// Generated by dart2js (fast startup emitter, strong), the Dart to JavaScript compiler version: 2.12.0-edge.6acb187d4a433b1a3c117ecbf85d281defdf8a82.
// 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):
//    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.
//
// 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];
    }
  }
  var supportsDirectProtoAccess = function() {
    var cls = function() {
    };
    cls.prototype = {p: {}};
    var object = new cls();
    if (!(object.__proto__ && object.__proto__.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 setFunctionNamesIfNecessary(holders) {
    function t() {
    }
    ;
    if (typeof t.name == "string")
      return;
    for (var i = 0; i < holders.length; i++) {
      var holder = holders[i];
      var keys = Object.keys(holder);
      for (var j = 0; j < keys.length; j++) {
        var key = keys[j];
        var f = holder[key];
        if (typeof f == 'function')
          f.name = key;
      }
    }
  }
  function inherit(cls, sup) {
    cls.prototype.constructor = cls;
    cls.prototype["$is" + cls.name] = cls;
    if (sup != null) {
      if (supportsDirectProtoAccess) {
        cls.prototype.__proto__ = 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 mixin(cls, mixin) {
    copyProperties(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() {
        H.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)
          H.throwLateInitializationError(name);
        holder[name] = value;
      }
      holder[getterName] = function() {
        return this[name];
      };
      return holder[name];
    };
  }
  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 tearOffGetter(funcs, applyTrampolineIndex, reflectionInfo, name, isIntercepted) {
    return isIntercepted ? new Function("funcs", "applyTrampolineIndex", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(receiver) {" + "if (c === null) c = " + "H.closureFromTearOff" + "(" + "this, funcs, applyTrampolineIndex, reflectionInfo, false, true, name);" + "return new c(this, funcs[0], receiver, name);" + "}")(funcs, applyTrampolineIndex, reflectionInfo, name, H, null) : new Function("funcs", "applyTrampolineIndex", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = " + "H.closureFromTearOff" + "(" + "this, funcs, applyTrampolineIndex, reflectionInfo, false, false, name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, applyTrampolineIndex, reflectionInfo, name, H, null);
  }
  function tearOff(funcs, applyTrampolineIndex, reflectionInfo, isStatic, name, isIntercepted) {
    var cache = null;
    return isStatic ? function() {
      if (cache === null)
        cache = H.closureFromTearOff(this, funcs, applyTrampolineIndex, reflectionInfo, true, false, name).prototype;
      return cache;
    } : tearOffGetter(funcs, applyTrampolineIndex, reflectionInfo, name, isIntercepted);
  }
  var typesOffset = 0;
  function installTearOff(container, getterName, isStatic, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    var funs = [];
    for (var i = 0; i < funsOrNames.length; i++) {
      var fun = funsOrNames[i];
      if (typeof fun == 'string')
        fun = container[fun];
      fun.$callName = callNames[i];
      funs.push(fun);
    }
    var fun = funs[0];
    fun.$requiredArgCount = requiredParameterCount;
    fun.$defaultValues = optionalParameterDefaultValues;
    var reflectionInfo = funType;
    if (typeof reflectionInfo == "number")
      reflectionInfo += typesOffset;
    var name = funsOrNames[0];
    fun.$stubName = name;
    var getterFunction = tearOff(funs, applyIndex || 0, reflectionInfo, isStatic, name, isIntercepted);
    container[getterName] = getterFunction;
    if (isStatic)
      fun.$tearOff = getterFunction;
  }
  function installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    return installTearOff(container, getterName, true, false, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex);
  }
  function installInstanceTearOff(container, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    return installTearOff(container, getterName, false, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex);
  }
  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);
        };
      },
      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: mixin, 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, setFunctionNamesIfNecessary: setFunctionNamesIfNecessary, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
  }();
  function initializeDeferredHunk(hunk) {
    typesOffset = init.types.length;
    hunk(hunkHelpers, init, holders, $);
  }
  function getGlobalFromName(name) {
    for (var i = 0; i < holders.length; i++) {
      if (holders[i] == C)
        continue;
      if (holders[i][name])
        return holders[i][name];
    }
  }
  var C = {},
  H = {JS_CONST: function JS_CONST() {
    },
    ReachabilityError$: function(_message) {
      return new H.ReachabilityError(_message);
    },
    checkNotNullable: function(value, $name, $T) {
      if (value == null)
        throw H.wrapException(new H.NotNullableError($name, $T._eval$1("NotNullableError<0>")));
      return value;
    },
    MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
      if (type$.EfficientLengthIterable_dynamic._is(iterable))
        return new H.EfficientLengthMappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
      return new H.MappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    IterableElementError_noElement: function() {
      return new P.StateError("No element");
    },
    IterableElementError_tooFew: function() {
      return new P.StateError("Too few elements");
    },
    LateError: function LateError(t0) {
      this._message = t0;
    },
    ReachabilityError: function ReachabilityError(t0) {
      this._message = t0;
    },
    nullFuture_closure: function nullFuture_closure() {
    },
    NotNullableError: function NotNullableError(t0, t1) {
      this.__internal$_name = t0;
      this.$ti = t1;
    },
    EfficientLengthIterable: function EfficientLengthIterable() {
    },
    ListIterable: function ListIterable() {
    },
    ListIterator: function ListIterator(t0, t1, t2) {
      var _ = this;
      _._iterable = t0;
      _.__internal$_length = t1;
      _._index = 0;
      _._current = null;
      _.$ti = t2;
    },
    MappedIterable: function MappedIterable(t0, t1, t2) {
      this._iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    EfficientLengthMappedIterable: function EfficientLengthMappedIterable(t0, t1, t2) {
      this._iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    MappedIterator: function MappedIterator(t0, t1, t2) {
      var _ = this;
      _._current = null;
      _._iterator = t0;
      _._f = t1;
      _.$ti = t2;
    },
    MappedListIterable: function MappedListIterable(t0, t1, t2) {
      this.__internal$_source = t0;
      this._f = t1;
      this.$ti = t2;
    },
    FixedLengthListMixin: function FixedLengthListMixin() {
    },
    Symbol: function Symbol(t0) {
      this.__internal$_name = t0;
    },
    ConstantMap__throwUnmodifiable: function() {
      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable Map"));
    },
    unminifyOrTag: function(rawClassName) {
      var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    isJsIndexable: function(object, record) {
      var result;
      if (record != null) {
        result = record.x;
        if (result != null)
          return result;
      }
      return type$.JavaScriptIndexingBehavior_dynamic._is(object);
    },
    S: function(value) {
      var res;
      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";
      res = J.toString$0$(value);
      if (typeof res != "string")
        throw H.wrapException(H.argumentErrorValue(value));
      return res;
    },
    Primitives_objectHashCode: function(object) {
      var hash = object.$identityHash;
      if (hash == null) {
        hash = Math.random() * 0x3fffffff | 0;
        object.$identityHash = hash;
      }
      return hash;
    },
    Primitives_parseInt: function(source, radix) {
      var match, decimalMatch;
      if (typeof source != "string")
        H.throwExpression(H.argumentErrorValue(source));
      match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
      if (match == null)
        return null;
      if (3 >= match.length)
        return H.ioore(match, 3);
      decimalMatch = match[3];
      if (decimalMatch != null)
        return parseInt(source, 10);
      if (match[2] != null)
        return parseInt(source, 16);
      return null;
    },
    Primitives_objectTypeName: function(object) {
      return H.Primitives__objectTypeNameNewRti(object);
    },
    Primitives__objectTypeNameNewRti: function(object) {
      var dispatchName, $constructor, constructorName;
      if (object instanceof P.Object)
        return H._rtiToString(H.instanceType(object), null);
      if (J.getInterceptor$(object) === C.Interceptor_methods || type$.UnknownJavaScriptObject._is(object)) {
        dispatchName = C.C_JS_CONST(object);
        if (H.Primitives__saneNativeClassName(dispatchName))
          return dispatchName;
        $constructor = object.constructor;
        if (typeof $constructor == "function") {
          constructorName = $constructor.name;
          if (typeof constructorName == "string" && H.Primitives__saneNativeClassName(constructorName))
            return constructorName;
        }
      }
      return H._rtiToString(H.instanceType(object), null);
    },
    Primitives__saneNativeClassName: function($name) {
      var t1 = $name !== "Object" && $name !== "";
      return t1;
    },
    Primitives_stringFromNativeUint8List: function(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: function(charCode) {
      var bits;
      if (charCode <= 65535)
        return String.fromCharCode(charCode);
      if (charCode <= 1114111) {
        bits = charCode - 65536;
        return String.fromCharCode((C.JSInt_methods._shrOtherPositive$1(bits, 10) | 55296) >>> 0, bits & 1023 | 56320);
      }
      throw H.wrapException(P.RangeError$range(charCode, 0, 1114111, null, null));
    },
    Primitives_lazyAsJsDate: function(receiver) {
      if (receiver.date === void 0)
        receiver.date = new Date(receiver._value);
      return receiver.date;
    },
    Primitives_getYear: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCFullYear() + 0 : H.Primitives_lazyAsJsDate(receiver).getFullYear() + 0;
    },
    Primitives_getMonth: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCMonth() + 1 : H.Primitives_lazyAsJsDate(receiver).getMonth() + 1;
    },
    Primitives_getDay: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCDate() + 0 : H.Primitives_lazyAsJsDate(receiver).getDate() + 0;
    },
    Primitives_getHours: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCHours() + 0 : H.Primitives_lazyAsJsDate(receiver).getHours() + 0;
    },
    Primitives_getMinutes: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCMinutes() + 0 : H.Primitives_lazyAsJsDate(receiver).getMinutes() + 0;
    },
    Primitives_getSeconds: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCSeconds() + 0 : H.Primitives_lazyAsJsDate(receiver).getSeconds() + 0;
    },
    Primitives_getMilliseconds: function(receiver) {
      return receiver.isUtc ? H.Primitives_lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : H.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
    },
    Primitives_functionNoSuchMethod: function($function, positionalArguments, namedArguments) {
      var $arguments, namedArgumentList, t1 = {};
      t1.argumentCount = 0;
      $arguments = [];
      namedArgumentList = [];
      t1.argumentCount = positionalArguments.length;
      C.JSArray_methods.addAll$1($arguments, positionalArguments);
      t1.names = "";
      if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments))
        namedArguments.forEach$1(0, new H.Primitives_functionNoSuchMethod_closure(t1, namedArgumentList, $arguments));
      "" + t1.argumentCount;
      return J.noSuchMethod$1$($function, new H.JSInvocationMirror(C.Symbol_call, 0, $arguments, namedArgumentList, 0));
    },
    Primitives_applyFunction: function($function, positionalArguments, namedArguments) {
      var t1, $arguments, argumentCount, jsStub;
      if (positionalArguments instanceof Array)
        t1 = namedArguments == null || namedArguments.get$isEmpty(namedArguments);
      else
        t1 = false;
      if (t1) {
        $arguments = positionalArguments;
        argumentCount = $arguments.length;
        if (argumentCount === 0) {
          if (!!$function.call$0)
            return $function.call$0();
        } else if (argumentCount === 1) {
          if (!!$function.call$1)
            return $function.call$1($arguments[0]);
        } else if (argumentCount === 2) {
          if (!!$function.call$2)
            return $function.call$2($arguments[0], $arguments[1]);
        } else if (argumentCount === 3) {
          if (!!$function.call$3)
            return $function.call$3($arguments[0], $arguments[1], $arguments[2]);
        } else if (argumentCount === 4) {
          if (!!$function.call$4)
            return $function.call$4($arguments[0], $arguments[1], $arguments[2], $arguments[3]);
        } else if (argumentCount === 5)
          if (!!$function.call$5)
            return $function.call$5($arguments[0], $arguments[1], $arguments[2], $arguments[3], $arguments[4]);
        jsStub = $function["call" + "$" + argumentCount];
        if (jsStub != null)
          return jsStub.apply($function, $arguments);
      }
      return H.Primitives__genericApplyFunction2($function, positionalArguments, namedArguments);
    },
    Primitives__genericApplyFunction2: function($function, positionalArguments, namedArguments) {
      var $arguments, argumentCount, requiredParameterCount, defaultValuesClosure, t1, defaultValues, interceptor, jsFunction, keys, _i, defaultValue, used, key;
      if (positionalArguments != null)
        $arguments = positionalArguments instanceof Array ? positionalArguments : P.List_List$from(positionalArguments, type$.dynamic);
      else
        $arguments = [];
      argumentCount = $arguments.length;
      requiredParameterCount = $function.$requiredArgCount;
      if (argumentCount < requiredParameterCount)
        return H.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.get$isNotEmpty(namedArguments))
          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if (argumentCount === requiredParameterCount)
          return jsFunction.apply($function, $arguments);
        return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
      }
      if (defaultValues instanceof Array) {
        if (namedArguments != null && namedArguments.get$isNotEmpty(namedArguments))
          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if (argumentCount > requiredParameterCount + defaultValues.length)
          return H.Primitives_functionNoSuchMethod($function, $arguments, null);
        C.JSArray_methods.addAll$1($arguments, defaultValues.slice(argumentCount - requiredParameterCount));
        return jsFunction.apply($function, $arguments);
      } else {
        if (argumentCount > requiredParameterCount)
          return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        keys = Object.keys(defaultValues);
        if (namedArguments == null)
          for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
            defaultValue = defaultValues[H._asStringS(keys[_i])];
            if (C.C__Required === defaultValue)
              return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
            C.JSArray_methods.add$1($arguments, defaultValue);
          }
        else {
          for (t1 = keys.length, used = 0, _i = 0; _i < keys.length; keys.length === t1 || (0, H.throwConcurrentModificationError)(keys), ++_i) {
            key = H._asStringS(keys[_i]);
            if (namedArguments.containsKey$1(key)) {
              ++used;
              C.JSArray_methods.add$1($arguments, namedArguments.$index(0, key));
            } else {
              defaultValue = defaultValues[key];
              if (C.C__Required === defaultValue)
                return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
              C.JSArray_methods.add$1($arguments, defaultValue);
            }
          }
          if (used !== namedArguments.get$length(namedArguments))
            return H.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        }
        return jsFunction.apply($function, $arguments);
      }
    },
    iae: function(argument) {
      throw H.wrapException(H.argumentErrorValue(argument));
    },
    ioore: function(receiver, index) {
      if (receiver == null)
        J.get$length$asx(receiver);
      throw H.wrapException(H.diagnoseIndexError(receiver, index));
    },
    diagnoseIndexError: function(indexable, index) {
      var $length, t1, _s5_ = "index";
      if (!H._isInt(index))
        return new P.ArgumentError(true, index, _s5_, null);
      $length = H._asIntS(J.get$length$asx(indexable));
      if (!(index < 0)) {
        if (typeof $length !== "number")
          return H.iae($length);
        t1 = index >= $length;
      } else
        t1 = true;
      if (t1)
        return P.IndexError$(index, indexable, _s5_, null, $length);
      return P.RangeError$value(index, _s5_);
    },
    argumentErrorValue: function(object) {
      return new P.ArgumentError(true, object, null, null);
    },
    checkBool: function(value) {
      return value;
    },
    wrapException: function(ex) {
      var wrapper, t1;
      if (ex == null)
        ex = new P.NullThrownError();
      wrapper = new Error();
      wrapper.dartException = ex;
      t1 = H.toStringWrapper;
      if ("defineProperty" in Object) {
        Object.defineProperty(wrapper, "message", {get: t1});
        wrapper.name = "";
      } else
        wrapper.toString = t1;
      return wrapper;
    },
    toStringWrapper: function() {
      return J.toString$0$(this.dartException);
    },
    throwExpression: function(ex) {
      throw H.wrapException(ex);
    },
    throwConcurrentModificationError: function(collection) {
      throw H.wrapException(P.ConcurrentModificationError$(collection));
    },
    TypeErrorDecoder_extractPattern: function(message) {
      var match, $arguments, argumentsExpr, expr, method, receiver;
      message = H.quoteStringForRegExp(message.replace(String({}), '$receiver$'));
      match = message.match(/\\\$[a-zA-Z]+\\\$/g);
      if (match == null)
        match = H.setRuntimeTypeInfo([], 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 H.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: function(expression) {
      return function($expr$) {
        var $argumentsExpr$ = '$arguments$';
        try {
          $expr$.$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
      return function($expr$) {
        try {
          $expr$.$method$;
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    NullError$: function(_message, match) {
      return new H.NullError(_message, match == null ? null : match.method);
    },
    JsNoSuchMethodError$: function(_message, match) {
      var t1 = match == null,
        t2 = t1 ? null : match.method;
      return new H.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
    },
    unwrapException: function(ex) {
      if (ex == null)
        return new H.NullThrownFromJavaScriptException(ex);
      if (ex instanceof H.ExceptionAndStackTrace)
        return H.saveStackTrace(ex, ex.dartException);
      if (typeof ex !== "object")
        return ex;
      if ("dartException" in ex)
        return H.saveStackTrace(ex, ex.dartException);
      return H._unwrapNonDartException(ex);
    },
    saveStackTrace: function(ex, error) {
      if (type$.Error._is(error))
        if (error.$thrownJsError == null)
          error.$thrownJsError = ex;
      return error;
    },
    _unwrapNonDartException: function(ex) {
      var message, number, ieErrorCode, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match, t1, _null = null;
      if (!("message" in ex))
        return ex;
      message = ex.message;
      if ("number" in ex && typeof ex.number == "number") {
        number = ex.number;
        ieErrorCode = number & 65535;
        if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
          switch (ieErrorCode) {
            case 438:
              return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
            case 445:
            case 5007:
              return H.saveStackTrace(ex, H.NullError$(H.S(message) + " (Error " + ieErrorCode + ")", _null));
          }
      }
      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 H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asStringS(message), match));
        else {
          match = notClosure.matchTypeError$1(message);
          if (match != null) {
            match.method = "call";
            return H.saveStackTrace(ex, H.JsNoSuchMethodError$(H._asStringS(message), match));
          } else {
            match = nullCall.matchTypeError$1(message);
            if (match == null) {
              match = nullLiteralCall.matchTypeError$1(message);
              if (match == null) {
                match = undefCall.matchTypeError$1(message);
                if (match == null) {
                  match = undefLiteralCall.matchTypeError$1(message);
                  if (match == null) {
                    match = nullProperty.matchTypeError$1(message);
                    if (match == null) {
                      match = nullLiteralCall.matchTypeError$1(message);
                      if (match == null) {
                        match = undefProperty.matchTypeError$1(message);
                        if (match == null) {
                          match = undefLiteralProperty.matchTypeError$1(message);
                          t1 = match != null;
                        } else
                          t1 = true;
                      } else
                        t1 = true;
                    } else
                      t1 = true;
                  } else
                    t1 = true;
                } else
                  t1 = true;
              } else
                t1 = true;
            } else
              t1 = true;
            if (t1)
              return H.saveStackTrace(ex, H.NullError$(H._asStringS(message), match));
          }
        }
        return H.saveStackTrace(ex, new H.UnknownJsTypeError(typeof message == "string" ? message : ""));
      }
      if (ex instanceof RangeError) {
        if (typeof message == "string" && message.indexOf("call stack") !== -1)
          return new P.StackOverflowError();
        message = function(ex) {
          try {
            return String(ex);
          } catch (e) {
          }
          return null;
        }(ex);
        return H.saveStackTrace(ex, new P.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 P.StackOverflowError();
      return ex;
    },
    getTraceFromException: function(exception) {
      var trace;
      if (exception instanceof H.ExceptionAndStackTrace)
        return exception.stackTrace;
      if (exception == null)
        return new H._StackTrace(exception);
      trace = exception.$cachedTrace;
      if (trace != null)
        return trace;
      return exception.$cachedTrace = new H._StackTrace(exception);
    },
    fillLiteralMap: function(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: function(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
      type$.Function._as(closure);
      switch (H._asIntS(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 H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
    },
    convertDartClosureToJS: function(closure, arity) {
      var $function;
      if (closure == null)
        return null;
      $function = closure.$identity;
      if (!!$function)
        return $function;
      $function = function(closure, arity, invoke) {
        return function(a1, a2, a3, a4) {
          return invoke(closure, arity, a1, a2, a3, a4);
        };
      }(closure, arity, H.invokeClosure);
      closure.$identity = $function;
      return $function;
    },
    Closure_fromTearOff: function(receiver, functions, applyTrampolineIndex, reflectionInfo, isStatic, isIntercepted, propertyName) {
      var $constructor, t1, trampoline, applyTrampoline, i, stub, stubCallName,
        $function = functions[0],
        callName = $function.$callName,
        $prototype = isStatic ? Object.create(new H.StaticClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, "").constructor.prototype);
      $prototype.$initialize = $prototype.constructor;
      if (isStatic)
        $constructor = function static_tear_off() {
          this.$initialize();
        };
      else {
        t1 = $.Closure_functionCounter;
        if (typeof t1 !== "number")
          return t1.$add();
        $.Closure_functionCounter = t1 + 1;
        t1 = new Function("a,b,c,d" + t1, "this.$initialize(a,b,c,d" + t1 + ")");
        $constructor = t1;
      }
      $prototype.constructor = $constructor;
      $constructor.prototype = $prototype;
      if (!isStatic) {
        trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
        trampoline.$reflectionInfo = reflectionInfo;
      } else {
        $prototype.$static_name = propertyName;
        trampoline = $function;
      }
      $prototype.$signature = H.Closure__computeSignatureFunctionNewRti(reflectionInfo, isStatic, isIntercepted);
      $prototype[callName] = trampoline;
      for (applyTrampoline = trampoline, i = 1; i < functions.length; ++i) {
        stub = functions[i];
        stubCallName = stub.$callName;
        if (stubCallName != null) {
          stub = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
          $prototype[stubCallName] = stub;
        }
        if (i === applyTrampolineIndex) {
          stub.$reflectionInfo = reflectionInfo;
          applyTrampoline = stub;
        }
      }
      $prototype["call*"] = applyTrampoline;
      $prototype.$requiredArgCount = $function.$requiredArgCount;
      $prototype.$defaultValues = $function.$defaultValues;
      return $constructor;
    },
    Closure__computeSignatureFunctionNewRti: function(functionType, isStatic, isIntercepted) {
      var typeEvalMethod;
      if (typeof functionType == "number")
        return function(getType, t) {
          return function() {
            return getType(t);
          };
        }(H.getTypeFromTypesTable, functionType);
      if (typeof functionType == "string") {
        if (isStatic)
          throw H.wrapException("Cannot compute signature for static tearoff.");
        typeEvalMethod = isIntercepted ? H.BoundClosure_evalRecipeIntercepted : H.BoundClosure_evalRecipe;
        return function(recipe, evalOnReceiver) {
          return function() {
            return evalOnReceiver(this, recipe);
          };
        }(functionType, typeEvalMethod);
      }
      throw H.wrapException("Error in functionType of tearoff");
    },
    Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
      var getSelf = H.BoundClosure_selfOf;
      switch (isSuperCall ? -1 : arity) {
        case 0:
          return function(n, S) {
            return function() {
              return S(this)[n]();
            };
          }(stubName, getSelf);
        case 1:
          return function(n, S) {
            return function(a) {
              return S(this)[n](a);
            };
          }(stubName, getSelf);
        case 2:
          return function(n, S) {
            return function(a, b) {
              return S(this)[n](a, b);
            };
          }(stubName, getSelf);
        case 3:
          return function(n, S) {
            return function(a, b, c) {
              return S(this)[n](a, b, c);
            };
          }(stubName, getSelf);
        case 4:
          return function(n, S) {
            return function(a, b, c, d) {
              return S(this)[n](a, b, c, d);
            };
          }(stubName, getSelf);
        case 5:
          return function(n, S) {
            return function(a, b, c, d, e) {
              return S(this)[n](a, b, c, d, e);
            };
          }(stubName, getSelf);
        default:
          return function(f, s) {
            return function() {
              return f.apply(s(this), arguments);
            };
          }($function, getSelf);
      }
    },
    Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
      var stubName, arity, lookedUpFunction, t1, t2, selfName, $arguments;
      if (isIntercepted)
        return H.Closure_forwardInterceptedCallTo(receiver, $function);
      stubName = $function.$stubName;
      arity = $function.length;
      lookedUpFunction = receiver[stubName];
      t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
      t2 = !t1 || arity >= 27;
      if (t2)
        return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
      if (arity === 0) {
        t1 = $.Closure_functionCounter;
        if (typeof t1 !== "number")
          return t1.$add();
        $.Closure_functionCounter = t1 + 1;
        selfName = "self" + t1;
        return new Function("return function(){var " + selfName + " = this." + H.S(H.BoundClosure_selfFieldName()) + ";return " + selfName + "." + H.S(stubName) + "();}")();
      }
      $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
      t1 = $.Closure_functionCounter;
      if (typeof t1 !== "number")
        return t1.$add();
      $.Closure_functionCounter = t1 + 1;
      $arguments += t1;
      return new Function("return function(" + $arguments + "){return this." + H.S(H.BoundClosure_selfFieldName()) + "." + H.S(stubName) + "(" + $arguments + ");}")();
    },
    Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
      var getSelf = H.BoundClosure_selfOf,
        getReceiver = H.BoundClosure_receiverOf;
      switch (isSuperCall ? -1 : arity) {
        case 0:
          throw H.wrapException(new H.RuntimeError("Intercepted function with no arguments."));
        case 1:
          return function(n, s, r) {
            return function() {
              return s(this)[n](r(this));
            };
          }($name, getSelf, getReceiver);
        case 2:
          return function(n, s, r) {
            return function(a) {
              return s(this)[n](r(this), a);
            };
          }($name, getSelf, getReceiver);
        case 3:
          return function(n, s, r) {
            return function(a, b) {
              return s(this)[n](r(this), a, b);
            };
          }($name, getSelf, getReceiver);
        case 4:
          return function(n, s, r) {
            return function(a, b, c) {
              return s(this)[n](r(this), a, b, c);
            };
          }($name, getSelf, getReceiver);
        case 5:
          return function(n, s, r) {
            return function(a, b, c, d) {
              return s(this)[n](r(this), a, b, c, d);
            };
          }($name, getSelf, getReceiver);
        case 6:
          return function(n, s, r) {
            return function(a, b, c, d, e) {
              return s(this)[n](r(this), a, b, c, d, e);
            };
          }($name, getSelf, getReceiver);
        default:
          return function(f, s, r, a) {
            return function() {
              a = [r(this)];
              Array.prototype.push.apply(a, arguments);
              return f.apply(s(this), a);
            };
          }($function, getSelf, getReceiver);
      }
    },
    Closure_forwardInterceptedCallTo: function(receiver, $function) {
      var stubName, arity, lookedUpFunction, t1, t2, $arguments,
        selfField = H.BoundClosure_selfFieldName(),
        receiverField = $.BoundClosure_receiverFieldNameCache;
      if (receiverField == null)
        receiverField = $.BoundClosure_receiverFieldNameCache = H.BoundClosure_computeFieldNamed("receiver");
      stubName = $function.$stubName;
      arity = $function.length;
      lookedUpFunction = receiver[stubName];
      t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
      t2 = !t1 || arity >= 28;
      if (t2)
        return H.Closure_cspForwardInterceptedCall(arity, !t1, stubName, $function);
      if (arity === 1) {
        t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + receiverField + ");";
        t2 = $.Closure_functionCounter;
        if (typeof t2 !== "number")
          return t2.$add();
        $.Closure_functionCounter = t2 + 1;
        return new Function(t1 + t2 + "}")();
      }
      $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
      t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + receiverField + ", " + $arguments + ");";
      t2 = $.Closure_functionCounter;
      if (typeof t2 !== "number")
        return t2.$add();
      $.Closure_functionCounter = t2 + 1;
      return new Function(t1 + t2 + "}")();
    },
    closureFromTearOff: function(receiver, functions, applyTrampolineIndex, reflectionInfo, isStatic, isIntercepted, $name) {
      return H.Closure_fromTearOff(receiver, functions, applyTrampolineIndex, reflectionInfo, !!isStatic, !!isIntercepted, $name);
    },
    BoundClosure_evalRecipe: function(closure, recipe) {
      return H._Universe_evalInEnvironment(init.typeUniverse, H.instanceType(closure._self), recipe);
    },
    BoundClosure_evalRecipeIntercepted: function(closure, recipe) {
      return H._Universe_evalInEnvironment(init.typeUniverse, H.instanceType(closure._receiver), recipe);
    },
    BoundClosure_selfOf: function(closure) {
      return closure._self;
    },
    BoundClosure_receiverOf: function(closure) {
      return closure._receiver;
    },
    BoundClosure_selfFieldName: function() {
      var t1 = $.BoundClosure_selfFieldNameCache;
      return t1 == null ? $.BoundClosure_selfFieldNameCache = H.BoundClosure_computeFieldNamed("self") : t1;
    },
    BoundClosure_computeFieldNamed: function(fieldName) {
      var t1, i, $name,
        template = new H.BoundClosure("self", "target", "receiver", "name"),
        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 H.wrapException(P.ArgumentError$("Field name " + fieldName + " not found."));
    },
    boolConversionCheck: function(value) {
      if (value == null)
        H.assertThrow("boolean expression must not be null");
      return value;
    },
    assertThrow: function(message) {
      throw H.wrapException(new H._AssertionError(message));
    },
    throwCyclicInit: function(staticName) {
      throw H.wrapException(new P.CyclicInitializationError(staticName));
    },
    getIsolateAffinityTag: function($name) {
      return init.getIsolateTag($name);
    },
    throwLateInitializationError: function($name) {
      return H.throwExpression(new H.LateError($name));
    },
    defineProperty: function(obj, property, value) {
      Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
    },
    lookupAndCacheInterceptor: function(obj) {
      var interceptor, interceptorClass, altTag, mark, t1,
        tag = H._asStringS($.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 = H._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 = H.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 = H.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      }
      if (mark === "+")
        return H.patchInteriorProto(obj, interceptor);
      if (mark === "*")
        throw H.wrapException(P.UnimplementedError$(tag));
      if (init.leafTags[tag] === true) {
        t1 = H.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      } else
        return H.patchInteriorProto(obj, interceptor);
    },
    patchInteriorProto: function(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: function(interceptor) {
      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
    },
    makeDefaultDispatchRecord: function(tag, interceptorClass, proto) {
      var interceptor = interceptorClass.prototype;
      if (init.leafTags[tag] === true)
        return H.makeLeafDispatchRecord(interceptor);
      else
        return J.makeDispatchRecord(interceptor, proto, null, null);
    },
    initNativeDispatch: function() {
      if (true === $.initNativeDispatchFlag)
        return;
      $.initNativeDispatchFlag = true;
      H.initNativeDispatchContinue();
    },
    initNativeDispatchContinue: function() {
      var map, tags, fun, i, tag, proto, record, interceptorClass;
      $.dispatchRecordsForInstanceTags = Object.create(null);
      $.interceptorsForUncacheableTags = Object.create(null);
      H.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 = H.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: function() {
      var transformers, i, transformer, getTag, getUnknownTag, prototypeForTag,
        hooks = C.C_JS_CONST0();
      hooks = H.applyHooksTransformer(C.C_JS_CONST1, H.applyHooksTransformer(C.C_JS_CONST2, H.applyHooksTransformer(C.C_JS_CONST3, H.applyHooksTransformer(C.C_JS_CONST3, H.applyHooksTransformer(C.C_JS_CONST4, H.applyHooksTransformer(C.C_JS_CONST5, H.applyHooksTransformer(C.C_JS_CONST6(C.C_JS_CONST), hooks)))))));
      if (typeof dartNativeDispatchHooksTransformer != "undefined") {
        transformers = dartNativeDispatchHooksTransformer;
        if (typeof transformers == "function")
          transformers = [transformers];
        if (transformers.constructor == Array)
          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 H.initHooks_closure(getTag);
      $.alternateTagFunction = new H.initHooks_closure0(getUnknownTag);
      $.prototypeForTagFunction = new H.initHooks_closure1(prototypeForTag);
    },
    applyHooksTransformer: function(transformer, hooks) {
      return transformer(hooks) || hooks;
    },
    quoteStringForRegExp: function(string) {
      if (/[[\]{}()*+?.\\^$|]/.test(string))
        return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
      return string;
    },
    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, t3) {
      var _ = this;
      _._length = t0;
      _._jsObject = t1;
      _._keys = t2;
      _.$ti = t3;
    },
    _ConstantMapKeyIterable: function _ConstantMapKeyIterable(t0, t1) {
      this._map = t0;
      this.$ti = t1;
    },
    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(t0, t1) {
      this.__js_helper$_message = t0;
      this._method = t1;
    },
    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() {
    },
    TearOffClosure: function TearOffClosure() {
    },
    StaticClosure: function StaticClosure() {
    },
    BoundClosure: function BoundClosure(t0, t1, t2, t3) {
      var _ = this;
      _._self = t0;
      _.__js_helper$_target = t1;
      _._receiver = t2;
      _._name = t3;
    },
    RuntimeError: function RuntimeError(t0) {
      this.message = t0;
    },
    _AssertionError: function _AssertionError(t0) {
      this.message = t0;
    },
    _Required: function _Required() {
    },
    JsLinkedHashMap: function JsLinkedHashMap(t0) {
      var _ = this;
      _._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;
    },
    _checkViewArguments: function(buffer, offsetInBytes, $length) {
    },
    _ensureNativeList: function(list) {
      var t1, result, i;
      if (type$.JSIndexable_dynamic._is(list))
        return list;
      t1 = J.getInterceptor$asx(list);
      result = P.List_List$filled(t1.get$length(list), null, false, type$.dynamic);
      for (i = 0; i < t1.get$length(list); ++i)
        C.JSArray_methods.$indexSet(result, i, t1.$index(list, i));
      return result;
    },
    NativeByteData_NativeByteData$view: function(buffer, offsetInBytes, $length) {
      H._checkViewArguments(buffer, offsetInBytes, $length);
      return $length == null ? new DataView(buffer, offsetInBytes) : new DataView(buffer, offsetInBytes, $length);
    },
    _checkValidIndex: function(index, list, $length) {
      if (index >>> 0 !== index || index >= $length)
        throw H.wrapException(H.diagnoseIndexError(list, index));
    },
    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: function(universe, rti) {
      var question = rti._precomputed1;
      return question == null ? rti._precomputed1 = H._Universe__lookupQuestionRti(universe, rti._primary, true) : question;
    },
    Rti__getFutureFromFutureOr: function(universe, rti) {
      var future = rti._precomputed1;
      return future == null ? rti._precomputed1 = H._Universe__lookupInterfaceRti(universe, "Future", [rti._primary]) : future;
    },
    Rti__isUnionOfFunctionType: function(rti) {
      var kind = rti._kind;
      if (kind === 6 || kind === 7 || kind === 8)
        return H.Rti__isUnionOfFunctionType(rti._primary);
      return kind === 11 || kind === 12;
    },
    Rti__getCanonicalRecipe: function(rti) {
      return rti._canonicalRecipe;
    },
    findType: function(recipe) {
      return H._Universe_eval(init.typeUniverse, recipe, false);
    },
    _substitute: function(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 = H._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return H._Universe__lookupStarRti(universe, substitutedBaseType, true);
        case 7:
          baseType = rti._primary;
          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return H._Universe__lookupQuestionRti(universe, substitutedBaseType, true);
        case 8:
          baseType = rti._primary;
          substitutedBaseType = H._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return H._Universe__lookupFutureOrRti(universe, substitutedBaseType, true);
        case 9:
          interfaceTypeArguments = rti._rest;
          substitutedInterfaceTypeArguments = H._substituteArray(universe, interfaceTypeArguments, typeArguments, depth);
          if (substitutedInterfaceTypeArguments === interfaceTypeArguments)
            return rti;
          return H._Universe__lookupInterfaceRti(universe, rti._primary, substitutedInterfaceTypeArguments);
        case 10:
          base = rti._primary;
          substitutedBase = H._substitute(universe, base, typeArguments, depth);
          $arguments = rti._rest;
          substitutedArguments = H._substituteArray(universe, $arguments, typeArguments, depth);
          if (substitutedBase === base && substitutedArguments === $arguments)
            return rti;
          return H._Universe__lookupBindingRti(universe, substitutedBase, substitutedArguments);
        case 11:
          returnType = rti._primary;
          substitutedReturnType = H._substitute(universe, returnType, typeArguments, depth);
          functionParameters = rti._rest;
          substitutedFunctionParameters = H._substituteFunctionParameters(universe, functionParameters, typeArguments, depth);
          if (substitutedReturnType === returnType && substitutedFunctionParameters === functionParameters)
            return rti;
          return H._Universe__lookupFunctionRti(universe, substitutedReturnType, substitutedFunctionParameters);
        case 12:
          bounds = rti._rest;
          depth += bounds.length;
          substitutedBounds = H._substituteArray(universe, bounds, typeArguments, depth);
          base = rti._primary;
          substitutedBase = H._substitute(universe, base, typeArguments, depth);
          if (substitutedBounds === bounds && substitutedBase === base)
            return rti;
          return H._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, true);
        case 13:
          index = rti._primary;
          if (index < depth)
            return rti;
          argument = typeArguments[index - depth];
          if (argument == null)
            return rti;
          return argument;
        default:
          throw H.wrapException(P.AssertionError$("Attempted to substitute unexpected RTI kind " + kind));
      }
    },
    _substituteArray: function(universe, rtiArray, typeArguments, depth) {
      var changed, i, rti, substitutedRti,
        $length = rtiArray.length,
        result = [];
      for (changed = false, i = 0; i < $length; ++i) {
        rti = rtiArray[i];
        substitutedRti = H._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result.push(substitutedRti);
      }
      return changed ? result : rtiArray;
    },
    _substituteNamed: function(universe, namedArray, typeArguments, depth) {
      var changed, i, t1, t2, rti, substitutedRti,
        $length = namedArray.length,
        result = [];
      for (changed = false, i = 0; i < $length; i += 3) {
        t1 = namedArray[i];
        t2 = namedArray[i + 1];
        rti = namedArray[i + 2];
        substitutedRti = H._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result.push(t1);
        result.push(t2);
        result.push(substitutedRti);
      }
      return changed ? result : namedArray;
    },
    _substituteFunctionParameters: function(universe, functionParameters, typeArguments, depth) {
      var result,
        requiredPositional = functionParameters._requiredPositional,
        substitutedRequiredPositional = H._substituteArray(universe, requiredPositional, typeArguments, depth),
        optionalPositional = functionParameters._optionalPositional,
        substitutedOptionalPositional = H._substituteArray(universe, optionalPositional, typeArguments, depth),
        named = functionParameters._named,
        substitutedNamed = H._substituteNamed(universe, named, typeArguments, depth);
      if (substitutedRequiredPositional === requiredPositional && substitutedOptionalPositional === optionalPositional && substitutedNamed === named)
        return functionParameters;
      result = new H._FunctionParameters();
      result._requiredPositional = substitutedRequiredPositional;
      result._optionalPositional = substitutedOptionalPositional;
      result._named = substitutedNamed;
      return result;
    },
    setRuntimeTypeInfo: function(target, rti) {
      target[init.arrayRti] = rti;
      return target;
    },
    closureFunctionType: function(closure) {
      var signature = closure.$signature;
      if (signature != null) {
        if (typeof signature == "number")
          return H.getTypeFromTypesTable(signature);
        return closure.$signature();
      }
      return null;
    },
    instanceOrFunctionType: function(object, testRti) {
      var rti;
      if (H.Rti__isUnionOfFunctionType(testRti))
        if (object instanceof H.Closure) {
          rti = H.closureFunctionType(object);
          if (rti != null)
            return rti;
        }
      return H.instanceType(object);
    },
    instanceType: function(object) {
      var rti;
      if (object instanceof P.Object) {
        rti = object.$ti;
        return rti != null ? rti : H._instanceTypeFromConstructor(object);
      }
      if (Array.isArray(object))
        return H._arrayInstanceType(object);
      return H._instanceTypeFromConstructor(J.getInterceptor$(object));
    },
    _arrayInstanceType: function(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: function(object) {
      var rti = object.$ti;
      return rti != null ? rti : H._instanceTypeFromConstructor(object);
    },
    _instanceTypeFromConstructor: function(instance) {
      var $constructor = instance.constructor,
        probe = $constructor.$ccache;
      if (probe != null)
        return probe;
      return H._instanceTypeFromConstructorMiss(instance, $constructor);
    },
    _instanceTypeFromConstructorMiss: function(instance, $constructor) {
      var effectiveConstructor = instance instanceof H.Closure ? instance.__proto__.__proto__.constructor : $constructor,
        rti = H._Universe_findErasedType(init.typeUniverse, effectiveConstructor.name);
      $constructor.$ccache = rti;
      return rti;
    },
    getTypeFromTypesTable: function(index) {
      var table, type, rti;
      H._asIntS(index);
      table = init.types;
      type = table[index];
      if (typeof type == "string") {
        rti = H._Universe_eval(init.typeUniverse, type, false);
        table[index] = rti;
        return rti;
      }
      return type;
    },
    getRuntimeType: function(object) {
      var rti = object instanceof H.Closure ? H.closureFunctionType(object) : null;
      return H.createRuntimeType(rti == null ? H.instanceType(object) : rti);
    },
    createRuntimeType: function(rti) {
      var recipe, starErasedRecipe, starErasedRti,
        type = rti._cachedRuntimeType;
      if (type != null)
        return type;
      recipe = rti._canonicalRecipe;
      starErasedRecipe = recipe.replace(/\*/g, "");
      if (starErasedRecipe === recipe)
        return rti._cachedRuntimeType = new H._Type(rti);
      starErasedRti = H._Universe_eval(init.typeUniverse, starErasedRecipe, true);
      type = starErasedRti._cachedRuntimeType;
      return rti._cachedRuntimeType = type == null ? starErasedRti._cachedRuntimeType = new H._Type(starErasedRti) : type;
    },
    typeLiteral: function(recipe) {
      return H.createRuntimeType(H._Universe_eval(init.typeUniverse, recipe, false));
    },
    _installSpecializedIsTest: function(object) {
      var unstarred, isFn, testRti = this,
        t1 = type$.Object;
      if (testRti === t1)
        return H._finishIsFn(testRti, object, H._isObject);
      if (!H.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = testRti === t1;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return H._finishIsFn(testRti, object, H._isTop);
      t1 = testRti._kind;
      unstarred = t1 === 6 ? testRti._primary : testRti;
      if (unstarred === type$.int)
        isFn = H._isInt;
      else if (unstarred === type$.double || unstarred === type$.num)
        isFn = H._isNum;
      else if (unstarred === type$.String)
        isFn = H._isString;
      else
        isFn = unstarred === type$.bool ? H._isBool : null;
      if (isFn != null)
        return H._finishIsFn(testRti, object, isFn);
      if (unstarred._kind === 9) {
        t1 = unstarred._primary;
        if (unstarred._rest.every(H.isTopType)) {
          testRti._specializedTestResource = "$is" + t1;
          return H._finishIsFn(testRti, object, H._isTestViaProperty);
        }
      } else if (t1 === 7)
        return H._finishIsFn(testRti, object, H._generalNullableIsTestImplementation);
      return H._finishIsFn(testRti, object, H._generalIsTestImplementation);
    },
    _finishIsFn: function(testRti, object, isFn) {
      testRti._is = isFn;
      return testRti._is(object);
    },
    _installSpecializedAsCheck: function(object) {
      var t1, asFn, testRti = this;
      if (!H.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = testRti === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        asFn = H._asTop;
      else if (testRti === type$.Object)
        asFn = H._asObject;
      else
        asFn = H._generalNullableAsCheckImplementation;
      testRti._as = asFn;
      return testRti._as(object);
    },
    _nullIs: function(testRti) {
      var t1,
        kind = testRti._kind;
      if (!H.isStrongTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          if (!(testRti === type$.legacy_Never))
            if (kind !== 7)
              t1 = kind === 8 && H._nullIs(testRti._primary) || testRti === type$.Null || testRti === type$.JSNull;
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    _generalIsTestImplementation: function(object) {
      var testRti = this;
      if (object == null)
        return H._nullIs(testRti);
      return H._isSubtype(init.typeUniverse, H.instanceOrFunctionType(object, testRti), null, testRti, null);
    },
    _generalNullableIsTestImplementation: function(object) {
      if (object == null)
        return true;
      return this._primary._is(object);
    },
    _isTestViaProperty: function(object) {
      var tag, testRti = this;
      if (object == null)
        return H._nullIs(testRti);
      tag = testRti._specializedTestResource;
      if (object instanceof P.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _generalAsCheckImplementation: function(object) {
      var testRti = this;
      if (object == null)
        return object;
      else if (testRti._is(object))
        return object;
      H._failedAsCheck(object, testRti);
    },
    _generalNullableAsCheckImplementation: function(object) {
      var testRti = this;
      if (object == null)
        return object;
      else if (testRti._is(object))
        return object;
      H._failedAsCheck(object, testRti);
    },
    _failedAsCheck: function(object, testRti) {
      throw H.wrapException(H._TypeError$fromMessage(H._Error_compose(object, H.instanceOrFunctionType(object, testRti), H._rtiToString(testRti, null))));
    },
    _Error_compose: function(object, objectRti, checkedTypeDescription) {
      var objectDescription = P.Error_safeToString(object),
        objectTypeDescription = H._rtiToString(objectRti == null ? H.instanceType(object) : objectRti, null);
      return objectDescription + ": type '" + H.S(objectTypeDescription) + "' is not a subtype of type '" + H.S(checkedTypeDescription) + "'";
    },
    _TypeError$fromMessage: function(message) {
      return new H._TypeError("TypeError: " + message);
    },
    _TypeError__TypeError$forType: function(object, type) {
      return new H._TypeError("TypeError: " + H._Error_compose(object, null, type));
    },
    _isObject: function(object) {
      return object != null;
    },
    _asObject: function(object) {
      return object;
    },
    _isTop: function(object) {
      return true;
    },
    _asTop: function(object) {
      return object;
    },
    _isBool: function(object) {
      return true === object || false === object;
    },
    _asBool: function(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolS: function(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolQ: function(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "bool?"));
    },
    _asDouble: function(object) {
      if (typeof object == "number")
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleS: function(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleQ: function(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "double?"));
    },
    _isInt: function(object) {
      return typeof object == "number" && Math.floor(object) === object;
    },
    _asInt: function(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "int"));
    },
    _asIntS: function(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "int"));
    },
    _asIntQ: function(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "int?"));
    },
    _isNum: function(object) {
      return typeof object == "number";
    },
    _asNum: function(object) {
      if (typeof object == "number")
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "num"));
    },
    _asNumS: function(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "num"));
    },
    _asNumQ: function(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "num?"));
    },
    _isString: function(object) {
      return typeof object == "string";
    },
    _asString: function(object) {
      if (typeof object == "string")
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "String"));
    },
    _asStringS: function(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "String"));
    },
    _asStringQ: function(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw H.wrapException(H._TypeError__TypeError$forType(object, "String?"));
    },
    _rtiArrayToString: function(array, genericContext) {
      var s, sep, i;
      for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
        s += C.JSString_methods.$add(sep, H._rtiToString(array[i], genericContext));
      return s;
    },
    _functionRtiToString: function(functionType, genericContext, bounds) {
      var boundsLength, outerContextLength, offset, i, t1, t2, t3, typeParametersText, typeSep, t4, t5, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
      if (bounds != null) {
        boundsLength = bounds.length;
        if (genericContext == null) {
          genericContext = H.setRuntimeTypeInfo([], type$.JSArray_String);
          outerContextLength = null;
        } else
          outerContextLength = genericContext.length;
        offset = genericContext.length;
        for (i = boundsLength; i > 0; --i)
          C.JSArray_methods.add$1(genericContext, "T" + (offset + i));
        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, t3 = type$.Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
          typeParametersText += typeSep;
          t4 = genericContext.length;
          t5 = t4 - 1 - i;
          if (t5 < 0)
            return H.ioore(genericContext, t5);
          typeParametersText = C.JSString_methods.$add(typeParametersText, genericContext[t5]);
          boundRti = bounds[i];
          kind = boundRti._kind;
          if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
            if (!(boundRti === t2))
              t4 = boundRti === t3;
            else
              t4 = true;
          else
            t4 = true;
          if (!t4)
            typeParametersText += C.JSString_methods.$add(" extends ", H._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 = H._rtiToString(t1, genericContext);
      for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
        argumentsText += C.JSString_methods.$add(sep, H._rtiToString(requiredPositional[i], genericContext));
      if (optionalPositionalLength > 0) {
        argumentsText += sep + "[";
        for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
          argumentsText += C.JSString_methods.$add(sep, H._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 += J.$add$ansx(H._rtiToString(named[i + 2], genericContext), " ") + named[i];
        }
        argumentsText += "}";
      }
      if (outerContextLength != null) {
        genericContext.toString;
        genericContext.length = outerContextLength;
      }
      return typeParametersText + "(" + argumentsText + ") => " + H.S(returnTypeText);
    },
    _rtiToString: function(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 = H._rtiToString(rti._primary, genericContext);
        return s;
      }
      if (kind === 7) {
        questionArgument = rti._primary;
        s = H._rtiToString(questionArgument, genericContext);
        argumentKind = questionArgument._kind;
        return J.$add$ansx(argumentKind === 11 || argumentKind === 12 ? C.JSString_methods.$add("(", s) + ")" : s, "?");
      }
      if (kind === 8)
        return "FutureOr<" + H.S(H._rtiToString(rti._primary, genericContext)) + ">";
      if (kind === 9) {
        $name = H._unminifyOrTag(rti._primary);
        $arguments = rti._rest;
        return $arguments.length !== 0 ? $name + ("<" + H._rtiArrayToString($arguments, genericContext) + ">") : $name;
      }
      if (kind === 11)
        return H._functionRtiToString(rti, genericContext, null);
      if (kind === 12)
        return H._functionRtiToString(rti._primary, genericContext, rti._rest);
      if (kind === 13) {
        genericContext.toString;
        t1 = rti._primary;
        t2 = genericContext.length;
        t1 = t2 - 1 - t1;
        if (t1 < 0 || t1 >= t2)
          return H.ioore(genericContext, t1);
        return genericContext[t1];
      }
      return "?";
    },
    _unminifyOrTag: function(rawClassName) {
      var preserved = H.unmangleGlobalNameIfPreservedAnyways(rawClassName);
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    _Universe_findRule: function(universe, targetType) {
      var rule = universe.tR[targetType];
      for (; typeof rule == "string";)
        rule = universe.tR[rule];
      return rule;
    },
    _Universe_findErasedType: function(universe, cls) {
      var $length, erased, $arguments, i, $interface,
        metadata = universe.eT,
        probe = metadata[cls];
      if (probe == null)
        return H._Universe_eval(universe, cls, false);
      else if (typeof probe == "number") {
        $length = probe;
        erased = H._Universe__lookupTerminalRti(universe, 5, "#");
        $arguments = [];
        for (i = 0; i < $length; ++i)
          $arguments.push(erased);
        $interface = H._Universe__lookupInterfaceRti(universe, cls, $arguments);
        metadata[cls] = $interface;
        return $interface;
      } else
        return probe;
    },
    _Universe_addRules: function(universe, rules) {
      return H._Utils_objectAssign(universe.tR, rules);
    },
    _Universe_addErasedTypes: function(universe, types) {
      return H._Utils_objectAssign(universe.eT, types);
    },
    _Universe_eval: function(universe, recipe, normalize) {
      var rti,
        cache = universe.eC,
        probe = cache.get(recipe);
      if (probe != null)
        return probe;
      rti = H._Parser_parse(H._Parser_create(universe, null, recipe, normalize));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_evalInEnvironment: function(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 = H._Parser_parse(H._Parser_create(universe, environment, recipe, true));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_bind: function(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 = H._Universe__lookupBindingRti(universe, environment, argumentsRti._kind === 10 ? argumentsRti._rest : [argumentsRti]);
      cache.set(argumentsRecipe, rti);
      return rti;
    },
    _Universe__installTypeTests: function(universe, rti) {
      rti._as = H._installSpecializedAsCheck;
      rti._is = H._installSpecializedIsTest;
      return rti;
    },
    _Universe__lookupTerminalRti: function(universe, kind, key) {
      var rti, t1,
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = kind;
      rti._canonicalRecipe = key;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupStarRti: function(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "*",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = H._Universe__createStarRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createStarRti: function(universe, baseType, key, normalize) {
      var baseKind, t1, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!H.isStrongTopType(baseType))
          t1 = baseType === type$.Null || baseType === type$.JSNull || baseKind === 7 || baseKind === 6;
        else
          t1 = true;
        if (t1)
          return baseType;
      }
      rti = new H.Rti(null, null);
      rti._kind = 6;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return H._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupQuestionRti: function(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "?",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = H._Universe__createQuestionRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createQuestionRti: function(universe, baseType, key, normalize) {
      var baseKind, t1, starArgument, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!H.isStrongTopType(baseType))
          if (!(baseType === type$.Null || baseType === type$.JSNull))
            if (baseKind !== 7)
              t1 = baseKind === 8 && H.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 && H.isNullable(starArgument._primary))
            return starArgument;
          else
            return H.Rti__getQuestionFromStar(universe, baseType);
        }
      }
      rti = new H.Rti(null, null);
      rti._kind = 7;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return H._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupFutureOrRti: function(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "/",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = H._Universe__createFutureOrRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createFutureOrRti: function(universe, baseType, key, normalize) {
      var t1, t2, rti;
      if (normalize) {
        t1 = baseType._kind;
        if (!H.isStrongTopType(baseType))
          if (!(baseType === type$.legacy_Object))
            t2 = baseType === type$.Object;
          else
            t2 = true;
        else
          t2 = true;
        if (t2 || baseType === type$.Object)
          return baseType;
        else if (t1 === 1)
          return H._Universe__lookupInterfaceRti(universe, "Future", [baseType]);
        else if (baseType === type$.Null || baseType === type$.JSNull)
          return type$.nullable_Future_Null;
      }
      rti = new H.Rti(null, null);
      rti._kind = 8;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return H._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupGenericFunctionParameterRti: function(universe, index) {
      var rti, t1,
        key = "" + index + "^",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = 13;
      rti._primary = index;
      rti._canonicalRecipe = key;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__canonicalRecipeJoin: function($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: function($arguments) {
      var s, sep, i, t1, nameSep, s0,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; i += 3, sep = ",") {
        t1 = $arguments[i];
        nameSep = $arguments[i + 1] ? "!" : ":";
        s0 = $arguments[i + 2]._canonicalRecipe;
        s += sep + t1 + nameSep + s0;
      }
      return s;
    },
    _Universe__lookupInterfaceRti: function(universe, $name, $arguments) {
      var probe, rti, t1,
        s = $name;
      if ($arguments.length !== 0)
        s += "<" + H._Universe__canonicalRecipeJoin($arguments) + ">";
      probe = universe.eC.get(s);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = 9;
      rti._primary = $name;
      rti._rest = $arguments;
      if ($arguments.length > 0)
        rti._precomputed1 = $arguments[0];
      rti._canonicalRecipe = s;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(s, t1);
      return t1;
    },
    _Universe__lookupBindingRti: function(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 + (";<" + H._Universe__canonicalRecipeJoin(newArguments) + ">");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = 10;
      rti._primary = newBase;
      rti._rest = newArguments;
      rti._canonicalRecipe = key;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupFunctionRti: function(universe, returnType, parameters) {
      var sep, t1, key, probe, rti,
        s = returnType._canonicalRecipe,
        requiredPositional = parameters._requiredPositional,
        requiredPositionalLength = requiredPositional.length,
        optionalPositional = parameters._optionalPositional,
        optionalPositionalLength = optionalPositional.length,
        named = parameters._named,
        namedLength = named.length,
        recipe = "(" + H._Universe__canonicalRecipeJoin(requiredPositional);
      if (optionalPositionalLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        t1 = H._Universe__canonicalRecipeJoin(optionalPositional);
        recipe += sep + "[" + t1 + "]";
      }
      if (namedLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        t1 = H._Universe__canonicalRecipeJoinNamed(named);
        recipe += sep + "{" + t1 + "}";
      }
      key = s + (recipe + ")");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new H.Rti(null, null);
      rti._kind = 11;
      rti._primary = returnType;
      rti._rest = parameters;
      rti._canonicalRecipe = key;
      t1 = H._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupGenericFunctionRti: function(universe, baseFunctionType, bounds, normalize) {
      var t1,
        key = baseFunctionType._canonicalRecipe + ("<" + H._Universe__canonicalRecipeJoin(bounds) + ">"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = H._Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createGenericFunctionRti: function(universe, baseFunctionType, bounds, key, normalize) {
      var $length, typeArguments, count, i, bound, substitutedBase, substitutedBounds, rti;
      if (normalize) {
        $length = bounds.length;
        typeArguments = new Array($length);
        for (count = 0, i = 0; i < $length; ++i) {
          bound = bounds[i];
          if (bound._kind === 1) {
            typeArguments[i] = bound;
            ++count;
          }
        }
        if (count > 0) {
          substitutedBase = H._substitute(universe, baseFunctionType, typeArguments, 0);
          substitutedBounds = H._substituteArray(universe, bounds, typeArguments, 0);
          return H._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, bounds !== substitutedBounds);
        }
      }
      rti = new H.Rti(null, null);
      rti._kind = 12;
      rti._primary = baseFunctionType;
      rti._rest = bounds;
      rti._canonicalRecipe = key;
      return H._Universe__installTypeTests(universe, rti);
    },
    _Parser_create: function(universe, environment, recipe, normalize) {
      return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
    },
    _Parser_parse: function(parser) {
      var t1, i, ch, universe, array, head, base, u, parameters, optionalPositional, named, item,
        source = parser.r,
        stack = parser.s;
      for (t1 = source.length, i = 0; i < t1;) {
        ch = source.charCodeAt(i);
        if (ch >= 48 && ch <= 57)
          i = H._Parser_handleDigit(i + 1, ch, source, stack);
        else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36)
          i = H._Parser_handleIdentifier(parser, i, source, stack, false);
        else if (ch === 46)
          i = H._Parser_handleIdentifier(parser, i, source, stack, true);
        else {
          ++i;
          switch (ch) {
            case 44:
              break;
            case 58:
              stack.push(false);
              break;
            case 33:
              stack.push(true);
              break;
            case 59:
              stack.push(H._Parser_toType(parser.u, parser.e, stack.pop()));
              break;
            case 94:
              stack.push(H._Universe__lookupGenericFunctionParameterRti(parser.u, stack.pop()));
              break;
            case 35:
              stack.push(H._Universe__lookupTerminalRti(parser.u, 5, "#"));
              break;
            case 64:
              stack.push(H._Universe__lookupTerminalRti(parser.u, 2, "@"));
              break;
            case 126:
              stack.push(H._Universe__lookupTerminalRti(parser.u, 3, "~"));
              break;
            case 60:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 62:
              universe = parser.u;
              array = stack.splice(parser.p);
              H._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              head = stack.pop();
              if (typeof head == "string")
                stack.push(H._Universe__lookupInterfaceRti(universe, head, array));
              else {
                base = H._Parser_toType(universe, parser.e, head);
                switch (base._kind) {
                  case 11:
                    stack.push(H._Universe__lookupGenericFunctionRti(universe, base, array, parser.n));
                    break;
                  default:
                    stack.push(H._Universe__lookupBindingRti(universe, base, array));
                    break;
                }
              }
              break;
            case 38:
              H._Parser_handleExtendedOperations(parser, stack);
              break;
            case 42:
              u = parser.u;
              stack.push(H._Universe__lookupStarRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 63:
              u = parser.u;
              stack.push(H._Universe__lookupQuestionRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 47:
              u = parser.u;
              stack.push(H._Universe__lookupFutureOrRti(u, H._Parser_toType(u, parser.e, stack.pop()), parser.n));
              break;
            case 40:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 41:
              universe = parser.u;
              parameters = new H._FunctionParameters();
              optionalPositional = universe.sEA;
              named = universe.sEA;
              head = stack.pop();
              if (typeof head == "number")
                switch (head) {
                  case -1:
                    optionalPositional = stack.pop();
                    break;
                  case -2:
                    named = stack.pop();
                    break;
                  default:
                    stack.push(head);
                    break;
                }
              else
                stack.push(head);
              array = stack.splice(parser.p);
              H._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              parameters._requiredPositional = array;
              parameters._optionalPositional = optionalPositional;
              parameters._named = named;
              stack.push(H._Universe__lookupFunctionRti(universe, H._Parser_toType(universe, parser.e, stack.pop()), parameters));
              break;
            case 91:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 93:
              array = stack.splice(parser.p);
              H._Parser_toTypes(parser.u, parser.e, array);
              parser.p = stack.pop();
              stack.push(array);
              stack.push(-1);
              break;
            case 123:
              stack.push(parser.p);
              parser.p = stack.length;
              break;
            case 125:
              array = stack.splice(parser.p);
              H._Parser_toTypesNamed(parser.u, parser.e, array);
              parser.p = stack.pop();
              stack.push(array);
              stack.push(-2);
              break;
            default:
              throw "Bad character " + ch;
          }
        }
      }
      item = stack.pop();
      return H._Parser_toType(parser.u, parser.e, item);
    },
    _Parser_handleDigit: function(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: function(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))
            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 = H._Universe_findRule(t1, environment._primary)[string];
        if (recipe == null)
          H.throwExpression('No "' + string + '" in "' + H.Rti__getCanonicalRecipe(environment) + '"');
        stack.push(H._Universe_evalInEnvironment(t1, environment, recipe));
      } else
        stack.push(string);
      return i;
    },
    _Parser_handleExtendedOperations: function(parser, stack) {
      var $top = stack.pop();
      if (0 === $top) {
        stack.push(H._Universe__lookupTerminalRti(parser.u, 1, "0&"));
        return;
      }
      if (1 === $top) {
        stack.push(H._Universe__lookupTerminalRti(parser.u, 4, "1&"));
        return;
      }
      throw H.wrapException(P.AssertionError$("Unexpected extended operation " + H.S($top)));
    },
    _Parser_toType: function(universe, environment, item) {
      if (typeof item == "string")
        return H._Universe__lookupInterfaceRti(universe, item, universe.sEA);
      else if (typeof item == "number")
        return H._Parser_indexToType(universe, environment, item);
      else
        return item;
    },
    _Parser_toTypes: function(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 0; i < $length; ++i)
        items[i] = H._Parser_toType(universe, environment, items[i]);
    },
    _Parser_toTypesNamed: function(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 2; i < $length; i += 3)
        items[i] = H._Parser_toType(universe, environment, items[i]);
    },
    _Parser_indexToType: function(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 H.wrapException(P.AssertionError$("Indexed base must be an interface type"));
      typeArguments = environment._rest;
      if (index <= typeArguments.length)
        return typeArguments[index - 1];
      throw H.wrapException(P.AssertionError$("Bad index " + index + " for " + environment.toString$0(0)));
    },
    _isSubtype: function(universe, s, sEnv, t, tEnv) {
      var t1, sKind, leftTypeVariable, tKind, sBounds, tBounds, sLength, i, sBound, tBound;
      if (s === t)
        return true;
      if (!H.isStrongTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = t === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return true;
      sKind = s._kind;
      if (sKind === 4)
        return true;
      if (H.isStrongTopType(s))
        return false;
      if (s._kind !== 1)
        t1 = s === type$.Null || s === type$.JSNull;
      else
        t1 = true;
      if (t1)
        return true;
      leftTypeVariable = sKind === 13;
      if (leftTypeVariable)
        if (H._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv))
          return true;
      tKind = t._kind;
      if (sKind === 6)
        return H._isSubtype(universe, s._primary, sEnv, t, tEnv);
      if (tKind === 6) {
        t1 = t._primary;
        return H._isSubtype(universe, s, sEnv, t1, tEnv);
      }
      if (sKind === 8) {
        if (!H._isSubtype(universe, s._primary, sEnv, t, tEnv))
          return false;
        return H._isSubtype(universe, H.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv);
      }
      if (sKind === 7) {
        t1 = H._isSubtype(universe, s._primary, sEnv, t, tEnv);
        return t1;
      }
      if (tKind === 8) {
        if (H._isSubtype(universe, s, sEnv, t._primary, tEnv))
          return true;
        return H._isSubtype(universe, s, sEnv, H.Rti__getFutureFromFutureOr(universe, t), tEnv);
      }
      if (tKind === 7) {
        t1 = H._isSubtype(universe, s, sEnv, t._primary, tEnv);
        return t1;
      }
      if (leftTypeVariable)
        return false;
      t1 = sKind !== 11;
      if ((!t1 || sKind === 12) && t === type$.Function)
        return true;
      if (tKind === 12) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (sKind !== 12)
          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 (!H._isSubtype(universe, sBound, sEnv, tBound, tEnv) || !H._isSubtype(universe, tBound, tEnv, sBound, sEnv))
            return false;
        }
        return H._isFunctionSubtype(universe, s._primary, sEnv, t._primary, tEnv);
      }
      if (tKind === 11) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (t1)
          return false;
        return H._isFunctionSubtype(universe, s, sEnv, t, tEnv);
      }
      if (sKind === 9) {
        if (tKind !== 9)
          return false;
        return H._isInterfaceSubtype(universe, s, sEnv, t, tEnv);
      }
      return false;
    },
    _isFunctionSubtype: function(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;
      if (!H._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 (!H._isSubtype(universe, tRequiredPositional[i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < requiredPositionalDelta; ++i) {
        t1 = sOptionalPositional[i];
        if (!H._isSubtype(universe, tRequiredPositional[sRequiredPositionalLength + i], tEnv, t1, sEnv))
          return false;
      }
      for (i = 0; i < tOptionalPositionalLength; ++i) {
        t1 = sOptionalPositional[requiredPositionalDelta + i];
        if (!H._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;
          if (sName < tName)
            continue;
          t1 = sNamed[sIndex - 1];
          if (!H._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv))
            return false;
          break;
        }
      }
      return true;
    },
    _isInterfaceSubtype: function(universe, s, sEnv, t, tEnv) {
      var sArgs, tArgs, $length, i, t1, t2, rule, supertypeArgs,
        sName = s._primary,
        tName = t._primary;
      if (sName === tName) {
        sArgs = s._rest;
        tArgs = t._rest;
        $length = sArgs.length;
        for (i = 0; i < $length; ++i) {
          t1 = sArgs[i];
          t2 = tArgs[i];
          if (!H._isSubtype(universe, t1, sEnv, t2, tEnv))
            return false;
        }
        return true;
      }
      if (t === type$.Object)
        return true;
      rule = H._Universe_findRule(universe, sName);
      if (rule == null)
        return false;
      supertypeArgs = rule[tName];
      if (supertypeArgs == null)
        return false;
      $length = supertypeArgs.length;
      tArgs = t._rest;
      for (i = 0; i < $length; ++i)
        if (!H._isSubtype(universe, H._Universe_evalInEnvironment(universe, s, supertypeArgs[i]), sEnv, tArgs[i], tEnv))
          return false;
      return true;
    },
    isNullable: function(t) {
      var t1,
        kind = t._kind;
      if (!(t === type$.Null || t === type$.JSNull))
        if (!H.isStrongTopType(t))
          if (kind !== 7)
            if (!(kind === 6 && H.isNullable(t._primary)))
              t1 = kind === 8 && H.isNullable(t._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isTopType: function(t) {
      var t1;
      if (!H.isStrongTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = t === type$.Object;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isStrongTopType: function(t) {
      var kind = t._kind;
      return kind === 2 || kind === 3 || kind === 4 || kind === 5 || t === type$.nullable_Object;
    },
    _Utils_objectAssign: function(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];
      }
    },
    Rti: function Rti(t0, t1) {
      var _ = this;
      _._as = t0;
      _._is = t1;
      _._cachedRuntimeType = _._specializedTestResource = _._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;
    },
    unmangleGlobalNameIfPreservedAnyways: function($name) {
      return init.mangledGlobalNames[$name];
    }
  },
  J = {
    makeDispatchRecord: function(interceptor, proto, extension, indexability) {
      return {i: interceptor, p: proto, e: extension, x: indexability};
    },
    getNativeInterceptor: function(object) {
      var proto, objectProto, $constructor, interceptor,
        record = object[init.dispatchPropertyName];
      if (record == null)
        if ($.initNativeDispatchFlag == null) {
          H.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 H.wrapException(P.UnimplementedError$("Return interceptor for " + H.S(proto(object, record))));
      }
      $constructor = object.constructor;
      interceptor = $constructor == null ? null : $constructor[J.JS_INTEROP_INTERCEPTOR_TAG()];
      if (interceptor != null)
        return interceptor;
      interceptor = H.lookupAndCacheInterceptor(object);
      if (interceptor != null)
        return interceptor;
      if (typeof object == "function")
        return C.JavaScriptFunction_methods;
      proto = Object.getPrototypeOf(object);
      if (proto == null)
        return C.PlainJavaScriptObject_methods;
      if (proto === Object.prototype)
        return C.PlainJavaScriptObject_methods;
      if (typeof $constructor == "function") {
        Object.defineProperty($constructor, J.JS_INTEROP_INTERCEPTOR_TAG(), {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
        return C.UnknownJavaScriptObject_methods;
      }
      return C.UnknownJavaScriptObject_methods;
    },
    JS_INTEROP_INTERCEPTOR_TAG: function() {
      var t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
      return t1 == null ? $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js") : t1;
    },
    JSArray_JSArray$fixed: function($length, $E) {
      if (!H._isInt($length))
        throw H.wrapException(P.ArgumentError$value($length, "length", "is not an integer"));
      if ($length < 0 || $length > 4294967295)
        throw H.wrapException(P.RangeError$range($length, 0, 4294967295, "length", null));
      return J.JSArray_JSArray$markFixed(new Array($length), $E);
    },
    JSArray_JSArray$growable: function($length, $E) {
      if (!H._isInt($length) || $length < 0)
        throw H.wrapException(P.ArgumentError$("Length must be a non-negative integer: " + H.S($length)));
      return H.setRuntimeTypeInfo(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$markFixed: function(allocation, $E) {
      return J.JSArray_markFixedList(H.setRuntimeTypeInfo(allocation, $E._eval$1("JSArray<0>")), $E);
    },
    JSArray_markFixedList: function(list, $T) {
      list.fixed$length = Array;
      return list;
    },
    getInterceptor$: function(receiver) {
      if (typeof receiver == "number") {
        if (Math.floor(receiver) == receiver)
          return J.JSInt.prototype;
        return J.JSDouble.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 (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ansx: function(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$asx: function(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ax: function(receiver) {
      if (receiver == null)
        return receiver;
      if (receiver.constructor == Array)
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$bn: function(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (receiver == null)
        return receiver;
      if (typeof receiver == "boolean")
        return J.JSBool.prototype;
      if (!(receiver instanceof P.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$n: function(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof P.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$s: function(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof P.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$x: function(receiver) {
      if (receiver == null)
        return receiver;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        return receiver;
      }
      if (receiver instanceof P.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    get$hashCode$: function(receiver) {
      return J.getInterceptor$(receiver).get$hashCode(receiver);
    },
    get$iterator$ax: function(receiver) {
      return J.getInterceptor$ax(receiver).get$iterator(receiver);
    },
    get$length$asx: function(receiver) {
      return J.getInterceptor$asx(receiver).get$length(receiver);
    },
    get$runtimeType$: function(receiver) {
      return J.getInterceptor$(receiver).get$runtimeType(receiver);
    },
    $add$ansx: function(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return receiver + a0;
      return J.getInterceptor$ansx(receiver).$add(receiver, a0);
    },
    $and$bn: function(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return (receiver & a0) >>> 0;
      return J.getInterceptor$bn(receiver).$and(receiver, a0);
    },
    $div$n: function(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return receiver / a0;
      return J.getInterceptor$n(receiver).$div(receiver, a0);
    },
    $eq$: function(receiver, a0) {
      if (receiver == null)
        return a0 == null;
      if (typeof receiver != "object")
        return a0 != null && receiver === a0;
      return J.getInterceptor$(receiver).$eq(receiver, a0);
    },
    $ge$n: function(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return receiver >= a0;
      return J.getInterceptor$n(receiver).$ge(receiver, a0);
    },
    $index$asx: function(receiver, a0) {
      if (typeof a0 === "number")
        if (receiver.constructor == Array || typeof receiver == "string" || H.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: function(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
    },
    $or$bn: function(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return (receiver | a0) >>> 0;
      return J.getInterceptor$bn(receiver).$or(receiver, a0);
    },
    $shl$n: function(receiver, a0) {
      return J.getInterceptor$n(receiver).$shl(receiver, a0);
    },
    $shr$n: function(receiver, a0) {
      return J.getInterceptor$n(receiver).$shr(receiver, a0);
    },
    $sub$n: function(receiver, a0) {
      if (typeof receiver == "number" && typeof a0 == "number")
        return receiver - a0;
      return J.getInterceptor$n(receiver).$sub(receiver, a0);
    },
    _removeEventListener$3$x: function(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver)._removeEventListener$3(receiver, a0, a1, a2);
    },
    addEventListener$3$x: function(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
    },
    elementAt$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
    },
    forEach$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
    },
    map$1$ax: function(receiver, a0) {
      return J.getInterceptor$ax(receiver).map$1(receiver, a0);
    },
    map$1$1$ax: function(receiver, a0, $T1) {
      return J.getInterceptor$ax(receiver).map$1$1(receiver, a0, $T1);
    },
    noSuchMethod$1$: function(receiver, a0) {
      return J.getInterceptor$(receiver).noSuchMethod$1(receiver, a0);
    },
    toList$0$ax: function(receiver) {
      return J.getInterceptor$ax(receiver).toList$0(receiver);
    },
    toString$0$: function(receiver) {
      return J.getInterceptor$(receiver).toString$0(receiver);
    },
    Interceptor: function Interceptor() {
    },
    JSBool: function JSBool() {
    },
    JSNull: function JSNull() {
    },
    JavaScriptObject: function JavaScriptObject() {
    },
    PlainJavaScriptObject: function PlainJavaScriptObject() {
    },
    UnknownJavaScriptObject: function UnknownJavaScriptObject() {
    },
    JavaScriptFunction: function JavaScriptFunction() {
    },
    JSArray: function JSArray(t0) {
      this.$ti = t0;
    },
    JSUnmodifiableArray: function JSUnmodifiableArray(t0) {
      this.$ti = t0;
    },
    ArrayIterator: function ArrayIterator(t0, t1, t2) {
      var _ = this;
      _.__interceptors$_iterable = t0;
      _.__interceptors$_length = t1;
      _.__interceptors$_index = 0;
      _.__interceptors$_current = null;
      _.$ti = t2;
    },
    JSNumber: function JSNumber() {
    },
    JSInt: function JSInt() {
    },
    JSDouble: function JSDouble() {
    },
    JSString: function JSString() {
    }
  },
  P = {
    _AsyncRun__initializeScheduleImmediate: function() {
      var div, span, t1 = {};
      if (self.scheduleImmediate != null)
        return P.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(H.convertDartClosureToJS(new P._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
        return new P._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
      } else if (self.setImmediate != null)
        return P.async__AsyncRun__scheduleImmediateWithSetImmediate$closure();
      return P.async__AsyncRun__scheduleImmediateWithTimer$closure();
    },
    _AsyncRun__scheduleImmediateJsOverride: function(callback) {
      self.scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithSetImmediate: function(callback) {
      self.setImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithTimer: function(callback) {
      P.Timer__createTimer(C.Duration_0, type$.void_Function._as(callback));
    },
    Timer__createTimer: function(duration, callback) {
      var milliseconds = C.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return P._TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _TimerImpl$: function(milliseconds, callback) {
      var t1 = new P._TimerImpl();
      t1._TimerImpl$2(milliseconds, callback);
      return t1;
    },
    _makeAsyncAwaitCompleter: function($T) {
      return new P._AsyncAwaitCompleter(new P._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncAwaitCompleter<0>"));
    },
    _asyncStartSync: function(bodyFunction, completer) {
      bodyFunction.call$2(0, null);
      completer.isSync = true;
      return completer._future;
    },
    _asyncAwait: function(object, bodyFunction) {
      P._awaitOnObject(object, bodyFunction);
    },
    _asyncReturn: function(object, completer) {
      completer.complete$1(object);
    },
    _asyncRethrow: function(object, completer) {
      completer.completeError$2(H.unwrapException(object), H.getTraceFromException(object));
    },
    _awaitOnObject: function(object, bodyFunction) {
      var t1, future,
        thenCallback = new P._awaitOnObject_closure(bodyFunction),
        errorCallback = new P._awaitOnObject_closure0(bodyFunction);
      if (object instanceof P._Future)
        object._thenAwait$1$2(thenCallback, errorCallback, type$.dynamic);
      else {
        t1 = type$.dynamic;
        if (type$.Future_dynamic._is(object))
          object.then$1$2$onError(thenCallback, errorCallback, t1);
        else {
          future = new P._Future($.Zone__current, type$._Future_dynamic);
          future._state = 4;
          future._resultOrListeners = object;
          future._thenAwait$1$2(thenCallback, errorCallback, t1);
        }
      }
    },
    _wrapJsFunctionForAsync: function($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 P._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
    },
    _Future__chainCoreFuture: function(source, target) {
      var t1, t2, listeners;
      for (t1 = type$._Future_dynamic; t2 = source._state, t2 === 2;)
        source = t1._as(source._resultOrListeners);
      if (t2 >= 4) {
        listeners = target._removeListeners$0();
        target._state = source._state;
        target._resultOrListeners = source._resultOrListeners;
        P._Future__propagateToListeners(target, listeners);
      } else {
        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
        target._state = 2;
        target._resultOrListeners = source;
        source._prependListeners$1(listeners);
      }
    },
    _Future__propagateToListeners: function(source, listeners) {
      var t2, t3, t4, _box_0, hasError, asyncError, nextListener, nextListener0, t5, sourceResult, t6, t7, zone, oldZone, result, current, _null = null, _box_1 = {},
        t1 = _box_1.source = source;
      for (t2 = type$.AsyncError, t3 = type$.nullable__FutureListener_dynamic_dynamic, t4 = type$.Future_dynamic; true;) {
        _box_0 = {};
        hasError = t1._state === 8;
        if (listeners == null) {
          if (hasError) {
            asyncError = t2._as(t1._resultOrListeners);
            P._rootHandleUncaughtError(_null, _null, t1._zone, asyncError.error, asyncError.stackTrace);
          }
          return;
        }
        _box_0.listener = listeners;
        nextListener = listeners._nextListener;
        for (t1 = listeners; nextListener != null; t1 = nextListener, nextListener = nextListener0) {
          t1._nextListener = null;
          P._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;
        t6 = !hasError;
        if (t6) {
          t7 = t1.state;
          t7 = (t7 & 1) !== 0 || (t7 & 15) === 8;
        } else
          t7 = true;
        if (t7) {
          zone = t1.result._zone;
          if (hasError) {
            t7 = t5._zone === zone;
            t7 = !(t7 || t7);
          } else
            t7 = false;
          if (t7) {
            t2._as(sourceResult);
            P._rootHandleUncaughtError(_null, _null, t5._zone, sourceResult.error, sourceResult.stackTrace);
            return;
          }
          oldZone = $.Zone__current;
          if (oldZone !== zone)
            $.Zone__current = zone;
          else
            oldZone = _null;
          t1 = t1.state;
          if ((t1 & 15) === 8)
            new P._Future__propagateToListeners_handleWhenCompleteCallback(_box_0, _box_1, hasError).call$0();
          else if (t6) {
            if ((t1 & 1) !== 0)
              new P._Future__propagateToListeners_handleValueCallback(_box_0, sourceResult).call$0();
          } else if ((t1 & 2) !== 0)
            new P._Future__propagateToListeners_handleError(_box_1, _box_0).call$0();
          if (oldZone != null)
            $.Zone__current = oldZone;
          t1 = _box_0.listenerValueOrError;
          if (t4._is(t1)) {
            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 instanceof P._Future)
              if (t1._state >= 4) {
                current = t3._as(result._resultOrListeners);
                result._resultOrListeners = null;
                listeners = result._reverseListeners$1(current);
                result._state = t1._state;
                result._resultOrListeners = t1._resultOrListeners;
                _box_1.source = t1;
                continue;
              } else
                P._Future__chainCoreFuture(t1, result);
            else
              result._chainForeignFuture$1(t1);
            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 = 4;
          result._resultOrListeners = t5;
        } else {
          t2._as(t5);
          result._state = 8;
          result._resultOrListeners = t5;
        }
        _box_1.source = result;
        t1 = result;
      }
    },
    _registerErrorHandler: function(errorHandler, zone) {
      var t1;
      if (type$.dynamic_Function_Object_StackTrace._is(errorHandler))
        return zone.registerBinaryCallback$3$1(errorHandler, type$.dynamic, type$.Object, type$.StackTrace);
      t1 = type$.dynamic_Function_Object;
      if (t1._is(errorHandler))
        return t1._as(errorHandler);
      throw H.wrapException(P.ArgumentError$value(errorHandler, "onError", "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a valid result"));
    },
    _microtaskLoop: function() {
      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: function() {
      $._isInCallbackLoop = true;
      try {
        P._microtaskLoop();
      } finally {
        $._lastPriorityCallback = null;
        $._isInCallbackLoop = false;
        if ($._nextCallback != null)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(P.async___startMicrotaskLoop$closure());
      }
    },
    _scheduleAsyncCallback: function(callback) {
      var newEntry = new P._AsyncCallbackEntry(callback),
        lastCallback = $._lastCallback;
      if (lastCallback == null) {
        $._nextCallback = $._lastCallback = newEntry;
        if (!$._isInCallbackLoop)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(P.async___startMicrotaskLoop$closure());
      } else
        $._lastCallback = lastCallback.next = newEntry;
    },
    _schedulePriorityAsyncCallback: function(callback) {
      var entry, lastPriorityCallback, next,
        t1 = $._nextCallback;
      if (t1 == null) {
        P._scheduleAsyncCallback(callback);
        $._lastPriorityCallback = $._lastCallback;
        return;
      }
      entry = new P._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: function(callback) {
      var _null = null,
        currentZone = $.Zone__current;
      if (C.C__RootZone === currentZone) {
        P._rootScheduleMicrotask(_null, _null, C.C__RootZone, callback);
        return;
      }
      P._rootScheduleMicrotask(_null, _null, currentZone, type$.void_Function._as(currentZone.bindCallbackGuarded$1(callback)));
    },
    StreamIterator_StreamIterator: function(stream, $T) {
      return new P._StreamIterator(H.checkNotNullable(stream, "stream", type$.Object), $T._eval$1("_StreamIterator<0>"));
    },
    StreamController_StreamController: function($T) {
      var _null = null;
      return new P._AsyncStreamController(_null, _null, _null, _null, $T._eval$1("_AsyncStreamController<0>"));
    },
    StreamController_StreamController$broadcast: function(sync, $T) {
      var _null = null;
      return sync ? new P._SyncBroadcastStreamController(_null, _null, $T._eval$1("_SyncBroadcastStreamController<0>")) : new P._AsyncBroadcastStreamController(_null, _null, $T._eval$1("_AsyncBroadcastStreamController<0>"));
    },
    _runGuarded: function(notificationHandler) {
      return;
    },
    _ControllerSubscription$: function(_controller, onData, onError, onDone, cancelOnError, $T) {
      var t1 = $.Zone__current,
        t2 = cancelOnError ? 1 : 0,
        t3 = P._BufferingStreamSubscription__registerDataHandler(t1, onData, $T),
        t4 = P._BufferingStreamSubscription__registerErrorHandler(t1, onError);
      return new P._ControllerSubscription(_controller, t3, t4, type$.void_Function._as(onDone), t1, t2, $T._eval$1("_ControllerSubscription<0>"));
    },
    _BufferingStreamSubscription__registerDataHandler: function(zone, handleData, $T) {
      var t1 = handleData == null ? P.async___nullDataHandler$closure() : handleData;
      return type$.$env_1_1_void._bind$1($T)._eval$1("1(2)")._as(t1);
    },
    _BufferingStreamSubscription__registerErrorHandler: function(zone, handleError) {
      if (handleError == null)
        handleError = P.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 type$.dynamic_Function_Object._as(handleError);
      throw H.wrapException(P.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace."));
    },
    _nullDataHandler: function(value) {
    },
    _nullErrorHandler: function(error, stackTrace) {
      P._rootHandleUncaughtError(null, null, $.Zone__current, error, stackTrace);
    },
    _cancelAndValue: function(subscription, future, value) {
      var cancelFuture = subscription.cancel$0();
      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new P._cancelAndValue_closure(future, value));
      else
        future._complete$1(value);
    },
    Timer_Timer: function(duration, callback) {
      var t1 = $.Zone__current;
      if (t1 === C.C__RootZone)
        return P.Timer__createTimer(duration, type$.void_Function._as(callback));
      return P.Timer__createTimer(duration, type$.void_Function._as(t1.bindCallbackGuarded$1(callback)));
    },
    AsyncError$: function(error, stackTrace) {
      var t1 = H.checkNotNullable(error, "error", type$.Object);
      return new P.AsyncError(t1, stackTrace == null ? P.AsyncError_defaultStackTrace(error) : stackTrace);
    },
    AsyncError_defaultStackTrace: function(error) {
      var stackTrace;
      if (type$.Error._is(error)) {
        stackTrace = error.get$stackTrace();
        if (stackTrace != null)
          return stackTrace;
      }
      return C.C__StringStackTrace;
    },
    _rootHandleUncaughtError: function($self, $parent, zone, error, stackTrace) {
      P._schedulePriorityAsyncCallback(new P._rootHandleUncaughtError_closure(error, stackTrace));
    },
    _rootRun: function($self, $parent, zone, f, $R) {
      var old,
        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: function($self, $parent, zone, f, arg, $R, $T) {
      var old,
        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: function($self, $parent, zone, f, arg1, arg2, $R, T1, T2) {
      var old,
        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;
      }
    },
    _rootScheduleMicrotask: function($self, $parent, zone, f) {
      var t1;
      type$.void_Function._as(f);
      t1 = C.C__RootZone !== zone;
      if (t1)
        f = !(!t1 || false) ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
      P._scheduleAsyncCallback(f);
    },
    _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() {
      this._handle = null;
    },
    _TimerImpl_internalCallback: function _TimerImpl_internalCallback(t0, t1) {
      this.$this = t0;
      this.callback = t1;
    },
    _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;
    },
    _BroadcastSubscription: function _BroadcastSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._eventState = 0;
      _._async$_previous = _._async$_next = null;
      _._controller = t0;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _BroadcastStreamController: function _BroadcastStreamController() {
    },
    _SyncBroadcastStreamController: function _SyncBroadcastStreamController(t0, t1, t2) {
      var _ = this;
      _.onListen = t0;
      _.onCancel = t1;
      _._state = 0;
      _._doneFuture = _._addStreamState = _._lastSubscription = _._firstSubscription = null;
      _.$ti = t2;
    },
    _SyncBroadcastStreamController__sendData_closure: function _SyncBroadcastStreamController__sendData_closure(t0, t1) {
      this.$this = t0;
      this.data = t1;
    },
    _AsyncBroadcastStreamController: function _AsyncBroadcastStreamController(t0, t1, t2) {
      var _ = this;
      _.onListen = t0;
      _.onCancel = t1;
      _._state = 0;
      _._doneFuture = _._addStreamState = _._lastSubscription = _._firstSubscription = null;
      _.$ti = t2;
    },
    _Completer: function _Completer() {
    },
    _AsyncCompleter: function _AsyncCompleter(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__asyncCompleteWithValue_closure: function _Future__asyncCompleteWithValue_closure(t0, t1) {
      this.$this = t0;
      this.value = t1;
    },
    _Future__chainFuture_closure: function _Future__chainFuture_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;
    },
    _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;
    },
    StreamSubscription: function StreamSubscription() {
    },
    StreamTransformerBase: function StreamTransformerBase() {
    },
    _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;
    },
    _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;
    },
    _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__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() {
    },
    _PendingEvents_schedule_closure: function _PendingEvents_schedule_closure(t0, t1) {
      this.$this = t0;
      this.dispatch = t1;
    },
    _StreamImplEvents: function _StreamImplEvents(t0) {
      var _ = this;
      _.lastPendingEvent = _.firstPendingEvent = null;
      _._state = 0;
      _.$ti = t0;
    },
    _DoneStreamSubscription: function _DoneStreamSubscription(t0, t1, t2) {
      var _ = this;
      _._zone = t0;
      _._state = 0;
      _._onDone = t1;
      _.$ti = t2;
    },
    _StreamIterator: function _StreamIterator(t0, t1) {
      var _ = this;
      _._async$_subscription = null;
      _._stateData = t0;
      _._async$_hasValue = false;
      _.$ti = t1;
    },
    _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;
      _._async$_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._async$_source = t1;
      this.$ti = t2;
    },
    AsyncError: function AsyncError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    _Zone: function _Zone() {
    },
    _rootHandleUncaughtError_closure: function _rootHandleUncaughtError_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_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;
    },
    LinkedHashMap_LinkedHashMap: function($K, $V) {
      return new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap$_literal: function(keyValuePairs, $K, $V) {
      return $K._eval$1("@<0>")._bind$1($V)._eval$1("LinkedHashMap<1,2>")._as(H.fillLiteralMap(keyValuePairs, new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"))));
    },
    LinkedHashMap_LinkedHashMap$_empty: function($K, $V) {
      return new H.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    LinkedHashSet_LinkedHashSet: function($E) {
      return new P._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    _LinkedHashSet__newHashTable: function() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
      var parts, t1;
      if (P._isToStringVisiting(iterable)) {
        if (leftDelimiter === "(" && rightDelimiter === ")")
          return "(...)";
        return leftDelimiter + "..." + rightDelimiter;
      }
      parts = H.setRuntimeTypeInfo([], type$.JSArray_String);
      C.JSArray_methods.add$1($._toStringVisiting, iterable);
      try {
        P._iterablePartsToStrings(iterable, parts);
      } finally {
        if (0 >= $._toStringVisiting.length)
          return H.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      t1 = P.StringBuffer__writeAll(leftDelimiter, type$.Iterable_dynamic._as(parts), ", ") + rightDelimiter;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
      var buffer, t1;
      if (P._isToStringVisiting(iterable))
        return leftDelimiter + "..." + rightDelimiter;
      buffer = new P.StringBuffer(leftDelimiter);
      C.JSArray_methods.add$1($._toStringVisiting, iterable);
      try {
        t1 = buffer;
        t1._contents = P.StringBuffer__writeAll(t1._contents, iterable, ", ");
      } finally {
        if (0 >= $._toStringVisiting.length)
          return H.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      buffer._contents += rightDelimiter;
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _isToStringVisiting: function(o) {
      var t1, i;
      for (t1 = $._toStringVisiting.length, i = 0; i < t1; ++i)
        if (o === $._toStringVisiting[i])
          return true;
      return false;
    },
    _iterablePartsToStrings: function(iterable, parts) {
      var next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision,
        it = iterable.get$iterator(iterable),
        $length = 0, count = 0;
      while (true) {
        if (!($length < 80 || count < 3))
          break;
        if (!it.moveNext$0())
          return;
        next = H.S(it.get$current());
        C.JSArray_methods.add$1(parts, next);
        $length += next.length + 2;
        ++count;
      }
      if (!it.moveNext$0()) {
        if (count <= 5)
          return;
        if (0 >= parts.length)
          return H.ioore(parts, -1);
        ultimateString = parts.pop();
        if (0 >= parts.length)
          return H.ioore(parts, -1);
        penultimateString = parts.pop();
      } else {
        penultimate = it.get$current();
        ++count;
        if (!it.moveNext$0()) {
          if (count <= 4) {
            C.JSArray_methods.add$1(parts, H.S(penultimate));
            return;
          }
          ultimateString = H.S(penultimate);
          if (0 >= parts.length)
            return H.ioore(parts, -1);
          penultimateString = parts.pop();
          $length += ultimateString.length + 2;
        } else {
          ultimate = it.get$current();
          ++count;
          for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
            ultimate0 = it.get$current();
            ++count;
            if (count > 100) {
              while (true) {
                if (!($length > 75 && count > 3))
                  break;
                if (0 >= parts.length)
                  return H.ioore(parts, -1);
                $length -= parts.pop().length + 2;
                --count;
              }
              C.JSArray_methods.add$1(parts, "...");
              return;
            }
          }
          penultimateString = H.S(penultimate);
          ultimateString = H.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 H.ioore(parts, -1);
        $length -= parts.pop().length + 2;
        if (elision == null) {
          $length += 5;
          elision = "...";
        }
      }
      if (elision != null)
        C.JSArray_methods.add$1(parts, elision);
      C.JSArray_methods.add$1(parts, penultimateString);
      C.JSArray_methods.add$1(parts, ultimateString);
    },
    LinkedHashMap_LinkedHashMap$of: function(other, $K, $V) {
      var t1 = P.LinkedHashMap_LinkedHashMap($K, $V);
      t1.addAll$1(0, other);
      return t1;
    },
    MapBase_mapToString: function(m) {
      var result, t1 = {};
      if (P._isToStringVisiting(m))
        return "{...}";
      result = new P.StringBuffer("");
      try {
        C.JSArray_methods.add$1($._toStringVisiting, m);
        result._contents += "{";
        t1.first = true;
        m.forEach$1(0, new P.MapBase_mapToString_closure(t1, result));
        result._contents += "}";
      } finally {
        if (0 >= $._toStringVisiting.length)
          return H.ioore($._toStringVisiting, -1);
        $._toStringVisiting.pop();
      }
      t1 = result._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    ListQueue__calculateCapacity: function(initialCapacity) {
      return 8;
    },
    _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._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;
    },
    ListMixin: function ListMixin() {
    },
    MapBase: function MapBase() {
    },
    MapBase_mapToString_closure: function MapBase_mapToString_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    MapMixin: function MapMixin() {
    },
    _UnmodifiableMapMixin: function _UnmodifiableMapMixin() {
    },
    MapView: function MapView() {
    },
    UnmodifiableMapView: function UnmodifiableMapView() {
    },
    ListQueue: function ListQueue(t0, t1) {
      var _ = this;
      _._collection$_table = t0;
      _._modificationCount = _._tail = _._head = 0;
      _.$ti = t1;
    },
    _ListQueueIterator: function _ListQueueIterator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._queue = t0;
      _._end = t1;
      _._modificationCount = t2;
      _._position = t3;
      _._collection$_current = null;
      _.$ti = t4;
    },
    SetMixin: function SetMixin() {
    },
    _SetBase: function _SetBase() {
    },
    _UnmodifiableMapView_MapView__UnmodifiableMapMixin: function _UnmodifiableMapView_MapView__UnmodifiableMapMixin() {
    },
    __SetBase_Object_SetMixin: function __SetBase_Object_SetMixin() {
    },
    _parseJson: function(source, reviver) {
      var parsed, e, exception, t1;
      if (typeof source != "string")
        throw H.wrapException(H.argumentErrorValue(source));
      parsed = null;
      try {
        parsed = JSON.parse(source);
      } catch (exception) {
        e = H.unwrapException(exception);
        t1 = P.FormatException$(String(e), null, null);
        throw H.wrapException(t1);
      }
      t1 = P._convertJsonToDartLazy(parsed);
      return t1;
    },
    _convertJsonToDartLazy: function(object) {
      var i;
      if (object == null)
        return null;
      if (typeof object != "object")
        return object;
      if (Object.getPrototypeOf(object) !== Array.prototype)
        return new P._JsonMap(object, Object.create(null));
      for (i = 0; i < object.length; ++i)
        object[i] = P._convertJsonToDartLazy(object[i]);
      return object;
    },
    Utf8Decoder__convertIntercepted: function(allowMalformed, codeUnits, start, end) {
      var casted, result;
      if (codeUnits instanceof Uint8Array) {
        casted = codeUnits;
        end = casted.length;
        if (end - start < 15)
          return null;
        result = P.Utf8Decoder__convertInterceptedUint8List(allowMalformed, casted, start, end);
        if (result != null && allowMalformed)
          if (result.indexOf("\ufffd") >= 0)
            return null;
        return result;
      }
      return null;
    },
    Utf8Decoder__convertInterceptedUint8List: function(allowMalformed, codeUnits, start, end) {
      var decoder = allowMalformed ? $.$get$Utf8Decoder__decoderNonfatal() : $.$get$Utf8Decoder__decoder();
      if (decoder == null)
        return null;
      if (0 === start && end === codeUnits.length)
        return P.Utf8Decoder__useTextDecoder(decoder, codeUnits);
      return P.Utf8Decoder__useTextDecoder(decoder, codeUnits.subarray(start, P.RangeError_checkValidRange(start, end, codeUnits.length)));
    },
    Utf8Decoder__useTextDecoder: function(decoder, codeUnits) {
      var t1, exception;
      try {
        t1 = decoder.decode(codeUnits);
        return t1;
      } catch (exception) {
        H.unwrapException(exception);
      }
      return null;
    },
    JsonUnsupportedObjectError$: function(unsupportedObject, cause, partialResult) {
      return new P.JsonUnsupportedObjectError(unsupportedObject, cause);
    },
    _defaultToEncodable: function(object) {
      return object.toJson$0();
    },
    _JsonStringStringifier$: function(_sink, _toEncodable) {
      return new P._JsonStringStringifier(_sink, [], P.convert___defaultToEncodable$closure());
    },
    _JsonStringStringifier_stringify: function(object, toEncodable, indent) {
      var t1,
        output = new P.StringBuffer(""),
        stringifier = P._JsonStringStringifier$(output, toEncodable);
      stringifier.writeObject$1(object);
      t1 = output._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Utf8Decoder_errorDescription: function(state) {
      switch (state) {
        case 65:
          return "Missing extension byte";
        case 67:
          return "Unexpected extension byte";
        case 69:
          return "Invalid UTF-8 byte";
        case 71:
          return "Overlong encoding";
        case 73:
          return "Out of unicode range";
        case 75:
          return "Encoded surrogate";
        case 77:
          return "Unfinished UTF-8 octet sequence";
        default:
          return "";
      }
    },
    _JsonMap: function _JsonMap(t0, t1) {
      this._original = t0;
      this._processed = t1;
      this._data = null;
    },
    _JsonMapKeyIterable: function _JsonMapKeyIterable(t0) {
      this._parent = t0;
    },
    Utf8Decoder__decoder_closure: function Utf8Decoder__decoder_closure() {
    },
    Utf8Decoder__decoderNonfatal_closure: function Utf8Decoder__decoderNonfatal_closure() {
    },
    Codec: function Codec() {
    },
    Converter: function Converter() {
    },
    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._sink = t0;
      this._seen = t1;
      this._toEncodable = t2;
    },
    Utf8Decoder: function Utf8Decoder(t0) {
      this._allowMalformed = t0;
    },
    _Utf8Decoder: function _Utf8Decoder(t0) {
      this.allowMalformed = t0;
      this._convert$_state = 16;
      this._charOrIndex = 0;
    },
    _symbolMapToStringMap: function(map) {
      var result = new H.JsLinkedHashMap(type$.JsLinkedHashMap_String_dynamic);
      map.forEach$1(0, new P._symbolMapToStringMap_closure(result));
      return result;
    },
    Function_apply: function($function, positionalArguments, namedArguments) {
      return H.Primitives_applyFunction($function, positionalArguments, namedArguments == null ? null : P._symbolMapToStringMap(namedArguments));
    },
    int_parse: function(source) {
      var value = H.Primitives_parseInt(source, null);
      if (value != null)
        return value;
      throw H.wrapException(P.FormatException$(source, null, null));
    },
    Error__objectToString: function(object) {
      if (object instanceof H.Closure)
        return object.toString$0(0);
      return "Instance of '" + H.S(H.Primitives_objectTypeName(object)) + "'";
    },
    List_List$filled: function($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: function(elements, $E) {
      var t1,
        list = H.setRuntimeTypeInfo([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        C.JSArray_methods.add$1(list, $E._as(t1.get$current()));
      return list;
    },
    List_List$of: function(elements, growable, $E) {
      var t1 = P.List_List$_of(elements, $E);
      return t1;
    },
    List_List$_of: function(elements, $E) {
      var list, t1;
      if (Array.isArray(elements))
        return H.setRuntimeTypeInfo(elements.slice(0), $E._eval$1("JSArray<0>"));
      list = H.setRuntimeTypeInfo([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        C.JSArray_methods.add$1(list, t1.get$current());
      return list;
    },
    String_String$fromCharCodes: function(charCodes, start, end) {
      var t1 = H.Primitives_stringFromNativeUint8List(charCodes, start, P.RangeError_checkValidRange(start, end, charCodes.length));
      return t1;
    },
    StringBuffer__writeAll: function(string, objects, separator) {
      var iterator = J.get$iterator$ax(objects);
      if (!iterator.moveNext$0())
        return string;
      if (separator.length === 0) {
        do
          string += H.S(iterator.get$current());
        while (iterator.moveNext$0());
      } else {
        string += H.S(iterator.get$current());
        for (; iterator.moveNext$0();)
          string = string + separator + H.S(iterator.get$current());
      }
      return string;
    },
    NoSuchMethodError$: function(receiver, memberName, positionalArguments, namedArguments) {
      return new P.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments);
    },
    StackTrace_current: function() {
      var stackTrace, exception;
      if (H.boolConversionCheck($.$get$_hasErrorStackProperty()))
        return H.getTraceFromException(new Error());
      try {
        throw H.wrapException("");
      } catch (exception) {
        H.unwrapException(exception);
        stackTrace = H.getTraceFromException(exception);
        return stackTrace;
      }
    },
    DateTime__fourDigits: function(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: function(n) {
      if (n >= 100)
        return "" + n;
      if (n >= 10)
        return "0" + n;
      return "00" + n;
    },
    DateTime__twoDigits: function(n) {
      if (n >= 10)
        return "" + n;
      return "0" + n;
    },
    Error_safeToString: function(object) {
      if (typeof object == "number" || H._isBool(object) || null == object)
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      return P.Error__objectToString(object);
    },
    AssertionError$: function(message) {
      return new P.AssertionError(message);
    },
    ArgumentError$: function(message) {
      return new P.ArgumentError(false, null, null, message);
    },
    ArgumentError$value: function(value, $name, message) {
      return new P.ArgumentError(true, value, $name, message);
    },
    RangeError$: function(message) {
      var _null = null;
      return new P.RangeError(_null, _null, false, _null, _null, message);
    },
    RangeError$value: function(value, $name) {
      return new P.RangeError(null, null, true, value, $name, "Value not in range");
    },
    RangeError$range: function(invalidValue, minValue, maxValue, $name, message) {
      return new P.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
    },
    RangeError_checkValidRange: function(start, end, $length) {
      if (0 > start || start > $length)
        throw H.wrapException(P.RangeError$range(start, 0, $length, "start", null));
      if (end != null) {
        if (start > end || end > $length)
          throw H.wrapException(P.RangeError$range(end, start, $length, "end", null));
        return end;
      }
      return $length;
    },
    RangeError_checkNotNegative: function(value, $name) {
      if (value < 0)
        throw H.wrapException(P.RangeError$range(value, 0, null, $name, null));
      return value;
    },
    IndexError$: function(invalidValue, indexable, $name, message, $length) {
      var t1 = H._asIntS($length == null ? J.get$length$asx(indexable) : $length);
      return new P.IndexError(t1, true, invalidValue, $name, "Index out of range");
    },
    UnsupportedError$: function(message) {
      return new P.UnsupportedError(message);
    },
    UnimplementedError$: function(message) {
      return new P.UnimplementedError(message);
    },
    StateError$: function(message) {
      return new P.StateError(message);
    },
    ConcurrentModificationError$: function(modifiedObject) {
      return new P.ConcurrentModificationError(modifiedObject);
    },
    Exception_Exception: function(message) {
      return new P._Exception(message);
    },
    FormatException$: function(message, source, offset) {
      return new P.FormatException(message, source, offset);
    },
    _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;
    },
    Duration_toString_sixDigits: function Duration_toString_sixDigits() {
    },
    Duration_toString_twoDigits: function Duration_toString_twoDigits() {
    },
    Error0: function Error0() {
    },
    AssertionError: function AssertionError(t0) {
      this.message = t0;
    },
    TypeError: function TypeError() {
    },
    NullThrownError: function NullThrownError() {
    },
    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() {
    },
    CyclicInitializationError: function CyclicInitializationError(t0) {
      this.variableName = t0;
    },
    _Exception: function _Exception(t0) {
      this.message = t0;
    },
    FormatException: function FormatException(t0, t1, t2) {
      this.message = t0;
      this.source = t1;
      this.offset = t2;
    },
    Iterable: function Iterable() {
    },
    Iterator: function Iterator() {
    },
    Null: function Null() {
    },
    Object: function Object() {
    },
    _StringStackTrace: function _StringStackTrace() {
    },
    StringBuffer: function StringBuffer(t0) {
      this._contents = t0;
    },
    _convertDartToNative_Value: function(value) {
      var array;
      if (value == null)
        return value;
      if (typeof value == "string" || typeof value == "number" || H._isBool(value))
        return value;
      if (type$.Map_dynamic_dynamic._is(value))
        return P.convertDartToNative_Dictionary(value);
      if (type$.List_dynamic._is(value)) {
        array = [];
        J.forEach$1$ax(value, new P._convertDartToNative_Value_closure(array));
        value = array;
      }
      return value;
    },
    convertDartToNative_Dictionary: function(dict) {
      var object = {};
      dict.forEach$1(0, new P.convertDartToNative_Dictionary_closure(object));
      return object;
    },
    _AcceptStructuredClone: function _AcceptStructuredClone() {
    },
    _AcceptStructuredClone_walk_closure: function _AcceptStructuredClone_walk_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _convertDartToNative_Value_closure: function _convertDartToNative_Value_closure(t0) {
      this.array = t0;
    },
    convertDartToNative_Dictionary_closure: function convertDartToNative_Dictionary_closure(t0) {
      this.object = t0;
    },
    _AcceptStructuredCloneDart2Js: function _AcceptStructuredCloneDart2Js(t0, t1) {
      this.values = t0;
      this.copies = t1;
      this.mustCopy = false;
    },
    promiseToFuture: function(jsPromise, $T) {
      var t1 = new P._Future($.Zone__current, $T._eval$1("_Future<0>")),
        completer = new P._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
      jsPromise.then(H.convertDartClosureToJS(new P.promiseToFuture_closure(completer, $T), 1), H.convertDartClosureToJS(new P.promiseToFuture_closure0(completer), 1));
      return t1;
    },
    promiseToFuture_closure: function promiseToFuture_closure(t0, t1) {
      this.completer = t0;
      this.T = t1;
    },
    promiseToFuture_closure0: function promiseToFuture_closure0(t0) {
      this.completer = t0;
    },
    _JSRandom: function _JSRandom() {
    }
  },
  W = {
    EventSource__factoryEventSource: function(url, eventSourceInitDict) {
      var t1 = new EventSource(url, P.convertDartToNative_Dictionary(eventSourceInitDict));
      return t1;
    },
    HttpRequest_request: function(url, method, sendData, withCredentials) {
      var t2, t3, t4,
        t1 = new P._Future($.Zone__current, type$._Future_HttpRequest),
        completer = new P._AsyncCompleter(t1, type$._AsyncCompleter_HttpRequest),
        xhr = new XMLHttpRequest();
      C.HttpRequest_methods.open$3$async(xhr, method, url, true);
      C.HttpRequest_methods.set$withCredentials(xhr, true);
      t2 = type$.nullable_void_Function_legacy_ProgressEvent;
      t3 = t2._as(new W.HttpRequest_request_closure(xhr, completer));
      type$.nullable_void_Function._as(null);
      t4 = type$.legacy_ProgressEvent;
      W._EventStreamSubscription$(xhr, "load", t3, false, t4);
      W._EventStreamSubscription$(xhr, "error", t2._as(completer.get$completeError()), false, t4);
      xhr.send(sendData);
      return t1;
    },
    _EventStreamSubscription$: function(_target, _eventType, onData, _useCapture, $T) {
      var t1 = onData == null ? null : W._wrapZone(new W._EventStreamSubscription_closure(onData), type$.Event);
      t1 = new W._EventStreamSubscription(_target, _eventType, t1, false, $T._eval$1("_EventStreamSubscription<0>"));
      t1._tryResume$0();
      return t1;
    },
    _wrapZone: function(callback, $T) {
      var t1 = $.Zone__current;
      if (t1 === C.C__RootZone)
        return callback;
      return t1.bindUnaryCallbackGuarded$1$1(callback, $T);
    },
    DomException: function DomException() {
    },
    Event0: function Event0() {
    },
    EventSource: function EventSource() {
    },
    EventTarget: function EventTarget() {
    },
    HttpRequest: function HttpRequest() {
    },
    HttpRequest_request_closure: function HttpRequest_request_closure(t0, t1) {
      this.xhr = t0;
      this.completer = t1;
    },
    HttpRequestEventTarget: function HttpRequestEventTarget() {
    },
    MessageEvent: function MessageEvent() {
    },
    ProgressEvent: function ProgressEvent() {
    },
    EventStreamProvider: function EventStreamProvider(t0, t1) {
      this._eventType = t0;
      this.$ti = t1;
    },
    _EventStream: function _EventStream(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_closure: function _EventStreamSubscription_onData_closure(t0) {
      this.handleData = t0;
    }
  },
  V = {ErrorResult: function ErrorResult(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    }},
  F = {ValueResult: function ValueResult(t0, t1) {
      this.value = t0;
      this.$ti = t1;
    },
    Logger_Logger: function($name) {
      return $.Logger__loggers.putIfAbsent$2($name, new F.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;
    }
  },
  G = {StreamQueue: function StreamQueue(t0, t1, t2, t3) {
      var _ = this;
      _._source = t0;
      _._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._completer = t0;
      this.$ti = t1;
    }},
  Q = {QueueList: function QueueList(t0) {
      var _ = this;
      _._table = null;
      _._queue_list$_tail = _._queue_list$_head = 0;
      _.$ti = t0;
    }, _QueueList_Object_ListMixin: function _QueueList_Object_ListMixin() {
    },
    createServiceObject: function(json, expectedTypes) {
      var t1, type, _null = null;
      if (json == null)
        return _null;
      if (type$.legacy_List_dynamic._is(json)) {
        t1 = J.map$1$1$ax(json, new Q.createServiceObject_closure(expectedTypes), type$.legacy_Object);
        return P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E"));
      } else if (type$.legacy_Map_dynamic_dynamic._is(json)) {
        type = H._asStringS(json.$index(0, "type"));
        if (type == null)
          if (expectedTypes.length === 1)
            type = (expectedTypes && C.JSArray_methods).get$first(expectedTypes);
          else
            return _null;
        else if (J.$eq$(json.$index(0, "type"), "@Instance") && J.$eq$(json.$index(0, "kind"), "Null") && !(expectedTypes && C.JSArray_methods).contains$1(expectedTypes, type))
          return _null;
        if ($._typeFactories.$index(0, type) == null)
          return _null;
        else
          return $._typeFactories.$index(0, type).call$1(json);
      } else
        return json;
    },
    _createSpecificObject: function(json, creator) {
      var t1, t2, key;
      if (json == null)
        return null;
      if (type$.legacy_List_dynamic._is(json)) {
        t1 = J.map$1$1$ax(json, new Q._createSpecificObject_closure(creator), type$.dynamic);
        return P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E"));
      } else if (type$.legacy_Map_dynamic_dynamic._is(json)) {
        t1 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.dynamic);
        for (t2 = json.get$keys(), t2 = t2.get$iterator(t2); t2.moveNext$0();) {
          key = H._asStringS(t2.get$current());
          t1.$indexSet(0, key, json.$index(0, key));
        }
        return creator.call$1(t1);
      } else
        return json;
    },
    _setIfNotNull: function(json, key, value) {
      if (value == null)
        return;
      json.$indexSet(0, key, value);
    },
    VmService$: function(inStream, writeMessage) {
      var t1 = type$.legacy_String;
      t1 = new Q.VmService(P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_Completer_dynamic), P.LinkedHashMap_LinkedHashMap$_empty(t1, t1), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_legacy_Future_legacy_Map_of_legacy_String_and_dynamic_Function_legacy_Map_of_legacy_String_and_dynamic), P.StreamController_StreamController$broadcast(true, t1), P.StreamController_StreamController$broadcast(true, t1), new P._AsyncCompleter(new P._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic), P.LinkedHashMap_LinkedHashMap$_empty(t1, type$.legacy_StreamController_legacy_Event));
      t1.VmService$5$disposeHandler$log$streamClosed(inStream, writeMessage, null, null, null);
      return t1;
    },
    ExtensionData_parse: function(json) {
      return json == null ? null : new Q.ExtensionData(json);
    },
    AllocationProfile_parse: function(json) {
      var t1, t2,
        _s24_ = "dateLastAccumulatorReset",
        _s17_ = "dateLastServiceGC";
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.AllocationProfile(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = Q.createServiceObject(json.$index(0, "members"), C.List_ClassHeapStats);
      if (t2 == null)
        t2 = [];
      t1.set$members(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_ClassHeapStats));
      t1.memoryUsage = type$.legacy_MemoryUsage._as(Q.createServiceObject(json.$index(0, "memoryUsage"), C.List_MemoryUsage));
      t1.dateLastAccumulatorReset = H._asIntS(typeof json.$index(0, _s24_) == "string" ? P.int_parse(H._asStringS(json.$index(0, _s24_))) : json.$index(0, _s24_));
      t1.dateLastServiceGC = H._asIntS(typeof json.$index(0, _s17_) == "string" ? P.int_parse(H._asStringS(json.$index(0, _s17_))) : json.$index(0, _s17_));
      return t1;
    },
    BoundField_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.BoundField();
      t1.decl = type$.legacy_FieldRef._as(Q.createServiceObject(json.$index(0, "decl"), C.List_FieldRef));
      t1.value = Q.createServiceObject(json.$index(0, "value"), C.List_InstanceRef_Sentinel);
      return t1;
    },
    BoundVariable_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.BoundVariable(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.value = Q.createServiceObject(json.$index(0, "value"), C.List_PAk);
      t1.declarationTokenPos = H._asIntS(json.$index(0, "declarationTokenPos"));
      t1.scopeStartTokenPos = H._asIntS(json.$index(0, "scopeStartTokenPos"));
      t1.scopeEndTokenPos = H._asIntS(json.$index(0, "scopeEndTokenPos"));
      return t1;
    },
    Breakpoint_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Breakpoint(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.breakpointNumber = H._asIntS(json.$index(0, "breakpointNumber"));
      t1.resolved = H._asBoolS(json.$index(0, "resolved"));
      t1.isSyntheticAsyncContinuation = H._asBoolS(json.$index(0, "isSyntheticAsyncContinuation"));
      t1.location = Q.createServiceObject(json.$index(0, "location"), C.List_oqh);
      return t1;
    },
    ClassRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ClassRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      return t1;
    },
    Class_parse: function(json) {
      var t1, t2, t3, t4, t5;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Class(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.error = type$.legacy_ErrorRef._as(Q.createServiceObject(json.$index(0, "error"), C.List_ErrorRef));
      t1.isAbstract = H._asBoolS(json.$index(0, "abstract"));
      t1.isConst = H._asBoolS(json.$index(0, "const"));
      t1.library = type$.legacy_LibraryRef._as(Q.createServiceObject(json.$index(0, "library"), C.List_LibraryRef));
      t1.location = type$.legacy_SourceLocation._as(Q.createServiceObject(json.$index(0, "location"), C.List_SourceLocation));
      t2 = type$.legacy_ClassRef;
      t1.superClass = t2._as(Q.createServiceObject(json.$index(0, "super"), C.List_ClassRef));
      t3 = type$.legacy_InstanceRef;
      t1.superType = t3._as(Q.createServiceObject(json.$index(0, "superType"), C.List_InstanceRef));
      t4 = Q.createServiceObject(json.$index(0, "interfaces"), C.List_InstanceRef);
      if (t4 == null)
        t4 = [];
      t5 = type$.Iterable_dynamic;
      t1.set$interfaces(P.List_List$from(t5._as(t4), t3));
      t1.mixin = t3._as(Q.createServiceObject(json.$index(0, "mixin"), C.List_InstanceRef));
      t3 = Q.createServiceObject(json.$index(0, "fields"), C.List_FieldRef);
      t1.set$fields(P.List_List$from(t5._as(t3 == null ? [] : t3), type$.legacy_FieldRef));
      t3 = Q.createServiceObject(json.$index(0, "functions"), C.List_FuncRef);
      t1.set$functions(P.List_List$from(t5._as(t3 == null ? [] : t3), type$.legacy_FuncRef));
      t3 = Q.createServiceObject(json.$index(0, "subclasses"), C.List_ClassRef);
      t1.set$subclasses(P.List_List$from(t5._as(t3 == null ? [] : t3), t2));
      return t1;
    },
    ClassHeapStats_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ClassHeapStats(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.classRef = type$.legacy_ClassRef._as(Q.createServiceObject(json.$index(0, "class"), C.List_ClassRef));
      t1.accumulatedSize = H._asIntS(json.$index(0, "accumulatedSize"));
      t1.bytesCurrent = H._asIntS(json.$index(0, "bytesCurrent"));
      t1.instancesAccumulated = H._asIntS(json.$index(0, "instancesAccumulated"));
      t1.instancesCurrent = H._asIntS(json.$index(0, "instancesCurrent"));
      return t1;
    },
    ClassList_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ClassList(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = Q.createServiceObject(json.$index(0, "classes"), C.List_ClassRef);
      if (t2 == null)
        t2 = [];
      t1.set$classes(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_ClassRef));
      return t1;
    },
    ClientName_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ClientName(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.name = H._asStringS(json.$index(0, "name"));
      return t1;
    },
    CodeRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.CodeRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.kind = H._asStringS(json.$index(0, "kind"));
      return t1;
    },
    Code_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Code(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.kind = H._asStringS(json.$index(0, "kind"));
      return t1;
    },
    ContextRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ContextRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.length = H._asIntS(json.$index(0, "length"));
      return t1;
    },
    Context_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Context(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.length = H._asIntS(json.$index(0, "length"));
      t1.parent = type$.legacy_Context._as(Q.createServiceObject(json.$index(0, "parent"), C.List_Context));
      t2 = Q.createServiceObject(json.$index(0, "variables"), C.List_ContextElement);
      if (t2 == null)
        t2 = [];
      t1.set$variables(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_ContextElement));
      return t1;
    },
    ContextElement_parse: function(json) {
      var t1 = new Q.ContextElement();
      t1.value = Q.createServiceObject(type$.legacy_Map_of_legacy_String_and_dynamic._as(json).$index(0, "value"), C.List_InstanceRef_Sentinel);
      return t1;
    },
    CpuSamples_parse: function(json) {
      var t1, t2, t3;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.CpuSamples(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.samplePeriod = H._asIntS(json.$index(0, "samplePeriod"));
      t1.maxStackDepth = H._asIntS(json.$index(0, "maxStackDepth"));
      t1.sampleCount = H._asIntS(json.$index(0, "sampleCount"));
      t1.timeSpan = H._asIntS(json.$index(0, "timeSpan"));
      t1.timeOriginMicros = H._asIntS(json.$index(0, "timeOriginMicros"));
      t1.timeExtentMicros = H._asIntS(json.$index(0, "timeExtentMicros"));
      t1.pid = H._asIntS(json.$index(0, "pid"));
      t2 = Q.createServiceObject(json.$index(0, "functions"), C.List_ProfileFunction);
      if (t2 == null)
        t2 = [];
      t3 = type$.Iterable_dynamic;
      t1.set$functions(P.List_List$from(t3._as(t2), type$.legacy_ProfileFunction));
      t2 = Q.createServiceObject(json.$index(0, "samples"), C.List_CpuSample);
      t1.set$samples(P.List_List$from(t3._as(t2 == null ? [] : t2), type$.legacy_CpuSample));
      return t1;
    },
    CpuSample_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.CpuSample();
      t1.tid = H._asIntS(json.$index(0, "tid"));
      t1.timestamp = H._asIntS(json.$index(0, "timestamp"));
      t1.vmTag = H._asStringS(json.$index(0, "vmTag"));
      t1.userTag = H._asStringS(json.$index(0, "userTag"));
      t1.truncated = H._asBoolS(json.$index(0, "truncated"));
      t1.set$stack(P.List_List$from(type$.Iterable_dynamic._as(json.$index(0, "stack")), type$.legacy_int));
      return t1;
    },
    ErrorRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ErrorRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.kind = H._asStringS(json.$index(0, "kind"));
      t1.message = H._asStringS(json.$index(0, "message"));
      return t1;
    },
    Error_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Error(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.kind = H._asStringS(json.$index(0, "kind"));
      t1.message = H._asStringS(json.$index(0, "message"));
      t2 = type$.legacy_InstanceRef;
      t1.exception = t2._as(Q.createServiceObject(json.$index(0, "exception"), C.List_InstanceRef));
      t1.stacktrace = t2._as(Q.createServiceObject(json.$index(0, "stacktrace"), C.List_InstanceRef));
      return t1;
    },
    Event_parse: function(json) {
      var t1, t2, _null = null,
        _s16_ = "pauseBreakpoints",
        _s14_ = "timelineEvents",
        _s14_0 = "updatedStreams";
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Event(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.kind = H._asStringS(json.$index(0, "kind"));
      t1.isolate = type$.legacy_IsolateRef._as(Q.createServiceObject(json.$index(0, "isolate"), C.List_IsolateRef));
      t1.vm = type$.legacy_VMRef._as(Q.createServiceObject(json.$index(0, "vm"), C.List_VMRef));
      t1.timestamp = H._asIntS(json.$index(0, "timestamp"));
      t2 = type$.legacy_Breakpoint;
      t1.breakpoint = t2._as(Q.createServiceObject(json.$index(0, "breakpoint"), C.List_Breakpoint));
      t1.set$pauseBreakpoints(json.$index(0, _s16_) == null ? _null : P.List_List$from(type$.Iterable_dynamic._as(Q.createServiceObject(json.$index(0, _s16_), C.List_Breakpoint)), t2));
      t1.topFrame = type$.legacy_Frame._as(Q.createServiceObject(json.$index(0, "topFrame"), C.List_Frame));
      t2 = type$.legacy_InstanceRef;
      t1.exception = t2._as(Q.createServiceObject(json.$index(0, "exception"), C.List_InstanceRef));
      t1.bytes = H._asStringS(json.$index(0, "bytes"));
      t1.inspectee = t2._as(Q.createServiceObject(json.$index(0, "inspectee"), C.List_InstanceRef));
      t1.extensionRPC = H._asStringS(json.$index(0, "extensionRPC"));
      t1.extensionKind = H._asStringS(json.$index(0, "extensionKind"));
      t2 = type$.legacy_Map_dynamic_dynamic._as(json.$index(0, "extensionData"));
      t1.extensionData = t2 == null ? _null : new Q.ExtensionData(t2);
      t1.set$timelineEvents(json.$index(0, _s14_) == null ? _null : P.List_List$from(type$.Iterable_dynamic._as(Q.createServiceObject(json.$index(0, _s14_), C.List_TimelineEvent)), type$.legacy_TimelineEvent));
      t1.set$updatedStreams(json.$index(0, _s14_0) == null ? _null : P.List_List$from(type$.Iterable_dynamic._as(json.$index(0, _s14_0)), type$.legacy_String));
      t1.atAsyncSuspension = H._asBoolS(json.$index(0, "atAsyncSuspension"));
      t1.status = H._asStringS(json.$index(0, "status"));
      t1.logRecord = type$.legacy_LogRecord._as(Q.createServiceObject(json.$index(0, "logRecord"), C.List_LogRecord));
      t1.service = H._asStringS(json.$index(0, "service"));
      t1.method = H._asStringS(json.$index(0, "method"));
      t1.alias = H._asStringS(json.$index(0, "alias"));
      t1.flag = H._asStringS(json.$index(0, "flag"));
      t1.newValue = H._asStringS(json.$index(0, "newValue"));
      t1.last = H._asBoolS(json.$index(0, "last"));
      t1.data = type$.legacy_ByteData._as(json.$index(0, "data"));
      return t1;
    },
    FieldRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.FieldRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.owner = type$.legacy_ObjRef._as(Q.createServiceObject(json.$index(0, "owner"), C.List_ObjRef));
      t1.declaredType = type$.legacy_InstanceRef._as(Q.createServiceObject(json.$index(0, "declaredType"), C.List_InstanceRef));
      t1.isConst = H._asBoolS(json.$index(0, "const"));
      t1.isFinal = H._asBoolS(json.$index(0, "final"));
      t1.isStatic = H._asBoolS(json.$index(0, "static"));
      return t1;
    },
    Field_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Field(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.owner = type$.legacy_ObjRef._as(Q.createServiceObject(json.$index(0, "owner"), C.List_ObjRef));
      t2 = type$.legacy_InstanceRef;
      t1.declaredType = t2._as(Q.createServiceObject(json.$index(0, "declaredType"), C.List_InstanceRef));
      t1.isConst = H._asBoolS(json.$index(0, "const"));
      t1.isFinal = H._asBoolS(json.$index(0, "final"));
      t1.isStatic = H._asBoolS(json.$index(0, "static"));
      t1.staticValue = t2._as(Q.createServiceObject(json.$index(0, "staticValue"), C.List_InstanceRef));
      t1.location = type$.legacy_SourceLocation._as(Q.createServiceObject(json.$index(0, "location"), C.List_SourceLocation));
      return t1;
    },
    Flag_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Flag();
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.comment = H._asStringS(json.$index(0, "comment"));
      t1.modified = H._asBoolS(json.$index(0, "modified"));
      t1.valueAsString = H._asStringS(json.$index(0, "valueAsString"));
      return t1;
    },
    FlagList_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.FlagList(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = Q.createServiceObject(json.$index(0, "flags"), C.List_Flag);
      if (t2 == null)
        t2 = [];
      t1.set$flags(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_Flag));
      return t1;
    },
    Frame_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Frame(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.index = H._asIntS(json.$index(0, "index"));
      t1.$function = type$.legacy_FuncRef._as(Q.createServiceObject(json.$index(0, "function"), C.List_FuncRef));
      t1.code = type$.legacy_CodeRef._as(Q.createServiceObject(json.$index(0, "code"), C.List_CodeRef));
      t1.location = type$.legacy_SourceLocation._as(Q.createServiceObject(json.$index(0, "location"), C.List_SourceLocation));
      t1.set$vars(json.$index(0, "vars") == null ? null : P.List_List$from(type$.Iterable_dynamic._as(Q.createServiceObject(json.$index(0, "vars"), C.List_BoundVariable)), type$.legacy_BoundVariable));
      t1.kind = H._asStringS(json.$index(0, "kind"));
      return t1;
    },
    FuncRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.FuncRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.owner = Q.createServiceObject(json.$index(0, "owner"), C.List_LibraryRef_ClassRef_FuncRef);
      t1.isStatic = H._asBoolS(json.$index(0, "static"));
      t1.isConst = H._asBoolS(json.$index(0, "const"));
      return t1;
    },
    Func_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Func(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.owner = Q.createServiceObject(json.$index(0, "owner"), C.List_LibraryRef_ClassRef_FuncRef);
      t1.isStatic = H._asBoolS(json.$index(0, "static"));
      t1.isConst = H._asBoolS(json.$index(0, "const"));
      t1.location = type$.legacy_SourceLocation._as(Q.createServiceObject(json.$index(0, "location"), C.List_SourceLocation));
      t1.code = type$.legacy_CodeRef._as(Q.createServiceObject(json.$index(0, "code"), C.List_CodeRef));
      return t1;
    },
    InstanceRef_parse: function(json) {
      var t1 = Q.InstanceRef$_fromJson(type$.legacy_Map_of_legacy_String_and_dynamic._as(json));
      return t1;
    },
    InstanceRef$_fromJson: function(json) {
      var t1 = new Q.InstanceRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.InstanceRef$_fromJson$1(json);
      return t1;
    },
    Instance_parse: function(json) {
      var t1 = Q.Instance$_fromJson(type$.legacy_Map_of_legacy_String_and_dynamic._as(json));
      return t1;
    },
    Instance$_fromJson: function(json) {
      var t1 = new Q.Instance(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.Instance$_fromJson$1(json);
      return t1;
    },
    IsolateRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.IsolateRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.id = H._asStringS(json.$index(0, "id"));
      t1.number = H._asStringS(json.$index(0, "number"));
      t1.name = H._asStringS(json.$index(0, "name"));
      return t1;
    },
    Isolate_parse: function(json) {
      var t1, t2, t3, t4,
        _s13_ = "extensionRPCs";
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Isolate(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.id = H._asStringS(json.$index(0, "id"));
      t1.number = H._asStringS(json.$index(0, "number"));
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.startTime = H._asIntS(json.$index(0, "startTime"));
      t1.runnable = H._asBoolS(json.$index(0, "runnable"));
      t1.livePorts = H._asIntS(json.$index(0, "livePorts"));
      t1.pauseOnExit = H._asBoolS(json.$index(0, "pauseOnExit"));
      t1.pauseEvent = type$.legacy_Event._as(Q.createServiceObject(json.$index(0, "pauseEvent"), C.List_Event));
      t2 = type$.legacy_LibraryRef;
      t1.rootLib = t2._as(Q.createServiceObject(json.$index(0, "rootLib"), C.List_LibraryRef));
      t3 = Q.createServiceObject(json.$index(0, "libraries"), C.List_LibraryRef);
      if (t3 == null)
        t3 = [];
      t4 = type$.Iterable_dynamic;
      t1.set$libraries(P.List_List$from(t4._as(t3), t2));
      t2 = Q.createServiceObject(json.$index(0, "breakpoints"), C.List_Breakpoint);
      t1.set$breakpoints(P.List_List$from(t4._as(t2 == null ? [] : t2), type$.legacy_Breakpoint));
      t1.error = type$.legacy_Error._as(Q.createServiceObject(json.$index(0, "error"), C.List_Error));
      t1.exceptionPauseMode = H._asStringS(json.$index(0, "exceptionPauseMode"));
      t1.set$extensionRPCs(json.$index(0, _s13_) == null ? null : P.List_List$from(t4._as(json.$index(0, _s13_)), type$.legacy_String));
      return t1;
    },
    IsolateGroupRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.IsolateGroupRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.id = H._asStringS(json.$index(0, "id"));
      t1.number = H._asStringS(json.$index(0, "number"));
      t1.name = H._asStringS(json.$index(0, "name"));
      return t1;
    },
    IsolateGroup_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.IsolateGroup(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.id = H._asStringS(json.$index(0, "id"));
      t1.number = H._asStringS(json.$index(0, "number"));
      t1.name = H._asStringS(json.$index(0, "name"));
      t2 = Q.createServiceObject(json.$index(0, "isolates"), C.List_IsolateRef);
      if (t2 == null)
        t2 = [];
      t1.set$isolates(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_IsolateRef));
      return t1;
    },
    InboundReferences_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.InboundReferences(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = Q.createServiceObject(json.$index(0, "references"), C.List_InboundReference);
      if (t2 == null)
        t2 = [];
      t1.set$references(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_InboundReference));
      return t1;
    },
    InboundReference_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.InboundReference();
      t1.source = type$.legacy_ObjRef._as(Q.createServiceObject(json.$index(0, "source"), C.List_ObjRef));
      t1.parentListIndex = H._asIntS(json.$index(0, "parentListIndex"));
      t1.parentField = type$.legacy_FieldRef._as(Q.createServiceObject(json.$index(0, "parentField"), C.List_FieldRef));
      return t1;
    },
    InstanceSet_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.InstanceSet(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.totalCount = H._asIntS(json.$index(0, "totalCount"));
      t2 = json.$index(0, "instances");
      t1.set$instances(P.List_List$from(type$.Iterable_dynamic._as(Q.createServiceObject(t2 == null ? json.$index(0, "samples") : t2, C.List_ObjRef)), type$.legacy_ObjRef));
      return t1;
    },
    LibraryRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.LibraryRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.uri = H._asStringS(json.$index(0, "uri"));
      return t1;
    },
    Library_parse: function(json) {
      var t1, t2, t3;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Library(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.uri = H._asStringS(json.$index(0, "uri"));
      t1.debuggable = H._asBoolS(json.$index(0, "debuggable"));
      t2 = type$.Iterable_dynamic;
      t1.set$dependencies(P.List_List$from(t2._as(Q._createSpecificObject(json.$index(0, "dependencies"), Q.vm_service_LibraryDependency_parse$closure())), type$.legacy_LibraryDependency));
      t3 = Q.createServiceObject(json.$index(0, "scripts"), C.List_ScriptRef);
      t1.set$scripts(P.List_List$from(t2._as(t3 == null ? [] : t3), type$.legacy_ScriptRef));
      t3 = Q.createServiceObject(json.$index(0, "variables"), C.List_FieldRef);
      t1.set$variables(P.List_List$from(t2._as(t3 == null ? [] : t3), type$.legacy_FieldRef));
      t3 = Q.createServiceObject(json.$index(0, "functions"), C.List_FuncRef);
      t1.set$functions(P.List_List$from(t2._as(t3 == null ? [] : t3), type$.legacy_FuncRef));
      t3 = Q.createServiceObject(json.$index(0, "classes"), C.List_ClassRef);
      t1.set$classes(P.List_List$from(t2._as(t3 == null ? [] : t3), type$.legacy_ClassRef));
      return t1;
    },
    LibraryDependency_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      if (json == null)
        t1 = null;
      else {
        t1 = new Q.LibraryDependency();
        t1.isImport = H._asBoolS(json.$index(0, "isImport"));
        t1.isDeferred = H._asBoolS(json.$index(0, "isDeferred"));
        t1.prefix = H._asStringS(json.$index(0, "prefix"));
        t1.target = type$.legacy_LibraryRef._as(Q.createServiceObject(json.$index(0, "target"), C.List_LibraryRef));
      }
      return t1;
    },
    LogRecord_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.LogRecord(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = type$.legacy_InstanceRef;
      t1.message = t2._as(Q.createServiceObject(json.$index(0, "message"), C.List_InstanceRef));
      t1.time = H._asIntS(json.$index(0, "time"));
      t1.level = H._asIntS(json.$index(0, "level"));
      t1.sequenceNumber = H._asIntS(json.$index(0, "sequenceNumber"));
      t1.loggerName = t2._as(Q.createServiceObject(json.$index(0, "loggerName"), C.List_InstanceRef));
      t1.zone = t2._as(Q.createServiceObject(json.$index(0, "zone"), C.List_InstanceRef));
      t1.error = t2._as(Q.createServiceObject(json.$index(0, "error"), C.List_InstanceRef));
      t1.stackTrace = t2._as(Q.createServiceObject(json.$index(0, "stackTrace"), C.List_InstanceRef));
      return t1;
    },
    MapAssociation_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      if (json == null)
        t1 = null;
      else {
        t1 = new Q.MapAssociation();
        t1.key = Q.createServiceObject(json.$index(0, "key"), C.List_InstanceRef_Sentinel);
        t1.value = Q.createServiceObject(json.$index(0, "value"), C.List_InstanceRef_Sentinel);
      }
      return t1;
    },
    MemoryUsage_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.MemoryUsage(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.externalUsage = H._asIntS(json.$index(0, "externalUsage"));
      t1.heapCapacity = H._asIntS(json.$index(0, "heapCapacity"));
      t1.heapUsage = H._asIntS(json.$index(0, "heapUsage"));
      return t1;
    },
    Message_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Message(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.index = H._asIntS(json.$index(0, "index"));
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.messageObjectId = H._asStringS(json.$index(0, "messageObjectId"));
      t1.size = H._asIntS(json.$index(0, "size"));
      t1.handler = type$.legacy_FuncRef._as(Q.createServiceObject(json.$index(0, "handler"), C.List_FuncRef));
      t1.location = type$.legacy_SourceLocation._as(Q.createServiceObject(json.$index(0, "location"), C.List_SourceLocation));
      return t1;
    },
    NativeFunction_parse: function(json) {
      var t1 = new Q.NativeFunction();
      t1.name = H._asStringS(type$.legacy_Map_of_legacy_String_and_dynamic._as(json).$index(0, "name"));
      return t1;
    },
    NullValRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.NullValRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.InstanceRef$_fromJson$1(json);
      t1.NullValRef_valueAsString = H._asStringS(json.$index(0, "valueAsString"));
      return t1;
    },
    NullVal_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.NullVal(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.Instance$_fromJson$1(json);
      t1.NullVal_valueAsString = H._asStringS(json.$index(0, "valueAsString"));
      return t1;
    },
    ObjRef_parse: function(json) {
      var t1 = Q.ObjRef$_fromJson(type$.legacy_Map_of_legacy_String_and_dynamic._as(json));
      return t1;
    },
    ObjRef$_fromJson: function(json) {
      var t1 = new Q.ObjRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      return t1;
    },
    Obj_parse: function(json) {
      var t1 = Q.Obj$_fromJson(type$.legacy_Map_of_legacy_String_and_dynamic._as(json));
      return t1;
    },
    Obj$_fromJson: function(json) {
      var t1 = new Q.Obj(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      return t1;
    },
    ProfileFunction_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ProfileFunction();
      t1.kind = H._asStringS(json.$index(0, "kind"));
      t1.inclusiveTicks = H._asIntS(json.$index(0, "inclusiveTicks"));
      t1.exclusiveTicks = H._asIntS(json.$index(0, "exclusiveTicks"));
      t1.resolvedUrl = H._asStringS(json.$index(0, "resolvedUrl"));
      t1.$function = Q.createServiceObject(json.$index(0, "function"), C.List_dynamic);
      return t1;
    },
    ProtocolList_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ProtocolList(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = Q.createServiceObject(json.$index(0, "protocols"), C.List_Protocol);
      if (t2 == null)
        t2 = [];
      t1.set$protocols(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_Protocol));
      return t1;
    },
    Protocol_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Protocol();
      t1.protocolName = H._asStringS(json.$index(0, "protocolName"));
      t1.major = H._asIntS(json.$index(0, "major"));
      t1.minor = H._asIntS(json.$index(0, "minor"));
      return t1;
    },
    ReloadReport_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ReloadReport(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.success = H._asBoolS(json.$index(0, "success"));
      return t1;
    },
    RetainingObject_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.RetainingObject();
      t2 = type$.legacy_ObjRef;
      t1.value = t2._as(Q.createServiceObject(json.$index(0, "value"), C.List_ObjRef));
      t1.parentListIndex = H._asIntS(json.$index(0, "parentListIndex"));
      t1.parentMapKey = t2._as(Q.createServiceObject(json.$index(0, "parentMapKey"), C.List_ObjRef));
      t1.parentField = H._asStringS(json.$index(0, "parentField"));
      return t1;
    },
    RetainingPath_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.RetainingPath(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.length = H._asIntS(json.$index(0, "length"));
      t1.gcRootType = H._asStringS(json.$index(0, "gcRootType"));
      t2 = Q.createServiceObject(json.$index(0, "elements"), C.List_RetainingObject);
      if (t2 == null)
        t2 = [];
      t1.set$elements(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_RetainingObject));
      return t1;
    },
    Response_parse: function(json) {
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      return json == null ? null : Q.Response$_fromJson(json);
    },
    Response$_fromJson: function(json) {
      var t1 = new Q.Response(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      return t1;
    },
    Sentinel_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Sentinel(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.kind = H._asStringS(json.$index(0, "kind"));
      t1.valueAsString = H._asStringS(json.$index(0, "valueAsString"));
      return t1;
    },
    Sentinel$_fromJson: function(json) {
      var t1 = new Q.Sentinel(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.kind = H._asStringS(json.$index(0, "kind"));
      t1.valueAsString = H._asStringS(json.$index(0, "valueAsString"));
      return t1;
    },
    ScriptRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ScriptRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.uri = H._asStringS(json.$index(0, "uri"));
      return t1;
    },
    Script_parse: function(json) {
      var t1 = Q.Script$_fromJson(type$.legacy_Map_of_legacy_String_and_dynamic._as(json));
      return t1;
    },
    Script$_fromJson: function(json) {
      var t1 = type$.legacy_int;
      t1 = new Q.Script(P.LinkedHashMap_LinkedHashMap$_empty(t1, t1), P.LinkedHashMap_LinkedHashMap$_empty(t1, t1), json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.Script$_fromJson$1(json);
      return t1;
    },
    ScriptList_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.ScriptList(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = Q.createServiceObject(json.$index(0, "scripts"), C.List_ScriptRef);
      if (t2 == null)
        t2 = [];
      t1.set$scripts(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_ScriptRef));
      return t1;
    },
    SourceLocation_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.SourceLocation(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.script = type$.legacy_ScriptRef._as(Q.createServiceObject(json.$index(0, "script"), C.List_ScriptRef));
      t1.tokenPos = H._asIntS(json.$index(0, "tokenPos"));
      t1.endTokenPos = H._asIntS(json.$index(0, "endTokenPos"));
      return t1;
    },
    SourceReport_parse: function(json) {
      var t1, t2, t3;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.SourceReport(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = type$.Iterable_dynamic;
      t1.set$ranges(P.List_List$from(t2._as(Q._createSpecificObject(json.$index(0, "ranges"), Q.vm_service_SourceReportRange_parse$closure())), type$.legacy_SourceReportRange));
      t3 = Q.createServiceObject(json.$index(0, "scripts"), C.List_ScriptRef);
      t1.set$scripts(P.List_List$from(t2._as(t3 == null ? [] : t3), type$.legacy_ScriptRef));
      return t1;
    },
    SourceReportCoverage_parse: function(json) {
      var t1, t2, t3;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      if (json == null)
        t1 = null;
      else {
        t1 = new Q.SourceReportCoverage();
        t2 = type$.Iterable_dynamic;
        t3 = type$.legacy_int;
        t1.set$hits(P.List_List$from(t2._as(json.$index(0, "hits")), t3));
        t1.set$misses(P.List_List$from(t2._as(json.$index(0, "misses")), t3));
      }
      return t1;
    },
    SourceReportRange_parse: function(json) {
      var t1,
        _s19_ = "possibleBreakpoints";
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      if (json == null)
        t1 = null;
      else {
        t1 = new Q.SourceReportRange();
        t1.scriptIndex = H._asIntS(json.$index(0, "scriptIndex"));
        t1.startPos = H._asIntS(json.$index(0, "startPos"));
        t1.endPos = H._asIntS(json.$index(0, "endPos"));
        t1.compiled = H._asBoolS(json.$index(0, "compiled"));
        t1.error = type$.legacy_ErrorRef._as(Q.createServiceObject(json.$index(0, "error"), C.List_ErrorRef));
        t1.coverage = type$.legacy_SourceReportCoverage._as(Q._createSpecificObject(json.$index(0, "coverage"), Q.vm_service_SourceReportCoverage_parse$closure()));
        t1.set$possibleBreakpoints(json.$index(0, _s19_) == null ? null : P.List_List$from(type$.Iterable_dynamic._as(json.$index(0, _s19_)), type$.legacy_int));
      }
      return t1;
    },
    Stack_parse: function(json) {
      var t1, t2, t3, t4,
        _s17_ = "asyncCausalFrames",
        _s13_ = "awaiterFrames";
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Stack(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = Q.createServiceObject(json.$index(0, "frames"), C.List_Frame);
      if (t2 == null)
        t2 = [];
      t3 = type$.Iterable_dynamic;
      t4 = type$.legacy_Frame;
      t1.set$frames(P.List_List$from(t3._as(t2), t4));
      t1.set$asyncCausalFrames(json.$index(0, _s17_) == null ? null : P.List_List$from(t3._as(Q.createServiceObject(json.$index(0, _s17_), C.List_Frame)), t4));
      t1.set$awaiterFrames(json.$index(0, _s13_) == null ? null : P.List_List$from(t3._as(Q.createServiceObject(json.$index(0, _s13_), C.List_Frame)), t4));
      t2 = Q.createServiceObject(json.$index(0, "messages"), C.List_Message);
      t1.set$messages(P.List_List$from(t3._as(t2 == null ? [] : t2), type$.legacy_Message));
      return t1;
    },
    Success_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Success(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      return t1;
    },
    Timeline_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Timeline(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t2 = Q.createServiceObject(json.$index(0, "traceEvents"), C.List_TimelineEvent);
      if (t2 == null)
        t2 = [];
      t1.set$traceEvents(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_TimelineEvent));
      t1.timeOriginMicros = H._asIntS(json.$index(0, "timeOriginMicros"));
      t1.timeExtentMicros = H._asIntS(json.$index(0, "timeExtentMicros"));
      return t1;
    },
    TimelineEvent_parse: function(json) {
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      return new Q.TimelineEvent(json);
    },
    TimelineFlags_parse: function(json) {
      var t1, t2, t3;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.TimelineFlags(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.recorderName = H._asStringS(json.$index(0, "recorderName"));
      t2 = type$.Iterable_dynamic;
      t3 = type$.legacy_String;
      t1.set$availableStreams(P.List_List$from(t2._as(json.$index(0, "availableStreams")), t3));
      t1.set$recordedStreams(P.List_List$from(t2._as(json.$index(0, "recordedStreams")), t3));
      return t1;
    },
    Timestamp_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Timestamp(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.timestamp = H._asIntS(json.$index(0, "timestamp"));
      return t1;
    },
    TypeArgumentsRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.TypeArgumentsRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.ObjRef$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      return t1;
    },
    TypeArguments_parse: function(json) {
      var t1, t2;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.TypeArguments(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.Obj$_fromJson$1(json);
      t1.name = H._asStringS(json.$index(0, "name"));
      t2 = Q.createServiceObject(json.$index(0, "types"), C.List_InstanceRef);
      if (t2 == null)
        t2 = [];
      t1.set$types(P.List_List$from(type$.Iterable_dynamic._as(t2), type$.legacy_InstanceRef));
      return t1;
    },
    UnresolvedSourceLocation_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.UnresolvedSourceLocation(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.script = type$.legacy_ScriptRef._as(Q.createServiceObject(json.$index(0, "script"), C.List_ScriptRef));
      t1.scriptUri = H._asStringS(json.$index(0, "scriptUri"));
      t1.tokenPos = H._asIntS(json.$index(0, "tokenPos"));
      t1.line = H._asIntS(json.$index(0, "line"));
      t1.column = H._asIntS(json.$index(0, "column"));
      return t1;
    },
    Version_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.Version(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.major = H._asIntS(json.$index(0, "major"));
      t1.minor = H._asIntS(json.$index(0, "minor"));
      return t1;
    },
    VMRef_parse: function(json) {
      var t1;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.VMRef(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.name = H._asStringS(json.$index(0, "name"));
      return t1;
    },
    VM_parse: function(json) {
      var t1, t2, t3;
      type$.legacy_Map_of_legacy_String_and_dynamic._as(json);
      t1 = new Q.VM(json);
      t1.type = H._asStringS(json.$index(0, "type"));
      t1.name = H._asStringS(json.$index(0, "name"));
      t1.architectureBits = H._asIntS(json.$index(0, "architectureBits"));
      t1.hostCPU = H._asStringS(json.$index(0, "hostCPU"));
      t1.operatingSystem = H._asStringS(json.$index(0, "operatingSystem"));
      t1.targetCPU = H._asStringS(json.$index(0, "targetCPU"));
      t1.version = H._asStringS(json.$index(0, "version"));
      t1.pid = H._asIntS(json.$index(0, "pid"));
      t1.startTime = H._asIntS(json.$index(0, "startTime"));
      t2 = Q.createServiceObject(json.$index(0, "isolates"), C.List_IsolateRef);
      if (t2 == null)
        t2 = [];
      t3 = type$.Iterable_dynamic;
      t1.set$isolates(P.List_List$from(t3._as(t2), type$.legacy_IsolateRef));
      t2 = Q.createServiceObject(json.$index(0, "isolateGroups"), C.List_IsolateGroupRef);
      t1.set$isolateGroups(P.List_List$from(t3._as(t2 == null ? [] : t2), type$.legacy_IsolateGroupRef));
      return t1;
    },
    createServiceObject_closure: function createServiceObject_closure(t0) {
      this.expectedTypes = t0;
    },
    _createSpecificObject_closure: function _createSpecificObject_closure(t0) {
      this.creator = t0;
    },
    VmService: function VmService(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._writeMessage = null;
      _._id = 0;
      _._completers = t0;
      _._methodCalls = t1;
      _._services = t2;
      _._log = null;
      _._onSend = t3;
      _._onReceive = t4;
      _._onDoneCompleter = t5;
      _._eventControllers = t6;
    },
    VmService_closure: function VmService_closure(t0) {
      this.$this = t0;
    },
    RPCError: function RPCError(t0, t1, t2, t3) {
      var _ = this;
      _.callingMethod = t0;
      _.code = t1;
      _.message = t2;
      _.data = t3;
    },
    SentinelException: function SentinelException(t0, t1) {
      this.callingMethod = t0;
      this.sentinel = t1;
    },
    ExtensionData: function ExtensionData(t0) {
      this.data = t0;
    },
    _NullLog: function _NullLog() {
    },
    AllocationProfile: function AllocationProfile(t0) {
      var _ = this;
      _.dateLastServiceGC = _.dateLastAccumulatorReset = _.memoryUsage = _.members = null;
      _.json = t0;
      _.type = null;
    },
    AllocationProfile_toJson_closure: function AllocationProfile_toJson_closure() {
    },
    BoundField: function BoundField() {
      this.value = this.decl = null;
    },
    BoundVariable: function BoundVariable(t0) {
      var _ = this;
      _.scopeEndTokenPos = _.scopeStartTokenPos = _.declarationTokenPos = _.value = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Breakpoint: function Breakpoint(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.location = _.isSyntheticAsyncContinuation = _.resolved = _.breakpointNumber = null;
      _.json = t0;
      _.type = null;
    },
    ClassRef: function ClassRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Class: function Class(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.subclasses = _.functions = _.fields = _.mixin = _.interfaces = _.superType = _.superClass = _.location = _.library = _.isConst = _.isAbstract = _.error = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Class_toJson_closure: function Class_toJson_closure() {
    },
    Class_toJson_closure0: function Class_toJson_closure0() {
    },
    Class_toJson_closure1: function Class_toJson_closure1() {
    },
    Class_toJson_closure2: function Class_toJson_closure2() {
    },
    ClassHeapStats: function ClassHeapStats(t0) {
      var _ = this;
      _.instancesCurrent = _.instancesAccumulated = _.bytesCurrent = _.accumulatedSize = _.classRef = null;
      _.json = t0;
      _.type = null;
    },
    ClassList: function ClassList(t0) {
      this.classes = null;
      this.json = t0;
      this.type = null;
    },
    ClassList_toJson_closure: function ClassList_toJson_closure() {
    },
    ClientName: function ClientName(t0) {
      this.name = null;
      this.json = t0;
      this.type = null;
    },
    CodeRef: function CodeRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.kind = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Code: function Code(t0) {
      var _ = this;
      _.fixedId = _.id = _.kind = _.name = null;
      _.json = t0;
      _.type = null;
    },
    ContextRef: function ContextRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.length = null;
      _.json = t0;
      _.type = null;
    },
    Context: function Context(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.variables = _.parent = _.length = null;
      _.json = t0;
      _.type = null;
    },
    Context_toJson_closure: function Context_toJson_closure() {
    },
    ContextElement: function ContextElement() {
      this.value = null;
    },
    CpuSamples: function CpuSamples(t0) {
      var _ = this;
      _.samples = _.functions = _.pid = _.timeExtentMicros = _.timeOriginMicros = _.timeSpan = _.sampleCount = _.maxStackDepth = _.samplePeriod = null;
      _.json = t0;
      _.type = null;
    },
    CpuSamples_toJson_closure: function CpuSamples_toJson_closure() {
    },
    CpuSamples_toJson_closure0: function CpuSamples_toJson_closure0() {
    },
    CpuSample: function CpuSample() {
      var _ = this;
      _.stack = _.truncated = _.userTag = _.vmTag = _.timestamp = _.tid = null;
    },
    CpuSample_toJson_closure: function CpuSample_toJson_closure() {
    },
    ErrorRef: function ErrorRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.message = _.kind = null;
      _.json = t0;
      _.type = null;
    },
    Error: function Error(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.stacktrace = _.exception = _.message = _.kind = null;
      _.json = t0;
      _.type = null;
    },
    Event: function Event(t0) {
      var _ = this;
      _.data = _.last = _.newValue = _.flag = _.alias = _.method = _.service = _.logRecord = _.status = _.atAsyncSuspension = _.updatedStreams = _.timelineEvents = _.extensionData = _.extensionKind = _.extensionRPC = _.inspectee = _.bytes = _.exception = _.topFrame = _.pauseBreakpoints = _.breakpoint = _.timestamp = _.vm = _.isolate = _.kind = null;
      _.json = t0;
      _.type = null;
    },
    Event_toJson_closure: function Event_toJson_closure() {
    },
    Event_toJson_closure0: function Event_toJson_closure0() {
    },
    Event_toJson_closure1: function Event_toJson_closure1() {
    },
    FieldRef: function FieldRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.isStatic = _.isFinal = _.isConst = _.declaredType = _.owner = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Field: function Field(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.location = _.staticValue = _.isStatic = _.isFinal = _.isConst = _.declaredType = _.owner = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Flag: function Flag() {
      var _ = this;
      _.valueAsString = _.modified = _.comment = _.name = null;
    },
    FlagList: function FlagList(t0) {
      this.flags = null;
      this.json = t0;
      this.type = null;
    },
    FlagList_toJson_closure: function FlagList_toJson_closure() {
    },
    Frame: function Frame(t0) {
      var _ = this;
      _.kind = _.vars = _.location = _.code = _.$function = _.index = null;
      _.json = t0;
      _.type = null;
    },
    Frame_toJson_closure: function Frame_toJson_closure() {
    },
    FuncRef: function FuncRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.isConst = _.isStatic = _.owner = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Func: function Func(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.code = _.location = _.isConst = _.isStatic = _.owner = _.name = null;
      _.json = t0;
      _.type = null;
    },
    InstanceRef: function InstanceRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.closureContext = _.closureFunction = _.pattern = _.parameterizedClass = _.typeClass = _.name = _.length = _.valueAsStringIsTruncated = _.valueAsString = _.classRef = _.kind = null;
      _.json = t0;
      _.type = null;
    },
    Instance: function Instance(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.bound = _.targetType = _.parameterIndex = _.typeArguments = _.propertyValue = _.propertyKey = _.isMultiLine = _.isCaseSensitive = _.closureContext = _.closureFunction = _.pattern = _.mirrorReferent = _.bytes = _.associations = _.elements = _.fields = _.parameterizedClass = _.typeClass = _.name = _.count = _.offset = _.length = _.valueAsStringIsTruncated = _.valueAsString = _.Instance_classRef = _.kind = null;
      _.json = t0;
      _.type = null;
    },
    Instance_toJson_closure: function Instance_toJson_closure() {
    },
    Instance_toJson_closure0: function Instance_toJson_closure0() {
    },
    Instance_toJson_closure1: function Instance_toJson_closure1() {
    },
    IsolateRef: function IsolateRef(t0) {
      var _ = this;
      _.name = _.number = _.id = null;
      _.json = t0;
      _.type = null;
    },
    Isolate: function Isolate(t0) {
      var _ = this;
      _.extensionRPCs = _.exceptionPauseMode = _.error = _.breakpoints = _.libraries = _.rootLib = _.pauseEvent = _.pauseOnExit = _.livePorts = _.runnable = _.startTime = _.name = _.number = _.id = null;
      _.json = t0;
      _.type = null;
    },
    Isolate_toJson_closure: function Isolate_toJson_closure() {
    },
    Isolate_toJson_closure0: function Isolate_toJson_closure0() {
    },
    Isolate_toJson_closure1: function Isolate_toJson_closure1() {
    },
    IsolateGroupRef: function IsolateGroupRef(t0) {
      var _ = this;
      _.name = _.number = _.id = null;
      _.json = t0;
      _.type = null;
    },
    IsolateGroup: function IsolateGroup(t0) {
      var _ = this;
      _.isolates = _.name = _.number = _.id = null;
      _.json = t0;
      _.type = null;
    },
    IsolateGroup_toJson_closure: function IsolateGroup_toJson_closure() {
    },
    InboundReferences: function InboundReferences(t0) {
      this.references = null;
      this.json = t0;
      this.type = null;
    },
    InboundReferences_toJson_closure: function InboundReferences_toJson_closure() {
    },
    InboundReference: function InboundReference() {
      this.parentField = this.parentListIndex = this.source = null;
    },
    InstanceSet: function InstanceSet(t0) {
      var _ = this;
      _.instances = _.totalCount = null;
      _.json = t0;
      _.type = null;
    },
    InstanceSet_toJson_closure: function InstanceSet_toJson_closure() {
    },
    LibraryRef: function LibraryRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.uri = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Library: function Library(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.classes = _.functions = _.variables = _.scripts = _.dependencies = _.debuggable = _.uri = _.name = null;
      _.json = t0;
      _.type = null;
    },
    Library_toJson_closure: function Library_toJson_closure() {
    },
    Library_toJson_closure0: function Library_toJson_closure0() {
    },
    Library_toJson_closure1: function Library_toJson_closure1() {
    },
    Library_toJson_closure2: function Library_toJson_closure2() {
    },
    Library_toJson_closure3: function Library_toJson_closure3() {
    },
    LibraryDependency: function LibraryDependency() {
      var _ = this;
      _.target = _.prefix = _.isDeferred = _.isImport = null;
    },
    LogRecord: function LogRecord(t0) {
      var _ = this;
      _.stackTrace = _.error = _.zone = _.loggerName = _.sequenceNumber = _.level = _.time = _.message = null;
      _.json = t0;
      _.type = null;
    },
    MapAssociation: function MapAssociation() {
      this.value = this.key = null;
    },
    MemoryUsage: function MemoryUsage(t0) {
      var _ = this;
      _.heapUsage = _.heapCapacity = _.externalUsage = null;
      _.json = t0;
      _.type = null;
    },
    Message: function Message(t0) {
      var _ = this;
      _.location = _.handler = _.size = _.messageObjectId = _.name = _.index = null;
      _.json = t0;
      _.type = null;
    },
    NativeFunction: function NativeFunction() {
      this.name = null;
    },
    NullValRef: function NullValRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.closureContext = _.closureFunction = _.pattern = _.parameterizedClass = _.typeClass = _.name = _.length = _.valueAsStringIsTruncated = _.valueAsString = _.classRef = _.kind = _.NullValRef_valueAsString = null;
      _.json = t0;
      _.type = null;
    },
    NullVal: function NullVal(t0) {
      var _ = this;
      _.classRef = _.fixedId = _.id = _.bound = _.targetType = _.parameterIndex = _.typeArguments = _.propertyValue = _.propertyKey = _.isMultiLine = _.isCaseSensitive = _.closureContext = _.closureFunction = _.pattern = _.mirrorReferent = _.bytes = _.associations = _.elements = _.fields = _.parameterizedClass = _.typeClass = _.name = _.count = _.offset = _.length = _.valueAsStringIsTruncated = _.valueAsString = _.Instance_classRef = _.kind = _.NullVal_valueAsString = null;
      _.size = null;
      _.json = t0;
      _.type = null;
    },
    ObjRef: function ObjRef(t0) {
      var _ = this;
      _.fixedId = _.id = null;
      _.json = t0;
      _.type = null;
    },
    Obj: function Obj(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = null;
      _.json = t0;
      _.type = null;
    },
    ProfileFunction: function ProfileFunction() {
      var _ = this;
      _.$function = _.resolvedUrl = _.exclusiveTicks = _.inclusiveTicks = _.kind = null;
    },
    ProtocolList: function ProtocolList(t0) {
      this.protocols = null;
      this.json = t0;
      this.type = null;
    },
    ProtocolList_toJson_closure: function ProtocolList_toJson_closure() {
    },
    Protocol: function Protocol() {
      this.minor = this.major = this.protocolName = null;
    },
    ReloadReport: function ReloadReport(t0) {
      this.success = null;
      this.json = t0;
      this.type = null;
    },
    RetainingObject: function RetainingObject() {
      var _ = this;
      _.parentField = _.parentMapKey = _.parentListIndex = _.value = null;
    },
    RetainingPath: function RetainingPath(t0) {
      var _ = this;
      _.elements = _.gcRootType = _.length = null;
      _.json = t0;
      _.type = null;
    },
    RetainingPath_toJson_closure: function RetainingPath_toJson_closure() {
    },
    Response: function Response(t0) {
      this.json = t0;
      this.type = null;
    },
    Sentinel: function Sentinel(t0) {
      var _ = this;
      _.valueAsString = _.kind = null;
      _.json = t0;
      _.type = null;
    },
    ScriptRef: function ScriptRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.uri = null;
      _.json = t0;
      _.type = null;
    },
    Script: function Script(t0, t1, t2) {
      var _ = this;
      _._tokenToLine = t0;
      _._tokenToColumn = t1;
      _.size = _.classRef = _.fixedId = _.id = _.tokenPosTable = _.source = _.columnOffset = _.lineOffset = _.library = _.uri = null;
      _.json = t2;
      _.type = null;
    },
    Script$_fromJson_closure: function Script$_fromJson_closure() {
    },
    Script_toJson_closure: function Script_toJson_closure() {
    },
    ScriptList: function ScriptList(t0) {
      this.scripts = null;
      this.json = t0;
      this.type = null;
    },
    ScriptList_toJson_closure: function ScriptList_toJson_closure() {
    },
    SourceLocation: function SourceLocation(t0) {
      var _ = this;
      _.endTokenPos = _.tokenPos = _.script = null;
      _.json = t0;
      _.type = null;
    },
    SourceReport: function SourceReport(t0) {
      var _ = this;
      _.scripts = _.ranges = null;
      _.json = t0;
      _.type = null;
    },
    SourceReport_toJson_closure: function SourceReport_toJson_closure() {
    },
    SourceReport_toJson_closure0: function SourceReport_toJson_closure0() {
    },
    SourceReportCoverage: function SourceReportCoverage() {
      this.misses = this.hits = null;
    },
    SourceReportCoverage_toJson_closure: function SourceReportCoverage_toJson_closure() {
    },
    SourceReportCoverage_toJson_closure0: function SourceReportCoverage_toJson_closure0() {
    },
    SourceReportRange: function SourceReportRange() {
      var _ = this;
      _.possibleBreakpoints = _.coverage = _.error = _.compiled = _.endPos = _.startPos = _.scriptIndex = null;
    },
    SourceReportRange_toJson_closure: function SourceReportRange_toJson_closure() {
    },
    Stack: function Stack(t0) {
      var _ = this;
      _.messages = _.awaiterFrames = _.asyncCausalFrames = _.frames = null;
      _.json = t0;
      _.type = null;
    },
    Stack_toJson_closure: function Stack_toJson_closure() {
    },
    Stack_toJson_closure0: function Stack_toJson_closure0() {
    },
    Stack_toJson_closure1: function Stack_toJson_closure1() {
    },
    Stack_toJson_closure2: function Stack_toJson_closure2() {
    },
    Success: function Success(t0) {
      this.json = t0;
      this.type = null;
    },
    Timeline: function Timeline(t0) {
      var _ = this;
      _.timeExtentMicros = _.timeOriginMicros = _.traceEvents = null;
      _.json = t0;
      _.type = null;
    },
    Timeline_toJson_closure: function Timeline_toJson_closure() {
    },
    TimelineEvent: function TimelineEvent(t0) {
      this.json = t0;
    },
    TimelineFlags: function TimelineFlags(t0) {
      var _ = this;
      _.recordedStreams = _.availableStreams = _.recorderName = null;
      _.json = t0;
      _.type = null;
    },
    TimelineFlags_toJson_closure: function TimelineFlags_toJson_closure() {
    },
    TimelineFlags_toJson_closure0: function TimelineFlags_toJson_closure0() {
    },
    Timestamp: function Timestamp(t0) {
      this.timestamp = null;
      this.json = t0;
      this.type = null;
    },
    TypeArgumentsRef: function TypeArgumentsRef(t0) {
      var _ = this;
      _.fixedId = _.id = _.name = null;
      _.json = t0;
      _.type = null;
    },
    TypeArguments: function TypeArguments(t0) {
      var _ = this;
      _.size = _.classRef = _.fixedId = _.id = _.types = _.name = null;
      _.json = t0;
      _.type = null;
    },
    TypeArguments_toJson_closure: function TypeArguments_toJson_closure() {
    },
    UnresolvedSourceLocation: function UnresolvedSourceLocation(t0) {
      var _ = this;
      _.column = _.line = _.tokenPos = _.scriptUri = _.script = null;
      _.json = t0;
      _.type = null;
    },
    Version: function Version(t0) {
      var _ = this;
      _.minor = _.major = null;
      _.json = t0;
      _.type = null;
    },
    VMRef: function VMRef(t0) {
      this.name = null;
      this.json = t0;
      this.type = null;
    },
    VM: function VM(t0) {
      var _ = this;
      _.isolateGroups = _.isolates = _.startTime = _.pid = _.version = _.targetCPU = _.operatingSystem = _.hostCPU = _.architectureBits = _.name = null;
      _.json = t0;
      _.type = null;
    },
    VM_toJson_closure: function VM_toJson_closure() {
    },
    VM_toJson_closure0: function VM_toJson_closure0() {
    }
  },
  N = {HexCodec: function HexCodec() {
    }},
  R = {
    _convert: function(bytes, start, end) {
      var t2, i, bufferIndex, byteOr, byte, bufferIndex0, t3,
        t1 = (end - start) * 2,
        buffer = new Uint8Array(t1);
      for (t2 = bytes.length, i = start, bufferIndex = 0, byteOr = 0; i < end; ++i) {
        if (i >= t2)
          return H.ioore(bytes, i);
        byte = bytes[i];
        if (typeof byte !== "number")
          return H.iae(byte);
        byteOr = (byteOr | byte) >>> 0;
        bufferIndex0 = bufferIndex + 1;
        t3 = byte >>> 4 & 15;
        t3 = t3 < 10 ? t3 + 48 : t3 + 97 - 10;
        if (bufferIndex >= t1)
          return H.ioore(buffer, bufferIndex);
        buffer[bufferIndex] = t3;
        bufferIndex = bufferIndex0 + 1;
        t3 = byte & 15;
        t3 = t3 < 10 ? t3 + 48 : t3 + 97 - 10;
        if (bufferIndex0 >= t1)
          return H.ioore(buffer, bufferIndex0);
        buffer[bufferIndex0] = t3;
      }
      if (byteOr >= 0 && byteOr <= 255)
        return P.String_String$fromCharCodes(buffer, 0, null);
      for (i = start; i < end; ++i) {
        if (i >= t2)
          return H.ioore(bytes, i);
        byte = bytes[i];
        if (typeof byte !== "number")
          return byte.$ge();
        if (byte >= 0 && byte <= 255)
          continue;
        throw H.wrapException(P.FormatException$("Invalid byte " + (byte < 0 ? "-" : "") + "0x" + C.JSInt_methods.toRadixString$1(Math.abs(byte), 16) + ".", bytes, i));
      }
      throw H.wrapException("unreachable");
    },
    HexEncoder: function HexEncoder() {
    },
    StreamChannelMixin: function StreamChannelMixin() {
    }
  },
  Y = {Level: function Level(t0, t1) {
      this.name = t0;
      this.value = t1;
    }},
  L = {LogRecord0: function LogRecord0(t0, t1, t2) {
      this.level = t0;
      this.message = t1;
      this.loggerName = t2;
    }},
  M = {
    SseClient$: function(serverUrl) {
      var t1 = type$.legacy_String;
      t1 = new M.SseClient(P.StreamController_StreamController(t1), P.StreamController_StreamController(t1), F.Logger_Logger("SseClient"), P.StreamController_StreamController(type$.dynamic));
      t1.SseClient$1(serverUrl);
      return t1;
    },
    SseClient: function SseClient(t0, t1, t2, t3) {
      var _ = this;
      _._incomingController = t0;
      _._outgoingController = t1;
      _._logger = t2;
      _._errorTimer = _._serverUrl = _._eventSource = null;
      _._messages = t3;
    },
    SseClient_closure: function SseClient_closure(t0) {
      this.$this = t0;
    },
    SseClient_closure0: function SseClient_closure0(t0) {
      this.$this = t0;
    },
    SseClient__closure: function SseClient__closure(t0, t1) {
      this.$this = t0;
      this.error = t1;
    }
  },
  K = {
    Uuid$: function() {
      var options, t2, t1 = {};
      t1.options = options;
      t1.options = null;
      t2 = new K.Uuid();
      t2.Uuid$1$options(t1);
      return t2;
    },
    Uuid: function Uuid() {
      var _ = this;
      _._clockSeq = _._nodeId = _._seedBytes = null;
      _._lastNSecs = _._lastMSecs = 0;
      _._hexToByte = _._byteToHex = null;
    }
  },
  E = {
    main: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.void),
        ddsChannel, vmService, id, message, channel, t1, t2, t3, $async$temp1, $async$temp2, $async$temp3;
      var $async$main = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              channel = M.SseClient$("/test");
              t1 = channel._incomingController;
              t2 = new Q.QueueList(type$.QueueList_legacy_Result_legacy_String);
              t3 = new Array(8);
              t3.fixed$length = Array;
              t2.set$_table(H.setRuntimeTypeInfo(t3, type$.JSArray_legacy_Result_legacy_String));
              t3 = P.List_List$filled(P.ListQueue__calculateCapacity(null), null, false, type$.nullable__EventRequest_dynamic);
              $async$temp1 = M;
              $async$goto = 2;
              return P._asyncAwait(new G.StreamQueue(new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")), t2, new P.ListQueue(t3, type$.ListQueue_legacy__EventRequest_dynamic), type$.StreamQueue_legacy_String).get$next(), $async$main);
            case 2:
              // returning from await.
              ddsChannel = $async$temp1.SseClient$($async$result);
              t1 = new W._EventStream(ddsChannel._eventSource, "open", false, type$._EventStream_legacy_Event);
              $async$goto = 3;
              return P._asyncAwait(t1.get$first(t1), $async$main);
            case 3:
              // returning from await.
              t1 = ddsChannel._incomingController;
              vmService = Q.VmService$(new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")), new E.main_closure(ddsChannel));
              id = "" + ++vmService._id;
              t1 = new P._Future($.Zone__current, type$._Future_legacy_Version);
              vmService._completers.$indexSet(0, id, new P._AsyncCompleter(t1, type$._AsyncCompleter_legacy_Version));
              vmService._methodCalls.$indexSet(0, id, "getVersion");
              t2 = type$.dynamic;
              message = C.C_JsonCodec.encode$2$toEncodable(P.LinkedHashMap_LinkedHashMap$_literal(["jsonrpc", "2.0", "id", id, "method", "getVersion", "params", C.Map_empty], t2, t2), null);
              vmService._onSend.add$1(0, message);
              vmService._writeMessage.call$1(message);
              t2 = channel._outgoingController;
              $async$temp1 = t2;
              $async$temp2 = H._instanceType(t2)._precomputed1;
              $async$temp3 = C.C_JsonCodec;
              $async$goto = 4;
              return P._asyncAwait(t1, $async$main);
            case 4:
              // returning from await.
              $async$temp1.add$1(0, $async$temp2._as($async$temp3.encode$1($async$result.json)));
              ddsChannel.close$0(0);
              // implicit return
              return P._asyncReturn(null, $async$completer);
          }
      });
      return P._asyncStartSync($async$main, $async$completer);
    },
    main_closure: function main_closure(t0) {
      this.ddsChannel = t0;
    }
  },
  T = {
    UuidUtil_mathRNG: function() {
      var b, i,
        t1 = new Array(16);
      t1.fixed$length = Array;
      b = H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_int);
      for (i = 0; i < 16; ++i)
        C.JSArray_methods.$indexSet(b, i, C.C__JSRandom.nextInt$1(256));
      C.JSArray_methods.shuffle$0(b);
      return b;
    }
  };
  var holders = [C, H, J, P, W, V, F, G, Q, N, R, Y, L, M, K, E, T];
  hunkHelpers.setFunctionNamesIfNecessary(holders);
  var $ = {};
  H.JS_CONST.prototype = {};
  J.Interceptor.prototype = {
    $eq: function(receiver, other) {
      return receiver === other;
    },
    get$hashCode: function(receiver) {
      return H.Primitives_objectHashCode(receiver);
    },
    toString$0: function(receiver) {
      return "Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'";
    },
    noSuchMethod$1: function(receiver, invocation) {
      type$.Invocation._as(invocation);
      throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
    },
    get$runtimeType: function(receiver) {
      return H.getRuntimeType(receiver);
    }
  };
  J.JSBool.prototype = {
    toString$0: function(receiver) {
      return String(receiver);
    },
    $and: function(receiver, other) {
      return H.checkBool(H._asBoolS(other)) && receiver;
    },
    $or: function(receiver, other) {
      return H.checkBool(H._asBoolS(other)) || receiver;
    },
    get$hashCode: function(receiver) {
      return receiver ? 519018 : 218159;
    },
    get$runtimeType: function(receiver) {
      return C.Type_bool_lhE;
    },
    $isbool: 1
  };
  J.JSNull.prototype = {
    $eq: function(receiver, other) {
      return null == other;
    },
    toString$0: function(receiver) {
      return "null";
    },
    get$hashCode: function(receiver) {
      return 0;
    },
    get$runtimeType: function(receiver) {
      return C.Type_Null_Yyn;
    },
    noSuchMethod$1: function(receiver, invocation) {
      return this.super$Interceptor$noSuchMethod(receiver, type$.Invocation._as(invocation));
    },
    $isNull: 1
  };
  J.JavaScriptObject.prototype = {
    get$hashCode: function(receiver) {
      return 0;
    },
    get$runtimeType: function(receiver) {
      return C.Type_JSObject_8k0;
    },
    toString$0: function(receiver) {
      return String(receiver);
    }
  };
  J.PlainJavaScriptObject.prototype = {};
  J.UnknownJavaScriptObject.prototype = {};
  J.JavaScriptFunction.prototype = {
    toString$0: function(receiver) {
      var dartClosure = receiver[$.$get$DART_CLOSURE_PROPERTY_NAME()];
      if (dartClosure == null)
        return this.super$JavaScriptObject$toString(receiver);
      return "JavaScript function for " + H.S(J.toString$0$(dartClosure));
    },
    $isFunction: 1
  };
  J.JSArray.prototype = {
    add$1: function(receiver, value) {
      H._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.fixed$length)
        H.throwExpression(P.UnsupportedError$("add"));
      receiver.push(value);
    },
    addAll$1: function(receiver, collection) {
      H._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(collection);
      if (!!receiver.fixed$length)
        H.throwExpression(P.UnsupportedError$("addAll"));
      this._addAllFromArray$1(receiver, collection);
      return;
    },
    _addAllFromArray$1: function(receiver, array) {
      var len, i;
      type$.JSArray_dynamic._as(array);
      len = array.length;
      if (len === 0)
        return;
      if (receiver === array)
        throw H.wrapException(P.ConcurrentModificationError$(receiver));
      for (i = 0; i < len; ++i)
        receiver.push(array[i]);
    },
    forEach$1: function(receiver, f) {
      var end, i;
      H._arrayInstanceType(receiver)._eval$1("~(1)")._as(f);
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        f.call$1(receiver[i]);
        if (receiver.length !== end)
          throw H.wrapException(P.ConcurrentModificationError$(receiver));
      }
    },
    map$1$1: function(receiver, f, $T) {
      var t1 = H._arrayInstanceType(receiver);
      return new H.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: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    elementAt$1: function(receiver, index) {
      if (index < 0 || index >= receiver.length)
        return H.ioore(receiver, index);
      return receiver[index];
    },
    get$first: function(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw H.wrapException(H.IterableElementError_noElement());
    },
    setRange$4: function(receiver, start, end, iterable, skipCount) {
      var $length, otherList, t1, i;
      H._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(iterable);
      if (!!receiver.immutable$list)
        H.throwExpression(P.UnsupportedError$("setRange"));
      P.RangeError_checkValidRange(start, end, receiver.length);
      $length = end - start;
      if ($length === 0)
        return;
      P.RangeError_checkNotNegative(skipCount, "skipCount");
      otherList = iterable;
      t1 = J.getInterceptor$asx(otherList);
      if (skipCount + $length > t1.get$length(otherList))
        throw H.wrapException(H.IterableElementError_tooFew());
      if (skipCount < start)
        for (i = $length - 1; i >= 0; --i)
          receiver[start + i] = t1.$index(otherList, skipCount + i);
      else
        for (i = 0; i < $length; ++i)
          receiver[start + i] = t1.$index(otherList, skipCount + i);
    },
    shuffle$1: function(receiver, random) {
      var $length, pos, t1, tmp;
      if (!!receiver.immutable$list)
        H.throwExpression(P.UnsupportedError$("shuffle"));
      if (random == null)
        random = C.C__JSRandom;
      $length = receiver.length;
      for (; $length > 1;) {
        pos = random.nextInt$1($length);
        --$length;
        t1 = receiver.length;
        if ($length >= t1)
          return H.ioore(receiver, $length);
        tmp = receiver[$length];
        if (pos < 0 || pos >= t1)
          return H.ioore(receiver, pos);
        this.$indexSet(receiver, $length, receiver[pos]);
        this.$indexSet(receiver, pos, tmp);
      }
    },
    shuffle$0: function($receiver) {
      return this.shuffle$1($receiver, null);
    },
    contains$1: function(receiver, other) {
      var i;
      for (i = 0; i < receiver.length; ++i)
        if (J.$eq$(receiver[i], other))
          return true;
      return false;
    },
    get$isNotEmpty: function(receiver) {
      return receiver.length !== 0;
    },
    toString$0: function(receiver) {
      return P.IterableBase_iterableToFullString(receiver, "[", "]");
    },
    toList$1$growable: function(receiver, growable) {
      var t1 = H.setRuntimeTypeInfo(receiver.slice(0), H._arrayInstanceType(receiver));
      return t1;
    },
    toList$0: function($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    get$iterator: function(receiver) {
      return new J.ArrayIterator(receiver, receiver.length, H._arrayInstanceType(receiver)._eval$1("ArrayIterator<1>"));
    },
    get$hashCode: function(receiver) {
      return H.Primitives_objectHashCode(receiver);
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    set$length: function(receiver, newLength) {
      if (!!receiver.fixed$length)
        H.throwExpression(P.UnsupportedError$("set length"));
      receiver.length = newLength;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      if (!H._isInt(index))
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      if (index >= receiver.length || index < 0)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      H._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.immutable$list)
        H.throwExpression(P.UnsupportedError$("indexed set"));
      if (!H._isInt(index))
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      if (index >= receiver.length || index < 0)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      receiver[index] = value;
    },
    $add: function(receiver, other) {
      var t1 = H._arrayInstanceType(receiver);
      t1._eval$1("List<1>")._as(other);
      t1 = P.List_List$of(receiver, true, t1._precomputed1);
      this.addAll$1(t1, other);
      return t1;
    },
    $isJSIndexable: 1,
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  J.JSUnmodifiableArray.prototype = {};
  J.ArrayIterator.prototype = {
    get$current: function() {
      return this.__interceptors$_current;
    },
    moveNext$0: function() {
      var t2, _this = this,
        t1 = _this.__interceptors$_iterable,
        $length = t1.length;
      if (_this.__interceptors$_length !== $length)
        throw H.wrapException(H.throwConcurrentModificationError(t1));
      t2 = _this.__interceptors$_index;
      if (t2 >= $length) {
        _this.set$__interceptors$_current(null);
        return false;
      }
      _this.set$__interceptors$_current(t1[t2]);
      ++_this.__interceptors$_index;
      return true;
    },
    set$__interceptors$_current: function(_current) {
      this.__interceptors$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  J.JSNumber.prototype = {
    floor$0: function(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 H.wrapException(P.UnsupportedError$("" + receiver + ".floor()"));
    },
    toRadixString$1: function(receiver, radix) {
      var result, match, t1, exponent;
      if (radix < 2 || radix > 36)
        throw H.wrapException(P.RangeError$range(radix, 2, 36, "radix", null));
      result = receiver.toString(radix);
      if (C.JSString_methods.codeUnitAt$1(result, result.length - 1) !== 41)
        return result;
      match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
      if (match == null)
        H.throwExpression(P.UnsupportedError$("Unexpected toString result: " + result));
      t1 = match.length;
      if (1 >= t1)
        return H.ioore(match, 1);
      result = match[1];
      if (3 >= t1)
        return H.ioore(match, 3);
      exponent = +match[3];
      t1 = match[2];
      if (t1 != null) {
        result += t1;
        exponent -= t1.length;
      }
      return result + C.JSString_methods.$mul("0", exponent);
    },
    toString$0: function(receiver) {
      if (receiver === 0 && 1 / receiver < 0)
        return "-0.0";
      else
        return "" + receiver;
    },
    get$hashCode: function(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;
    },
    $add: function(receiver, other) {
      H._asNumS(other);
      return receiver + other;
    },
    $sub: function(receiver, other) {
      return receiver - other;
    },
    $div: function(receiver, other) {
      return receiver / other;
    },
    $mod: function(receiver, other) {
      var result = receiver % other;
      if (result === 0)
        return 0;
      if (result > 0)
        return result;
      if (other < 0)
        return result - other;
      else
        return result + other;
    },
    _tdivFast$1: function(receiver, other) {
      return (receiver | 0) === receiver ? receiver / other | 0 : this._tdivSlow$1(receiver, other);
    },
    _tdivSlow$1: function(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 H.wrapException(P.UnsupportedError$("Result of truncating division is " + H.S(quotient) + ": " + H.S(receiver) + " ~/ " + other));
    },
    $shl: function(receiver, other) {
      if (other < 0)
        throw H.wrapException(H.argumentErrorValue(other));
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    $shr: function(receiver, other) {
      var t1;
      if (other < 0)
        throw H.wrapException(H.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: function(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;
    },
    _shrBothPositive$1: function(receiver, other) {
      return other > 31 ? 0 : receiver >>> other;
    },
    $and: function(receiver, other) {
      return (receiver & other) >>> 0;
    },
    $or: function(receiver, other) {
      H._asNumS(other);
      if (typeof other != "number")
        throw H.wrapException(H.argumentErrorValue(other));
      return (receiver | other) >>> 0;
    },
    $lt: function(receiver, other) {
      return receiver < other;
    },
    $gt: function(receiver, other) {
      return receiver > other;
    },
    $ge: function(receiver, other) {
      if (typeof other != "number")
        throw H.wrapException(H.argumentErrorValue(other));
      return receiver >= other;
    },
    get$runtimeType: function(receiver) {
      return C.Type_num_cv7;
    },
    $isdouble: 1,
    $isnum: 1
  };
  J.JSInt.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_int_tHn;
    },
    $isint: 1
  };
  J.JSDouble.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_double_K1J;
    }
  };
  J.JSString.prototype = {
    codeUnitAt$1: function(receiver, index) {
      if (index < 0)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      if (index >= receiver.length)
        H.throwExpression(H.diagnoseIndexError(receiver, index));
      return receiver.charCodeAt(index);
    },
    _codeUnitAt$1: function(receiver, index) {
      if (index >= receiver.length)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      return receiver.charCodeAt(index);
    },
    $add: function(receiver, other) {
      H._asStringS(other);
      if (typeof other != "string")
        throw H.wrapException(P.ArgumentError$value(other, null, null));
      return receiver + other;
    },
    startsWith$1: function(receiver, pattern) {
      var otherLength = pattern.length;
      if (otherLength > receiver.length)
        return false;
      return pattern === receiver.substring(0, otherLength);
    },
    substring$2: function(receiver, startIndex, endIndex) {
      if (endIndex == null)
        endIndex = receiver.length;
      if (startIndex < 0)
        throw H.wrapException(P.RangeError$value(startIndex, null));
      if (startIndex > endIndex)
        throw H.wrapException(P.RangeError$value(startIndex, null));
      if (endIndex > receiver.length)
        throw H.wrapException(P.RangeError$value(endIndex, null));
      return receiver.substring(startIndex, endIndex);
    },
    substring$1: function($receiver, startIndex) {
      return this.substring$2($receiver, startIndex, null);
    },
    $mul: function(receiver, times) {
      var s, result;
      if (0 >= times)
        return "";
      if (times === 1 || receiver.length === 0)
        return receiver;
      if (times !== times >>> 0)
        throw H.wrapException(C.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;
    },
    lastIndexOf$1: function(receiver, pattern) {
      var start = receiver.length,
        t1 = pattern.length;
      if (start + t1 > start)
        start -= t1;
      return receiver.lastIndexOf(pattern, start);
    },
    toString$0: function(receiver) {
      return receiver;
    },
    get$hashCode: function(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: function(receiver) {
      return C.Type_String_k8F;
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      if (index >= receiver.length || false)
        throw H.wrapException(H.diagnoseIndexError(receiver, index));
      return receiver[index];
    },
    $isJSIndexable: 1,
    $isPattern: 1,
    $isString: 1
  };
  H.LateError.prototype = {
    toString$0: function(_) {
      var message = this._message;
      return message != null ? "LateInitializationError: " + message : "LateInitializationError";
    }
  };
  H.ReachabilityError.prototype = {
    toString$0: function(_) {
      var t1 = "ReachabilityError: " + this._message;
      return t1;
    }
  };
  H.nullFuture_closure.prototype = {
    call$0: function() {
      var t1 = new P._Future($.Zone__current, type$._Future_Null);
      t1._asyncComplete$1(null);
      return t1;
    },
    $signature: 45
  };
  H.NotNullableError.prototype = {
    toString$0: function(_) {
      return "Null is not a valid value for the parameter '" + this.__internal$_name + "' of type '" + H.createRuntimeType(this.$ti._precomputed1).toString$0(0) + "'";
    }
  };
  H.EfficientLengthIterable.prototype = {};
  H.ListIterable.prototype = {
    get$iterator: function(_) {
      var _this = this;
      return new H.ListIterator(_this, _this.get$length(_this), H._instanceType(_this)._eval$1("ListIterator<ListIterable.E>"));
    },
    get$isEmpty: function(_) {
      return this.get$length(this) === 0;
    },
    map$1: function(_, f) {
      var t1 = H._instanceType(this);
      return new H.MappedListIterable(this, t1._eval$1("@(ListIterable.E)")._as(f), t1._eval$1("MappedListIterable<ListIterable.E,@>"));
    }
  };
  H.ListIterator.prototype = {
    get$current: function() {
      return this._current;
    },
    moveNext$0: function() {
      var t3, _this = this,
        t1 = _this._iterable,
        t2 = J.getInterceptor$asx(t1),
        $length = t2.get$length(t1);
      if (_this.__internal$_length !== $length)
        throw H.wrapException(P.ConcurrentModificationError$(t1));
      t3 = _this._index;
      if (t3 >= $length) {
        _this.set$_current(null);
        return false;
      }
      _this.set$_current(t2.elementAt$1(t1, t3));
      ++_this._index;
      return true;
    },
    set$_current: function(_current) {
      this._current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  H.MappedIterable.prototype = {
    get$iterator: function(_) {
      var t1 = H._instanceType(this);
      return new H.MappedIterator(J.get$iterator$ax(this._iterable), this._f, t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("MappedIterator<1,2>"));
    },
    get$length: function(_) {
      return J.get$length$asx(this._iterable);
    }
  };
  H.EfficientLengthMappedIterable.prototype = {$isEfficientLengthIterable: 1};
  H.MappedIterator.prototype = {
    moveNext$0: function() {
      var _this = this,
        t1 = _this._iterator;
      if (t1.moveNext$0()) {
        _this.set$_current(_this._f.call$1(t1.get$current()));
        return true;
      }
      _this.set$_current(null);
      return false;
    },
    get$current: function() {
      return this._current;
    },
    set$_current: function(_current) {
      this._current = this.$ti._eval$1("2?")._as(_current);
    }
  };
  H.MappedListIterable.prototype = {
    get$length: function(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1: function(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_source, index));
    }
  };
  H.FixedLengthListMixin.prototype = {};
  H.Symbol.prototype = {
    get$hashCode: function(_) {
      var hash = this._hashCode;
      if (hash != null)
        return hash;
      hash = 664597 * J.get$hashCode$(this.__internal$_name) & 536870911;
      this._hashCode = hash;
      return hash;
    },
    toString$0: function(_) {
      return 'Symbol("' + H.S(this.__internal$_name) + '")';
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof H.Symbol && this.__internal$_name == other.__internal$_name;
    },
    $isSymbol0: 1
  };
  H.ConstantMapView.prototype = {};
  H.ConstantMap.prototype = {
    get$isEmpty: function(_) {
      return this.get$length(this) === 0;
    },
    toString$0: function(_) {
      return P.MapBase_mapToString(this);
    },
    $indexSet: function(_, key, val) {
      var t1 = H._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(val);
      H.ConstantMap__throwUnmodifiable();
      H.ReachabilityError$("`null` encountered as the result from expression with type `Never`.");
    },
    map$2$1: function(_, transform, K2, V2) {
      var result = P.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      this.forEach$1(0, new H.ConstantMap_map_closure(this, H._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), result));
      return result;
    },
    map$1: function($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    $isMap: 1
  };
  H.ConstantMap_map_closure.prototype = {
    call$2: function(key, value) {
      var t1 = H._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());
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  H.ConstantStringMap.prototype = {
    get$length: function(_) {
      return this._length;
    },
    containsKey$1: function(key) {
      if (typeof key != "string")
        return false;
      if ("__proto__" === key)
        return false;
      return this._jsObject.hasOwnProperty(key);
    },
    $index: function(_, key) {
      if (!this.containsKey$1(key))
        return null;
      return this._fetch$1(key);
    },
    _fetch$1: function(key) {
      return this._jsObject[H._asStringS(key)];
    },
    forEach$1: function(_, f) {
      var keys, t2, i, key,
        t1 = H._instanceType(this);
      t1._eval$1("~(1,2)")._as(f);
      keys = this._keys;
      for (t2 = keys.length, t1 = t1._rest[1], i = 0; i < t2; ++i) {
        key = keys[i];
        f.call$2(key, t1._as(this._fetch$1(key)));
      }
    },
    get$keys: function() {
      return new H._ConstantMapKeyIterable(this, H._instanceType(this)._eval$1("_ConstantMapKeyIterable<1>"));
    }
  };
  H._ConstantMapKeyIterable.prototype = {
    get$iterator: function(_) {
      var t1 = this._map._keys;
      return new J.ArrayIterator(t1, t1.length, H._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
    },
    get$length: function(_) {
      return this._map._keys.length;
    }
  };
  H.JSInvocationMirror.prototype = {
    get$memberName: function() {
      var t1 = this._memberName;
      return t1;
    },
    get$positionalArguments: function() {
      var t1, argumentCount, list, index, _this = this;
      if (_this.__js_helper$_kind === 1)
        return C.List_empty;
      t1 = _this._arguments;
      argumentCount = t1.length - _this._namedArgumentNames.length - _this._typeArgumentCount;
      if (argumentCount === 0)
        return C.List_empty;
      list = [];
      for (index = 0; index < argumentCount; ++index) {
        if (index >= t1.length)
          return H.ioore(t1, index);
        list.push(t1[index]);
      }
      list.fixed$length = Array;
      list.immutable$list = Array;
      return list;
    },
    get$namedArguments: function() {
      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4, _this = this;
      if (_this.__js_helper$_kind !== 0)
        return C.Map_empty0;
      t1 = _this._namedArgumentNames;
      namedArgumentCount = t1.length;
      t2 = _this._arguments;
      namedArgumentsStartIndex = t2.length - namedArgumentCount - _this._typeArgumentCount;
      if (namedArgumentCount === 0)
        return C.Map_empty0;
      map = new H.JsLinkedHashMap(type$.JsLinkedHashMap_Symbol_dynamic);
      for (i = 0; i < namedArgumentCount; ++i) {
        if (i >= t1.length)
          return H.ioore(t1, i);
        t3 = t1[i];
        t4 = namedArgumentsStartIndex + i;
        if (t4 < 0 || t4 >= t2.length)
          return H.ioore(t2, t4);
        map.$indexSet(0, new H.Symbol(t3), t2[t4]);
      }
      return new H.ConstantMapView(map, type$.ConstantMapView_Symbol_dynamic);
    },
    $isInvocation: 1
  };
  H.Primitives_functionNoSuchMethod_closure.prototype = {
    call$2: function($name, argument) {
      var t1;
      H._asStringS($name);
      t1 = this._box_0;
      t1.names = t1.names + "$" + H.S($name);
      C.JSArray_methods.add$1(this.namedArgumentList, $name);
      C.JSArray_methods.add$1(this.$arguments, argument);
      ++t1.argumentCount;
    },
    $signature: 39
  };
  H.TypeErrorDecoder.prototype = {
    matchTypeError$1: function(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;
    }
  };
  H.NullError.prototype = {
    toString$0: function(_) {
      var t1 = this._method;
      if (t1 == null)
        return "NoSuchMethodError: " + H.S(this.__js_helper$_message);
      return "NoSuchMethodError: method not found: '" + t1 + "' on null";
    }
  };
  H.JsNoSuchMethodError.prototype = {
    toString$0: function(_) {
      var t2, _this = this,
        _s38_ = "NoSuchMethodError: method not found: '",
        t1 = _this._method;
      if (t1 == null)
        return "NoSuchMethodError: " + H.S(_this.__js_helper$_message);
      t2 = _this._receiver;
      if (t2 == null)
        return _s38_ + t1 + "' (" + H.S(_this.__js_helper$_message) + ")";
      return _s38_ + t1 + "' on '" + t2 + "' (" + H.S(_this.__js_helper$_message) + ")";
    }
  };
  H.UnknownJsTypeError.prototype = {
    toString$0: function(_) {
      var t1 = this.__js_helper$_message;
      return t1.length === 0 ? "Error" : "Error: " + t1;
    }
  };
  H.NullThrownFromJavaScriptException.prototype = {
    toString$0: function(_) {
      return "Throw of null ('" + (this._irritant === null ? "null" : "undefined") + "' from JavaScript)";
    }
  };
  H.ExceptionAndStackTrace.prototype = {};
  H._StackTrace.prototype = {
    toString$0: function(_) {
      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
  };
  H.Closure.prototype = {
    toString$0: function(_) {
      var $constructor = this.constructor,
        $name = $constructor == null ? null : $constructor.name;
      return "Closure '" + H.unminifyOrTag($name == null ? "unknown" : $name) + "'";
    },
    $isFunction: 1,
    get$$call: function() {
      return this;
    },
    "call*": "call$1",
    $requiredArgCount: 1,
    $defaultValues: null
  };
  H.TearOffClosure.prototype = {};
  H.StaticClosure.prototype = {
    toString$0: function(_) {
      var $name = this.$static_name;
      if ($name == null)
        return "Closure of unknown static method";
      return "Closure '" + H.unminifyOrTag($name) + "'";
    }
  };
  H.BoundClosure.prototype = {
    $eq: function(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (_this === other)
        return true;
      if (!(other instanceof H.BoundClosure))
        return false;
      return _this._self === other._self && _this.__js_helper$_target === other.__js_helper$_target && _this._receiver === other._receiver;
    },
    get$hashCode: function(_) {
      var receiverHashCode,
        t1 = this._receiver;
      if (t1 == null)
        receiverHashCode = H.Primitives_objectHashCode(this._self);
      else
        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
      return (receiverHashCode ^ H.Primitives_objectHashCode(this.__js_helper$_target)) >>> 0;
    },
    toString$0: function(_) {
      var receiver = this._receiver;
      if (receiver == null)
        receiver = this._self;
      return "Closure '" + H.S(this._name) + "' of " + ("Instance of '" + H.S(H.Primitives_objectTypeName(receiver)) + "'");
    }
  };
  H.RuntimeError.prototype = {
    toString$0: function(_) {
      return "RuntimeError: " + this.message;
    }
  };
  H._AssertionError.prototype = {
    toString$0: function(_) {
      return "Assertion failed: " + P.Error_safeToString(this.message);
    }
  };
  H._Required.prototype = {};
  H.JsLinkedHashMap.prototype = {
    get$length: function(_) {
      return this._length;
    },
    get$isEmpty: function(_) {
      return this._length === 0;
    },
    get$isNotEmpty: function(_) {
      return !this.get$isEmpty(this);
    },
    get$keys: function() {
      return new H.LinkedHashMapKeyIterable(this, H._instanceType(this)._eval$1("LinkedHashMapKeyIterable<1>"));
    },
    containsKey$1: function(key) {
      var strings, t1;
      if (typeof key == "string") {
        strings = this._strings;
        if (strings == null)
          return false;
        return this._containsTableEntry$2(strings, key);
      } else {
        t1 = this.internalContainsKey$1(key);
        return t1;
      }
    },
    internalContainsKey$1: function(key) {
      var _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return false;
      return _this.internalFindBucketIndex$2(_this._getTableBucket$2(rest, _this.internalComputeHashCode$1(key)), key) >= 0;
    },
    addAll$1: function(_, other) {
      H._instanceType(this)._eval$1("Map<1,2>")._as(other).forEach$1(0, new H.JsLinkedHashMap_addAll_closure(this));
    },
    $index: function(_, key) {
      var strings, cell, t1, nums, _this = this, _null = null;
      if (typeof key == "string") {
        strings = _this._strings;
        if (strings == null)
          return _null;
        cell = _this._getTableCell$2(strings, key);
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else if (typeof key == "number" && (key & 0x3ffffff) === key) {
        nums = _this._nums;
        if (nums == null)
          return _null;
        cell = _this._getTableCell$2(nums, key);
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else
        return _this.internalGet$1(key);
    },
    internalGet$1: function(key) {
      var bucket, index, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      bucket = _this._getTableBucket$2(rest, _this.internalComputeHashCode$1(key));
      index = _this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      return bucket[index].hashMapCellValue;
    },
    $indexSet: function(_, key, value) {
      var strings, nums, _this = this,
        t1 = H._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 & 0x3ffffff) === 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: function(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = H._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 = _this._getTableBucket$2(rest, hash);
      if (bucket == null)
        _this._setTableEntry$3(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: function(key, ifAbsent) {
      var value, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(key);
      t1._eval$1("2()")._as(ifAbsent);
      if (_this.containsKey$1(key))
        return _this.$index(0, key);
      value = ifAbsent.call$0();
      _this.$indexSet(0, key, value);
      return value;
    },
    remove$1: function(_, key) {
      var _this = this;
      if (typeof key == "string")
        return _this._removeHashTableEntry$2(_this._strings, key);
      else if (typeof key == "number" && (key & 0x3ffffff) === key)
        return _this._removeHashTableEntry$2(_this._nums, key);
      else
        return _this.internalRemove$1(key);
    },
    internalRemove$1: function(key) {
      var hash, bucket, index, cell, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      hash = _this.internalComputeHashCode$1(key);
      bucket = _this._getTableBucket$2(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)
        _this._deleteTableEntry$2(rest, hash);
      return cell.hashMapCellValue;
    },
    forEach$1: function(_, action) {
      var cell, modifications, _this = this;
      H._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 H.wrapException(P.ConcurrentModificationError$(_this));
        cell = cell._next;
      }
    },
    _addHashTableEntry$3: function(table, key, value) {
      var cell, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      cell = _this._getTableCell$2(table, key);
      if (cell == null)
        _this._setTableEntry$3(table, key, _this._newLinkedCell$2(key, value));
      else
        cell.hashMapCellValue = value;
    },
    _removeHashTableEntry$2: function(table, key) {
      var cell;
      if (table == null)
        return null;
      cell = this._getTableCell$2(table, key);
      if (cell == null)
        return null;
      this._unlinkCell$1(cell);
      this._deleteTableEntry$2(table, key);
      return cell.hashMapCellValue;
    },
    _modified$0: function() {
      this._modifications = this._modifications + 1 & 67108863;
    },
    _newLinkedCell$2: function(key, value) {
      var _this = this,
        t1 = H._instanceType(_this),
        cell = new H.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._length;
      _this._modified$0();
      return cell;
    },
    _unlinkCell$1: function(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._length;
      _this._modified$0();
    },
    internalComputeHashCode$1: function(key) {
      return J.get$hashCode$(key) & 0x3ffffff;
    },
    internalFindBucketIndex$2: function(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: function(_) {
      return P.MapBase_mapToString(this);
    },
    _getTableCell$2: function(table, key) {
      return table[key];
    },
    _getTableBucket$2: function(table, key) {
      return table[key];
    },
    _setTableEntry$3: function(table, key, value) {
      table[key] = value;
    },
    _deleteTableEntry$2: function(table, key) {
      delete table[key];
    },
    _containsTableEntry$2: function(table, key) {
      return this._getTableCell$2(table, key) != null;
    },
    _newHashTable$0: function() {
      var _s20_ = "<non-identifier-key>",
        table = Object.create(null);
      this._setTableEntry$3(table, _s20_, table);
      this._deleteTableEntry$2(table, _s20_);
      return table;
    },
    $isLinkedHashMap: 1
  };
  H.JsLinkedHashMap_addAll_closure.prototype = {
    call$2: function(key, value) {
      var t1 = this.$this,
        t2 = H._instanceType(t1);
      t1.$indexSet(0, t2._precomputed1._as(key), t2._rest[1]._as(value));
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  H.LinkedHashMapCell.prototype = {};
  H.LinkedHashMapKeyIterable.prototype = {
    get$length: function(_) {
      return this._map._length;
    },
    get$isEmpty: function(_) {
      return this._map._length === 0;
    },
    get$iterator: function(_) {
      var t1 = this._map,
        t2 = new H.LinkedHashMapKeyIterator(t1, t1._modifications, this.$ti._eval$1("LinkedHashMapKeyIterator<1>"));
      t2._cell = t1._first;
      return t2;
    },
    contains$1: function(_, element) {
      return this._map.containsKey$1(element);
    }
  };
  H.LinkedHashMapKeyIterator.prototype = {
    get$current: function() {
      return this.__js_helper$_current;
    },
    moveNext$0: function() {
      var cell, _this = this,
        t1 = _this._map;
      if (_this._modifications !== t1._modifications)
        throw H.wrapException(P.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: function(_current) {
      this.__js_helper$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  H.initHooks_closure.prototype = {
    call$1: function(o) {
      return this.getTag(o);
    },
    $signature: 2
  };
  H.initHooks_closure0.prototype = {
    call$2: function(o, tag) {
      return this.getUnknownTag(o, tag);
    },
    $signature: 33
  };
  H.initHooks_closure1.prototype = {
    call$1: function(tag) {
      return this.prototypeForTag(H._asStringS(tag));
    },
    $signature: 35
  };
  H.NativeByteBuffer.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_ByteBuffer_RkP;
    }
  };
  H.NativeTypedData.prototype = {};
  H.NativeByteData.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_ByteData_zNC;
    },
    _getUint32$2: function(receiver, byteOffset, littleEndian) {
      return receiver.getUint32(byteOffset, littleEndian);
    },
    $isByteData: 1
  };
  H.NativeTypedArray.prototype = {
    get$length: function(receiver) {
      return receiver.length;
    },
    $isJSIndexable: 1,
    $isJavaScriptIndexingBehavior: 1
  };
  H.NativeTypedArrayOfDouble.prototype = {
    $index: function(receiver, index) {
      H._asIntS(index);
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      H._asDoubleS(value);
      H._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  H.NativeTypedArrayOfInt.prototype = {
    $indexSet: function(receiver, index, value) {
      H._asIntS(index);
      H._asIntS(value);
      H._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  H.NativeFloat32List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Float32List_LB7;
    }
  };
  H.NativeFloat64List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Float64List_LB7;
    }
  };
  H.NativeInt16List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Int16List_uXf;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    }
  };
  H.NativeInt32List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Int32List_O50;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    }
  };
  H.NativeInt8List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Int8List_ekJ;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    }
  };
  H.NativeUint16List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Uint16List_2bx;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    }
  };
  H.NativeUint32List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Uint32List_2bx;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    }
  };
  H.NativeUint8ClampedList.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Uint8ClampedList_Jik;
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    }
  };
  H.NativeUint8List.prototype = {
    get$runtimeType: function(receiver) {
      return C.Type_Uint8List_WLA;
    },
    get$length: function(receiver) {
      return receiver.length;
    },
    $index: function(receiver, index) {
      H._asIntS(index);
      H._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    $isUint8List: 1
  };
  H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.prototype = {};
  H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.prototype = {};
  H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  H.Rti.prototype = {
    _eval$1: function(recipe) {
      return H._Universe_evalInEnvironment(init.typeUniverse, this, recipe);
    },
    _bind$1: function(typeOrTuple) {
      return H._Universe_bind(init.typeUniverse, this, typeOrTuple);
    }
  };
  H._FunctionParameters.prototype = {};
  H._Type.prototype = {
    toString$0: function(_) {
      return H._rtiToString(this._rti, null);
    }
  };
  H._Error.prototype = {
    toString$0: function(_) {
      return this.__rti$_message;
    }
  };
  H._TypeError.prototype = {};
  P._AsyncRun__initializeScheduleImmediate_internalCallback.prototype = {
    call$1: function(_) {
      var t1 = this._box_0,
        f = t1.storedCallback;
      t1.storedCallback = null;
      f.call$0();
    },
    $signature: 11
  };
  P._AsyncRun__initializeScheduleImmediate_closure.prototype = {
    call$1: function(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: 28
  };
  P._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
    call$0: function() {
      this.callback.call$0();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 3
  };
  P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
    call$0: function() {
      this.callback.call$0();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 3
  };
  P._TimerImpl.prototype = {
    _TimerImpl$2: function(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setTimeout(H.convertDartClosureToJS(new P._TimerImpl_internalCallback(this, callback), 0), milliseconds);
      else
        throw H.wrapException(P.UnsupportedError$("`setTimeout()` not found."));
    },
    cancel$0: function() {
      if (self.setTimeout != null) {
        var t1 = this._handle;
        if (t1 == null)
          return;
        self.clearTimeout(t1);
        this._handle = null;
      } else
        throw H.wrapException(P.UnsupportedError$("Canceling a timer."));
    },
    $isTimer: 1
  };
  P._TimerImpl_internalCallback.prototype = {
    call$0: function() {
      this.$this._handle = null;
      this.callback.call$0();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P._AsyncAwaitCompleter.prototype = {
    complete$1: function(value) {
      var t2, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/?")._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(t1._precomputed1._as(value));
      }
    },
    completeError$2: function(e, st) {
      var t1;
      if (st == null)
        st = P.AsyncError_defaultStackTrace(e);
      t1 = this._future;
      if (this.isSync)
        t1._completeError$2(e, st);
      else
        t1._asyncCompleteError$2(e, st);
    },
    completeError$1: function(e) {
      return this.completeError$2(e, null);
    },
    $isCompleter: 1
  };
  P._awaitOnObject_closure.prototype = {
    call$1: function(result) {
      return this.bodyFunction.call$2(0, result);
    },
    $signature: 1
  };
  P._awaitOnObject_closure0.prototype = {
    call$2: function(error, stackTrace) {
      this.bodyFunction.call$2(1, new H.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: 40
  };
  P._wrapJsFunctionForAsync_closure.prototype = {
    call$2: function(errorCode, result) {
      this.$protected(H._asIntS(errorCode), result);
    },
    $signature: 41
  };
  P._BroadcastSubscription.prototype = {
    _onPause$0: function() {
    },
    _onResume$0: function() {
    },
    set$_async$_next: function(_next) {
      this._async$_next = this.$ti._eval$1("_BroadcastSubscription<1>?")._as(_next);
    },
    set$_async$_previous: function(_previous) {
      this._async$_previous = this.$ti._eval$1("_BroadcastSubscription<1>?")._as(_previous);
    }
  };
  P._BroadcastStreamController.prototype = {
    get$_mayAddEvent: function() {
      return this._state < 4;
    },
    _removeListener$1: function(subscription) {
      var previous, next;
      H._instanceType(this)._eval$1("_BroadcastSubscription<1>")._as(subscription);
      previous = subscription._async$_previous;
      next = subscription._async$_next;
      if (previous == null)
        this.set$_firstSubscription(next);
      else
        previous.set$_async$_next(next);
      if (next == null)
        this.set$_lastSubscription(previous);
      else
        next.set$_async$_previous(previous);
      subscription.set$_async$_previous(subscription);
      subscription.set$_async$_next(subscription);
    },
    _subscribe$4: function(onData, onError, onDone, cancelOnError) {
      var t2, t3, t4, t5, subscription, oldLast, _this = this,
        t1 = H._instanceType(_this);
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      if ((_this._state & 4) !== 0) {
        t1 = new P._DoneStreamSubscription($.Zone__current, onDone, t1._eval$1("_DoneStreamSubscription<1>"));
        t1._schedule$0();
        return t1;
      }
      t2 = $.Zone__current;
      t3 = cancelOnError ? 1 : 0;
      t4 = P._BufferingStreamSubscription__registerDataHandler(t2, onData, t1._precomputed1);
      t5 = P._BufferingStreamSubscription__registerErrorHandler(t2, onError);
      t1 = t1._eval$1("_BroadcastSubscription<1>");
      subscription = new P._BroadcastSubscription(_this, t4, t5, type$.void_Function._as(onDone), t2, t3, t1);
      subscription.set$_async$_previous(subscription);
      subscription.set$_async$_next(subscription);
      t1._as(subscription);
      subscription._eventState = _this._state & 1;
      oldLast = _this._lastSubscription;
      _this.set$_lastSubscription(subscription);
      subscription.set$_async$_next(null);
      subscription.set$_async$_previous(oldLast);
      if (oldLast == null)
        _this.set$_firstSubscription(subscription);
      else
        oldLast.set$_async$_next(subscription);
      if (_this._firstSubscription == _this._lastSubscription)
        P._runGuarded(_this.onListen);
      return subscription;
    },
    _recordCancel$1: function(sub) {
      var _this = this,
        t1 = H._instanceType(_this);
      sub = t1._eval$1("_BroadcastSubscription<1>")._as(t1._eval$1("StreamSubscription<1>")._as(sub));
      if (sub._async$_next === sub)
        return null;
      t1 = sub._eventState;
      if ((t1 & 2) !== 0)
        sub._eventState = t1 | 4;
      else {
        _this._removeListener$1(sub);
        if ((_this._state & 2) === 0 && _this._firstSubscription == null)
          _this._callOnCancel$0();
      }
      return null;
    },
    _recordPause$1: function(subscription) {
      H._instanceType(this)._eval$1("StreamSubscription<1>")._as(subscription);
    },
    _recordResume$1: function(subscription) {
      H._instanceType(this)._eval$1("StreamSubscription<1>")._as(subscription);
    },
    _addEventError$0: function() {
      if ((this._state & 4) !== 0)
        return new P.StateError("Cannot add new events after calling close");
      return new P.StateError("Cannot add new events while doing an addStream");
    },
    add$1: function(_, data) {
      var _this = this;
      H._instanceType(_this)._precomputed1._as(data);
      if (!_this.get$_mayAddEvent())
        throw H.wrapException(_this._addEventError$0());
      _this._sendData$1(data);
    },
    _forEachListener$1: function(action) {
      var t1, subscription, id, next, _this = this;
      H._instanceType(_this)._eval$1("~(_BufferingStreamSubscription<1>)")._as(action);
      t1 = _this._state;
      if ((t1 & 2) !== 0)
        throw H.wrapException(P.StateError$(string$.Cannot));
      subscription = _this._firstSubscription;
      if (subscription == null)
        return;
      id = t1 & 1;
      _this._state = t1 ^ 3;
      for (; subscription != null;) {
        t1 = subscription._eventState;
        if ((t1 & 1) === id) {
          subscription._eventState = t1 | 2;
          action.call$1(subscription);
          t1 = subscription._eventState ^= 1;
          next = subscription._async$_next;
          if ((t1 & 4) !== 0)
            _this._removeListener$1(subscription);
          subscription._eventState &= 4294967293;
          subscription = next;
        } else
          subscription = subscription._async$_next;
      }
      _this._state &= 4294967293;
      if (_this._firstSubscription == null)
        _this._callOnCancel$0();
    },
    _callOnCancel$0: function() {
      if ((this._state & 4) !== 0) {
        var doneFuture = this._doneFuture;
        if (doneFuture._state === 0)
          doneFuture._asyncComplete$1(null);
      }
      P._runGuarded(this.onCancel);
    },
    set$_firstSubscription: function(_firstSubscription) {
      this._firstSubscription = H._instanceType(this)._eval$1("_BroadcastSubscription<1>?")._as(_firstSubscription);
    },
    set$_lastSubscription: function(_lastSubscription) {
      this._lastSubscription = H._instanceType(this)._eval$1("_BroadcastSubscription<1>?")._as(_lastSubscription);
    },
    $isStreamController: 1,
    $is_StreamControllerLifecycle: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  P._SyncBroadcastStreamController.prototype = {
    get$_mayAddEvent: function() {
      return P._BroadcastStreamController.prototype.get$_mayAddEvent.call(this) && (this._state & 2) === 0;
    },
    _addEventError$0: function() {
      if ((this._state & 2) !== 0)
        return new P.StateError(string$.Cannot);
      return this.super$_BroadcastStreamController$_addEventError();
    },
    _sendData$1: function(data) {
      var t2, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(data);
      t2 = _this._firstSubscription;
      if (t2 == null)
        return;
      if (t2 === _this._lastSubscription) {
        _this._state |= 2;
        t1._eval$1("_BroadcastSubscription<1>")._as(t2)._add$1(data);
        _this._state &= 4294967293;
        if (_this._firstSubscription == null)
          _this._callOnCancel$0();
        return;
      }
      _this._forEachListener$1(new P._SyncBroadcastStreamController__sendData_closure(_this, data));
    }
  };
  P._SyncBroadcastStreamController__sendData_closure.prototype = {
    call$1: function(subscription) {
      this.$this.$ti._eval$1("_BufferingStreamSubscription<1>")._as(subscription)._add$1(this.data);
    },
    $signature: function() {
      return this.$this.$ti._eval$1("~(_BufferingStreamSubscription<1>)");
    }
  };
  P._AsyncBroadcastStreamController.prototype = {
    _sendData$1: function(data) {
      var subscription,
        t1 = this.$ti;
      t1._precomputed1._as(data);
      for (subscription = this._firstSubscription, t1 = t1._eval$1("_DelayedData<1>"); subscription != null; subscription = subscription._async$_next)
        subscription._addPending$1(new P._DelayedData(data, t1));
    }
  };
  P._Completer.prototype = {
    completeError$2: function(error, stackTrace) {
      var t1;
      H.checkNotNullable(error, "error", type$.Object);
      t1 = this.future;
      if (t1._state !== 0)
        throw H.wrapException(P.StateError$("Future already completed"));
      if (stackTrace == null)
        stackTrace = P.AsyncError_defaultStackTrace(error);
      t1._asyncCompleteError$2(error, stackTrace);
    },
    completeError$1: function(error) {
      return this.completeError$2(error, null);
    },
    $isCompleter: 1
  };
  P._AsyncCompleter.prototype = {
    complete$1: function(value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if (t2._state !== 0)
        throw H.wrapException(P.StateError$("Future already completed"));
      t2._asyncComplete$1(t1._eval$1("1/")._as(value));
    },
    complete$0: function() {
      return this.complete$1(null);
    }
  };
  P._FutureListener.prototype = {
    matchesErrorTest$1: function(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: function(asyncError) {
      var errorCallback = this.errorCallback,
        t1 = type$.dynamic,
        t2 = type$.Object,
        t3 = this.$ti._eval$1("2/"),
        t4 = this.result._zone;
      if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
        return t3._as(t4.runBinary$3$3(errorCallback, asyncError.error, asyncError.stackTrace, t1, t2, type$.StackTrace));
      else
        return t3._as(t4.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), asyncError.error, t1, t2));
    }
  };
  P._Future.prototype = {
    then$1$2$onError: function(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 !== C.C__RootZone) {
        $R._eval$1("@<0/>")._bind$1(t1._precomputed1)._eval$1("1(2)")._as(f);
        if (onError != null)
          onError = P._registerErrorHandler(onError, currentZone);
      }
      result = new P._Future(currentZone, $R._eval$1("_Future<0>"));
      t2 = onError == null ? 1 : 3;
      this._addListener$1(new P._FutureListener(result, t2, f, onError, t1._eval$1("@<1>")._bind$1($R)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    then$1$1: function(f, $R) {
      return this.then$1$2$onError(f, null, $R);
    },
    _thenAwait$1$2: function(f, onError, $E) {
      var result,
        t1 = this.$ti;
      t1._bind$1($E)._eval$1("1/(2)")._as(f);
      result = new P._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this._addListener$1(new P._FutureListener(result, 19, f, onError, t1._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    whenComplete$1: function(action) {
      var t1, result;
      type$.dynamic_Function._as(action);
      t1 = this.$ti;
      result = new P._Future($.Zone__current, t1);
      this._addListener$1(new P._FutureListener(result, 8, action, null, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    _setValue$1: function(value) {
      this.$ti._precomputed1._as(value);
      this._state = 4;
      this._resultOrListeners = value;
    },
    _addListener$1: function(listener) {
      var source, _this = this,
        t1 = _this._state;
      if (t1 <= 1) {
        listener._nextListener = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listener;
      } else {
        if (t1 === 2) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          t1 = source._state;
          if (t1 < 4) {
            source._addListener$1(listener);
            return;
          }
          _this._state = t1;
          _this._resultOrListeners = source._resultOrListeners;
        }
        P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(new P._Future__addListener_closure(_this, listener)));
      }
    },
    _prependListeners$1: function(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 <= 1) {
        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 === 2) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          t1 = source._state;
          if (t1 < 4) {
            source._prependListeners$1(listeners);
            return;
          }
          _this._state = t1;
          _this._resultOrListeners = source._resultOrListeners;
        }
        _box_0.listeners = _this._reverseListeners$1(listeners);
        P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(new P._Future__prependListeners_closure(_box_0, _this)));
      }
    },
    _removeListeners$0: function() {
      var current = type$.nullable__FutureListener_dynamic_dynamic._as(this._resultOrListeners);
      this._resultOrListeners = null;
      return this._reverseListeners$1(current);
    },
    _reverseListeners$1: function(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: function(source) {
      var e, s, exception, _this = this;
      _this._state = 1;
      try {
        source.then$1$2$onError(new P._Future__chainForeignFuture_closure(_this), new P._Future__chainForeignFuture_closure0(_this), type$.Null);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P.scheduleMicrotask(new P._Future__chainForeignFuture_closure1(_this, e, s));
      }
    },
    _complete$1: function(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))
          P._Future__chainCoreFuture(value, _this);
        else
          _this._chainForeignFuture$1(value);
      else {
        listeners = _this._removeListeners$0();
        t1._precomputed1._as(value);
        _this._state = 4;
        _this._resultOrListeners = value;
        P._Future__propagateToListeners(_this, listeners);
      }
    },
    _completeWithValue$1: function(value) {
      var listeners, _this = this;
      _this.$ti._precomputed1._as(value);
      listeners = _this._removeListeners$0();
      _this._state = 4;
      _this._resultOrListeners = value;
      P._Future__propagateToListeners(_this, listeners);
    },
    _completeError$2: function(error, stackTrace) {
      var listeners, t1, _this = this;
      type$.StackTrace._as(stackTrace);
      listeners = _this._removeListeners$0();
      t1 = P.AsyncError$(error, stackTrace);
      _this._state = 8;
      _this._resultOrListeners = t1;
      P._Future__propagateToListeners(_this, listeners);
    },
    _asyncComplete$1: function(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(t1._precomputed1._as(value));
    },
    _asyncCompleteWithValue$1: function(value) {
      var _this = this;
      _this.$ti._precomputed1._as(value);
      _this._state = 1;
      P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(new P._Future__asyncCompleteWithValue_closure(_this, value)));
    },
    _chainFuture$1: function(value) {
      var _this = this,
        t1 = _this.$ti;
      t1._eval$1("Future<1>")._as(value);
      if (t1._is(value)) {
        if (value._state === 8) {
          _this._state = 1;
          P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(new P._Future__chainFuture_closure(_this, value)));
        } else
          P._Future__chainCoreFuture(value, _this);
        return;
      }
      _this._chainForeignFuture$1(value);
    },
    _asyncCompleteError$2: function(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this._state = 1;
      P._rootScheduleMicrotask(null, null, this._zone, type$.void_Function._as(new P._Future__asyncCompleteError_closure(this, error, stackTrace)));
    },
    $isFuture: 1
  };
  P._Future__addListener_closure.prototype = {
    call$0: function() {
      P._Future__propagateToListeners(this.$this, this.listener);
    },
    $signature: 0
  };
  P._Future__prependListeners_closure.prototype = {
    call$0: function() {
      P._Future__propagateToListeners(this.$this, this._box_0.listeners);
    },
    $signature: 0
  };
  P._Future__chainForeignFuture_closure.prototype = {
    call$1: function(value) {
      var error, stackTrace, exception,
        t1 = this.$this;
      t1._state = 0;
      try {
        t1._completeWithValue$1(t1.$ti._precomputed1._as(value));
      } catch (exception) {
        error = H.unwrapException(exception);
        stackTrace = H.getTraceFromException(exception);
        t1._completeError$2(error, stackTrace);
      }
    },
    $signature: 11
  };
  P._Future__chainForeignFuture_closure0.prototype = {
    call$2: function(error, stackTrace) {
      this.$this._completeError$2(error, type$.StackTrace._as(stackTrace));
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: 29
  };
  P._Future__chainForeignFuture_closure1.prototype = {
    call$0: function() {
      this.$this._completeError$2(this.e, this.s);
    },
    $signature: 0
  };
  P._Future__asyncCompleteWithValue_closure.prototype = {
    call$0: function() {
      this.$this._completeWithValue$1(this.value);
    },
    $signature: 0
  };
  P._Future__chainFuture_closure.prototype = {
    call$0: function() {
      P._Future__chainCoreFuture(this.value, this.$this);
    },
    $signature: 0
  };
  P._Future__asyncCompleteError_closure.prototype = {
    call$0: function() {
      this.$this._completeError$2(this.error, this.stackTrace);
    },
    $signature: 0
  };
  P._Future__propagateToListeners_handleWhenCompleteCallback.prototype = {
    call$0: function() {
      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 = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        if (_this.hasError) {
          t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners).error;
          t2 = e;
          t2 = t1 == null ? t2 == null : t1 === t2;
          t1 = t2;
        } else
          t1 = false;
        t2 = _this._box_0;
        if (t1)
          t2.listenerValueOrError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        else
          t2.listenerValueOrError = P.AsyncError$(e, s);
        t2.listenerHasError = true;
        return;
      }
      if (completeResult instanceof P._Future && completeResult._state >= 4) {
        if (completeResult._state === 8) {
          t1 = _this._box_0;
          t1.listenerValueOrError = type$.AsyncError._as(completeResult._resultOrListeners);
          t1.listenerHasError = true;
        }
        return;
      }
      if (type$.Future_dynamic._is(completeResult)) {
        originalSource = _this._box_1.source;
        t1 = _this._box_0;
        t1.listenerValueOrError = completeResult.then$1$1(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(originalSource), type$.dynamic);
        t1.listenerHasError = false;
      }
    },
    $signature: 0
  };
  P._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
    call$1: function(_) {
      return this.originalSource;
    },
    $signature: 32
  };
  P._Future__propagateToListeners_handleValueCallback.prototype = {
    call$0: function() {
      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 = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        t1 = this._box_0;
        t1.listenerValueOrError = P.AsyncError$(e, s);
        t1.listenerHasError = true;
      }
    },
    $signature: 0
  };
  P._Future__propagateToListeners_handleError.prototype = {
    call$0: function() {
      var asyncError, e, s, t1, exception, t2, t3, t4, _this = this;
      try {
        asyncError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t1 = _this._box_0;
        if (H.boolConversionCheck(t1.listener.matchesErrorTest$1(asyncError)) && t1.listener.errorCallback != null) {
          t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
          t1.listenerHasError = false;
        }
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t2 = t1.error;
        t3 = e;
        t4 = _this._box_0;
        if (t2 == null ? t3 == null : t2 === t3)
          t4.listenerValueOrError = t1;
        else
          t4.listenerValueOrError = P.AsyncError$(e, s);
        t4.listenerHasError = true;
      }
    },
    $signature: 0
  };
  P._AsyncCallbackEntry.prototype = {};
  P.Stream.prototype = {
    map$1: function(_, convert) {
      var t1 = H._instanceType(this);
      return new P._MapStream(t1._eval$1("@(Stream.T)")._as(convert), this, t1._eval$1("_MapStream<Stream.T,@>"));
    },
    get$length: function(_) {
      var t1 = {},
        future = new P._Future($.Zone__current, type$._Future_int);
      t1.count = 0;
      this.listen$4$cancelOnError$onDone$onError(new P.Stream_length_closure(t1, this), true, new P.Stream_length_closure0(t1, future), future.get$_completeError());
      return future;
    },
    get$first: function(_) {
      var future = new P._Future($.Zone__current, H._instanceType(this)._eval$1("_Future<Stream.T>")),
        subscription = this.listen$4$cancelOnError$onDone$onError(null, true, new P.Stream_first_closure(future), future.get$_completeError());
      subscription.onData$1(new P.Stream_first_closure0(this, subscription, future));
      return future;
    }
  };
  P.Stream_length_closure.prototype = {
    call$1: function(_) {
      H._instanceType(this.$this)._eval$1("Stream.T")._as(_);
      ++this._box_0.count;
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  P.Stream_length_closure0.prototype = {
    call$0: function() {
      this.future._complete$1(this._box_0.count);
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P.Stream_first_closure.prototype = {
    call$0: function() {
      var e, s, t1, exception, error, stackTrace;
      try {
        t1 = H.IterableElementError_noElement();
        throw H.wrapException(t1);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        error = e;
        stackTrace = s;
        if (stackTrace == null)
          stackTrace = P.AsyncError_defaultStackTrace(error);
        this.future._completeError$2(error, stackTrace);
      }
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  P.Stream_first_closure0.prototype = {
    call$1: function(value) {
      P._cancelAndValue(this.subscription, this.future, H._instanceType(this.$this)._eval$1("Stream.T")._as(value));
    },
    $signature: function() {
      return H._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  P.StreamSubscription.prototype = {};
  P.StreamTransformerBase.prototype = {};
  P._StreamController.prototype = {
    get$_pendingEvents: function() {
      var t1, _this = this;
      if ((_this._state & 8) === 0)
        return H._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(_this._varData);
      t1 = H._instanceType(_this);
      return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData());
    },
    _ensurePendingEvents$0: function() {
      var events, t1, _this = this;
      if ((_this._state & 8) === 0) {
        events = _this._varData;
        if (events == null)
          events = _this._varData = new P._StreamImplEvents(H._instanceType(_this)._eval$1("_StreamImplEvents<1>"));
        return H._instanceType(_this)._eval$1("_StreamImplEvents<1>")._as(events);
      }
      t1 = H._instanceType(_this);
      events = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData();
      return t1._eval$1("_StreamImplEvents<1>")._as(events);
    },
    get$_async$_subscription: function() {
      var varData = this._varData;
      if ((this._state & 8) !== 0)
        varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData).get$varData();
      return H._instanceType(this)._eval$1("_ControllerSubscription<1>")._as(varData);
    },
    _badEventState$0: function() {
      if ((this._state & 4) !== 0)
        return new P.StateError("Cannot add event after closing");
      return new P.StateError("Cannot add event while adding a stream");
    },
    _ensureDoneFuture$0: function() {
      var t1 = this._doneFuture;
      if (t1 == null)
        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new P._Future($.Zone__current, type$._Future_void);
      return t1;
    },
    add$1: function(_, value) {
      var t2, _this = this,
        t1 = H._instanceType(_this);
      t1._precomputed1._as(value);
      t2 = _this._state;
      if (t2 >= 4)
        throw H.wrapException(_this._badEventState$0());
      if ((t2 & 1) !== 0)
        _this._sendData$1(value);
      else if ((t2 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new P._DelayedData(value, t1._eval$1("_DelayedData<1>")));
    },
    close$0: function(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 4) !== 0)
        return _this._ensureDoneFuture$0();
      if (t1 >= 4)
        throw H.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, C.C__DelayedDone);
      return _this._ensureDoneFuture$0();
    },
    _subscribe$4: function(onData, onError, onDone, cancelOnError) {
      var subscription, pendingEvents, t2, addState, _this = this,
        t1 = H._instanceType(_this);
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      if ((_this._state & 3) !== 0)
        throw H.wrapException(P.StateError$("Stream has already been listened to."));
      subscription = P._ControllerSubscription$(_this, onData, onError, onDone, cancelOnError, t1._precomputed1);
      pendingEvents = _this.get$_pendingEvents();
      t2 = _this._state |= 1;
      if ((t2 & 8) !== 0) {
        addState = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
        addState.set$varData(subscription);
        addState.resume$0();
      } else
        _this._varData = subscription;
      subscription._setPendingEvents$1(pendingEvents);
      subscription._guardCallback$1(new P._StreamController__subscribe_closure(_this));
      return subscription;
    },
    _recordCancel$1: function(subscription) {
      var result, onCancel, cancelResult, e, s, exception, result0, _this = this,
        t1 = H._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();
      _this._varData = null;
      _this._state = _this._state & 4294967286 | 2;
      onCancel = _this.onCancel;
      if (onCancel != null)
        if (result == null)
          try {
            cancelResult = onCancel.call$0();
            if (type$.Future_void._is(cancelResult))
              result = cancelResult;
          } catch (exception) {
            e = H.unwrapException(exception);
            s = H.getTraceFromException(exception);
            result0 = new P._Future($.Zone__current, type$._Future_void);
            result0._asyncCompleteError$2(e, s);
            result = result0;
          }
        else
          result = result.whenComplete$1(onCancel);
      t1 = new P._StreamController__recordCancel_complete(_this);
      if (result != null)
        result = result.whenComplete$1(t1);
      else
        t1.call$0();
      return result;
    },
    _recordPause$1: function(subscription) {
      var _this = this,
        t1 = H._instanceType(_this);
      t1._eval$1("StreamSubscription<1>")._as(subscription);
      if ((_this._state & 8) !== 0)
        t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).pause$0();
      P._runGuarded(_this.onPause);
    },
    _recordResume$1: function(subscription) {
      var _this = this,
        t1 = H._instanceType(_this);
      t1._eval$1("StreamSubscription<1>")._as(subscription);
      if ((_this._state & 8) !== 0)
        t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).resume$0();
      P._runGuarded(_this.onResume);
    },
    $isStreamController: 1,
    $is_StreamControllerLifecycle: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  P._StreamController__subscribe_closure.prototype = {
    call$0: function() {
      P._runGuarded(this.$this.onListen);
    },
    $signature: 0
  };
  P._StreamController__recordCancel_complete.prototype = {
    call$0: function() {
      var doneFuture = this.$this._doneFuture;
      if (doneFuture != null && doneFuture._state === 0)
        doneFuture._asyncComplete$1(null);
    },
    $signature: 0
  };
  P._AsyncStreamControllerDispatch.prototype = {
    _sendData$1: function(data) {
      var t1 = this.$ti;
      t1._precomputed1._as(data);
      this.get$_async$_subscription()._addPending$1(new P._DelayedData(data, t1._eval$1("_DelayedData<1>")));
    },
    _sendError$2: function(error, stackTrace) {
      this.get$_async$_subscription()._addPending$1(new P._DelayedError(error, stackTrace));
    },
    _sendDone$0: function() {
      this.get$_async$_subscription()._addPending$1(C.C__DelayedDone);
    }
  };
  P._AsyncStreamController.prototype = {};
  P._ControllerStream.prototype = {
    get$hashCode: function(_) {
      return (H.Primitives_objectHashCode(this._controller) ^ 892482866) >>> 0;
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return other instanceof P._ControllerStream && other._controller === this._controller;
    }
  };
  P._ControllerSubscription.prototype = {
    _onCancel$0: function() {
      return this._controller._recordCancel$1(this);
    },
    _onPause$0: function() {
      this._controller._recordPause$1(this);
    },
    _onResume$0: function() {
      this._controller._recordResume$1(this);
    }
  };
  P._StreamSinkWrapper.prototype = {};
  P._BufferingStreamSubscription.prototype = {
    _setPendingEvents$1: function(pendingEvents) {
      var _this = this;
      H._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: function(handleData) {
      var t1 = H._instanceType(this);
      this.set$_async$_onData(P._BufferingStreamSubscription__registerDataHandler(this._zone, t1._eval$1("~(_BufferingStreamSubscription.T)?")._as(handleData), t1._eval$1("_BufferingStreamSubscription.T")));
    },
    pause$0: function() {
      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: function() {
      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: function() {
      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;
    },
    _cancel$0: function() {
      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: function(data) {
      var t2, _this = this,
        t1 = H._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 P._DelayedData(data, t1._eval$1("_DelayedData<_BufferingStreamSubscription.T>")));
    },
    _addError$2: function(error, stackTrace) {
      var t1 = this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 < 32)
        this._sendError$2(error, stackTrace);
      else
        this._addPending$1(new P._DelayedError(error, stackTrace));
    },
    _close$0: function() {
      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(C.C__DelayedDone);
    },
    _onPause$0: function() {
    },
    _onResume$0: function() {
    },
    _onCancel$0: function() {
      return null;
    },
    _addPending$1: function($event) {
      var _this = this,
        t1 = H._instanceType(_this),
        pending = t1._eval$1("_StreamImplEvents<_BufferingStreamSubscription.T>?")._as(_this._pending);
      if (pending == null)
        pending = new P._StreamImplEvents(t1._eval$1("_StreamImplEvents<_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: function(data) {
      var t2, _this = this,
        t1 = H._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: function(error, stackTrace) {
      var cancelFuture, _this = this,
        t1 = _this._state,
        t2 = new P._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: function() {
      var cancelFuture, _this = this,
        t1 = new P._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: function(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: function(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: function(_onData) {
      this._async$_onData = H._instanceType(this)._eval$1("~(_BufferingStreamSubscription.T)")._as(_onData);
    },
    set$_pending: function(_pending) {
      this._pending = H._instanceType(this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(_pending);
    },
    $isStreamSubscription: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  P._BufferingStreamSubscription__sendError_sendError.prototype = {
    call$0: function() {
      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
  };
  P._BufferingStreamSubscription__sendDone_sendDone.prototype = {
    call$0: function() {
      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
  };
  P._StreamImpl.prototype = {
    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
      var t1 = H._instanceType(this);
      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$2$onDone: function(onData, onDone) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, null);
    },
    listen$3$onDone$onError: function(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  P._DelayedEvent.prototype = {
    set$next: function(next) {
      this.next = type$.nullable__DelayedEvent_dynamic._as(next);
    },
    get$next: function() {
      return this.next;
    }
  };
  P._DelayedData.prototype = {
    perform$1: function(dispatch) {
      this.$ti._eval$1("_EventDispatch<1>")._as(dispatch)._sendData$1(this.value);
    }
  };
  P._DelayedError.prototype = {
    perform$1: function(dispatch) {
      dispatch._sendError$2(this.error, this.stackTrace);
    }
  };
  P._DelayedDone.prototype = {
    perform$1: function(dispatch) {
      dispatch._sendDone$0();
    },
    get$next: function() {
      return null;
    },
    set$next: function(_) {
      throw H.wrapException(P.StateError$("No events after a done."));
    },
    $is_DelayedEvent: 1
  };
  P._PendingEvents.prototype = {
    schedule$1: function(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;
      }
      P.scheduleMicrotask(new P._PendingEvents_schedule_closure(_this, dispatch));
      _this._state = 1;
    }
  };
  P._PendingEvents_schedule_closure.prototype = {
    call$0: function() {
      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();
      t1.firstPendingEvent = nextEvent;
      if (nextEvent == null)
        t1.lastPendingEvent = null;
      $event.perform$1(t2);
    },
    $signature: 0
  };
  P._StreamImplEvents.prototype = {
    add$1: function(_, $event) {
      var _this = this,
        lastEvent = _this.lastPendingEvent;
      if (lastEvent == null)
        _this.firstPendingEvent = _this.lastPendingEvent = $event;
      else {
        lastEvent.set$next($event);
        _this.lastPendingEvent = $event;
      }
    }
  };
  P._DoneStreamSubscription.prototype = {
    _schedule$0: function() {
      var _this = this;
      if ((_this._state & 2) !== 0)
        return;
      P._rootScheduleMicrotask(null, null, _this._zone, type$.void_Function._as(_this.get$_sendDone()));
      _this._state = (_this._state | 2) >>> 0;
    },
    onData$1: function(handleData) {
      this.$ti._eval$1("~(1)?")._as(handleData);
    },
    pause$0: function() {
      this._state += 4;
    },
    resume$0: function() {
      var t1 = this._state;
      if (t1 >= 4) {
        t1 = this._state = t1 - 4;
        if (t1 < 4 && (t1 & 1) === 0)
          this._schedule$0();
      }
    },
    cancel$0: function() {
      return $.$get$Future__nullFuture();
    },
    _sendDone$0: function() {
      var _this = this,
        t1 = _this._state = (_this._state & 4294967293) >>> 0;
      if (t1 >= 4)
        return;
      _this._state = (t1 | 1) >>> 0;
      _this._zone.runGuarded$1(_this._onDone);
    },
    $isStreamSubscription: 1
  };
  P._StreamIterator.prototype = {
    get$current: function() {
      var _this = this;
      if (_this._async$_hasValue)
        return _this.$ti._precomputed1._as(_this._stateData);
      return _this.$ti._precomputed1._as(null);
    },
    moveNext$0: function() {
      var future, _this = this,
        subscription = _this._async$_subscription;
      if (subscription != null) {
        if (_this._async$_hasValue) {
          future = new P._Future($.Zone__current, type$._Future_bool);
          _this._stateData = future;
          _this._async$_hasValue = false;
          subscription.resume$0();
          return future;
        }
        throw H.wrapException(P.StateError$("Already waiting for next."));
      }
      return _this._initializeOrDone$0();
    },
    _initializeOrDone$0: function() {
      var future, subscription, _this = this,
        stateData = _this._stateData;
      if (stateData != null) {
        _this.$ti._eval$1("Stream<1>")._as(stateData);
        future = new P._Future($.Zone__current, type$._Future_bool);
        _this._stateData = future;
        subscription = stateData.listen$4$cancelOnError$onDone$onError(_this.get$_async$_onData(), true, _this.get$_onDone(), _this.get$_onError());
        if (_this._stateData != null)
          _this.set$_async$_subscription(subscription);
        return future;
      }
      return $.$get$Future__falseFuture();
    },
    cancel$0: function() {
      var _this = this,
        subscription = _this._async$_subscription,
        stateData = _this._stateData;
      _this._stateData = null;
      if (subscription != null) {
        _this.set$_async$_subscription(null);
        if (!_this._async$_hasValue)
          type$._Future_bool._as(stateData)._asyncComplete$1(false);
        else
          _this._async$_hasValue = false;
        return subscription.cancel$0();
      }
      return $.$get$Future__nullFuture();
    },
    _async$_onData$1: function(data) {
      var moveNextFuture, t1, _this = this;
      _this.$ti._precomputed1._as(data);
      if (_this._async$_subscription == null)
        return;
      moveNextFuture = type$._Future_bool._as(_this._stateData);
      _this._stateData = data;
      _this._async$_hasValue = true;
      moveNextFuture._complete$1(true);
      if (_this._async$_hasValue) {
        t1 = _this._async$_subscription;
        if (t1 != null)
          t1.pause$0();
      }
    },
    _onError$2: function(error, stackTrace) {
      var subscription, moveNextFuture, _this = this;
      type$.StackTrace._as(stackTrace);
      subscription = _this._async$_subscription;
      moveNextFuture = type$._Future_bool._as(_this._stateData);
      _this.set$_async$_subscription(null);
      _this._stateData = null;
      if (subscription != null)
        moveNextFuture._completeError$2(error, stackTrace);
      else
        moveNextFuture._asyncCompleteError$2(error, stackTrace);
    },
    _onDone$0: function() {
      var _this = this,
        subscription = _this._async$_subscription,
        moveNextFuture = type$._Future_bool._as(_this._stateData);
      _this.set$_async$_subscription(null);
      _this._stateData = null;
      if (subscription != null)
        moveNextFuture._completeWithValue$1(false);
      else
        moveNextFuture._asyncCompleteWithValue$1(false);
    },
    set$_async$_subscription: function(_subscription) {
      this._async$_subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  P._cancelAndValue_closure.prototype = {
    call$0: function() {
      return this.future._complete$1(this.value);
    },
    $signature: 0
  };
  P._ForwardingStream.prototype = {
    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
      var t2, t3, t4, t5, t6,
        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 = P._BufferingStreamSubscription__registerDataHandler(t3, onData, t2);
      t6 = P._BufferingStreamSubscription__registerErrorHandler(t3, onError);
      t1 = new P._ForwardingStreamSubscription(this, t5, t6, type$.void_Function._as(onDone), t3, t4, t1._eval$1("@<1>")._bind$1(t2)._eval$1("_ForwardingStreamSubscription<1,2>"));
      t1.set$_async$_subscription(this._async$_source.listen$3$onDone$onError(t1.get$_handleData(), t1.get$_handleDone(), t1.get$_handleError()));
      return t1;
    },
    listen$3$onDone$onError: function(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  P._ForwardingStreamSubscription.prototype = {
    _add$1: function(data) {
      this.$ti._rest[1]._as(data);
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_add(data);
    },
    _addError$2: function(error, stackTrace) {
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_addError(error, stackTrace);
    },
    _onPause$0: function() {
      var t1 = this._async$_subscription;
      if (t1 != null)
        t1.pause$0();
    },
    _onResume$0: function() {
      var t1 = this._async$_subscription;
      if (t1 != null)
        t1.resume$0();
    },
    _onCancel$0: function() {
      var subscription = this._async$_subscription;
      if (subscription != null) {
        this.set$_async$_subscription(null);
        return subscription.cancel$0();
      }
      return null;
    },
    _handleData$1: function(data) {
      this._stream._handleData$2(this.$ti._precomputed1._as(data), this);
    },
    _handleError$2: function(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._addError$2(error, stackTrace);
    },
    _handleDone$0: function() {
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._close$0();
    },
    set$_async$_subscription: function(_subscription) {
      this._async$_subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  P._MapStream.prototype = {
    _handleData$2: function(inputEvent, sink) {
      var outputEvent, e, s, exception,
        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 = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        sink._addError$2(e, s);
        return;
      }
      sink._add$1(outputEvent);
    }
  };
  P.AsyncError.prototype = {
    toString$0: function(_) {
      return H.S(this.error);
    },
    $isError0: 1,
    get$stackTrace: function() {
      return this.stackTrace;
    }
  };
  P._Zone.prototype = {$isZone: 1};
  P._rootHandleUncaughtError_closure.prototype = {
    call$0: function() {
      var error = H.wrapException(this.error);
      error.stack = J.toString$0$(this.stackTrace);
      throw error;
    },
    $signature: 0
  };
  P._RootZone.prototype = {
    runGuarded$1: function(f) {
      var e, s, exception, _null = null;
      type$.void_Function._as(f);
      try {
        if (C.C__RootZone === $.Zone__current) {
          f.call$0();
          return;
        }
        P._rootRun(_null, _null, this, f, type$.void);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2: function(f, arg, $T) {
      var e, s, exception, _null = null;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        if (C.C__RootZone === $.Zone__current) {
          f.call$1(arg);
          return;
        }
        P._rootRunUnary(_null, _null, this, f, arg, type$.void, $T);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3: function(f, arg1, arg2, T1, T2) {
      var e, s, exception, _null = null;
      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      try {
        if (C.C__RootZone === $.Zone__current) {
          f.call$2(arg1, arg2);
          return;
        }
        P._rootRunBinary(_null, _null, this, f, arg1, arg2, type$.void, T1, T2);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        P._rootHandleUncaughtError(_null, _null, this, e, type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1: function(f, $R) {
      return new P._RootZone_bindCallback_closure(this, $R._eval$1("0()")._as(f), $R);
    },
    bindCallbackGuarded$1: function(f) {
      return new P._RootZone_bindCallbackGuarded_closure(this, type$.void_Function._as(f));
    },
    bindUnaryCallbackGuarded$1$1: function(f, $T) {
      return new P._RootZone_bindUnaryCallbackGuarded_closure(this, $T._eval$1("~(0)")._as(f), $T);
    },
    $index: function(_, key) {
      return null;
    },
    run$1$1: function(f, $R) {
      $R._eval$1("0()")._as(f);
      if ($.Zone__current === C.C__RootZone)
        return f.call$0();
      return P._rootRun(null, null, this, f, $R);
    },
    runUnary$2$2: function(f, arg, $R, $T) {
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      if ($.Zone__current === C.C__RootZone)
        return f.call$1(arg);
      return P._rootRunUnary(null, null, this, f, arg, $R, $T);
    },
    runBinary$3$3: function(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 === C.C__RootZone)
        return f.call$2(arg1, arg2);
      return P._rootRunBinary(null, null, this, f, arg1, arg2, $R, T1, T2);
    },
    registerBinaryCallback$3$1: function(f, $R, T1, T2) {
      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
    }
  };
  P._RootZone_bindCallback_closure.prototype = {
    call$0: function() {
      return this.$this.run$1$1(this.f, this.R);
    },
    $signature: function() {
      return this.R._eval$1("0()");
    }
  };
  P._RootZone_bindCallbackGuarded_closure.prototype = {
    call$0: function() {
      return this.$this.runGuarded$1(this.f);
    },
    $signature: 0
  };
  P._RootZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1: function(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.f, t1._as(arg), t1);
    },
    $signature: function() {
      return this.T._eval$1("~(0)");
    }
  };
  P._LinkedHashSet.prototype = {
    get$iterator: function(_) {
      var _this = this,
        t1 = new P._LinkedHashSetIterator(_this, _this._collection$_modifications, H._instanceType(_this)._eval$1("_LinkedHashSetIterator<1>"));
      t1._collection$_cell = _this._collection$_first;
      return t1;
    },
    get$length: function(_) {
      return this._collection$_length;
    },
    add$1: function(_, element) {
      var strings, nums, _this = this;
      H._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 = P._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 = P._LinkedHashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(element);
    },
    _collection$_add$1: function(element) {
      var rest, hash, bucket, _this = this;
      H._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = P._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: function(table, element) {
      H._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: function(element) {
      var _this = this,
        cell = new P._LinkedHashSetCell(H._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: function(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2: function(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, element))
          return i;
      return -1;
    }
  };
  P._LinkedHashSetCell.prototype = {};
  P._LinkedHashSetIterator.prototype = {
    get$current: function() {
      return this._collection$_current;
    },
    moveNext$0: function() {
      var _this = this,
        cell = _this._collection$_cell,
        t1 = _this._set;
      if (_this._collection$_modifications !== t1._collection$_modifications)
        throw H.wrapException(P.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._element));
        _this._collection$_cell = cell._collection$_next;
        return true;
      }
    },
    set$_collection$_current: function(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  P.ListMixin.prototype = {
    get$iterator: function(receiver) {
      return new H.ListIterator(receiver, this.get$length(receiver), H.instanceType(receiver)._eval$1("ListIterator<ListMixin.E>"));
    },
    elementAt$1: function(receiver, index) {
      return this.$index(receiver, index);
    },
    forEach$1: function(receiver, action) {
      var $length, i;
      H.instanceType(receiver)._eval$1("~(ListMixin.E)")._as(action);
      $length = this.get$length(receiver);
      for (i = 0; i < $length; ++i) {
        action.call$1(this.$index(receiver, i));
        if ($length !== this.get$length(receiver))
          throw H.wrapException(P.ConcurrentModificationError$(receiver));
      }
    },
    get$isNotEmpty: function(receiver) {
      return this.get$length(receiver) !== 0;
    },
    map$1$1: function(receiver, f, $T) {
      var t1 = H.instanceType(receiver);
      return new H.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(ListMixin.E)")._as(f), t1._eval$1("@<ListMixin.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1: function($receiver, f) {
      return this.map$1$1($receiver, f, type$.dynamic);
    },
    toList$1$growable: function(receiver, growable) {
      var t1, first, result, i, _this = this;
      if (_this.get$length(receiver) === 0) {
        t1 = J.JSArray_JSArray$growable(0, H.instanceType(receiver)._eval$1("ListMixin.E"));
        return t1;
      }
      first = _this.$index(receiver, 0);
      result = P.List_List$filled(_this.get$length(receiver), first, true, H.instanceType(receiver)._eval$1("ListMixin.E"));
      for (i = 1; i < _this.get$length(receiver); ++i)
        C.JSArray_methods.$indexSet(result, i, _this.$index(receiver, i));
      return result;
    },
    toList$0: function($receiver) {
      return this.toList$1$growable($receiver, true);
    },
    $add: function(receiver, other) {
      var t1 = H.instanceType(receiver);
      t1._eval$1("List<ListMixin.E>")._as(other);
      t1 = P.List_List$of(receiver, true, t1._eval$1("ListMixin.E"));
      C.JSArray_methods.addAll$1(t1, other);
      return t1;
    },
    toString$0: function(receiver) {
      return P.IterableBase_iterableToFullString(receiver, "[", "]");
    }
  };
  P.MapBase.prototype = {};
  P.MapBase_mapToString_closure.prototype = {
    call$2: function(k, v) {
      var t2,
        t1 = this._box_0;
      if (!t1.first)
        this.result._contents += ", ";
      t1.first = false;
      t1 = this.result;
      t2 = t1._contents += H.S(k);
      t1._contents = t2 + ": ";
      t1._contents += H.S(v);
    },
    $signature: 13
  };
  P.MapMixin.prototype = {
    forEach$1: function(_, action) {
      var t1, key;
      H._instanceType(this)._eval$1("~(MapMixin.K,MapMixin.V)")._as(action);
      for (t1 = this.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
        key = t1.get$current();
        action.call$2(key, this.$index(0, key));
      }
    },
    map$2$1: function(_, transform, K2, V2) {
      var result, t1, key, entry;
      H._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(MapMixin.K,MapMixin.V)")._as(transform);
      result = P.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      for (t1 = this.get$keys(), t1 = t1.get$iterator(t1); t1.moveNext$0();) {
        key = t1.get$current();
        entry = transform.call$2(key, this.$index(0, key));
        result.$indexSet(0, entry.get$key(entry), entry.get$value());
      }
      return result;
    },
    map$1: function($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    containsKey$1: function(key) {
      return this.get$keys().contains$1(0, key);
    },
    get$length: function(_) {
      var t1 = this.get$keys();
      return t1.get$length(t1);
    },
    get$isEmpty: function(_) {
      var t1 = this.get$keys();
      return t1.get$isEmpty(t1);
    },
    toString$0: function(_) {
      return P.MapBase_mapToString(this);
    },
    $isMap: 1
  };
  P._UnmodifiableMapMixin.prototype = {
    $indexSet: function(_, key, value) {
      var t1 = H._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable map"));
    }
  };
  P.MapView.prototype = {
    $index: function(_, key) {
      return this._collection$_map.$index(0, key);
    },
    $indexSet: function(_, key, value) {
      var t1 = H._instanceType(this);
      this._collection$_map.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1: function(key) {
      return this._collection$_map.containsKey$1(key);
    },
    forEach$1: function(_, action) {
      this._collection$_map.forEach$1(0, H._instanceType(this)._eval$1("~(1,2)")._as(action));
    },
    get$isEmpty: function(_) {
      var t1 = this._collection$_map;
      return t1.get$isEmpty(t1);
    },
    get$length: function(_) {
      var t1 = this._collection$_map;
      return t1.get$length(t1);
    },
    get$keys: function() {
      return this._collection$_map.get$keys();
    },
    toString$0: function(_) {
      return P.MapBase_mapToString(this._collection$_map);
    },
    map$2$1: function(_, transform, K2, V2) {
      return this._collection$_map.map$2$1(0, H._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), K2, V2);
    },
    map$1: function($receiver, transform) {
      return this.map$2$1($receiver, transform, type$.dynamic, type$.dynamic);
    },
    $isMap: 1
  };
  P.UnmodifiableMapView.prototype = {};
  P.ListQueue.prototype = {
    get$iterator: function(_) {
      var _this = this;
      return new P._ListQueueIterator(_this, _this._tail, _this._modificationCount, _this._head, _this.$ti._eval$1("_ListQueueIterator<1>"));
    },
    get$isEmpty: function(_) {
      return this._head === this._tail;
    },
    get$length: function(_) {
      return (this._tail - this._head & this._collection$_table.length - 1) >>> 0;
    },
    elementAt$1: function(_, index) {
      var t1, t2, t3, _this = this,
        $length = _this.get$length(_this);
      if (0 > index || index >= $length)
        H.throwExpression(P.IndexError$(index, _this, "index", null, $length));
      t1 = _this._collection$_table;
      t2 = t1.length;
      t3 = (_this._head + index & t2 - 1) >>> 0;
      if (t3 < 0 || t3 >= t2)
        return H.ioore(t1, t3);
      return t1[t3];
    },
    toString$0: function(_) {
      return P.IterableBase_iterableToFullString(this, "{", "}");
    },
    set$_collection$_table: function(_table) {
      this._collection$_table = this.$ti._eval$1("List<1?>")._as(_table);
    },
    $isQueue: 1
  };
  P._ListQueueIterator.prototype = {
    get$current: function() {
      return this._collection$_current;
    },
    moveNext$0: function() {
      var t2, t3, _this = this,
        t1 = _this._queue;
      if (_this._modificationCount !== t1._modificationCount)
        H.throwExpression(P.ConcurrentModificationError$(t1));
      t2 = _this._position;
      if (t2 === _this._end) {
        _this.set$_collection$_current(null);
        return false;
      }
      t3 = t1._collection$_table;
      if (t2 >= t3.length)
        return H.ioore(t3, t2);
      _this.set$_collection$_current(t3[t2]);
      _this._position = (_this._position + 1 & t1._collection$_table.length - 1) >>> 0;
      return true;
    },
    set$_collection$_current: function(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  P.SetMixin.prototype = {
    map$1: function(_, f) {
      var t1 = H._instanceType(this);
      return new H.EfficientLengthMappedIterable(this, t1._eval$1("@(1)")._as(f), t1._eval$1("EfficientLengthMappedIterable<1,@>"));
    },
    toString$0: function(_) {
      return P.IterableBase_iterableToFullString(this, "{", "}");
    }
  };
  P._SetBase.prototype = {$isEfficientLengthIterable: 1, $isIterable: 1};
  P._UnmodifiableMapView_MapView__UnmodifiableMapMixin.prototype = {};
  P.__SetBase_Object_SetMixin.prototype = {};
  P._JsonMap.prototype = {
    $index: function(_, 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: function(_) {
      var t1;
      if (this._processed == null) {
        t1 = this._data;
        t1 = t1.get$length(t1);
      } else
        t1 = this._computeKeys$0().length;
      return t1;
    },
    get$isEmpty: function(_) {
      return this.get$length(this) === 0;
    },
    get$keys: function() {
      if (this._processed == null)
        return this._data.get$keys();
      return new P._JsonMapKeyIterable(this);
    },
    $indexSet: function(_, key, value) {
      var processed, original, _this = this;
      if (_this._processed == null)
        _this._data.$indexSet(0, key, value);
      else if (_this.containsKey$1(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: function(key) {
      if (this._processed == null)
        return this._data.containsKey$1(key);
      return Object.prototype.hasOwnProperty.call(this._original, key);
    },
    forEach$1: function(_, 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._computeKeys$0();
      for (i = 0; i < keys.length; ++i) {
        key = keys[i];
        value = _this._processed[key];
        if (typeof value == "undefined") {
          value = P._convertJsonToDartLazy(_this._original[key]);
          _this._processed[key] = value;
        }
        f.call$2(key, value);
        if (keys !== _this._data)
          throw H.wrapException(P.ConcurrentModificationError$(_this));
      }
    },
    _computeKeys$0: function() {
      var keys = type$.nullable_List_dynamic._as(this._data);
      if (keys == null)
        keys = this._data = H.setRuntimeTypeInfo(Object.keys(this._original), type$.JSArray_String);
      return keys;
    },
    _upgrade$0: function() {
      var result, keys, i, t1, key, _this = this;
      if (_this._processed == null)
        return _this._data;
      result = P.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = _this._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)
        C.JSArray_methods.add$1(keys, "");
      else
        C.JSArray_methods.set$length(keys, 0);
      _this._original = _this._processed = null;
      return _this._data = result;
    },
    _process$1: function(key) {
      var result;
      if (!Object.prototype.hasOwnProperty.call(this._original, key))
        return null;
      result = P._convertJsonToDartLazy(this._original[key]);
      return this._processed[key] = result;
    }
  };
  P._JsonMapKeyIterable.prototype = {
    get$length: function(_) {
      var t1 = this._parent;
      return t1.get$length(t1);
    },
    elementAt$1: function(_, index) {
      var t1 = this._parent;
      if (t1._processed == null)
        t1 = t1.get$keys().elementAt$1(0, index);
      else {
        t1 = t1._computeKeys$0();
        if (index < 0 || index >= t1.length)
          return H.ioore(t1, index);
        t1 = t1[index];
      }
      return t1;
    },
    get$iterator: function(_) {
      var t1 = this._parent;
      if (t1._processed == null) {
        t1 = t1.get$keys();
        t1 = t1.get$iterator(t1);
      } else {
        t1 = t1._computeKeys$0();
        t1 = new J.ArrayIterator(t1, t1.length, H._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
      }
      return t1;
    },
    contains$1: function(_, key) {
      return this._parent.containsKey$1(key);
    }
  };
  P.Utf8Decoder__decoder_closure.prototype = {
    call$0: function() {
      var t1, exception;
      try {
        t1 = new TextDecoder("utf-8", {fatal: true});
        return t1;
      } catch (exception) {
        H.unwrapException(exception);
      }
      return null;
    },
    $signature: 14
  };
  P.Utf8Decoder__decoderNonfatal_closure.prototype = {
    call$0: function() {
      var t1, exception;
      try {
        t1 = new TextDecoder("utf-8", {fatal: false});
        return t1;
      } catch (exception) {
        H.unwrapException(exception);
      }
      return null;
    },
    $signature: 14
  };
  P.Codec.prototype = {};
  P.Converter.prototype = {};
  P.JsonUnsupportedObjectError.prototype = {
    toString$0: function(_) {
      var safeString = P.Error_safeToString(this.unsupportedObject);
      return (this.cause != null ? "Converting object to an encodable object failed:" : "Converting object did not return an encodable object:") + " " + safeString;
    }
  };
  P.JsonCyclicError.prototype = {
    toString$0: function(_) {
      return "Cyclic error in JSON stringify";
    }
  };
  P.JsonCodec.prototype = {
    decode$2$reviver: function(source, reviver) {
      var t1;
      type$.nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object._as(reviver);
      t1 = P._parseJson(source, this.get$decoder()._reviver);
      return t1;
    },
    encode$2$toEncodable: function(value, toEncodable) {
      var t1;
      type$.nullable_nullable_Object_Function_dynamic._as(toEncodable);
      t1 = P._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
      return t1;
    },
    encode$1: function(value) {
      return this.encode$2$toEncodable(value, null);
    },
    get$encoder: function() {
      return C.JsonEncoder_null;
    },
    get$decoder: function() {
      return C.JsonDecoder_null;
    }
  };
  P.JsonEncoder.prototype = {};
  P.JsonDecoder.prototype = {};
  P._JsonStringifier.prototype = {
    writeStringContent$1: function(s) {
      var t1, t2, offset, i, charCode, t3, t4,
        $length = s.length;
      for (t1 = J.getInterceptor$s(s), t2 = this._sink, offset = 0, i = 0; i < $length; ++i) {
        charCode = t1._codeUnitAt$1(s, i);
        if (charCode > 92) {
          if (charCode >= 55296) {
            t3 = charCode & 64512;
            if (t3 === 55296) {
              t4 = i + 1;
              t4 = !(t4 < $length && (C.JSString_methods._codeUnitAt$1(s, t4) & 64512) === 56320);
            } else
              t4 = false;
            if (!t4)
              if (t3 === 56320) {
                t3 = i - 1;
                t3 = !(t3 >= 0 && (C.JSString_methods.codeUnitAt$1(s, t3) & 64512) === 55296);
              } else
                t3 = false;
            else
              t3 = true;
            if (t3) {
              if (i > offset)
                t2._contents += C.JSString_methods.substring$2(s, offset, i);
              offset = i + 1;
              t2._contents += H.Primitives_stringFromCharCode(92);
              t2._contents += H.Primitives_stringFromCharCode(117);
              t2._contents += H.Primitives_stringFromCharCode(100);
              t3 = charCode >>> 8 & 15;
              t2._contents += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
              t3 = charCode >>> 4 & 15;
              t2._contents += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
              t3 = charCode & 15;
              t2._contents += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
            }
          }
          continue;
        }
        if (charCode < 32) {
          if (i > offset)
            t2._contents += C.JSString_methods.substring$2(s, offset, i);
          offset = i + 1;
          t2._contents += H.Primitives_stringFromCharCode(92);
          switch (charCode) {
            case 8:
              t2._contents += H.Primitives_stringFromCharCode(98);
              break;
            case 9:
              t2._contents += H.Primitives_stringFromCharCode(116);
              break;
            case 10:
              t2._contents += H.Primitives_stringFromCharCode(110);
              break;
            case 12:
              t2._contents += H.Primitives_stringFromCharCode(102);
              break;
            case 13:
              t2._contents += H.Primitives_stringFromCharCode(114);
              break;
            default:
              t2._contents += H.Primitives_stringFromCharCode(117);
              t2._contents += H.Primitives_stringFromCharCode(48);
              t2._contents += H.Primitives_stringFromCharCode(48);
              t3 = charCode >>> 4 & 15;
              t2._contents += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
              t3 = charCode & 15;
              t2._contents += H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
              break;
          }
        } else if (charCode === 34 || charCode === 92) {
          if (i > offset)
            t2._contents += C.JSString_methods.substring$2(s, offset, i);
          offset = i + 1;
          t2._contents += H.Primitives_stringFromCharCode(92);
          t2._contents += H.Primitives_stringFromCharCode(charCode);
        }
      }
      if (offset === 0)
        t2._contents += H.S(s);
      else if (offset < $length)
        t2._contents += t1.substring$2(s, offset, $length);
    },
    _checkCycle$1: function(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 H.wrapException(new P.JsonCyclicError(object, null));
      }
      C.JSArray_methods.add$1(t1, object);
    },
    writeObject$1: function(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 = P.JsonUnsupportedObjectError$(object, null, _this.get$_partialResult());
          throw H.wrapException(t1);
        }
        t1 = _this._seen;
        if (0 >= t1.length)
          return H.ioore(t1, -1);
        t1.pop();
      } catch (exception) {
        e = H.unwrapException(exception);
        t1 = P.JsonUnsupportedObjectError$(object, e, _this.get$_partialResult());
        throw H.wrapException(t1);
      }
    },
    writeJsonValue$1: function(object) {
      var t1, success, _this = this;
      if (typeof object == "number") {
        if (!isFinite(object))
          return false;
        _this._sink._contents += C.JSNumber_methods.toString$0(object);
        return true;
      } else if (object === true) {
        _this._sink._contents += "true";
        return true;
      } else if (object === false) {
        _this._sink._contents += "false";
        return true;
      } else if (object == null) {
        _this._sink._contents += "null";
        return true;
      } else if (typeof object == "string") {
        t1 = _this._sink;
        t1._contents += '"';
        _this.writeStringContent$1(object);
        t1._contents += '"';
        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 H.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 H.ioore(t1, -1);
        t1.pop();
        return success;
      } else
        return false;
    },
    writeList$1: function(list) {
      var t2, i,
        t1 = this._sink;
      t1._contents += "[";
      t2 = J.getInterceptor$ax(list);
      if (t2.get$isNotEmpty(list)) {
        this.writeObject$1(t2.$index(list, 0));
        for (i = 1; i < t2.get$length(list); ++i) {
          t1._contents += ",";
          this.writeObject$1(t2.$index(list, i));
        }
      }
      t1._contents += "]";
    },
    writeMap$1: function(map) {
      var t1, keyValueList, i, t2, separator, t3, _this = this, _box_0 = {};
      if (map.get$isEmpty(map)) {
        _this._sink._contents += "{}";
        return true;
      }
      t1 = map.get$length(map) * 2;
      keyValueList = P.List_List$filled(t1, null, false, type$.nullable_Object);
      i = _box_0.i = 0;
      _box_0.allStringKeys = true;
      map.forEach$1(0, new P._JsonStringifier_writeMap_closure(_box_0, keyValueList));
      if (!_box_0.allStringKeys)
        return false;
      t2 = _this._sink;
      t2._contents += "{";
      for (separator = '"'; i < t1; i += 2, separator = ',"') {
        t2._contents += separator;
        _this.writeStringContent$1(H._asStringS(keyValueList[i]));
        t2._contents += '":';
        t3 = i + 1;
        if (t3 >= t1)
          return H.ioore(keyValueList, t3);
        _this.writeObject$1(keyValueList[t3]);
      }
      t2._contents += "}";
      return true;
    }
  };
  P._JsonStringifier_writeMap_closure.prototype = {
    call$2: function(key, value) {
      var t1, t2;
      if (typeof key != "string")
        this._box_0.allStringKeys = false;
      t1 = this.keyValueList;
      t2 = this._box_0;
      C.JSArray_methods.$indexSet(t1, t2.i++, key);
      C.JSArray_methods.$indexSet(t1, t2.i++, value);
    },
    $signature: 13
  };
  P._JsonStringStringifier.prototype = {
    get$_partialResult: function() {
      var t1 = this._sink._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    }
  };
  P.Utf8Decoder.prototype = {
    convert$1: function(codeUnits) {
      var t1, result;
      type$.List_int._as(codeUnits);
      t1 = this._allowMalformed;
      result = P.Utf8Decoder__convertIntercepted(t1, codeUnits, 0, null);
      if (result != null)
        return result;
      return new P._Utf8Decoder(t1).convertGeneral$4(codeUnits, 0, null, true);
    }
  };
  P._Utf8Decoder.prototype = {
    convertGeneral$4: function(codeUnits, start, maybeEnd, single) {
      var end, result, t1, message, _this = this;
      type$.List_int._as(codeUnits);
      end = P.RangeError_checkValidRange(start, maybeEnd, codeUnits.length);
      if (start === end)
        return "";
      result = _this._convertRecursive$4(codeUnits, start, end, true);
      t1 = _this._convert$_state;
      if ((t1 & 1) !== 0) {
        message = P._Utf8Decoder_errorDescription(t1);
        _this._convert$_state = 0;
        throw H.wrapException(P.FormatException$(message, codeUnits, _this._charOrIndex));
      }
      return result;
    },
    _convertRecursive$4: function(bytes, start, end, single) {
      var mid, s1, _this = this;
      if (end - start > 1000) {
        mid = C.JSInt_methods._tdivFast$1(start + end, 2);
        s1 = _this._convertRecursive$4(bytes, start, mid, false);
        if ((_this._convert$_state & 1) !== 0)
          return s1;
        return s1 + _this._convertRecursive$4(bytes, mid, end, single);
      }
      return _this.decodeGeneral$4(bytes, start, end, single);
    },
    decodeGeneral$4: function(bytes, start, end, single) {
      var byte, t2, type, t3, i0, markEnd, i1, m, _this = this, _65533 = 65533,
        state = _this._convert$_state,
        char = _this._charOrIndex,
        buffer = new P.StringBuffer(""),
        i = start + 1,
        t1 = bytes.length;
      if (start < 0 || start >= t1)
        return H.ioore(bytes, start);
      byte = bytes[start];
      $label0$0:
        for (t2 = _this.allowMalformed; true;) {
          for (; true; i = i0) {
            type = C.JSString_methods._codeUnitAt$1("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHJEEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBKCCCCCCCCCCCCDCLONNNMEEEEEEEEEEE", byte) & 31;
            char = state <= 32 ? byte & 61694 >>> type : (byte & 63 | char << 6) >>> 0;
            state = C.JSString_methods._codeUnitAt$1(" \x000:XECCCCCN:lDb \x000:XECCCCCNvlDb \x000:XECCCCCN:lDb AAAAA\x00\x00\x00\x00\x00AAAAA00000AAAAA:::::AAAAAGG000AAAAA00KKKAAAAAG::::AAAAA:IIIIAAAAA000\x800AAAAA\x00\x00\x00\x00 AAAAA", state + type);
            if (state === 0) {
              buffer._contents += H.Primitives_stringFromCharCode(char);
              if (i === end)
                break $label0$0;
              break;
            } else if ((state & 1) !== 0) {
              if (t2)
                switch (state) {
                  case 69:
                  case 67:
                    buffer._contents += H.Primitives_stringFromCharCode(_65533);
                    break;
                  case 65:
                    buffer._contents += H.Primitives_stringFromCharCode(_65533);
                    --i;
                    break;
                  default:
                    t3 = buffer._contents += H.Primitives_stringFromCharCode(_65533);
                    buffer._contents = t3 + H.Primitives_stringFromCharCode(_65533);
                    break;
                }
              else {
                _this._convert$_state = state;
                _this._charOrIndex = i - 1;
                return "";
              }
              state = 0;
            }
            if (i === end)
              break $label0$0;
            i0 = i + 1;
            if (i < 0 || i >= t1)
              return H.ioore(bytes, i);
            byte = bytes[i];
          }
          i0 = i + 1;
          if (i < 0 || i >= t1)
            return H.ioore(bytes, i);
          byte = bytes[i];
          if (byte < 128) {
            while (true) {
              if (!(i0 < end)) {
                markEnd = end;
                break;
              }
              i1 = i0 + 1;
              if (i0 < 0 || i0 >= t1)
                return H.ioore(bytes, i0);
              byte = bytes[i0];
              if (byte >= 128) {
                markEnd = i1 - 1;
                i0 = i1;
                break;
              }
              i0 = i1;
            }
            if (markEnd - i < 20)
              for (m = i; m < markEnd; ++m) {
                if (m >= t1)
                  return H.ioore(bytes, m);
                buffer._contents += H.Primitives_stringFromCharCode(bytes[m]);
              }
            else
              buffer._contents += P.String_String$fromCharCodes(bytes, i, markEnd);
            if (markEnd === end)
              break $label0$0;
            i = i0;
          } else
            i = i0;
        }
      if (single && state > 32)
        if (t2)
          buffer._contents += H.Primitives_stringFromCharCode(_65533);
        else {
          _this._convert$_state = 77;
          _this._charOrIndex = end;
          return "";
        }
      _this._convert$_state = state;
      _this._charOrIndex = char;
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    }
  };
  P._symbolMapToStringMap_closure.prototype = {
    call$2: function(key, value) {
      this.result.$indexSet(0, type$.Symbol._as(key).__internal$_name, value);
    },
    $signature: 15
  };
  P.NoSuchMethodError_toString_closure.prototype = {
    call$2: function(key, value) {
      var t1, t2, t3;
      type$.Symbol._as(key);
      t1 = this.sb;
      t2 = this._box_0;
      t1._contents += t2.comma;
      t3 = t1._contents += H.S(key.__internal$_name);
      t1._contents = t3 + ": ";
      t1._contents += P.Error_safeToString(value);
      t2.comma = ", ";
    },
    $signature: 15
  };
  P.DateTime.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof P.DateTime && this._value === other._value && this.isUtc === other.isUtc;
    },
    get$hashCode: function(_) {
      var t1 = this._value;
      return (t1 ^ C.JSInt_methods._shrOtherPositive$1(t1, 30)) & 1073741823;
    },
    toString$0: function(_) {
      var _this = this,
        y = P.DateTime__fourDigits(H.Primitives_getYear(_this)),
        m = P.DateTime__twoDigits(H.Primitives_getMonth(_this)),
        d = P.DateTime__twoDigits(H.Primitives_getDay(_this)),
        h = P.DateTime__twoDigits(H.Primitives_getHours(_this)),
        min = P.DateTime__twoDigits(H.Primitives_getMinutes(_this)),
        sec = P.DateTime__twoDigits(H.Primitives_getSeconds(_this)),
        ms = P.DateTime__threeDigits(H.Primitives_getMilliseconds(_this));
      if (_this.isUtc)
        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
      else
        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
    }
  };
  P.Duration.prototype = {
    $add: function(_, other) {
      return new P.Duration(C.JSInt_methods.$add(this._duration, type$.Duration._as(other).get$_duration()));
    },
    $sub: function(_, other) {
      return new P.Duration(C.JSInt_methods.$sub(this._duration, type$.Duration._as(other).get$_duration()));
    },
    $lt: function(_, other) {
      return C.JSInt_methods.$lt(this._duration, type$.Duration._as(other).get$_duration());
    },
    $gt: function(_, other) {
      return C.JSInt_methods.$gt(this._duration, type$.Duration._as(other).get$_duration());
    },
    $ge: function(_, other) {
      return C.JSInt_methods.$ge(this._duration, type$.Duration._as(other).get$_duration());
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof P.Duration && this._duration === other._duration;
    },
    get$hashCode: function(_) {
      return C.JSInt_methods.get$hashCode(this._duration);
    },
    toString$0: function(_) {
      var twoDigitMinutes, twoDigitSeconds, sixDigitUs,
        t1 = new P.Duration_toString_twoDigits(),
        t2 = this._duration;
      if (t2 < 0)
        return "-" + new P.Duration(0 - t2).toString$0(0);
      twoDigitMinutes = t1.call$1(C.JSInt_methods._tdivFast$1(t2, 60000000) % 60);
      twoDigitSeconds = t1.call$1(C.JSInt_methods._tdivFast$1(t2, 1000000) % 60);
      sixDigitUs = new P.Duration_toString_sixDigits().call$1(t2 % 1000000);
      return "" + C.JSInt_methods._tdivFast$1(t2, 3600000000) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
    }
  };
  P.Duration_toString_sixDigits.prototype = {
    call$1: function(n) {
      if (n >= 100000)
        return "" + n;
      if (n >= 10000)
        return "0" + n;
      if (n >= 1000)
        return "00" + n;
      if (n >= 100)
        return "000" + n;
      if (n >= 10)
        return "0000" + n;
      return "00000" + n;
    },
    $signature: 16
  };
  P.Duration_toString_twoDigits.prototype = {
    call$1: function(n) {
      if (n >= 10)
        return "" + n;
      return "0" + n;
    },
    $signature: 16
  };
  P.Error0.prototype = {
    get$stackTrace: function() {
      return H.getTraceFromException(this.$thrownJsError);
    }
  };
  P.AssertionError.prototype = {
    toString$0: function(_) {
      var t1 = this.message;
      if (t1 != null)
        return "Assertion failed: " + P.Error_safeToString(t1);
      return "Assertion failed";
    }
  };
  P.TypeError.prototype = {};
  P.NullThrownError.prototype = {
    toString$0: function(_) {
      return "Throw of null.";
    }
  };
  P.ArgumentError.prototype = {
    get$_errorName: function() {
      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
    },
    get$_errorExplanation: function() {
      return "";
    },
    toString$0: function(_) {
      var explanation, errorValue, _this = this,
        $name = _this.name,
        nameString = $name == null ? "" : " (" + $name + ")",
        message = _this.message,
        messageString = message == null ? "" : ": " + message,
        prefix = _this.get$_errorName() + nameString + messageString;
      if (!_this._hasValue)
        return prefix;
      explanation = _this.get$_errorExplanation();
      errorValue = P.Error_safeToString(_this.invalidValue);
      return prefix + explanation + ": " + errorValue;
    }
  };
  P.RangeError.prototype = {
    get$_errorName: function() {
      return "RangeError";
    },
    get$_errorExplanation: function() {
      var explanation,
        start = this.start,
        end = this.end;
      if (start == null)
        explanation = end != null ? ": Not less than or equal to " + H.S(end) : "";
      else if (end == null)
        explanation = ": Not greater than or equal to " + H.S(start);
      else if (end > start)
        explanation = ": Not in inclusive range " + H.S(start) + ".." + H.S(end);
      else
        explanation = end < start ? ": Valid value range is empty" : ": Only valid value is " + H.S(start);
      return explanation;
    }
  };
  P.IndexError.prototype = {
    get$_errorName: function() {
      return "RangeError";
    },
    get$_errorExplanation: function() {
      var t1,
        invalidValue = H._asIntS(this.invalidValue);
      if (typeof invalidValue !== "number")
        return invalidValue.$lt();
      if (invalidValue < 0)
        return ": index must not be negative";
      t1 = this.length;
      if (t1 === 0)
        return ": no indices are valid";
      return ": index should be less than " + H.S(t1);
    },
    get$length: function(receiver) {
      return this.length;
    }
  };
  P.NoSuchMethodError.prototype = {
    toString$0: function(_) {
      var $arguments, t1, _i, t2, t3, argument, receiverText, actualParameters, _this = this, _box_0 = {},
        sb = new P.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 += P.Error_safeToString(argument);
        _box_0.comma = ", ";
      }
      _this._namedArguments.forEach$1(0, new P.NoSuchMethodError_toString_closure(_box_0, sb));
      receiverText = P.Error_safeToString(_this._core$_receiver);
      actualParameters = sb.toString$0(0);
      t1 = "NoSuchMethodError: method not found: '" + H.S(_this._core$_memberName.__internal$_name) + "'\nReceiver: " + receiverText + "\nArguments: [" + actualParameters + "]";
      return t1;
    }
  };
  P.UnsupportedError.prototype = {
    toString$0: function(_) {
      return "Unsupported operation: " + this.message;
    }
  };
  P.UnimplementedError.prototype = {
    toString$0: function(_) {
      var message = this.message;
      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
    }
  };
  P.StateError.prototype = {
    toString$0: function(_) {
      return "Bad state: " + this.message;
    }
  };
  P.ConcurrentModificationError.prototype = {
    toString$0: function(_) {
      var t1 = this.modifiedObject;
      if (t1 == null)
        return "Concurrent modification during iteration.";
      return "Concurrent modification during iteration: " + P.Error_safeToString(t1) + ".";
    }
  };
  P.OutOfMemoryError.prototype = {
    toString$0: function(_) {
      return "Out of Memory";
    },
    get$stackTrace: function() {
      return null;
    },
    $isError0: 1
  };
  P.StackOverflowError.prototype = {
    toString$0: function(_) {
      return "Stack Overflow";
    },
    get$stackTrace: function() {
      return null;
    },
    $isError0: 1
  };
  P.CyclicInitializationError.prototype = {
    toString$0: function(_) {
      var variableName = this.variableName;
      return variableName == null ? "Reading static variable during its initialization" : "Reading static variable '" + variableName + "' during its initialization";
    }
  };
  P._Exception.prototype = {
    toString$0: function(_) {
      return "Exception: " + this.message;
    }
  };
  P.FormatException.prototype = {
    toString$0: function(_) {
      var message = this.message,
        report = message != null && "" !== message ? "FormatException: " + H.S(message) : "FormatException",
        offset = this.offset;
      return offset != null ? report + (" (at offset " + H.S(offset) + ")") : report;
    }
  };
  P.Iterable.prototype = {
    map$1: function(_, f) {
      var t1 = H._instanceType(this);
      return H.MappedIterable_MappedIterable(this, t1._eval$1("@(Iterable.E)")._as(f), t1._eval$1("Iterable.E"), type$.dynamic);
    },
    get$length: function(_) {
      var count,
        it = this.get$iterator(this);
      for (count = 0; it.moveNext$0();)
        ++count;
      return count;
    },
    elementAt$1: function(_, index) {
      var t1, elementIndex, element;
      P.RangeError_checkNotNegative(index, "index");
      for (t1 = this.get$iterator(this), elementIndex = 0; t1.moveNext$0();) {
        element = t1.get$current();
        if (index === elementIndex)
          return element;
        ++elementIndex;
      }
      throw H.wrapException(P.IndexError$(index, this, "index", null, elementIndex));
    },
    toString$0: function(_) {
      return P.IterableBase_iterableToShortString(this, "(", ")");
    }
  };
  P.Iterator.prototype = {};
  P.Null.prototype = {
    get$hashCode: function(_) {
      return P.Object.prototype.get$hashCode.call(C.JSNull_methods, this);
    },
    toString$0: function(_) {
      return "null";
    }
  };
  P.Object.prototype = {constructor: P.Object, $isObject: 1,
    $eq: function(_, other) {
      return this === other;
    },
    get$hashCode: function(_) {
      return H.Primitives_objectHashCode(this);
    },
    toString$0: function(_) {
      return "Instance of '" + H.S(H.Primitives_objectTypeName(this)) + "'";
    },
    noSuchMethod$1: function(_, invocation) {
      type$.Invocation._as(invocation);
      throw H.wrapException(P.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments()));
    },
    get$runtimeType: function(_) {
      return H.getRuntimeType(this);
    },
    toString: function() {
      return this.toString$0(this);
    }
  };
  P._StringStackTrace.prototype = {
    toString$0: function(_) {
      return "";
    },
    $isStackTrace: 1
  };
  P.StringBuffer.prototype = {
    get$length: function(_) {
      return this._contents.length;
    },
    toString$0: function(_) {
      var t1 = this._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    $isStringSink: 1
  };
  W.DomException.prototype = {
    toString$0: function(receiver) {
      return String(receiver);
    }
  };
  W.Event0.prototype = {$isEvent0: 1};
  W.EventSource.prototype = {$isEventSource: 1};
  W.EventTarget.prototype = {
    addEventListener$3: function(receiver, type, listener, useCapture) {
      type$.nullable_dynamic_Function_Event._as(listener);
      if (listener != null)
        this._addEventListener$3(receiver, type, listener, useCapture);
    },
    addEventListener$2: function($receiver, type, listener) {
      return this.addEventListener$3($receiver, type, listener, null);
    },
    _addEventListener$3: function(receiver, type, listener, options) {
      return receiver.addEventListener(type, H.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), options);
    },
    _removeEventListener$3: function(receiver, type, listener, options) {
      return receiver.removeEventListener(type, H.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), false);
    },
    $isEventTarget: 1
  };
  W.HttpRequest.prototype = {
    open$3$async: function(receiver, method, url, async) {
      return receiver.open(method, url, true);
    },
    set$withCredentials: function(receiver, value) {
      receiver.withCredentials = true;
    },
    $isHttpRequest: 1
  };
  W.HttpRequest_request_closure.prototype = {
    call$1: function(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(t1);
      else
        t3.completeError$1(e);
    },
    $signature: 42
  };
  W.HttpRequestEventTarget.prototype = {};
  W.MessageEvent.prototype = {$isMessageEvent: 1};
  W.ProgressEvent.prototype = {$isProgressEvent: 1};
  W.EventStreamProvider.prototype = {};
  W._EventStream.prototype = {
    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return W._EventStreamSubscription$(this._target, this._eventType, onData, false, t1._precomputed1);
    },
    listen$3$onDone$onError: function(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  W._EventStreamSubscription.prototype = {
    cancel$0: function() {
      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: function(handleData) {
      var t1, _this = this;
      _this.$ti._eval$1("~(1)?")._as(handleData);
      if (_this._target == null)
        throw H.wrapException(P.StateError$("Subscription has been canceled."));
      _this._unlisten$0();
      t1 = W._wrapZone(new W._EventStreamSubscription_onData_closure(handleData), type$.Event);
      _this.set$_onData(t1);
      _this._tryResume$0();
    },
    pause$0: function() {
      if (this._target == null)
        return;
      ++this._pauseCount;
      this._unlisten$0();
    },
    resume$0: function() {
      var _this = this;
      if (_this._target == null || _this._pauseCount <= 0)
        return;
      --_this._pauseCount;
      _this._tryResume$0();
    },
    _tryResume$0: function() {
      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: function() {
      var t3,
        t1 = this._onData,
        t2 = t1 != null;
      if (t2) {
        t3 = this._target;
        t3.toString;
        type$.nullable_dynamic_Function_Event._as(t1);
        if (t2)
          J._removeEventListener$3$x(t3, this._eventType, t1, false);
      }
    },
    set$_onData: function(_onData) {
      this._onData = type$.nullable_dynamic_Function_Event._as(_onData);
    }
  };
  W._EventStreamSubscription_closure.prototype = {
    call$1: function(e) {
      return this.onData.call$1(type$.Event._as(e));
    },
    $signature: 17
  };
  W._EventStreamSubscription_onData_closure.prototype = {
    call$1: function(e) {
      return this.handleData.call$1(type$.Event._as(e));
    },
    $signature: 17
  };
  P._AcceptStructuredClone.prototype = {
    findSlot$1: function(value) {
      var i,
        t1 = this.values,
        $length = t1.length;
      for (i = 0; i < $length; ++i)
        if (t1[i] === value)
          return i;
      C.JSArray_methods.add$1(t1, value);
      C.JSArray_methods.add$1(this.copies, null);
      return $length;
    },
    walk$1: function(e) {
      var millisSinceEpoch, t1, proto, slot, copy, t2, l, $length, i, _this = this, _box_0 = {};
      if (e == null)
        return e;
      if (H._isBool(e))
        return e;
      if (typeof e == "number")
        return e;
      if (typeof e == "string")
        return e;
      if (e instanceof Date) {
        millisSinceEpoch = e.getTime();
        if (Math.abs(millisSinceEpoch) <= 864e13)
          t1 = false;
        else
          t1 = true;
        if (t1)
          H.throwExpression(P.ArgumentError$("DateTime is outside valid range: " + millisSinceEpoch));
        H.checkNotNullable(true, "isUtc", type$.bool);
        return new P.DateTime(millisSinceEpoch, true);
      }
      if (e instanceof RegExp)
        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
      if (typeof Promise != "undefined" && e instanceof Promise)
        return P.promiseToFuture(e, type$.dynamic);
      proto = Object.getPrototypeOf(e);
      if (proto === Object.prototype || proto === null) {
        slot = _this.findSlot$1(e);
        t1 = _this.copies;
        if (slot >= t1.length)
          return H.ioore(t1, slot);
        copy = _box_0.copy = t1[slot];
        if (copy != null)
          return copy;
        t2 = type$.dynamic;
        copy = P.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
        _box_0.copy = copy;
        C.JSArray_methods.$indexSet(t1, slot, copy);
        _this.forEachJsField$2(e, new P._AcceptStructuredClone_walk_closure(_box_0, _this));
        return _box_0.copy;
      }
      if (e instanceof Array) {
        l = e;
        slot = _this.findSlot$1(l);
        t1 = _this.copies;
        if (slot >= t1.length)
          return H.ioore(t1, slot);
        copy = t1[slot];
        if (copy != null)
          return copy;
        t2 = J.getInterceptor$asx(l);
        $length = t2.get$length(l);
        copy = _this.mustCopy ? new Array($length) : l;
        C.JSArray_methods.$indexSet(t1, slot, copy);
        for (t1 = J.getInterceptor$ax(copy), i = 0; i < $length; ++i)
          t1.$indexSet(copy, i, _this.walk$1(t2.$index(l, i)));
        return copy;
      }
      return e;
    },
    convertNativeToDart_AcceptStructuredClone$2$mustCopy: function(object, mustCopy) {
      this.mustCopy = true;
      return this.walk$1(object);
    }
  };
  P._AcceptStructuredClone_walk_closure.prototype = {
    call$2: function(key, value) {
      var t1 = this._box_0.copy,
        t2 = this.$this.walk$1(value);
      J.$indexSet$ax(t1, key, t2);
      return t2;
    },
    $signature: 52
  };
  P._convertDartToNative_Value_closure.prototype = {
    call$1: function(element) {
      this.array.push(P._convertDartToNative_Value(element));
    },
    $signature: 1
  };
  P.convertDartToNative_Dictionary_closure.prototype = {
    call$2: function(key, value) {
      this.object[key] = P._convertDartToNative_Value(value);
    },
    $signature: 58
  };
  P._AcceptStructuredCloneDart2Js.prototype = {
    forEachJsField$2: function(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, H.throwConcurrentModificationError)(t1), ++_i) {
        key = t1[_i];
        action.call$2(key, object[key]);
      }
    }
  };
  P.promiseToFuture_closure.prototype = {
    call$1: function(r) {
      return this.completer.complete$1(this.T._eval$1("0/?")._as(r));
    },
    $signature: 1
  };
  P.promiseToFuture_closure0.prototype = {
    call$1: function(e) {
      return this.completer.completeError$1(e);
    },
    $signature: 1
  };
  P._JSRandom.prototype = {
    nextInt$1: function(max) {
      if (max <= 0 || max > 4294967296)
        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
      return Math.random() * max >>> 0;
    },
    $isRandom: 1
  };
  V.ErrorResult.prototype = {
    complete$1: function(completer) {
      completer.completeError$2(this.error, this.stackTrace);
    },
    get$hashCode: function(_) {
      return (J.get$hashCode$(this.error) ^ J.get$hashCode$(this.stackTrace) ^ 492929599) >>> 0;
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof V.ErrorResult && J.$eq$(this.error, other.error) && this.stackTrace == other.stackTrace;
    },
    $isResult: 1
  };
  F.ValueResult.prototype = {
    complete$1: function(completer) {
      this.$ti._eval$1("Completer<1*>*")._as(completer).complete$1(this.value);
    },
    get$hashCode: function(_) {
      return (J.get$hashCode$(this.value) ^ 842997089) >>> 0;
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof F.ValueResult && J.$eq$(this.value, other.value);
    },
    $isResult: 1
  };
  G.StreamQueue.prototype = {
    get$next: function() {
      var t1 = this.$ti,
        t2 = new P._Future($.Zone__current, t1._eval$1("_Future<1*>"));
      this._addRequest$1(new G._NextRequest(new P._AsyncCompleter(t2, t1._eval$1("_AsyncCompleter<1*>")), t1._eval$1("_NextRequest<1*>")));
      return t2;
    },
    _updateRequests$0: function() {
      var t1, t2, t3, t4, _this = this;
      for (t1 = _this._requestQueue, t2 = _this._eventQueue; !t1.get$isEmpty(t1);) {
        t3 = t1._head;
        if (t3 === t1._tail)
          H.throwExpression(H.IterableElementError_noElement());
        t4 = t1._collection$_table;
        if (t3 >= t4.length)
          return H.ioore(t4, t3);
        if (t4[t3].update$2(t2, _this._isDone)) {
          t3 = t1._head;
          if (t3 === t1._tail)
            H.throwExpression(H.IterableElementError_noElement());
          ++t1._modificationCount;
          t4 = t1._collection$_table;
          if (t3 >= t4.length)
            return H.ioore(t4, t3);
          C.JSArray_methods.$indexSet(t4, t3, null);
          t1._head = (t1._head + 1 & t1._collection$_table.length - 1) >>> 0;
        } else
          return;
      }
      if (!_this._isDone)
        _this._subscription.pause$0();
    },
    _ensureListening$0: function() {
      var t1, _this = this;
      if (_this._isDone)
        return;
      t1 = _this._subscription;
      if (t1 == null)
        _this.set$_subscription(_this._source.listen$3$onDone$onError(new G.StreamQueue__ensureListening_closure(_this), new G.StreamQueue__ensureListening_closure0(_this), new G.StreamQueue__ensureListening_closure1(_this)));
      else
        t1.resume$0();
    },
    _addResult$1: function(result) {
      var t1, _this = this;
      _this.$ti._eval$1("Result<1*>*")._as(result);
      ++_this._eventsReceived;
      t1 = _this._eventQueue;
      t1._queue_list$_add$1(t1.$ti._eval$1("1*")._as(result));
      _this._updateRequests$0();
    },
    _addRequest$1: function(request) {
      var t1, t2, t3, t4, newTable, split, _this = this;
      _this.$ti._eval$1("_EventRequest<1*>*")._as(request);
      t1 = _this._requestQueue;
      if (t1._head === t1._tail) {
        if (request.update$2(_this._eventQueue, _this._isDone))
          return;
        _this._ensureListening$0();
      }
      t2 = t1.$ti;
      t2._precomputed1._as(request);
      C.JSArray_methods.$indexSet(t1._collection$_table, t1._tail, request);
      t3 = t1._tail;
      t4 = t1._collection$_table.length;
      t3 = (t3 + 1 & t4 - 1) >>> 0;
      t1._tail = t3;
      if (t1._head === t3) {
        newTable = P.List_List$filled(t4 * 2, null, false, t2._eval$1("1?"));
        t2 = t1._collection$_table;
        t3 = t1._head;
        split = t2.length - t3;
        C.JSArray_methods.setRange$4(newTable, 0, split, t2, t3);
        C.JSArray_methods.setRange$4(newTable, split, split + t1._head, t1._collection$_table, 0);
        t1._head = 0;
        t1._tail = t1._collection$_table.length;
        t1.set$_collection$_table(newTable);
      }
      ++t1._modificationCount;
    },
    set$_subscription: function(_subscription) {
      this._subscription = this.$ti._eval$1("StreamSubscription<1*>*")._as(_subscription);
    }
  };
  G.StreamQueue__ensureListening_closure.prototype = {
    call$1: function(data) {
      var t1 = this.$this,
        t2 = t1.$ti;
      t1._addResult$1(new F.ValueResult(t2._eval$1("1*")._as(data), t2._eval$1("ValueResult<1*>")));
    },
    $signature: function() {
      return this.$this.$ti._eval$1("Null(1*)");
    }
  };
  G.StreamQueue__ensureListening_closure1.prototype = {
    call$2: function(error, stackTrace) {
      this.$this._addResult$1(new V.ErrorResult(error, type$.legacy_StackTrace._as(stackTrace)));
    },
    "call*": "call$2",
    $requiredArgCount: 2,
    $signature: 62
  };
  G.StreamQueue__ensureListening_closure0.prototype = {
    call$0: function() {
      var t1 = this.$this;
      t1.set$_subscription(null);
      t1._isDone = true;
      t1._updateRequests$0();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 3
  };
  G._NextRequest.prototype = {
    update$2: function(events, isDone) {
      var t1, t2, result;
      this.$ti._eval$1("QueueList<Result<1*>*>*")._as(events);
      if (events.get$length(events) !== 0) {
        t1 = events._queue_list$_head;
        if (t1 === events._queue_list$_tail)
          H.throwExpression(P.StateError$("No element"));
        t2 = events._table;
        if (t1 >= t2.length)
          return H.ioore(t2, t1);
        result = t2[t1];
        C.JSArray_methods.$indexSet(t2, t1, null);
        events._queue_list$_head = (events._queue_list$_head + 1 & events._table.length - 1) >>> 0;
        result.complete$1(this._completer);
        return true;
      }
      if (isDone) {
        this._completer.completeError$2(new P.StateError("No elements"), P.StackTrace_current());
        return true;
      }
      return false;
    },
    $is_EventRequest: 1
  };
  Q.QueueList.prototype = {
    toString$0: function(_) {
      return P.IterableBase_iterableToFullString(this, "{", "}");
    },
    get$length: function(_) {
      return (this._queue_list$_tail - this._queue_list$_head & this._table.length - 1) >>> 0;
    },
    $index: function(_, index) {
      var t1, t2, t3, _this = this;
      H._asIntS(index);
      if (index < 0 || index >= _this.get$length(_this))
        throw H.wrapException(P.RangeError$("Index " + index + " must be in the range [0.." + _this.get$length(_this) + ")."));
      t1 = _this._table;
      t2 = t1.length;
      t3 = (_this._queue_list$_head + index & t2 - 1) >>> 0;
      if (t3 < 0 || t3 >= t2)
        return H.ioore(t1, t3);
      return t1[t3];
    },
    $indexSet: function(_, index, value) {
      var t1, _this = this;
      H._asIntS(index);
      _this.$ti._eval$1("1*")._as(value);
      if (typeof index !== "number")
        return index.$lt();
      if (index < 0 || index >= _this.get$length(_this))
        throw H.wrapException(P.RangeError$("Index " + index + " must be in the range [0.." + _this.get$length(_this) + ")."));
      t1 = _this._table;
      C.JSArray_methods.$indexSet(t1, (_this._queue_list$_head + index & t1.length - 1) >>> 0, value);
    },
    _queue_list$_add$1: function(element) {
      var t2, t3, newTable, split, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1*")._as(element);
      C.JSArray_methods.$indexSet(_this._table, _this._queue_list$_tail, element);
      t2 = _this._queue_list$_tail;
      t3 = _this._table.length;
      t2 = (t2 + 1 & t3 - 1) >>> 0;
      _this._queue_list$_tail = t2;
      if (_this._queue_list$_head === t2) {
        t2 = new Array(t3 * 2);
        t2.fixed$length = Array;
        newTable = H.setRuntimeTypeInfo(t2, t1._eval$1("JSArray<1*>"));
        t1 = _this._table;
        t2 = _this._queue_list$_head;
        split = t1.length - t2;
        C.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
        C.JSArray_methods.setRange$4(newTable, split, split + _this._queue_list$_head, _this._table, 0);
        _this._queue_list$_head = 0;
        _this._queue_list$_tail = _this._table.length;
        _this.set$_table(newTable);
      }
    },
    set$_table: function(_table) {
      this._table = this.$ti._eval$1("List<1*>*")._as(_table);
    },
    $isEfficientLengthIterable: 1,
    $isQueue: 1,
    $isIterable: 1,
    $isList: 1
  };
  Q._QueueList_Object_ListMixin.prototype = {};
  N.HexCodec.prototype = {
    get$encoder: function() {
      return C.C_HexEncoder;
    }
  };
  R.HexEncoder.prototype = {
    convert$1: function(bytes) {
      type$.legacy_List_legacy_int._as(bytes);
      return R._convert(bytes, 0, bytes.length);
    }
  };
  Y.Level.prototype = {
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Y.Level && this.value === other.value;
    },
    $gt: function(_, other) {
      return C.JSInt_methods.$gt(this.value, type$.legacy_Level._as(other).get$value());
    },
    $ge: function(_, other) {
      return this.value >= type$.legacy_Level._as(other).value;
    },
    get$hashCode: function(_) {
      return this.value;
    },
    toString$0: function(_) {
      return this.name;
    }
  };
  L.LogRecord0.prototype = {
    toString$0: function(_) {
      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
    }
  };
  F.Logger.prototype = {
    get$fullName: function() {
      var t1 = this.parent,
        t2 = t1 == null || t1.name === "",
        t3 = this.name;
      return t2 ? t3 : t1.get$fullName() + "." + t3;
    },
    get$level: function() {
      var effectiveLevel, t1;
      if (this.parent == null)
        effectiveLevel = this._level;
      else {
        t1 = $.$get$Logger_root();
        effectiveLevel = t1._level;
      }
      return effectiveLevel;
    },
    log$4: function(logLevel, message, error, stackTrace) {
      var record, _this = this,
        t1 = logLevel.value;
      if (t1 >= _this.get$level().value) {
        if (t1 >= 2000) {
          P.StackTrace_current();
          logLevel.toString$0(0);
        }
        t1 = _this.get$fullName();
        Date.now();
        $.LogRecord__nextNumber = $.LogRecord__nextNumber + 1;
        record = new L.LogRecord0(logLevel, message, t1);
        if (_this.parent == null)
          _this._publish$1(record);
        else
          $.$get$Logger_root()._publish$1(record);
      }
    },
    _publish$1: function(record) {
    }
  };
  F.Logger_Logger_closure.prototype = {
    call$0: function() {
      var dot, $parent, t1,
        thisName = this.name;
      if (C.JSString_methods.startsWith$1(thisName, "."))
        H.throwExpression(P.ArgumentError$("name shouldn't start with a '.'"));
      dot = C.JSString_methods.lastIndexOf$1(thisName, ".");
      if (dot === -1)
        $parent = thisName !== "" ? F.Logger_Logger("") : null;
      else {
        $parent = F.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
        thisName = C.JSString_methods.substring$1(thisName, dot + 1);
      }
      t1 = new F.Logger(thisName, $parent, P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Logger));
      if ($parent == null)
        t1._level = C.Level_INFO_800;
      else
        $parent._children.$indexSet(0, thisName, t1);
      return t1;
    },
    $signature: 27
  };
  M.SseClient.prototype = {
    SseClient$1: function(serverUrl) {
      var t1, t2, t3, t4, _this = this,
        clientId = K.Uuid$().v1$0();
      _this._eventSource = W.EventSource__factoryEventSource(H.S(serverUrl) + "?sseClientId=" + clientId, P.LinkedHashMap_LinkedHashMap$_literal(["withCredentials", true], type$.String, type$.dynamic));
      _this._serverUrl = H.S(serverUrl) + "?sseClientId=" + clientId;
      t1 = _this._outgoingController;
      new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$onDone(_this.get$_onOutgoingMessage(), _this.get$_onOutgoingDone());
      C.EventSource_methods.addEventListener$2(_this._eventSource, "message", _this.get$_onIncomingMessage());
      C.EventSource_methods.addEventListener$2(_this._eventSource, "control", _this.get$_onIncomingControlMessage());
      t1 = _this._eventSource;
      t2 = type$.nullable_void_Function_legacy_Event;
      t3 = t2._as(new M.SseClient_closure(_this));
      type$.nullable_void_Function._as(null);
      t4 = type$.legacy_Event_2;
      W._EventStreamSubscription$(t1, "open", t3, false, t4);
      W._EventStreamSubscription$(_this._eventSource, "error", t2._as(new M.SseClient_closure0(_this)), false, t4);
      _this._startPostingMessages$0();
    },
    close$0: function(_) {
      this._eventSource.close();
      this._incomingController.close$0(0);
      this._outgoingController.close$0(0);
    },
    _onIncomingControlMessage$1: function(message) {
      var data = new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as(type$.legacy_Event_2._as(message)).data, true);
      if (J.$eq$(data, "close"))
        this.close$0(0);
      else
        throw H.wrapException(P.UnsupportedError$('Illegal Control Message "' + H.S(data) + '"'));
    },
    _onIncomingMessage$1: function(message) {
      this._incomingController.add$1(0, H._asStringS(C.C_JsonCodec.decode$2$reviver(H._asStringS(new P._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.legacy_MessageEvent._as(type$.legacy_Event_2._as(message)).data, true)), null)));
    },
    _onOutgoingDone$0: function() {
      this.close$0(0);
    },
    _onOutgoingMessage$1: function(message) {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.dynamic),
        $async$self = this;
      var $async$_onOutgoingMessage$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$self._messages.add$1(0, message);
              // implicit return
              return P._asyncReturn(null, $async$completer);
          }
      });
      return P._asyncStartSync($async$_onOutgoingMessage$1, $async$completer);
    },
    _startPostingMessages$0: function() {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.dynamic),
        $async$handler = 1, $async$currentError, $async$next = [], $async$self = this, message, e, e0, t2, exception, t3, t1, $async$exception, $async$temp1;
      var $async$_startPostingMessages$0 = P._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._messages;
              t1 = new P._StreamIterator(H.checkNotNullable(new P._ControllerStream(t1, H._instanceType(t1)._eval$1("_ControllerStream<1>")), "stream", type$.Object), type$._StreamIterator_dynamic);
              $async$handler = 2;
              t2 = $async$self._logger;
            case 5:
              // for condition
              $async$temp1 = H;
              $async$goto = 7;
              return P._asyncAwait(t1.moveNext$0(), $async$_startPostingMessages$0);
            case 7:
              // returning from await.
              if (!$async$temp1.boolConversionCheck($async$result)) {
                // goto after for
                $async$goto = 6;
                break;
              }
              message = t1.get$current();
              $async$handler = 9;
              $async$goto = 12;
              return P._asyncAwait(W.HttpRequest_request($async$self._serverUrl, "POST", C.C_JsonCodec.encode$2$toEncodable(message, null), true), $async$_startPostingMessages$0);
            case 12:
              // returning from await.
              $async$handler = 2;
              // goto after finally
              $async$goto = 11;
              break;
            case 9:
              // catch
              $async$handler = 8;
              $async$exception = $async$currentError;
              t3 = H.unwrapException($async$exception);
              if (t3 instanceof P.JsonUnsupportedObjectError) {
                e = t3;
                t2.log$4(C.Level_WARNING_900, "Unable to encode outgoing message: " + H.S(e), null, null);
              } else if (t3 instanceof P.ArgumentError) {
                e0 = t3;
                t2.log$4(C.Level_WARNING_900, "Invalid argument: " + H.S(e0), null, null);
              } else
                throw $async$exception;
              // goto after finally
              $async$goto = 11;
              break;
            case 8:
              // uncaught
              // goto uncaught
              $async$goto = 2;
              break;
            case 11:
              // after finally
              // goto for condition
              $async$goto = 5;
              break;
            case 6:
              // after for
              $async$next.push(4);
              // goto finally
              $async$goto = 3;
              break;
            case 2:
              // uncaught
              $async$next = [1];
            case 3:
              // finally
              $async$handler = 1;
              $async$goto = 13;
              return P._asyncAwait(t1.cancel$0(), $async$_startPostingMessages$0);
            case 13:
              // returning from await.
              // goto the next finally handler
              $async$goto = $async$next.pop();
              break;
            case 4:
              // after finally
              // implicit return
              return P._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return P._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return P._asyncStartSync($async$_startPostingMessages$0, $async$completer);
    }
  };
  M.SseClient_closure.prototype = {
    call$1: function(_) {
      var t1 = this.$this._errorTimer;
      if (t1 != null)
        t1.cancel$0();
    },
    $signature: 19
  };
  M.SseClient_closure0.prototype = {
    call$1: function(error) {
      var t1 = this.$this,
        t2 = t1._errorTimer;
      t2 = t2 == null ? null : t2._handle != null;
      if (t2 !== true)
        t1._errorTimer = P.Timer_Timer(C.Duration_5000000, new M.SseClient__closure(t1, error));
    },
    $signature: 19
  };
  M.SseClient__closure.prototype = {
    call$0: function() {
      var stackTrace, t3,
        t1 = this.$this,
        t2 = t1._incomingController,
        error = this.error;
      H.checkNotNullable(error, "error", type$.Object);
      if (t2._state >= 4)
        H.throwExpression(t2._badEventState$0());
      stackTrace = P.AsyncError_defaultStackTrace(error);
      t3 = t2._state;
      if ((t3 & 1) !== 0)
        t2._sendError$2(error, stackTrace);
      else if ((t3 & 3) === 0)
        t2._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace));
      t1.close$0(0);
    },
    $signature: 3
  };
  R.StreamChannelMixin.prototype = {};
  K.Uuid.prototype = {
    Uuid$1$options: function(_box_0) {
      var t1, t2, i, hex, t3, v1PositionalArgs, v1NamedArgs, _this = this,
        _s19_ = "v1rngPositionalArgs",
        _s14_ = "v1rngNamedArgs",
        _s18_ = "grngPositionalArgs",
        _s13_ = "grngNamedArgs",
        options = _box_0.options;
      if (!(options != null))
        options = new H.JsLinkedHashMap(type$.JsLinkedHashMap_of_legacy_String_and_dynamic);
      _box_0.options = options;
      t1 = new Array(256);
      t1.fixed$length = Array;
      _this.set$_byteToHex(H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_String));
      _this.set$_hexToByte(new H.JsLinkedHashMap(type$.JsLinkedHashMap_of_legacy_String_and_legacy_int));
      for (t1 = type$.JSArray_legacy_int, t2 = type$.HexCodec._eval$1("Codec.S"), i = 0; i < 256; ++i) {
        hex = H.setRuntimeTypeInfo([], t1);
        C.JSArray_methods.add$1(hex, i);
        t3 = _this._byteToHex;
        t2._as(hex);
        (t3 && C.JSArray_methods).$indexSet(t3, i, C.C_HexCodec.get$encoder().convert$1(hex));
        _this._hexToByte.$indexSet(0, _this._byteToHex[i], i);
      }
      v1PositionalArgs = _box_0.options.$index(0, _s19_) != null ? _box_0.options.$index(0, _s19_) : [];
      v1NamedArgs = _box_0.options.$index(0, _s14_) != null ? type$.legacy_Map_of_legacy_Symbol_and_dynamic._as(_box_0.options.$index(0, _s14_)) : C.Map_empty0;
      _this._seedBytes = _box_0.options.$index(0, "v1rng") != null ? P.Function_apply(type$.Function._as(_box_0.options.$index(0, "v1rng")), type$.nullable_List_dynamic._as(v1PositionalArgs), v1NamedArgs) : T.UuidUtil_mathRNG();
      if (_box_0.options.$index(0, _s18_) != null)
        _box_0.options.$index(0, _s18_);
      if (_box_0.options.$index(0, _s13_) != null)
        type$.legacy_Map_of_legacy_Symbol_and_dynamic._as(_box_0.options.$index(0, _s13_));
      _this._nodeId = [J.$or$bn(J.$index$asx(_this._seedBytes, 0), 1), J.$index$asx(_this._seedBytes, 1), J.$index$asx(_this._seedBytes, 2), J.$index$asx(_this._seedBytes, 3), J.$index$asx(_this._seedBytes, 4), J.$index$asx(_this._seedBytes, 5)];
      t1 = J.$shl$n(J.$index$asx(_this._seedBytes, 6), 8);
      t2 = J.$index$asx(_this._seedBytes, 7);
      if (typeof t2 !== "number")
        return H.iae(t2);
      _this._clockSeq = (t1 | t2) & 262143;
    },
    v1$0: function() {
      var buf, options, clockSeq, mSecs, nSecs, dt, t2, tl, tmh, node, n, _this = this,
        _s8_ = "clockSeq",
        _s5_ = "nSecs",
        t1 = new Array(16);
      t1.fixed$length = Array;
      buf = H.setRuntimeTypeInfo(t1, type$.JSArray_legacy_int);
      options = new H.JsLinkedHashMap(type$.JsLinkedHashMap_of_legacy_String_and_dynamic);
      clockSeq = options.$index(0, _s8_) != null ? options.$index(0, _s8_) : _this._clockSeq;
      mSecs = options.$index(0, "mSecs") != null ? options.$index(0, "mSecs") : Date.now();
      nSecs = options.$index(0, _s5_) != null ? options.$index(0, _s5_) : _this._lastNSecs + 1;
      t1 = J.getInterceptor$n(mSecs);
      dt = J.$add$ansx(t1.$sub(mSecs, _this._lastMSecs), J.$div$n(J.$sub$n(nSecs, _this._lastNSecs), 10000));
      t2 = J.getInterceptor$n(dt);
      if (t2.$lt(dt, 0) && options.$index(0, _s8_) == null)
        clockSeq = J.$and$bn(J.$add$ansx(clockSeq, 1), 16383);
      if ((t2.$lt(dt, 0) || t1.$gt(mSecs, _this._lastMSecs)) && options.$index(0, _s5_) == null)
        nSecs = 0;
      if (J.$ge$n(nSecs, 10000))
        throw H.wrapException(P.Exception_Exception("uuid.v1(): Can't create more than 10M uuids/sec"));
      H._asIntS(mSecs);
      _this._lastMSecs = mSecs;
      H._asIntS(nSecs);
      _this._lastNSecs = nSecs;
      _this._clockSeq = clockSeq;
      mSecs += 122192928e5;
      tl = C.JSInt_methods.$mod((mSecs & 268435455) * 10000 + nSecs, 4294967296);
      C.JSArray_methods.$indexSet(buf, 0, C.JSInt_methods._shrOtherPositive$1(tl, 24) & 255);
      C.JSArray_methods.$indexSet(buf, 1, C.JSInt_methods._shrOtherPositive$1(tl, 16) & 255);
      C.JSArray_methods.$indexSet(buf, 2, C.JSInt_methods._shrOtherPositive$1(tl, 8) & 255);
      C.JSArray_methods.$indexSet(buf, 3, tl & 255);
      tmh = C.JSDouble_methods.floor$0(mSecs / 4294967296 * 10000) & 268435455;
      C.JSArray_methods.$indexSet(buf, 4, tmh >>> 8 & 255);
      C.JSArray_methods.$indexSet(buf, 5, tmh & 255);
      C.JSArray_methods.$indexSet(buf, 6, tmh >>> 24 & 15 | 16);
      C.JSArray_methods.$indexSet(buf, 7, tmh >>> 16 & 255);
      t1 = J.getInterceptor$bn(clockSeq);
      C.JSArray_methods.$indexSet(buf, 8, (J.$shr$n(t1.$and(clockSeq, 16128), 8) | 128) >>> 0);
      C.JSArray_methods.$indexSet(buf, 9, H._asIntS(t1.$and(clockSeq, 255)));
      node = options.$index(0, "node") != null ? options.$index(0, "node") : _this._nodeId;
      for (t1 = J.getInterceptor$asx(node), n = 0; n < 6; ++n)
        C.JSArray_methods.$indexSet(buf, 10 + n, H._asIntS(t1.$index(node, n)));
      type$.legacy_List_legacy_int._as(buf);
      t1 = _this._byteToHex;
      t1 = H.S((t1 && C.JSArray_methods).$index(t1, buf[0]));
      t2 = _this._byteToHex;
      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[1]));
      t1 = _this._byteToHex;
      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[2]));
      t2 = _this._byteToHex;
      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[3])) + "-";
      t1 = _this._byteToHex;
      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[4]));
      t2 = _this._byteToHex;
      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[5])) + "-";
      t1 = _this._byteToHex;
      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[6]));
      t2 = _this._byteToHex;
      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[7])) + "-";
      t1 = _this._byteToHex;
      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[8]));
      t2 = _this._byteToHex;
      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[9])) + "-";
      t1 = _this._byteToHex;
      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[10]));
      t2 = _this._byteToHex;
      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[11]));
      t1 = _this._byteToHex;
      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[12]));
      t2 = _this._byteToHex;
      t2 = t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[13]));
      t1 = _this._byteToHex;
      t1 = t2 + H.S((t1 && C.JSArray_methods).$index(t1, buf[14]));
      t2 = _this._byteToHex;
      return t1 + H.S((t2 && C.JSArray_methods).$index(t2, buf[15]));
    },
    set$_byteToHex: function(_byteToHex) {
      this._byteToHex = type$.legacy_List_legacy_String._as(_byteToHex);
    },
    set$_hexToByte: function(_hexToByte) {
      this._hexToByte = type$.legacy_Map_of_legacy_String_and_legacy_int._as(_hexToByte);
    }
  };
  Q.createServiceObject_closure.prototype = {
    call$1: function(e) {
      return Q.createServiceObject(e, this.expectedTypes);
    },
    $signature: 30
  };
  Q._createSpecificObject_closure.prototype = {
    call$1: function(e) {
      return this.creator.call$1(type$.legacy_Map_of_legacy_String_and_dynamic._as(e));
    },
    $signature: 2
  };
  Q.VmService.prototype = {
    _getEventController$1: function(eventName) {
      var t1 = this._eventControllers,
        controller = t1.$index(0, eventName);
      if (controller == null) {
        controller = P.StreamController_StreamController$broadcast(false, type$.legacy_Event);
        t1.$indexSet(0, eventName, controller);
      }
      return controller;
    },
    VmService$5$disposeHandler$log$streamClosed: function(inStream, writeMessage, disposeHandler, log, streamClosed) {
      var _this = this;
      inStream.listen$2$onDone(_this.get$_processMessage(), new Q.VmService_closure(_this));
      _this._writeMessage = writeMessage;
      _this._log = new Q._NullLog();
      _this.set$_disposeHandler(disposeHandler);
    },
    _processMessage$1: function(message) {
      var t1, _this = this;
      if (typeof message == "string")
        _this._processMessageStr$1(message);
      else if (type$.legacy_List_legacy_int._is(message))
        _this._processMessageByteData$1(H.NativeByteData_NativeByteData$view(new Uint8Array(H._ensureNativeList(message)).buffer, 0, null));
      else if (type$.legacy_ByteData._is(message))
        _this._processMessageByteData$1(message);
      else {
        t1 = _this._log;
        J.get$runtimeType$(message).toString$0(0);
        t1.toString;
      }
    },
    _processMessageByteData$1: function(bytes) {
      var t2, t3, meta, data, map, streamId, $event,
        dataOffset = C.NativeByteData_methods._getUint32$2(bytes, 0, true),
        metaLength = dataOffset - 4,
        t1 = bytes.byteLength;
      if (typeof t1 !== "number")
        return t1.$sub();
      t2 = bytes.buffer;
      t3 = bytes.byteOffset;
      if (typeof t3 !== "number")
        return t3.$add();
      t3 += 4;
      H._checkViewArguments(t2, t3, metaLength);
      t2 = new Uint8Array(t2, t3, metaLength);
      type$.List_int._as(t2);
      meta = C.Utf8Decoder_false.convert$1(t2);
      t2 = bytes.buffer;
      t3 = bytes.byteOffset;
      if (typeof t3 !== "number")
        return t3.$add();
      data = H.NativeByteData_NativeByteData$view(t2, t3 + dataOffset, t1 - dataOffset);
      map = C.C_JsonCodec.decode$2$reviver(meta, null);
      if (map != null && J.$eq$(J.$index$asx(map, "method"), "streamNotify")) {
        t1 = J.getInterceptor$asx(map);
        streamId = H._asStringS(J.$index$asx(t1.$index(map, "params"), "streamId"));
        $event = type$.legacy_Map_dynamic_dynamic._as(J.$index$asx(t1.$index(map, "params"), "event"));
        $event.$indexSet(0, "data", data);
        this._getEventController$1(streamId).add$1(0, type$.legacy_Event._as(Q.createServiceObject($event, C.List_Event)));
      }
    },
    _processMessageStr$1: function(message) {
      var e, s, exception, t1, t2, completer, methodName, returnTypes, result, type, _this = this, _s2_ = "id", _s5_ = "error", json = null;
      try {
        _this._onReceive.add$1(0, message);
        json = C.C_JsonCodec.decode$2$reviver(message, null);
      } catch (exception) {
        e = H.unwrapException(exception);
        s = H.getTraceFromException(exception);
        t1 = _this._log;
        H.S(e);
        H.S(s);
        t1.toString;
        return;
      }
      if (json.containsKey$1("method")) {
        t1 = type$.legacy_Map_of_legacy_String_and_dynamic;
        if (json.containsKey$1(_s2_))
          _this._processRequest$1(t1._as(json));
        else
          _this._processNotification$1(t1._as(json));
      } else {
        if (json.containsKey$1(_s2_))
          t1 = json.containsKey$1("result") || json.containsKey$1(_s5_);
        else
          t1 = false;
        if (t1) {
          t1 = type$.legacy_Map_of_legacy_String_and_dynamic;
          t2 = t1._as(json);
          completer = _this._completers.remove$1(0, t2.$index(0, _s2_));
          methodName = _this._methodCalls.remove$1(0, t2.$index(0, _s2_));
          returnTypes = $._methodReturnTypes.$index(0, methodName);
          if (completer == null) {
            t1 = _this._log;
            C.C_JsonCodec.encode$2$toEncodable(t2, null);
            t1.toString;
          } else if (t2.$index(0, _s5_) != null) {
            t1 = t2.$index(0, _s5_);
            t2 = J.getInterceptor$asx(t1);
            completer.completeError$1(new Q.RPCError(methodName, H._asIntS(t2.$index(t1, "code")), H._asStringS(t2.$index(t1, "message")), type$.legacy_Map_dynamic_dynamic._as(t2.$index(t1, "data"))));
          } else {
            result = t1._as(t2.$index(0, "result"));
            type = H._asStringS(result.$index(0, "type"));
            if (type === "Sentinel") {
              t1 = Q.Sentinel$_fromJson(result);
              completer.completeError$1(new Q.SentinelException(methodName, t1));
            } else if ($._typeFactories.$index(0, type) == null) {
              t1 = Q.Response$_fromJson(result);
              completer.complete$1(t1);
            } else
              completer.complete$1(Q.createServiceObject(result, returnTypes));
          }
        } else
          _this._log.toString;
      }
    },
    _processRequest$1: function(json) {
      return this._processRequest$body$VmService(type$.legacy_Map_of_legacy_String_and_dynamic._as(json));
    },
    _processRequest$body$VmService: function(json) {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.dynamic),
        $async$self = this, m, message, t1, t2;
      var $async$_processRequest$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = H._asStringS(json.$index(0, "method"));
              t2 = json.$index(0, "params");
              if (t2 == null)
                t2 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.dynamic);
              $async$goto = 2;
              return P._asyncAwait($async$self._routeRequest$2(t1, type$.legacy_Map_of_legacy_String_and_dynamic._as(t2)), $async$_processRequest$1);
            case 2:
              // returning from await.
              m = $async$result;
              m.$indexSet(0, "id", json.$index(0, "id"));
              m.$indexSet(0, "jsonrpc", "2.0");
              message = C.C_JsonCodec.encode$2$toEncodable(m, null);
              $async$self._onSend.add$1(0, message);
              $async$self._writeMessage.call$1(message);
              // implicit return
              return P._asyncReturn(null, $async$completer);
          }
      });
      return P._asyncStartSync($async$_processRequest$1, $async$completer);
    },
    _processNotification$1: function(json) {
      return this._processNotification$body$VmService(type$.legacy_Map_of_legacy_String_and_dynamic._as(json));
    },
    _processNotification$body$VmService: function(json) {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.dynamic),
        $async$self = this, method, t1;
      var $async$_processNotification$1 = P._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return P._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              method = H._asStringS(json.$index(0, "method"));
              t1 = json.$index(0, "params");
              if (t1 == null)
                t1 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.dynamic);
              type$.legacy_Map_dynamic_dynamic._as(t1);
              $async$goto = method === "streamNotify" ? 2 : 4;
              break;
            case 2:
              // then
              $async$self._getEventController$1(H._asStringS(t1.$index(0, "streamId"))).add$1(0, type$.legacy_Event._as(Q.createServiceObject(t1.$index(0, "event"), C.List_Event)));
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              $async$goto = 5;
              return P._asyncAwait($async$self._routeRequest$2(method, type$.legacy_Map_of_legacy_String_and_dynamic._as(t1)), $async$_processNotification$1);
            case 5:
              // returning from await.
            case 3:
              // join
              // implicit return
              return P._asyncReturn(null, $async$completer);
          }
      });
      return P._asyncStartSync($async$_processNotification$1, $async$completer);
    },
    _routeRequest$2: function(method, params) {
      return this._routeRequest$body$VmService(method, type$.legacy_Map_of_legacy_String_and_dynamic._as(params));
    },
    _routeRequest$body$VmService: function(method, params) {
      var $async$goto = 0,
        $async$completer = P._makeAsyncAwaitCompleter(type$.legacy_Map_dynamic_dynamic),
        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, e, st, error, exception, t2, t3, t4, t1, $async$exception;
      var $async$_routeRequest$2 = P._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._services;
              if (!t1.containsKey$1(method)) {
                t1 = type$.dynamic;
                $async$returnValue = P.LinkedHashMap_LinkedHashMap$_literal(["error", new Q.RPCError(method, -32601, "method not found '" + H.S(method) + "'", null).toMap$0()], t1, t1);
                // goto return
                $async$goto = 1;
                break;
              }
              $async$handler = 4;
              $async$goto = 7;
              return P._asyncAwait(t1.$index(0, method).call$1(params), $async$_routeRequest$2);
            case 7:
              // returning from await.
              t1 = $async$result;
              $async$returnValue = t1;
              // goto return
              $async$goto = 1;
              break;
              $async$handler = 2;
              // goto after finally
              $async$goto = 6;
              break;
            case 4:
              // catch
              $async$handler = 3;
              $async$exception = $async$currentError;
              e = H.unwrapException($async$exception);
              st = H.getTraceFromException($async$exception);
              t1 = H.S(e);
              t2 = H.S(st);
              t3 = type$.dynamic;
              t4 = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, t3);
              t4.$indexSet(0, "details", t2);
              error = new Q.RPCError(method, -32000, t1, t4);
              $async$returnValue = P.LinkedHashMap_LinkedHashMap$_literal(["error", error.toMap$0()], t3, t3);
              // goto return
              $async$goto = 1;
              break;
              // goto after finally
              $async$goto = 6;
              break;
            case 3:
              // uncaught
              // goto rethrow
              $async$goto = 2;
              break;
            case 6:
              // after finally
            case 1:
              // return
              return P._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return P._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return P._asyncStartSync($async$_routeRequest$2, $async$completer);
    },
    set$_disposeHandler: function(_disposeHandler) {
      type$.legacy_legacy_Future_dynamic_Function._as(_disposeHandler);
    }
  };
  Q.VmService_closure.prototype = {
    call$0: function() {
      return this.$this._onDoneCompleter.complete$0();
    },
    "call*": "call$0",
    $requiredArgCount: 0,
    $signature: 0
  };
  Q.RPCError.prototype = {
    get$details: function() {
      var t1 = this.data;
      return H._asStringS(t1 == null ? null : t1.$index(0, "details"));
    },
    toMap$0: function() {
      var map = P.LinkedHashMap_LinkedHashMap$_literal(["code", this.code, "message", this.message], type$.legacy_String, type$.dynamic),
        t1 = this.data;
      if (t1 != null)
        map.$indexSet(0, "data", t1);
      return map;
    },
    toString$0: function(_) {
      var _this = this,
        t1 = _this.callingMethod,
        t2 = _this.code,
        t3 = _this.message;
      if (_this.get$details() == null)
        return H.S(t1) + ": (" + H.S(t2) + ") " + H.S(t3);
      else
        return H.S(t1) + ": (" + H.S(t2) + ") " + H.S(t3) + "\n" + H.S(_this.get$details());
    }
  };
  Q.SentinelException.prototype = {
    toString$0: function(_) {
      return H.S(this.sentinel) + " from " + H.S(this.callingMethod) + "()";
    }
  };
  Q.ExtensionData.prototype = {
    toString$0: function(_) {
      return "[ExtensionData " + this.data.toString$0(0) + "]";
    }
  };
  Q._NullLog.prototype = {$isLog: 1};
  Q.AllocationProfile.prototype = {
    toJson$0: function() {
      var t3, t4, t5, _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "AllocationProfile");
      t3 = _this.members;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["members", P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.AllocationProfile_toJson_closure()), t5), true, t5._eval$1("ListIterable.E")), "memoryUsage", _this.memoryUsage.toJson$0()], t1, t2));
      Q._setIfNotNull(json, "dateLastAccumulatorReset", _this.dateLastAccumulatorReset);
      Q._setIfNotNull(json, "dateLastServiceGC", _this.dateLastServiceGC);
      return json;
    },
    toString$0: function(_) {
      return "[AllocationProfile type: " + H.S(this.type) + ", members: " + H.S(this.members) + ", memoryUsage: " + H.S(this.memoryUsage) + "]";
    },
    set$members: function(members) {
      this.members = type$.legacy_List_legacy_ClassHeapStats._as(members);
    }
  };
  Q.AllocationProfile_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_ClassHeapStats._as(f).toJson$0();
    },
    $signature: 31
  };
  Q.BoundField.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["decl", this.decl.toJson$0(), "value", this.value.toJson$0()], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[BoundField decl: " + H.S(this.decl) + ", value: " + H.S(this.value) + "]";
    }
  };
  Q.BoundVariable.prototype = {
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "BoundVariable");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", _this.name, "value", _this.value.toJson$0(), "declarationTokenPos", _this.declarationTokenPos, "scopeStartTokenPos", _this.scopeStartTokenPos, "scopeEndTokenPos", _this.scopeEndTokenPos], t1, t2));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[BoundVariable type: " + H.S(_this.type) + ", name: " + H.S(_this.name) + ", value: " + H.S(_this.value) + ", declarationTokenPos: " + H.S(_this.declarationTokenPos) + ", scopeStartTokenPos: " + H.S(_this.scopeStartTokenPos) + ", scopeEndTokenPos: " + H.S(_this.scopeEndTokenPos) + "]";
    }
  };
  Q.Breakpoint.prototype = {
    toJson$0: function() {
      var _this = this,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Breakpoint");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["breakpointNumber", _this.breakpointNumber, "resolved", _this.resolved, "location", _this.location.toJson$0()], type$.legacy_String, type$.dynamic));
      Q._setIfNotNull(json, "isSyntheticAsyncContinuation", _this.isSyntheticAsyncContinuation);
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Breakpoint && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Breakpoint type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", breakpointNumber: " + H.S(_this.breakpointNumber) + ", resolved: " + H.S(_this.resolved) + ", location: " + H.S(_this.location) + "]";
    }
  };
  Q.ClassRef.prototype = {
    toJson$0: function() {
      var json = this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Class");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", this.name], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_ClassRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      return "[ClassRef type: " + H.S(this.type) + ", id: " + H.S(this.id) + ", name: " + H.S(this.name) + "]";
    }
  };
  Q.Class.prototype = {
    toJson$0: function() {
      var t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, _this = this, _null = null,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Class");
      t1 = _this.name;
      t2 = _this.isAbstract;
      t3 = _this.isConst;
      t4 = _this.library.toJson$0();
      t5 = _this.interfaces;
      t5.toString;
      t6 = H._arrayInstanceType(t5);
      t7 = t6._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t7 = P.List_List$of(new H.MappedListIterable(t5, t6._eval$1("Map<String*,@>*(1)")._as(new Q.Class_toJson_closure()), t7), true, t7._eval$1("ListIterable.E"));
      t6 = _this.fields;
      t6.toString;
      t5 = H._arrayInstanceType(t6);
      t8 = t5._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t8 = P.List_List$of(new H.MappedListIterable(t6, t5._eval$1("Map<String*,@>*(1)")._as(new Q.Class_toJson_closure0()), t8), true, t8._eval$1("ListIterable.E"));
      t5 = _this.functions;
      t5.toString;
      t6 = H._arrayInstanceType(t5);
      t9 = t6._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t9 = P.List_List$of(new H.MappedListIterable(t5, t6._eval$1("Map<String*,@>*(1)")._as(new Q.Class_toJson_closure1()), t9), true, t9._eval$1("ListIterable.E"));
      t6 = _this.subclasses;
      t6.toString;
      t5 = H._arrayInstanceType(t6);
      t10 = t5._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", t1, "abstract", t2, "const", t3, "library", t4, "interfaces", t7, "fields", t8, "functions", t9, "subclasses", P.List_List$of(new H.MappedListIterable(t6, t5._eval$1("Map<String*,@>*(1)")._as(new Q.Class_toJson_closure2()), t10), true, t10._eval$1("ListIterable.E"))], type$.legacy_String, type$.dynamic));
      t10 = _this.error;
      Q._setIfNotNull(json, "error", t10 == null ? _null : t10.toJson$0());
      t1 = _this.location;
      Q._setIfNotNull(json, "location", t1 == null ? _null : t1.toJson$0());
      t1 = _this.superClass;
      Q._setIfNotNull(json, "super", t1 == null ? _null : t1.toJson$0());
      t1 = _this.superType;
      Q._setIfNotNull(json, "superType", t1 == null ? _null : t1.toJson$0());
      t1 = _this.mixin;
      Q._setIfNotNull(json, "mixin", t1 == null ? _null : t1.toJson$0());
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Class && this.id == other.id;
    },
    toString$0: function(_) {
      return "[Class]";
    },
    set$interfaces: function(interfaces) {
      this.interfaces = type$.legacy_List_legacy_InstanceRef._as(interfaces);
    },
    set$fields: function(fields) {
      this.fields = type$.legacy_List_legacy_FieldRef._as(fields);
    },
    set$functions: function(functions) {
      this.functions = type$.legacy_List_legacy_FuncRef._as(functions);
    },
    set$subclasses: function(subclasses) {
      this.subclasses = type$.legacy_List_legacy_ClassRef._as(subclasses);
    },
    $isClassRef: 1
  };
  Q.Class_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_InstanceRef._as(f).toJson$0();
    },
    $signature: 20
  };
  Q.Class_toJson_closure0.prototype = {
    call$1: function(f) {
      return type$.legacy_FieldRef._as(f).toJson$0();
    },
    $signature: 21
  };
  Q.Class_toJson_closure1.prototype = {
    call$1: function(f) {
      return type$.legacy_FuncRef._as(f).toJson$0();
    },
    $signature: 22
  };
  Q.Class_toJson_closure2.prototype = {
    call$1: function(f) {
      return type$.legacy_ClassRef._as(f).toJson$0();
    },
    $signature: 8
  };
  Q.ClassHeapStats.prototype = {
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "ClassHeapStats");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["class", _this.classRef.toJson$0(), "accumulatedSize", _this.accumulatedSize, "bytesCurrent", _this.bytesCurrent, "instancesAccumulated", _this.instancesAccumulated, "instancesCurrent", _this.instancesCurrent], t1, t2));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[ClassHeapStats type: " + H.S(_this.type) + ", classRef: " + H.S(_this.classRef) + ", accumulatedSize: " + H.S(_this.accumulatedSize) + ", bytesCurrent: " + H.S(_this.bytesCurrent) + ", instancesAccumulated: " + H.S(_this.instancesAccumulated) + ", instancesCurrent: " + H.S(_this.instancesCurrent) + "]";
    }
  };
  Q.ClassList.prototype = {
    toJson$0: function() {
      var t3, t4, t5,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "ClassList");
      t3 = this.classes;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["classes", P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.ClassList_toJson_closure()), t5), true, t5._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[ClassList type: " + H.S(this.type) + ", classes: " + H.S(this.classes) + "]";
    },
    set$classes: function(classes) {
      this.classes = type$.legacy_List_legacy_ClassRef._as(classes);
    }
  };
  Q.ClassList_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_ClassRef._as(f).toJson$0();
    },
    $signature: 8
  };
  Q.ClientName.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "ClientName");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", this.name], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[ClientName type: " + H.S(this.type) + ", name: " + H.S(this.name) + "]";
    }
  };
  Q.CodeRef.prototype = {
    toJson$0: function() {
      var json = this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Code");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", this.name, "kind", this.kind], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_CodeRef._is(other) && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[CodeRef type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", name: " + H.S(_this.name) + ", kind: " + H.S(_this.kind) + "]";
    }
  };
  Q.Code.prototype = {
    toJson$0: function() {
      var json = this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "Code");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", this.name, "kind", this.kind], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Code && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Code type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", name: " + H.S(_this.name) + ", kind: " + H.S(_this.kind) + "]";
    },
    $isCodeRef: 1
  };
  Q.ContextRef.prototype = {
    toJson$0: function() {
      var json = this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Context");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["length", this.length], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_ContextRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      return "[ContextRef type: " + H.S(this.type) + ", id: " + H.S(this.id) + ", length: " + H.S(this.length) + "]";
    },
    get$length: function(receiver) {
      return this.length;
    }
  };
  Q.Context.prototype = {
    toJson$0: function() {
      var t1, t2, t3, t4, _this = this,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Context");
      t1 = _this.length;
      t2 = _this.variables;
      t2.toString;
      t3 = H._arrayInstanceType(t2);
      t4 = t3._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["length", t1, "variables", P.List_List$of(new H.MappedListIterable(t2, t3._eval$1("Map<String*,@>*(1)")._as(new Q.Context_toJson_closure()), t4), true, t4._eval$1("ListIterable.E"))], type$.legacy_String, type$.dynamic));
      t4 = _this.parent;
      Q._setIfNotNull(json, "parent", t4 == null ? null : t4.toJson$0());
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Context && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Context type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", length: " + H.S(_this.length) + ", variables: " + H.S(_this.variables) + "]";
    },
    set$variables: function(variables) {
      this.variables = type$.legacy_List_legacy_ContextElement._as(variables);
    },
    $isContextRef: 1,
    get$length: function(receiver) {
      return this.length;
    }
  };
  Q.Context_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_ContextElement._as(f).toJson$0();
    },
    $signature: 36
  };
  Q.ContextElement.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["value", this.value.toJson$0()], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[ContextElement value: " + H.S(this.value) + "]";
    }
  };
  Q.CpuSamples.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "CpuSamples");
      t3 = _this.samplePeriod;
      t4 = _this.maxStackDepth;
      t5 = _this.sampleCount;
      t6 = _this.timeSpan;
      t7 = _this.timeOriginMicros;
      t8 = _this.timeExtentMicros;
      t9 = _this.pid;
      t10 = _this.functions;
      t10.toString;
      t11 = H._arrayInstanceType(t10);
      t12 = t11._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t12 = P.List_List$of(new H.MappedListIterable(t10, t11._eval$1("Map<String*,@>*(1)")._as(new Q.CpuSamples_toJson_closure()), t12), true, t12._eval$1("ListIterable.E"));
      t11 = _this.samples;
      t11.toString;
      t10 = H._arrayInstanceType(t11);
      t13 = t10._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["samplePeriod", t3, "maxStackDepth", t4, "sampleCount", t5, "timeSpan", t6, "timeOriginMicros", t7, "timeExtentMicros", t8, "pid", t9, "functions", t12, "samples", P.List_List$of(new H.MappedListIterable(t11, t10._eval$1("Map<String*,@>*(1)")._as(new Q.CpuSamples_toJson_closure0()), t13), true, t13._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[CpuSamples]";
    },
    set$functions: function(functions) {
      this.functions = type$.legacy_List_legacy_ProfileFunction._as(functions);
    },
    set$samples: function(samples) {
      this.samples = type$.legacy_List_legacy_CpuSample._as(samples);
    }
  };
  Q.CpuSamples_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_ProfileFunction._as(f).toJson$0();
    },
    $signature: 37
  };
  Q.CpuSamples_toJson_closure0.prototype = {
    call$1: function(f) {
      return type$.legacy_CpuSample._as(f).toJson$0();
    },
    $signature: 38
  };
  Q.CpuSample.prototype = {
    toJson$0: function() {
      var t6, t7, _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2),
        t3 = _this.tid,
        t4 = _this.timestamp,
        t5 = _this.stack;
      t5.toString;
      t6 = H._arrayInstanceType(t5);
      t7 = t6._eval$1("MappedListIterable<1,int*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["tid", t3, "timestamp", t4, "stack", P.List_List$of(new H.MappedListIterable(t5, t6._eval$1("int*(1)")._as(new Q.CpuSample_toJson_closure()), t7), true, t7._eval$1("ListIterable.E"))], t1, t2));
      Q._setIfNotNull(json, "vmTag", _this.vmTag);
      Q._setIfNotNull(json, "userTag", _this.userTag);
      Q._setIfNotNull(json, "truncated", _this.truncated);
      return json;
    },
    toString$0: function(_) {
      return "[CpuSample tid: " + H.S(this.tid) + ", timestamp: " + H.S(this.timestamp) + ", stack: " + H.S(this.stack) + "]";
    },
    set$stack: function(stack) {
      this.stack = type$.legacy_List_legacy_int._as(stack);
    }
  };
  Q.CpuSample_toJson_closure.prototype = {
    call$1: function(f) {
      return H._asIntS(f);
    },
    $signature: 4
  };
  Q.ErrorRef.prototype = {
    toJson$0: function() {
      var json = this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Error");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["kind", this.kind, "message", this.message], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_ErrorRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      var _this = this;
      return "[ErrorRef type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", kind: " + H.S(_this.kind) + ", message: " + H.S(_this.message) + "]";
    }
  };
  Q.Error.prototype = {
    toJson$0: function() {
      var t1, _this = this,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Error");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["kind", _this.kind, "message", _this.message], type$.legacy_String, type$.dynamic));
      t1 = _this.exception;
      Q._setIfNotNull(json, "exception", t1 == null ? null : t1.toJson$0());
      t1 = _this.stacktrace;
      Q._setIfNotNull(json, "stacktrace", t1 == null ? null : t1.toJson$0());
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Error && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Error type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", kind: " + H.S(_this.kind) + ", message: " + H.S(_this.message) + "]";
    },
    $isErrorRef: 1
  };
  Q.Event.prototype = {
    toJson$0: function() {
      var _this = this, _null = null,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Event");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["kind", _this.kind, "timestamp", _this.timestamp], t1, t2));
      t2 = _this.isolate;
      Q._setIfNotNull(json, "isolate", t2 == null ? _null : t2.toJson$0());
      t1 = _this.vm;
      Q._setIfNotNull(json, "vm", t1 == null ? _null : t1.toJson$0());
      t1 = _this.breakpoint;
      Q._setIfNotNull(json, "breakpoint", t1 == null ? _null : t1.toJson$0());
      t1 = _this.pauseBreakpoints;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("Map<String*,@>*(1)")._as(new Q.Event_toJson_closure()), t2._eval$1("MappedListIterable<1,Map<String*,@>*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "pauseBreakpoints", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      t1 = _this.topFrame;
      Q._setIfNotNull(json, "topFrame", t1 == null ? _null : t1.toJson$0());
      t1 = _this.exception;
      Q._setIfNotNull(json, "exception", t1 == null ? _null : t1.toJson$0());
      Q._setIfNotNull(json, "bytes", _this.bytes);
      t1 = _this.inspectee;
      Q._setIfNotNull(json, "inspectee", t1 == null ? _null : t1.toJson$0());
      Q._setIfNotNull(json, "extensionRPC", _this.extensionRPC);
      Q._setIfNotNull(json, "extensionKind", _this.extensionKind);
      t1 = _this.extensionData;
      Q._setIfNotNull(json, "extensionData", t1 == null ? _null : t1.data);
      t1 = _this.timelineEvents;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("Map<String*,@>*(1)")._as(new Q.Event_toJson_closure0()), t2._eval$1("MappedListIterable<1,Map<String*,@>*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "timelineEvents", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      t1 = _this.updatedStreams;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("String*(1)")._as(new Q.Event_toJson_closure1()), t2._eval$1("MappedListIterable<1,String*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "updatedStreams", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      Q._setIfNotNull(json, "atAsyncSuspension", _this.atAsyncSuspension);
      Q._setIfNotNull(json, "status", _this.status);
      t1 = _this.logRecord;
      Q._setIfNotNull(json, "logRecord", t1 == null ? _null : t1.toJson$0());
      Q._setIfNotNull(json, "service", _this.service);
      Q._setIfNotNull(json, "method", _this.method);
      Q._setIfNotNull(json, "alias", _this.alias);
      Q._setIfNotNull(json, "flag", _this.flag);
      Q._setIfNotNull(json, "newValue", _this.newValue);
      Q._setIfNotNull(json, "last", _this.last);
      Q._setIfNotNull(json, "data", _this.data);
      return json;
    },
    toString$0: function(_) {
      return "[Event type: " + H.S(this.type) + ", kind: " + H.S(this.kind) + ", timestamp: " + H.S(this.timestamp) + "]";
    },
    set$pauseBreakpoints: function(pauseBreakpoints) {
      this.pauseBreakpoints = type$.legacy_List_legacy_Breakpoint._as(pauseBreakpoints);
    },
    set$timelineEvents: function(timelineEvents) {
      this.timelineEvents = type$.legacy_List_legacy_TimelineEvent._as(timelineEvents);
    },
    set$updatedStreams: function(updatedStreams) {
      this.updatedStreams = type$.legacy_List_legacy_String._as(updatedStreams);
    }
  };
  Q.Event_toJson_closure.prototype = {
    call$1: function(f) {
      type$.legacy_Breakpoint._as(f);
      return f == null ? null : f.toJson$0();
    },
    $signature: 23
  };
  Q.Event_toJson_closure0.prototype = {
    call$1: function(f) {
      type$.legacy_TimelineEvent._as(f);
      return f == null ? null : f.toJson$0();
    },
    $signature: 24
  };
  Q.Event_toJson_closure1.prototype = {
    call$1: function(f) {
      return H._asStringS(f);
    },
    $signature: 5
  };
  Q.FieldRef.prototype = {
    toJson$0: function() {
      var _this = this,
        json = _this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Field");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", _this.name, "owner", _this.owner.toJson$0(), "declaredType", _this.declaredType.toJson$0(), "const", _this.isConst, "final", _this.isFinal, "static", _this.isStatic], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_FieldRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      return "[FieldRef]";
    }
  };
  Q.Field.prototype = {
    toJson$0: function() {
      var t1, _this = this,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Field");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", _this.name, "owner", _this.owner.toJson$0(), "declaredType", _this.declaredType.toJson$0(), "const", _this.isConst, "final", _this.isFinal, "static", _this.isStatic], type$.legacy_String, type$.dynamic));
      t1 = _this.staticValue;
      Q._setIfNotNull(json, "staticValue", t1 == null ? null : t1.toJson$0());
      t1 = _this.location;
      Q._setIfNotNull(json, "location", t1 == null ? null : t1.toJson$0());
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Field && this.id == other.id;
    },
    toString$0: function(_) {
      return "[Field]";
    },
    $isFieldRef: 1
  };
  Q.Flag.prototype = {
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", _this.name, "comment", _this.comment, "modified", _this.modified], t1, t2));
      Q._setIfNotNull(json, "valueAsString", _this.valueAsString);
      return json;
    },
    toString$0: function(_) {
      return "[Flag name: " + H.S(this.name) + ", comment: " + H.S(this.comment) + ", modified: " + H.S(this.modified) + "]";
    }
  };
  Q.FlagList.prototype = {
    toJson$0: function() {
      var t3, t4, t5,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "FlagList");
      t3 = this.flags;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["flags", P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.FlagList_toJson_closure()), t5), true, t5._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[FlagList type: " + H.S(this.type) + ", flags: " + H.S(this.flags) + "]";
    },
    set$flags: function(flags) {
      this.flags = type$.legacy_List_legacy_Flag._as(flags);
    }
  };
  Q.FlagList_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_Flag._as(f).toJson$0();
    },
    $signature: 43
  };
  Q.Frame.prototype = {
    toJson$0: function() {
      var _this = this, _null = null,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Frame");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["index", _this.index], t1, t2));
      t2 = _this.$function;
      Q._setIfNotNull(json, "function", t2 == null ? _null : t2.toJson$0());
      t1 = _this.code;
      Q._setIfNotNull(json, "code", t1 == null ? _null : t1.toJson$0());
      t1 = _this.location;
      Q._setIfNotNull(json, "location", t1 == null ? _null : t1.toJson$0());
      t1 = _this.vars;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("Map<String*,@>*(1)")._as(new Q.Frame_toJson_closure()), t2._eval$1("MappedListIterable<1,Map<String*,@>*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "vars", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      Q._setIfNotNull(json, "kind", _this.kind);
      return json;
    },
    toString$0: function(_) {
      return "[Frame type: " + H.S(this.type) + ", index: " + H.S(this.index) + "]";
    },
    set$vars: function(vars) {
      this.vars = type$.legacy_List_legacy_BoundVariable._as(vars);
    }
  };
  Q.Frame_toJson_closure.prototype = {
    call$1: function(f) {
      type$.legacy_BoundVariable._as(f);
      return f == null ? null : f.toJson$0();
    },
    $signature: 44
  };
  Q.FuncRef.prototype = {
    toJson$0: function() {
      var _this = this,
        json = _this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Function");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", _this.name, "owner", _this.owner.toJson$0(), "static", _this.isStatic, "const", _this.isConst], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_FuncRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      var _this = this;
      return "[FuncRef type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", name: " + H.S(_this.name) + ", owner: " + H.S(_this.owner) + ", isStatic: " + H.S(_this.isStatic) + ", isConst: " + H.S(_this.isConst) + "]";
    }
  };
  Q.Func.prototype = {
    toJson$0: function() {
      var t1, _this = this,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Function");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", _this.name, "owner", _this.owner.toJson$0(), "static", _this.isStatic, "const", _this.isConst], type$.legacy_String, type$.dynamic));
      t1 = _this.location;
      Q._setIfNotNull(json, "location", t1 == null ? null : t1.toJson$0());
      t1 = _this.code;
      Q._setIfNotNull(json, "code", t1 == null ? null : t1.toJson$0());
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Func && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Func type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", name: " + H.S(_this.name) + ", owner: " + H.S(_this.owner) + ", isStatic: " + H.S(_this.isStatic) + ", isConst: " + H.S(_this.isConst) + "]";
    },
    $isFuncRef: 1
  };
  Q.InstanceRef.prototype = {
    InstanceRef$_fromJson$1: function(json) {
      var t1, _this = this;
      _this.kind = H._asStringS(json.$index(0, "kind"));
      t1 = type$.legacy_ClassRef;
      _this.classRef = t1._as(Q.createServiceObject(json.$index(0, "class"), C.List_ClassRef));
      _this.set$valueAsString(H._asStringS(json.$index(0, "valueAsString")));
      _this.valueAsStringIsTruncated = H._asBoolS(json.$index(0, "valueAsStringIsTruncated"));
      _this.length = H._asIntS(json.$index(0, "length"));
      _this.name = H._asStringS(json.$index(0, "name"));
      _this.typeClass = t1._as(Q.createServiceObject(json.$index(0, "typeClass"), C.List_ClassRef));
      _this.parameterizedClass = t1._as(Q.createServiceObject(json.$index(0, "parameterizedClass"), C.List_ClassRef));
      _this.pattern = type$.legacy_InstanceRef._as(Q.createServiceObject(json.$index(0, "pattern"), C.List_InstanceRef));
      _this.closureFunction = type$.legacy_FuncRef._as(Q.createServiceObject(json.$index(0, "closureFunction"), C.List_FuncRef));
      _this.closureContext = type$.legacy_ContextRef._as(Q.createServiceObject(json.$index(0, "closureContext"), C.List_ContextRef));
    },
    toJson$0: function() {
      var t1, _this = this, _null = null,
        json = _this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Instance");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["kind", _this.kind, "class", _this.classRef.toJson$0()], type$.legacy_String, type$.dynamic));
      Q._setIfNotNull(json, "valueAsString", _this.get$valueAsString());
      Q._setIfNotNull(json, "valueAsStringIsTruncated", _this.valueAsStringIsTruncated);
      Q._setIfNotNull(json, "length", _this.length);
      Q._setIfNotNull(json, "name", _this.name);
      t1 = _this.typeClass;
      Q._setIfNotNull(json, "typeClass", t1 == null ? _null : t1.toJson$0());
      t1 = _this.parameterizedClass;
      Q._setIfNotNull(json, "parameterizedClass", t1 == null ? _null : t1.toJson$0());
      t1 = _this.pattern;
      Q._setIfNotNull(json, "pattern", t1 == null ? _null : t1.toJson$0());
      t1 = _this.closureFunction;
      Q._setIfNotNull(json, "closureFunction", t1 == null ? _null : t1.toJson$0());
      t1 = _this.closureContext;
      Q._setIfNotNull(json, "closureContext", t1 == null ? _null : t1.toJson$0());
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_InstanceRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      var _this = this;
      return "[InstanceRef type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", kind: " + H.S(_this.kind) + ", classRef: " + H.S(_this.classRef) + "]";
    },
    set$valueAsString: function(valueAsString) {
      this.valueAsString = H._asStringS(valueAsString);
    },
    get$valueAsString: function() {
      return this.valueAsString;
    },
    get$length: function(receiver) {
      return this.length;
    }
  };
  Q.Instance.prototype = {
    Instance$_fromJson$1: function(json) {
      var t1, _this = this,
        _s8_ = "elements",
        _s12_ = "associations";
      _this.kind = H._asStringS(json.$index(0, "kind"));
      t1 = type$.legacy_ClassRef;
      _this.Instance_classRef = t1._as(Q.createServiceObject(json.$index(0, "class"), C.List_ClassRef));
      _this.set$valueAsString(H._asStringS(json.$index(0, "valueAsString")));
      _this.valueAsStringIsTruncated = H._asBoolS(json.$index(0, "valueAsStringIsTruncated"));
      _this.length = H._asIntS(json.$index(0, "length"));
      _this.offset = H._asIntS(json.$index(0, "offset"));
      _this.count = H._asIntS(json.$index(0, "count"));
      _this.name = H._asStringS(json.$index(0, "name"));
      _this.typeClass = t1._as(Q.createServiceObject(json.$index(0, "typeClass"), C.List_ClassRef));
      _this.parameterizedClass = t1._as(Q.createServiceObject(json.$index(0, "parameterizedClass"), C.List_ClassRef));
      _this.set$fields(json.$index(0, "fields") == null ? null : P.List_List$from(type$.Iterable_dynamic._as(Q.createServiceObject(json.$index(0, "fields"), C.List_BoundField)), type$.legacy_BoundField));
      _this.elements = json.$index(0, _s8_) == null ? null : P.List_List$from(type$.Iterable_dynamic._as(Q.createServiceObject(json.$index(0, _s8_), C.List_dynamic)), type$.dynamic);
      _this.set$associations(json.$index(0, _s12_) == null ? null : P.List_List$from(type$.Iterable_dynamic._as(Q._createSpecificObject(json.$index(0, _s12_), Q.vm_service_MapAssociation_parse$closure())), type$.legacy_MapAssociation));
      _this.bytes = H._asStringS(json.$index(0, "bytes"));
      t1 = type$.legacy_InstanceRef;
      _this.mirrorReferent = t1._as(Q.createServiceObject(json.$index(0, "mirrorReferent"), C.List_InstanceRef));
      _this.pattern = t1._as(Q.createServiceObject(json.$index(0, "pattern"), C.List_InstanceRef));
      _this.closureFunction = type$.legacy_FuncRef._as(Q.createServiceObject(json.$index(0, "closureFunction"), C.List_FuncRef));
      _this.closureContext = type$.legacy_ContextRef._as(Q.createServiceObject(json.$index(0, "closureContext"), C.List_ContextRef));
      _this.isCaseSensitive = H._asBoolS(json.$index(0, "isCaseSensitive"));
      _this.isMultiLine = H._asBoolS(json.$index(0, "isMultiLine"));
      _this.propertyKey = t1._as(Q.createServiceObject(json.$index(0, "propertyKey"), C.List_InstanceRef));
      _this.propertyValue = t1._as(Q.createServiceObject(json.$index(0, "propertyValue"), C.List_InstanceRef));
      _this.typeArguments = type$.legacy_TypeArgumentsRef._as(Q.createServiceObject(json.$index(0, "typeArguments"), C.List_TypeArgumentsRef));
      _this.parameterIndex = H._asIntS(json.$index(0, "parameterIndex"));
      _this.targetType = t1._as(Q.createServiceObject(json.$index(0, "targetType"), C.List_InstanceRef));
      _this.bound = t1._as(Q.createServiceObject(json.$index(0, "bound"), C.List_InstanceRef));
    },
    toJson$0: function() {
      var t1, t2, _this = this, _null = null,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Instance");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["kind", _this.kind, "class", _this.Instance_classRef.toJson$0()], type$.legacy_String, type$.dynamic));
      Q._setIfNotNull(json, "valueAsString", _this.get$valueAsString());
      Q._setIfNotNull(json, "valueAsStringIsTruncated", _this.valueAsStringIsTruncated);
      Q._setIfNotNull(json, "length", _this.length);
      Q._setIfNotNull(json, "offset", _this.offset);
      Q._setIfNotNull(json, "count", _this.count);
      Q._setIfNotNull(json, "name", _this.name);
      t1 = _this.typeClass;
      Q._setIfNotNull(json, "typeClass", t1 == null ? _null : t1.toJson$0());
      t1 = _this.parameterizedClass;
      Q._setIfNotNull(json, "parameterizedClass", t1 == null ? _null : t1.toJson$0());
      t1 = _this.fields;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("Map<String*,@>*(1)")._as(new Q.Instance_toJson_closure()), t2._eval$1("MappedListIterable<1,Map<String*,@>*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "fields", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      t1 = _this.elements;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("@(1)")._as(new Q.Instance_toJson_closure0()), t2._eval$1("MappedListIterable<1,@>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "elements", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      t1 = _this.associations;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("Map<String*,@>*(1)")._as(new Q.Instance_toJson_closure1()), t2._eval$1("MappedListIterable<1,Map<String*,@>*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "associations", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      Q._setIfNotNull(json, "bytes", _this.bytes);
      t1 = _this.mirrorReferent;
      Q._setIfNotNull(json, "mirrorReferent", t1 == null ? _null : t1.toJson$0());
      t1 = _this.pattern;
      Q._setIfNotNull(json, "pattern", t1 == null ? _null : t1.toJson$0());
      t1 = _this.closureFunction;
      Q._setIfNotNull(json, "closureFunction", t1 == null ? _null : t1.toJson$0());
      t1 = _this.closureContext;
      Q._setIfNotNull(json, "closureContext", t1 == null ? _null : t1.toJson$0());
      Q._setIfNotNull(json, "isCaseSensitive", _this.isCaseSensitive);
      Q._setIfNotNull(json, "isMultiLine", _this.isMultiLine);
      t1 = _this.propertyKey;
      Q._setIfNotNull(json, "propertyKey", t1 == null ? _null : t1.toJson$0());
      t1 = _this.propertyValue;
      Q._setIfNotNull(json, "propertyValue", t1 == null ? _null : t1.toJson$0());
      t1 = _this.typeArguments;
      Q._setIfNotNull(json, "typeArguments", t1 == null ? _null : t1.toJson$0());
      Q._setIfNotNull(json, "parameterIndex", _this.parameterIndex);
      t1 = _this.targetType;
      Q._setIfNotNull(json, "targetType", t1 == null ? _null : t1.toJson$0());
      t1 = _this.bound;
      Q._setIfNotNull(json, "bound", t1 == null ? _null : t1.toJson$0());
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Instance && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Instance type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", kind: " + H.S(_this.kind) + ", classRef: " + H.S(_this.Instance_classRef) + "]";
    },
    set$classRef: function(classRef) {
      this.Instance_classRef = type$.legacy_ClassRef._as(classRef);
    },
    set$valueAsString: function(valueAsString) {
      this.valueAsString = H._asStringS(valueAsString);
    },
    set$fields: function(fields) {
      this.fields = type$.legacy_List_legacy_BoundField._as(fields);
    },
    set$associations: function(associations) {
      this.associations = type$.legacy_List_legacy_MapAssociation._as(associations);
    },
    $isInstanceRef: 1,
    get$classRef: function() {
      return this.Instance_classRef;
    },
    get$valueAsString: function() {
      return this.valueAsString;
    },
    get$length: function(receiver) {
      return this.length;
    }
  };
  Q.Instance_toJson_closure.prototype = {
    call$1: function(f) {
      type$.legacy_BoundField._as(f);
      return f == null ? null : f.toJson$0();
    },
    $signature: 26
  };
  Q.Instance_toJson_closure0.prototype = {
    call$1: function(f) {
      return f == null ? null : f.toJson$0();
    },
    $signature: 2
  };
  Q.Instance_toJson_closure1.prototype = {
    call$1: function(f) {
      type$.legacy_MapAssociation._as(f);
      return f == null ? null : f.toJson$0();
    },
    $signature: 46
  };
  Q.IsolateRef.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "@Isolate");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["id", this.id, "number", this.number, "name", this.name], t1, t2));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_IsolateRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      var _this = this;
      return "[IsolateRef type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", number: " + H.S(_this.number) + ", name: " + H.S(_this.name) + "]";
    },
    get$id: function(receiver) {
      return this.id;
    }
  };
  Q.Isolate.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, _this = this, _null = null,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Isolate");
      t3 = _this.id;
      t4 = _this.number;
      t5 = _this.name;
      t6 = _this.startTime;
      t7 = _this.runnable;
      t8 = _this.livePorts;
      t9 = _this.pauseOnExit;
      t10 = _this.pauseEvent.toJson$0();
      t11 = _this.libraries;
      t11.toString;
      t12 = H._arrayInstanceType(t11);
      t13 = t12._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t13 = P.List_List$of(new H.MappedListIterable(t11, t12._eval$1("Map<String*,@>*(1)")._as(new Q.Isolate_toJson_closure()), t13), true, t13._eval$1("ListIterable.E"));
      t12 = _this.breakpoints;
      t12.toString;
      t11 = H._arrayInstanceType(t12);
      t14 = t11._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["id", t3, "number", t4, "name", t5, "startTime", t6, "runnable", t7, "livePorts", t8, "pauseOnExit", t9, "pauseEvent", t10, "libraries", t13, "breakpoints", P.List_List$of(new H.MappedListIterable(t12, t11._eval$1("Map<String*,@>*(1)")._as(new Q.Isolate_toJson_closure0()), t14), true, t14._eval$1("ListIterable.E")), "exceptionPauseMode", _this.exceptionPauseMode], t1, t2));
      t2 = _this.rootLib;
      Q._setIfNotNull(json, "rootLib", t2 == null ? _null : t2.toJson$0());
      t1 = _this.error;
      Q._setIfNotNull(json, "error", t1 == null ? _null : t1.toJson$0());
      t1 = _this.extensionRPCs;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("String*(1)")._as(new Q.Isolate_toJson_closure1()), t2._eval$1("MappedListIterable<1,String*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "extensionRPCs", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Isolate && this.id == other.id;
    },
    toString$0: function(_) {
      return "[Isolate]";
    },
    set$libraries: function(libraries) {
      this.libraries = type$.legacy_List_legacy_LibraryRef._as(libraries);
    },
    set$breakpoints: function(breakpoints) {
      this.breakpoints = type$.legacy_List_legacy_Breakpoint._as(breakpoints);
    },
    set$extensionRPCs: function(extensionRPCs) {
      this.extensionRPCs = type$.legacy_List_legacy_String._as(extensionRPCs);
    },
    $isIsolateRef: 1,
    get$id: function(receiver) {
      return this.id;
    }
  };
  Q.Isolate_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_LibraryRef._as(f).toJson$0();
    },
    $signature: 47
  };
  Q.Isolate_toJson_closure0.prototype = {
    call$1: function(f) {
      return type$.legacy_Breakpoint._as(f).toJson$0();
    },
    $signature: 23
  };
  Q.Isolate_toJson_closure1.prototype = {
    call$1: function(f) {
      return H._asStringS(f);
    },
    $signature: 5
  };
  Q.IsolateGroupRef.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "@IsolateGroup");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["id", this.id, "number", this.number, "name", this.name], t1, t2));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_IsolateGroupRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      var _this = this;
      return "[IsolateGroupRef type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", number: " + H.S(_this.number) + ", name: " + H.S(_this.name) + "]";
    },
    get$id: function(receiver) {
      return this.id;
    }
  };
  Q.IsolateGroup.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6, t7, t8, _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "IsolateGroup");
      t3 = _this.id;
      t4 = _this.number;
      t5 = _this.name;
      t6 = _this.isolates;
      t6.toString;
      t7 = H._arrayInstanceType(t6);
      t8 = t7._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["id", t3, "number", t4, "name", t5, "isolates", P.List_List$of(new H.MappedListIterable(t6, t7._eval$1("Map<String*,@>*(1)")._as(new Q.IsolateGroup_toJson_closure()), t8), true, t8._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.IsolateGroup && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[IsolateGroup type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", number: " + H.S(_this.number) + ", name: " + H.S(_this.name) + ", isolates: " + H.S(_this.isolates) + "]";
    },
    set$isolates: function(isolates) {
      this.isolates = type$.legacy_List_legacy_IsolateRef._as(isolates);
    },
    $isIsolateGroupRef: 1,
    get$id: function(receiver) {
      return this.id;
    }
  };
  Q.IsolateGroup_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_IsolateRef._as(f).toJson$0();
    },
    $signature: 25
  };
  Q.InboundReferences.prototype = {
    toJson$0: function() {
      var t3, t4, t5,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "InboundReferences");
      t3 = this.references;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["references", P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.InboundReferences_toJson_closure()), t5), true, t5._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[InboundReferences type: " + H.S(this.type) + ", references: " + H.S(this.references) + "]";
    },
    set$references: function(references) {
      this.references = type$.legacy_List_legacy_InboundReference._as(references);
    }
  };
  Q.InboundReferences_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_InboundReference._as(f).toJson$0();
    },
    $signature: 49
  };
  Q.InboundReference.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["source", this.source.toJson$0()], t1, t2));
      Q._setIfNotNull(json, "parentListIndex", this.parentListIndex);
      t2 = this.parentField;
      Q._setIfNotNull(json, "parentField", t2 == null ? null : t2.toJson$0());
      return json;
    },
    toString$0: function(_) {
      return "[InboundReference source: " + H.S(this.source) + "]";
    }
  };
  Q.InstanceSet.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "InstanceSet");
      t3 = this.totalCount;
      t4 = this.instances;
      t4.toString;
      t5 = H._arrayInstanceType(t4);
      t6 = t5._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["totalCount", t3, "instances", P.List_List$of(new H.MappedListIterable(t4, t5._eval$1("Map<String*,@>*(1)")._as(new Q.InstanceSet_toJson_closure()), t6), true, t6._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[InstanceSet type: " + H.S(this.type) + ", totalCount: " + H.S(this.totalCount) + ", instances: " + H.S(this.instances) + "]";
    },
    set$instances: function(instances) {
      this.instances = type$.legacy_List_legacy_ObjRef._as(instances);
    }
  };
  Q.InstanceSet_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_ObjRef._as(f).toJson$0();
    },
    $signature: 50
  };
  Q.LibraryRef.prototype = {
    toJson$0: function() {
      var json = this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Library");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", this.name, "uri", this.uri], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_LibraryRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      var _this = this;
      return "[LibraryRef type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", name: " + H.S(_this.name) + ", uri: " + H.S(_this.uri) + "]";
    }
  };
  Q.Library.prototype = {
    toJson$0: function() {
      var t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, _this = this,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Library");
      t1 = _this.name;
      t2 = _this.uri;
      t3 = _this.debuggable;
      t4 = _this.dependencies;
      t4.toString;
      t5 = H._arrayInstanceType(t4);
      t6 = t5._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t6 = P.List_List$of(new H.MappedListIterable(t4, t5._eval$1("Map<String*,@>*(1)")._as(new Q.Library_toJson_closure()), t6), true, t6._eval$1("ListIterable.E"));
      t5 = _this.scripts;
      t5.toString;
      t4 = H._arrayInstanceType(t5);
      t7 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t7 = P.List_List$of(new H.MappedListIterable(t5, t4._eval$1("Map<String*,@>*(1)")._as(new Q.Library_toJson_closure0()), t7), true, t7._eval$1("ListIterable.E"));
      t4 = _this.variables;
      t4.toString;
      t5 = H._arrayInstanceType(t4);
      t8 = t5._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t8 = P.List_List$of(new H.MappedListIterable(t4, t5._eval$1("Map<String*,@>*(1)")._as(new Q.Library_toJson_closure1()), t8), true, t8._eval$1("ListIterable.E"));
      t5 = _this.functions;
      t5.toString;
      t4 = H._arrayInstanceType(t5);
      t9 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t9 = P.List_List$of(new H.MappedListIterable(t5, t4._eval$1("Map<String*,@>*(1)")._as(new Q.Library_toJson_closure2()), t9), true, t9._eval$1("ListIterable.E"));
      t4 = _this.classes;
      t4.toString;
      t5 = H._arrayInstanceType(t4);
      t10 = t5._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", t1, "uri", t2, "debuggable", t3, "dependencies", t6, "scripts", t7, "variables", t8, "functions", t9, "classes", P.List_List$of(new H.MappedListIterable(t4, t5._eval$1("Map<String*,@>*(1)")._as(new Q.Library_toJson_closure3()), t10), true, t10._eval$1("ListIterable.E"))], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Library && this.id == other.id;
    },
    toString$0: function(_) {
      return "[Library]";
    },
    set$dependencies: function(dependencies) {
      this.dependencies = type$.legacy_List_legacy_LibraryDependency._as(dependencies);
    },
    set$scripts: function(scripts) {
      this.scripts = type$.legacy_List_legacy_ScriptRef._as(scripts);
    },
    set$variables: function(variables) {
      this.variables = type$.legacy_List_legacy_FieldRef._as(variables);
    },
    set$functions: function(functions) {
      this.functions = type$.legacy_List_legacy_FuncRef._as(functions);
    },
    set$classes: function(classes) {
      this.classes = type$.legacy_List_legacy_ClassRef._as(classes);
    },
    $isLibraryRef: 1
  };
  Q.Library_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_LibraryDependency._as(f).toJson$0();
    },
    $signature: 51
  };
  Q.Library_toJson_closure0.prototype = {
    call$1: function(f) {
      return type$.legacy_ScriptRef._as(f).toJson$0();
    },
    $signature: 9
  };
  Q.Library_toJson_closure1.prototype = {
    call$1: function(f) {
      return type$.legacy_FieldRef._as(f).toJson$0();
    },
    $signature: 21
  };
  Q.Library_toJson_closure2.prototype = {
    call$1: function(f) {
      return type$.legacy_FuncRef._as(f).toJson$0();
    },
    $signature: 22
  };
  Q.Library_toJson_closure3.prototype = {
    call$1: function(f) {
      return type$.legacy_ClassRef._as(f).toJson$0();
    },
    $signature: 8
  };
  Q.LibraryDependency.prototype = {
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["isImport", _this.isImport, "isDeferred", _this.isDeferred, "prefix", _this.prefix, "target", _this.target.toJson$0()], t1, t2));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[LibraryDependency isImport: " + H.S(_this.isImport) + ", isDeferred: " + H.S(_this.isDeferred) + ", prefix: " + H.S(_this.prefix) + ", target: " + H.S(_this.target) + "]";
    }
  };
  Q.LogRecord.prototype = {
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "LogRecord");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["message", _this.message.toJson$0(), "time", _this.time, "level", _this.level, "sequenceNumber", _this.sequenceNumber, "loggerName", _this.loggerName.toJson$0(), "zone", _this.zone.toJson$0(), "error", _this.error.toJson$0(), "stackTrace", _this.stackTrace.toJson$0()], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[LogRecord]";
    }
  };
  Q.MapAssociation.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["key", this.key.toJson$0(), "value", this.value.toJson$0()], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[MapAssociation key: " + H.S(this.key) + ", value: " + H.S(this.value) + "]";
    }
  };
  Q.MemoryUsage.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "MemoryUsage");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["externalUsage", this.externalUsage, "heapCapacity", this.heapCapacity, "heapUsage", this.heapUsage], t1, t2));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[MemoryUsage type: " + H.S(_this.type) + ", externalUsage: " + H.S(_this.externalUsage) + ", heapCapacity: " + H.S(_this.heapCapacity) + ", heapUsage: " + H.S(_this.heapUsage) + "]";
    }
  };
  Q.Message.prototype = {
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Message");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["index", _this.index, "name", _this.name, "messageObjectId", _this.messageObjectId, "size", _this.size], t1, t2));
      t2 = _this.handler;
      Q._setIfNotNull(json, "handler", t2 == null ? null : t2.toJson$0());
      t1 = _this.location;
      Q._setIfNotNull(json, "location", t1 == null ? null : t1.toJson$0());
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Message type: " + H.S(_this.type) + ", index: " + H.S(_this.index) + ", name: " + H.S(_this.name) + ", messageObjectId: " + H.S(_this.messageObjectId) + ", size: " + H.S(_this.size) + "]";
    }
  };
  Q.NativeFunction.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", this.name], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[NativeFunction name: " + H.S(this.name) + "]";
    }
  };
  Q.NullValRef.prototype = {
    toJson$0: function() {
      var json = this.super$InstanceRef$toJson();
      json.$indexSet(0, "type", "@Null");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["valueAsString", this.NullValRef_valueAsString], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_NullValRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      var _this = this;
      return "[NullValRef type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", kind: " + H.S(_this.kind) + ", classRef: " + H.S(_this.classRef) + ", valueAsString: " + H.S(_this.NullValRef_valueAsString) + "]";
    },
    set$valueAsString: function(valueAsString) {
      this.NullValRef_valueAsString = H._asStringS(valueAsString);
    },
    get$valueAsString: function() {
      return this.NullValRef_valueAsString;
    }
  };
  Q.NullVal.prototype = {
    toJson$0: function() {
      var json = this.super$Instance$toJson();
      json.$indexSet(0, "type", "Null");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["valueAsString", this.NullVal_valueAsString], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.NullVal && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[NullVal type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", kind: " + H.S(_this.kind) + ", classRef: " + H.S(_this.Instance_classRef) + ", valueAsString: " + H.S(_this.NullVal_valueAsString) + "]";
    },
    set$valueAsString: function(valueAsString) {
      this.NullVal_valueAsString = H._asStringS(valueAsString);
    },
    $isNullValRef: 1,
    get$valueAsString: function() {
      return this.NullVal_valueAsString;
    }
  };
  Q.ObjRef.prototype = {
    ObjRef$_fromJson$1: function(json) {
      this.id = H._asStringS(json.$index(0, "id"));
      this.fixedId = H._asBoolS(json.$index(0, "fixedId"));
    },
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "@Object");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["id", this.id], t1, t2));
      Q._setIfNotNull(json, "fixedId", this.fixedId);
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_ObjRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      return "[ObjRef type: " + H.S(this.type) + ", id: " + H.S(this.id) + "]";
    },
    get$id: function(receiver) {
      return this.id;
    }
  };
  Q.Obj.prototype = {
    Obj$_fromJson$1: function(json) {
      var _this = this;
      _this.id = H._asStringS(json.$index(0, "id"));
      _this.fixedId = H._asBoolS(json.$index(0, "fixedId"));
      _this.set$classRef(type$.legacy_ClassRef._as(Q.createServiceObject(json.$index(0, "class"), C.List_ClassRef)));
      _this.size = H._asIntS(json.$index(0, "size"));
    },
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Object");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["id", _this.id], t1, t2));
      Q._setIfNotNull(json, "fixedId", _this.fixedId);
      t2 = _this.get$classRef();
      Q._setIfNotNull(json, "class", t2 == null ? null : t2.toJson$0());
      Q._setIfNotNull(json, "size", _this.size);
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Obj && this.id == other.id;
    },
    toString$0: function(_) {
      return "[Obj type: " + H.S(this.type) + ", id: " + H.S(this.id) + "]";
    },
    set$classRef: function(classRef) {
      this.classRef = type$.legacy_ClassRef._as(classRef);
    },
    $isObjRef: 1,
    get$id: function(receiver) {
      return this.id;
    },
    get$classRef: function() {
      return this.classRef;
    }
  };
  Q.ProfileFunction.prototype = {
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["kind", _this.kind, "inclusiveTicks", _this.inclusiveTicks, "exclusiveTicks", _this.exclusiveTicks, "resolvedUrl", _this.resolvedUrl, "function", _this.$function.toJson$0()], t1, t2));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[ProfileFunction kind: " + H.S(_this.kind) + ", inclusiveTicks: " + H.S(_this.inclusiveTicks) + ", exclusiveTicks: " + H.S(_this.exclusiveTicks) + ", resolvedUrl: " + H.S(_this.resolvedUrl) + ", function: " + H.S(_this.$function) + "]";
    }
  };
  Q.ProtocolList.prototype = {
    toJson$0: function() {
      var t3, t4, t5,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "ProtocolList");
      t3 = this.protocols;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["protocols", P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.ProtocolList_toJson_closure()), t5), true, t5._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[ProtocolList type: " + H.S(this.type) + ", protocols: " + H.S(this.protocols) + "]";
    },
    set$protocols: function(protocols) {
      this.protocols = type$.legacy_List_legacy_Protocol._as(protocols);
    }
  };
  Q.ProtocolList_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_Protocol._as(f).toJson$0();
    },
    $signature: 53
  };
  Q.Protocol.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["protocolName", this.protocolName, "major", this.major, "minor", this.minor], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[Protocol protocolName: " + H.S(this.protocolName) + ", major: " + H.S(this.major) + ", minor: " + H.S(this.minor) + "]";
    }
  };
  Q.ReloadReport.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "ReloadReport");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["success", this.success], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[ReloadReport type: " + H.S(this.type) + ", success: " + H.S(this.success) + "]";
    }
  };
  Q.RetainingObject.prototype = {
    toJson$0: function() {
      var _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["value", _this.value.toJson$0()], t1, t2));
      Q._setIfNotNull(json, "parentListIndex", _this.parentListIndex);
      t2 = _this.parentMapKey;
      Q._setIfNotNull(json, "parentMapKey", t2 == null ? null : t2.toJson$0());
      Q._setIfNotNull(json, "parentField", _this.parentField);
      return json;
    },
    toString$0: function(_) {
      return "[RetainingObject value: " + H.S(this.value) + "]";
    }
  };
  Q.RetainingPath.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6, t7,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "RetainingPath");
      t3 = this.length;
      t4 = this.gcRootType;
      t5 = this.elements;
      t5.toString;
      t6 = H._arrayInstanceType(t5);
      t7 = t6._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["length", t3, "gcRootType", t4, "elements", P.List_List$of(new H.MappedListIterable(t5, t6._eval$1("Map<String*,@>*(1)")._as(new Q.RetainingPath_toJson_closure()), t7), true, t7._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[RetainingPath type: " + H.S(_this.type) + ", length: " + H.S(_this.length) + ", gcRootType: " + H.S(_this.gcRootType) + ", elements: " + H.S(_this.elements) + "]";
    },
    set$elements: function(elements) {
      this.elements = type$.legacy_List_legacy_RetainingObject._as(elements);
    },
    get$length: function(receiver) {
      return this.length;
    }
  };
  Q.RetainingPath_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_RetainingObject._as(f).toJson$0();
    },
    $signature: 54
  };
  Q.Response.prototype = {
    toJson$0: function() {
      var result = P.LinkedHashMap_LinkedHashMap$of(this.json, type$.legacy_String, type$.dynamic),
        t1 = this.type;
      result.$indexSet(0, "type", t1 == null ? "Response" : t1);
      return result;
    },
    toString$0: function(_) {
      return "[Response type: " + H.S(this.type) + "]";
    }
  };
  Q.Sentinel.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Sentinel");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["kind", this.kind, "valueAsString", this.valueAsString], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[Sentinel type: " + H.S(this.type) + ", kind: " + H.S(this.kind) + ", valueAsString: " + H.S(this.valueAsString) + "]";
    }
  };
  Q.ScriptRef.prototype = {
    toJson$0: function() {
      var json = this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@Script");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["uri", this.uri], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_ScriptRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      return "[ScriptRef type: " + H.S(this.type) + ", id: " + H.S(this.id) + ", uri: " + H.S(this.uri) + "]";
    }
  };
  Q.Script.prototype = {
    Script$_fromJson$1: function(json) {
      var _this = this,
        _s13_ = "tokenPosTable";
      _this.uri = H._asStringS(json.$index(0, "uri"));
      _this.library = type$.legacy_LibraryRef._as(Q.createServiceObject(json.$index(0, "library"), C.List_LibraryRef));
      _this.lineOffset = H._asIntS(json.$index(0, "lineOffset"));
      _this.columnOffset = H._asIntS(json.$index(0, "columnOffset"));
      _this.source = H._asStringS(json.$index(0, "source"));
      _this.set$tokenPosTable(json.$index(0, _s13_) == null ? null : P.List_List$from(type$.Iterable_dynamic._as(J.map$1$ax(json.$index(0, _s13_), new Q.Script$_fromJson_closure())), type$.legacy_List_legacy_int));
      _this._parseTokenPosTable$0();
    },
    _parseTokenPosTable$0: function() {
      var lineSet, t1, t2, t3, t4, _i, line, t5, lineNumber, pos, tokenOffset, colNumber, _this = this;
      if (_this.tokenPosTable == null)
        return;
      lineSet = P.LinkedHashSet_LinkedHashSet(type$.legacy_int);
      for (t1 = _this.tokenPosTable, t2 = t1.length, t3 = _this._tokenToLine, t4 = _this._tokenToColumn, _i = 0; _i < t1.length; t1.length === t2 || (0, H.throwConcurrentModificationError)(t1), ++_i) {
        line = t1[_i];
        t5 = J.getInterceptor$asx(line);
        lineNumber = H._asIntS(t5.$index(line, 0));
        lineSet.add$1(0, lineNumber);
        for (pos = 1; pos < t5.get$length(line); pos += 2) {
          tokenOffset = H._asIntS(t5.$index(line, pos));
          colNumber = H._asIntS(t5.$index(line, pos + 1));
          t3.$indexSet(0, tokenOffset, lineNumber);
          t4.$indexSet(0, tokenOffset, colNumber);
        }
      }
    },
    toJson$0: function() {
      var t1, t2, _this = this,
        json = _this.super$Obj$toJson();
      json.$indexSet(0, "type", "Script");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["uri", _this.uri, "library", _this.library.toJson$0()], type$.legacy_String, type$.dynamic));
      Q._setIfNotNull(json, "lineOffset", _this.lineOffset);
      Q._setIfNotNull(json, "columnOffset", _this.columnOffset);
      Q._setIfNotNull(json, "source", _this.source);
      t1 = _this.tokenPosTable;
      if (t1 == null)
        t1 = null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("List<int*>*(1)")._as(new Q.Script_toJson_closure()), t2._eval$1("MappedListIterable<1,List<int*>*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "tokenPosTable", t1 == null ? null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.Script && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Script type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", uri: " + H.S(_this.uri) + ", library: " + H.S(_this.library) + "]";
    },
    set$tokenPosTable: function(tokenPosTable) {
      this.tokenPosTable = type$.legacy_List_legacy_List_legacy_int._as(tokenPosTable);
    },
    $isScriptRef: 1
  };
  Q.Script$_fromJson_closure.prototype = {
    call$1: function(list) {
      return P.List_List$from(type$.Iterable_dynamic._as(list), type$.legacy_int);
    },
    $signature: 55
  };
  Q.Script_toJson_closure.prototype = {
    call$1: function(f) {
      type$.legacy_List_legacy_int._as(f);
      return f == null ? null : J.toList$0$ax(f);
    },
    $signature: 56
  };
  Q.ScriptList.prototype = {
    toJson$0: function() {
      var t3, t4, t5,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "ScriptList");
      t3 = this.scripts;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["scripts", P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.ScriptList_toJson_closure()), t5), true, t5._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[ScriptList type: " + H.S(this.type) + ", scripts: " + H.S(this.scripts) + "]";
    },
    set$scripts: function(scripts) {
      this.scripts = type$.legacy_List_legacy_ScriptRef._as(scripts);
    }
  };
  Q.ScriptList_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_ScriptRef._as(f).toJson$0();
    },
    $signature: 9
  };
  Q.SourceLocation.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "SourceLocation");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["script", this.script.toJson$0(), "tokenPos", this.tokenPos], t1, t2));
      Q._setIfNotNull(json, "endTokenPos", this.endTokenPos);
      return json;
    },
    toString$0: function(_) {
      return "[SourceLocation type: " + H.S(this.type) + ", script: " + H.S(this.script) + ", tokenPos: " + H.S(this.tokenPos) + "]";
    }
  };
  Q.SourceReport.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "SourceReport");
      t3 = this.ranges;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t5 = P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.SourceReport_toJson_closure()), t5), true, t5._eval$1("ListIterable.E"));
      t4 = this.scripts;
      t4.toString;
      t3 = H._arrayInstanceType(t4);
      t6 = t3._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["ranges", t5, "scripts", P.List_List$of(new H.MappedListIterable(t4, t3._eval$1("Map<String*,@>*(1)")._as(new Q.SourceReport_toJson_closure0()), t6), true, t6._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[SourceReport type: " + H.S(this.type) + ", ranges: " + H.S(this.ranges) + ", scripts: " + H.S(this.scripts) + "]";
    },
    set$ranges: function(ranges) {
      this.ranges = type$.legacy_List_legacy_SourceReportRange._as(ranges);
    },
    set$scripts: function(scripts) {
      this.scripts = type$.legacy_List_legacy_ScriptRef._as(scripts);
    }
  };
  Q.SourceReport_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_SourceReportRange._as(f).toJson$0();
    },
    $signature: 57
  };
  Q.SourceReport_toJson_closure0.prototype = {
    call$1: function(f) {
      return type$.legacy_ScriptRef._as(f).toJson$0();
    },
    $signature: 9
  };
  Q.SourceReportCoverage.prototype = {
    toJson$0: function() {
      var t4, t5, t6,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2),
        t3 = this.hits;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,int*>");
      t5 = P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("int*(1)")._as(new Q.SourceReportCoverage_toJson_closure()), t5), true, t5._eval$1("ListIterable.E"));
      t4 = this.misses;
      t4.toString;
      t3 = H._arrayInstanceType(t4);
      t6 = t3._eval$1("MappedListIterable<1,int*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["hits", t5, "misses", P.List_List$of(new H.MappedListIterable(t4, t3._eval$1("int*(1)")._as(new Q.SourceReportCoverage_toJson_closure0()), t6), true, t6._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[SourceReportCoverage hits: " + H.S(this.hits) + ", misses: " + H.S(this.misses) + "]";
    },
    set$hits: function(hits) {
      this.hits = type$.legacy_List_legacy_int._as(hits);
    },
    set$misses: function(misses) {
      this.misses = type$.legacy_List_legacy_int._as(misses);
    }
  };
  Q.SourceReportCoverage_toJson_closure.prototype = {
    call$1: function(f) {
      return H._asIntS(f);
    },
    $signature: 4
  };
  Q.SourceReportCoverage_toJson_closure0.prototype = {
    call$1: function(f) {
      return H._asIntS(f);
    },
    $signature: 4
  };
  Q.SourceReportRange.prototype = {
    toJson$0: function() {
      var _this = this, _null = null,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["scriptIndex", _this.scriptIndex, "startPos", _this.startPos, "endPos", _this.endPos, "compiled", _this.compiled], t1, t2));
      t2 = _this.error;
      Q._setIfNotNull(json, "error", t2 == null ? _null : t2.toJson$0());
      t1 = _this.coverage;
      Q._setIfNotNull(json, "coverage", t1 == null ? _null : t1.toJson$0());
      t1 = _this.possibleBreakpoints;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("int*(1)")._as(new Q.SourceReportRange_toJson_closure()), t2._eval$1("MappedListIterable<1,int*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "possibleBreakpoints", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[SourceReportRange scriptIndex: " + H.S(_this.scriptIndex) + ", startPos: " + H.S(_this.startPos) + ", endPos: " + H.S(_this.endPos) + ", compiled: " + H.S(_this.compiled) + "]";
    },
    set$possibleBreakpoints: function(possibleBreakpoints) {
      this.possibleBreakpoints = type$.legacy_List_legacy_int._as(possibleBreakpoints);
    }
  };
  Q.SourceReportRange_toJson_closure.prototype = {
    call$1: function(f) {
      return H._asIntS(f);
    },
    $signature: 4
  };
  Q.Stack.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6, _this = this, _null = null,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Stack");
      t3 = _this.frames;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t5 = P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.Stack_toJson_closure()), t5), true, t5._eval$1("ListIterable.E"));
      t4 = _this.messages;
      t4.toString;
      t3 = H._arrayInstanceType(t4);
      t6 = t3._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["frames", t5, "messages", P.List_List$of(new H.MappedListIterable(t4, t3._eval$1("Map<String*,@>*(1)")._as(new Q.Stack_toJson_closure0()), t6), true, t6._eval$1("ListIterable.E"))], t1, t2));
      t2 = _this.asyncCausalFrames;
      if (t2 == null)
        t1 = _null;
      else {
        t1 = H._arrayInstanceType(t2);
        t1 = new H.MappedListIterable(t2, t1._eval$1("Map<String*,@>*(1)")._as(new Q.Stack_toJson_closure1()), t1._eval$1("MappedListIterable<1,Map<String*,@>*>"));
      }
      Q._setIfNotNull(json, "asyncCausalFrames", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      t1 = _this.awaiterFrames;
      if (t1 == null)
        t1 = _null;
      else {
        t2 = H._arrayInstanceType(t1);
        t2 = new H.MappedListIterable(t1, t2._eval$1("Map<String*,@>*(1)")._as(new Q.Stack_toJson_closure2()), t2._eval$1("MappedListIterable<1,Map<String*,@>*>"));
        t1 = t2;
      }
      Q._setIfNotNull(json, "awaiterFrames", t1 == null ? _null : P.List_List$of(t1, true, t1.$ti._eval$1("ListIterable.E")));
      return json;
    },
    toString$0: function(_) {
      return "[Stack type: " + H.S(this.type) + ", frames: " + H.S(this.frames) + ", messages: " + H.S(this.messages) + "]";
    },
    set$frames: function($frames) {
      this.frames = type$.legacy_List_legacy_Frame._as($frames);
    },
    set$asyncCausalFrames: function(asyncCausalFrames) {
      this.asyncCausalFrames = type$.legacy_List_legacy_Frame._as(asyncCausalFrames);
    },
    set$awaiterFrames: function(awaiterFrames) {
      this.awaiterFrames = type$.legacy_List_legacy_Frame._as(awaiterFrames);
    },
    set$messages: function(messages) {
      this.messages = type$.legacy_List_legacy_Message._as(messages);
    }
  };
  Q.Stack_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_Frame._as(f).toJson$0();
    },
    $signature: 10
  };
  Q.Stack_toJson_closure0.prototype = {
    call$1: function(f) {
      return type$.legacy_Message._as(f).toJson$0();
    },
    $signature: 59
  };
  Q.Stack_toJson_closure1.prototype = {
    call$1: function(f) {
      type$.legacy_Frame._as(f);
      return f == null ? null : f.toJson$0();
    },
    $signature: 10
  };
  Q.Stack_toJson_closure2.prototype = {
    call$1: function(f) {
      type$.legacy_Frame._as(f);
      return f == null ? null : f.toJson$0();
    },
    $signature: 10
  };
  Q.Success.prototype = {
    toJson$0: function() {
      var json = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.dynamic);
      json.$indexSet(0, "type", "Success");
      return json;
    },
    toString$0: function(_) {
      return "[Success type: " + H.S(this.type) + "]";
    }
  };
  Q.Timeline.prototype = {
    toJson$0: function() {
      var t3, t4, t5,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Timeline");
      t3 = this.traceEvents;
      t3.toString;
      t4 = H._arrayInstanceType(t3);
      t5 = t4._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["traceEvents", P.List_List$of(new H.MappedListIterable(t3, t4._eval$1("Map<String*,@>*(1)")._as(new Q.Timeline_toJson_closure()), t5), true, t5._eval$1("ListIterable.E")), "timeOriginMicros", this.timeOriginMicros, "timeExtentMicros", this.timeExtentMicros], t1, t2));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[Timeline type: " + H.S(_this.type) + ", traceEvents: " + H.S(_this.traceEvents) + ", timeOriginMicros: " + H.S(_this.timeOriginMicros) + ", timeExtentMicros: " + H.S(_this.timeExtentMicros) + "]";
    },
    set$traceEvents: function(traceEvents) {
      this.traceEvents = type$.legacy_List_legacy_TimelineEvent._as(traceEvents);
    }
  };
  Q.Timeline_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_TimelineEvent._as(f).toJson$0();
    },
    $signature: 24
  };
  Q.TimelineEvent.prototype = {
    toJson$0: function() {
      var result = P.LinkedHashMap_LinkedHashMap$of(this.json, type$.legacy_String, type$.dynamic);
      result.$indexSet(0, "type", "TimelineEvent");
      return result;
    },
    toString$0: function(_) {
      return "[TimelineEvent ]";
    }
  };
  Q.TimelineFlags.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6, t7,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "TimelineFlags");
      t3 = this.recorderName;
      t4 = this.availableStreams;
      t4.toString;
      t5 = H._arrayInstanceType(t4);
      t6 = t5._eval$1("MappedListIterable<1,String*>");
      t6 = P.List_List$of(new H.MappedListIterable(t4, t5._eval$1("String*(1)")._as(new Q.TimelineFlags_toJson_closure()), t6), true, t6._eval$1("ListIterable.E"));
      t5 = this.recordedStreams;
      t5.toString;
      t4 = H._arrayInstanceType(t5);
      t7 = t4._eval$1("MappedListIterable<1,String*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["recorderName", t3, "availableStreams", t6, "recordedStreams", P.List_List$of(new H.MappedListIterable(t5, t4._eval$1("String*(1)")._as(new Q.TimelineFlags_toJson_closure0()), t7), true, t7._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      var _this = this;
      return "[TimelineFlags type: " + H.S(_this.type) + ", recorderName: " + H.S(_this.recorderName) + ", availableStreams: " + H.S(_this.availableStreams) + ", recordedStreams: " + H.S(_this.recordedStreams) + "]";
    },
    set$availableStreams: function(availableStreams) {
      this.availableStreams = type$.legacy_List_legacy_String._as(availableStreams);
    },
    set$recordedStreams: function(recordedStreams) {
      this.recordedStreams = type$.legacy_List_legacy_String._as(recordedStreams);
    }
  };
  Q.TimelineFlags_toJson_closure.prototype = {
    call$1: function(f) {
      return H._asStringS(f);
    },
    $signature: 5
  };
  Q.TimelineFlags_toJson_closure0.prototype = {
    call$1: function(f) {
      return H._asStringS(f);
    },
    $signature: 5
  };
  Q.Timestamp.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Timestamp");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["timestamp", this.timestamp], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[Timestamp type: " + H.S(this.type) + ", timestamp: " + H.S(this.timestamp) + "]";
    }
  };
  Q.TypeArgumentsRef.prototype = {
    toJson$0: function() {
      var json = this.super$ObjRef$toJson();
      json.$indexSet(0, "type", "@TypeArguments");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", this.name], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return type$.legacy_TypeArgumentsRef._is(other) && this.id == other.get$id(other);
    },
    toString$0: function(_) {
      return "[TypeArgumentsRef type: " + H.S(this.type) + ", id: " + H.S(this.id) + ", name: " + H.S(this.name) + "]";
    }
  };
  Q.TypeArguments.prototype = {
    toJson$0: function() {
      var t1, t2, t3, t4,
        json = this.super$Obj$toJson();
      json.$indexSet(0, "type", "TypeArguments");
      t1 = this.name;
      t2 = this.types;
      t2.toString;
      t3 = H._arrayInstanceType(t2);
      t4 = t3._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", t1, "types", P.List_List$of(new H.MappedListIterable(t2, t3._eval$1("Map<String*,@>*(1)")._as(new Q.TypeArguments_toJson_closure()), t4), true, t4._eval$1("ListIterable.E"))], type$.legacy_String, type$.dynamic));
      return json;
    },
    get$hashCode: function(_) {
      return J.get$hashCode$(this.id);
    },
    $eq: function(_, other) {
      if (other == null)
        return false;
      return other instanceof Q.TypeArguments && this.id == other.id;
    },
    toString$0: function(_) {
      var _this = this;
      return "[TypeArguments type: " + H.S(_this.type) + ", id: " + H.S(_this.id) + ", name: " + H.S(_this.name) + ", types: " + H.S(_this.types) + "]";
    },
    set$types: function(types) {
      this.types = type$.legacy_List_legacy_InstanceRef._as(types);
    },
    $isTypeArgumentsRef: 1
  };
  Q.TypeArguments_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_InstanceRef._as(f).toJson$0();
    },
    $signature: 20
  };
  Q.UnresolvedSourceLocation.prototype = {
    toJson$0: function() {
      var t1, _this = this,
        json = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.dynamic);
      json.$indexSet(0, "type", "UnresolvedSourceLocation");
      t1 = _this.script;
      Q._setIfNotNull(json, "script", t1 == null ? null : t1.toJson$0());
      Q._setIfNotNull(json, "scriptUri", _this.scriptUri);
      Q._setIfNotNull(json, "tokenPos", _this.tokenPos);
      Q._setIfNotNull(json, "line", _this.line);
      Q._setIfNotNull(json, "column", _this.column);
      return json;
    },
    toString$0: function(_) {
      return "[UnresolvedSourceLocation type: " + H.S(this.type) + "]";
    }
  };
  Q.Version.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "Version");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["major", this.major, "minor", this.minor], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[Version type: " + H.S(this.type) + ", major: " + H.S(this.major) + ", minor: " + H.S(this.minor) + "]";
    }
  };
  Q.VMRef.prototype = {
    toJson$0: function() {
      var t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "@VM");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", this.name], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[VMRef type: " + H.S(this.type) + ", name: " + H.S(this.name) + "]";
    }
  };
  Q.VM.prototype = {
    toJson$0: function() {
      var t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, _this = this,
        t1 = type$.legacy_String,
        t2 = type$.dynamic,
        json = P.LinkedHashMap_LinkedHashMap$_empty(t1, t2);
      json.$indexSet(0, "type", "VM");
      t3 = _this.name;
      t4 = _this.architectureBits;
      t5 = _this.hostCPU;
      t6 = _this.operatingSystem;
      t7 = _this.targetCPU;
      t8 = _this.version;
      t9 = _this.pid;
      t10 = _this.startTime;
      t11 = _this.isolates;
      t11.toString;
      t12 = H._arrayInstanceType(t11);
      t13 = t12._eval$1("MappedListIterable<1,Map<String*,@>*>");
      t13 = P.List_List$of(new H.MappedListIterable(t11, t12._eval$1("Map<String*,@>*(1)")._as(new Q.VM_toJson_closure()), t13), true, t13._eval$1("ListIterable.E"));
      t12 = _this.isolateGroups;
      t12.toString;
      t11 = H._arrayInstanceType(t12);
      t14 = t11._eval$1("MappedListIterable<1,Map<String*,@>*>");
      json.addAll$1(0, P.LinkedHashMap_LinkedHashMap$_literal(["name", t3, "architectureBits", t4, "hostCPU", t5, "operatingSystem", t6, "targetCPU", t7, "version", t8, "pid", t9, "startTime", t10, "isolates", t13, "isolateGroups", P.List_List$of(new H.MappedListIterable(t12, t11._eval$1("Map<String*,@>*(1)")._as(new Q.VM_toJson_closure0()), t14), true, t14._eval$1("ListIterable.E"))], t1, t2));
      return json;
    },
    toString$0: function(_) {
      return "[VM]";
    },
    set$isolates: function(isolates) {
      this.isolates = type$.legacy_List_legacy_IsolateRef._as(isolates);
    },
    set$isolateGroups: function(isolateGroups) {
      this.isolateGroups = type$.legacy_List_legacy_IsolateGroupRef._as(isolateGroups);
    },
    $isVMRef: 1
  };
  Q.VM_toJson_closure.prototype = {
    call$1: function(f) {
      return type$.legacy_IsolateRef._as(f).toJson$0();
    },
    $signature: 25
  };
  Q.VM_toJson_closure0.prototype = {
    call$1: function(f) {
      return type$.legacy_IsolateGroupRef._as(f).toJson$0();
    },
    $signature: 60
  };
  E.main_closure.prototype = {
    call$1: function(e) {
      var t1 = this.ddsChannel._outgoingController;
      t1.add$1(0, H._instanceType(t1)._precomputed1._as(e));
      return null;
    },
    $signature: 61
  };
  (function aliases() {
    var _ = J.Interceptor.prototype;
    _.super$Interceptor$noSuchMethod = _.noSuchMethod$1;
    _ = J.JavaScriptObject.prototype;
    _.super$JavaScriptObject$toString = _.toString$0;
    _ = P._BroadcastStreamController.prototype;
    _.super$_BroadcastStreamController$_addEventError = _._addEventError$0;
    _ = P._BufferingStreamSubscription.prototype;
    _.super$_BufferingStreamSubscription$_add = _._add$1;
    _.super$_BufferingStreamSubscription$_addError = _._addError$2;
    _ = Q.InstanceRef.prototype;
    _.super$InstanceRef$toJson = _.toJson$0;
    _ = Q.Instance.prototype;
    _.super$Instance$toJson = _.toJson$0;
    _ = Q.ObjRef.prototype;
    _.super$ObjRef$toJson = _.toJson$0;
    _ = Q.Obj.prototype;
    _.super$Obj$toJson = _.toJson$0;
  })();
  (function installTearOffs() {
    var _static_1 = hunkHelpers._static_1,
      _static_0 = hunkHelpers._static_0,
      _static_2 = hunkHelpers._static_2,
      _instance_0_u = hunkHelpers._instance_0u,
      _instance = hunkHelpers.installInstanceTearOff,
      _instance_2_u = hunkHelpers._instance_2u,
      _instance_1_u = hunkHelpers._instance_1u;
    _static_1(P, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 6);
    _static_1(P, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 6);
    _static_1(P, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 6);
    _static_0(P, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
    _static_1(P, "async___nullDataHandler$closure", "_nullDataHandler", 1);
    _static_2(P, "async___nullErrorHandler$closure", "_nullErrorHandler", 7);
    var _;
    _instance_0_u(_ = P._BroadcastSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance(P._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 48, 0);
    _instance_2_u(P._Future.prototype, "get$_completeError", "_completeError$2", 7);
    _instance_0_u(_ = P._ControllerSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = P._BufferingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(P._DoneStreamSubscription.prototype, "get$_sendDone", "_sendDone$0", 0);
    _instance_1_u(_ = P._StreamIterator.prototype, "get$_async$_onData", "_async$_onData$1", 12);
    _instance_2_u(_, "get$_onError", "_onError$2", 7);
    _instance_0_u(_, "get$_onDone", "_onDone$0", 0);
    _instance_0_u(_ = P._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", 34);
    _instance_0_u(_, "get$_handleDone", "_handleDone$0", 0);
    _static_1(P, "convert___defaultToEncodable$closure", "_defaultToEncodable", 2);
    _instance_1_u(_ = M.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 18);
    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 18);
    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 1);
    _static_1(Q, "vm_service_ExtensionData_parse$closure", "ExtensionData_parse", 63);
    _static_1(Q, "vm_service_AllocationProfile_parse$closure", "AllocationProfile_parse", 64);
    _static_1(Q, "vm_service_BoundField_parse$closure", "BoundField_parse", 65);
    _static_1(Q, "vm_service_BoundVariable_parse$closure", "BoundVariable_parse", 66);
    _static_1(Q, "vm_service_Breakpoint_parse$closure", "Breakpoint_parse", 67);
    _static_1(Q, "vm_service_ClassRef_parse$closure", "ClassRef_parse", 68);
    _static_1(Q, "vm_service_Class_parse$closure", "Class_parse", 69);
    _static_1(Q, "vm_service_ClassHeapStats_parse$closure", "ClassHeapStats_parse", 70);
    _static_1(Q, "vm_service_ClassList_parse$closure", "ClassList_parse", 71);
    _static_1(Q, "vm_service_ClientName_parse$closure", "ClientName_parse", 72);
    _static_1(Q, "vm_service_CodeRef_parse$closure", "CodeRef_parse", 73);
    _static_1(Q, "vm_service_Code_parse$closure", "Code_parse", 74);
    _static_1(Q, "vm_service_ContextRef_parse$closure", "ContextRef_parse", 75);
    _static_1(Q, "vm_service_Context_parse$closure", "Context_parse", 76);
    _static_1(Q, "vm_service_ContextElement_parse$closure", "ContextElement_parse", 77);
    _static_1(Q, "vm_service_CpuSamples_parse$closure", "CpuSamples_parse", 78);
    _static_1(Q, "vm_service_CpuSample_parse$closure", "CpuSample_parse", 79);
    _static_1(Q, "vm_service_ErrorRef_parse$closure", "ErrorRef_parse", 80);
    _static_1(Q, "vm_service_Error_parse$closure", "Error_parse", 81);
    _static_1(Q, "vm_service_Event_parse$closure", "Event_parse", 82);
    _static_1(Q, "vm_service_FieldRef_parse$closure", "FieldRef_parse", 83);
    _static_1(Q, "vm_service_Field_parse$closure", "Field_parse", 84);
    _static_1(Q, "vm_service_Flag_parse$closure", "Flag_parse", 85);
    _static_1(Q, "vm_service_FlagList_parse$closure", "FlagList_parse", 86);
    _static_1(Q, "vm_service_Frame_parse$closure", "Frame_parse", 87);
    _static_1(Q, "vm_service_FuncRef_parse$closure", "FuncRef_parse", 88);
    _static_1(Q, "vm_service_Func_parse$closure", "Func_parse", 89);
    _static_1(Q, "vm_service_InstanceRef_parse$closure", "InstanceRef_parse", 90);
    _static_1(Q, "vm_service_Instance_parse$closure", "Instance_parse", 137);
    _static_1(Q, "vm_service_IsolateRef_parse$closure", "IsolateRef_parse", 92);
    _static_1(Q, "vm_service_Isolate_parse$closure", "Isolate_parse", 93);
    _static_1(Q, "vm_service_IsolateGroupRef_parse$closure", "IsolateGroupRef_parse", 94);
    _static_1(Q, "vm_service_IsolateGroup_parse$closure", "IsolateGroup_parse", 95);
    _static_1(Q, "vm_service_InboundReferences_parse$closure", "InboundReferences_parse", 96);
    _static_1(Q, "vm_service_InboundReference_parse$closure", "InboundReference_parse", 97);
    _static_1(Q, "vm_service_InstanceSet_parse$closure", "InstanceSet_parse", 98);
    _static_1(Q, "vm_service_LibraryRef_parse$closure", "LibraryRef_parse", 99);
    _static_1(Q, "vm_service_Library_parse$closure", "Library_parse", 100);
    _static_1(Q, "vm_service_LibraryDependency_parse$closure", "LibraryDependency_parse", 101);
    _static_1(Q, "vm_service_LogRecord_parse$closure", "LogRecord_parse", 102);
    _static_1(Q, "vm_service_MapAssociation_parse$closure", "MapAssociation_parse", 103);
    _static_1(Q, "vm_service_MemoryUsage_parse$closure", "MemoryUsage_parse", 104);
    _static_1(Q, "vm_service_Message_parse$closure", "Message_parse", 105);
    _static_1(Q, "vm_service_NativeFunction_parse$closure", "NativeFunction_parse", 106);
    _static_1(Q, "vm_service_NullValRef_parse$closure", "NullValRef_parse", 107);
    _static_1(Q, "vm_service_NullVal_parse$closure", "NullVal_parse", 108);
    _static_1(Q, "vm_service_ObjRef_parse$closure", "ObjRef_parse", 109);
    _static_1(Q, "vm_service_Obj_parse$closure", "Obj_parse", 110);
    _static_1(Q, "vm_service_ProfileFunction_parse$closure", "ProfileFunction_parse", 111);
    _static_1(Q, "vm_service_ProtocolList_parse$closure", "ProtocolList_parse", 112);
    _static_1(Q, "vm_service_Protocol_parse$closure", "Protocol_parse", 113);
    _static_1(Q, "vm_service_ReloadReport_parse$closure", "ReloadReport_parse", 114);
    _static_1(Q, "vm_service_RetainingObject_parse$closure", "RetainingObject_parse", 115);
    _static_1(Q, "vm_service_RetainingPath_parse$closure", "RetainingPath_parse", 116);
    _static_1(Q, "vm_service_Response_parse$closure", "Response_parse", 117);
    _static_1(Q, "vm_service_Sentinel_parse$closure", "Sentinel_parse", 118);
    _static_1(Q, "vm_service_ScriptRef_parse$closure", "ScriptRef_parse", 119);
    _static_1(Q, "vm_service_Script_parse$closure", "Script_parse", 120);
    _static_1(Q, "vm_service_ScriptList_parse$closure", "ScriptList_parse", 121);
    _static_1(Q, "vm_service_SourceLocation_parse$closure", "SourceLocation_parse", 122);
    _static_1(Q, "vm_service_SourceReport_parse$closure", "SourceReport_parse", 123);
    _static_1(Q, "vm_service_SourceReportCoverage_parse$closure", "SourceReportCoverage_parse", 124);
    _static_1(Q, "vm_service_SourceReportRange_parse$closure", "SourceReportRange_parse", 125);
    _static_1(Q, "vm_service_Stack_parse$closure", "Stack_parse", 126);
    _static_1(Q, "vm_service_Success_parse$closure", "Success_parse", 127);
    _static_1(Q, "vm_service_Timeline_parse$closure", "Timeline_parse", 128);
    _static_1(Q, "vm_service_TimelineEvent_parse$closure", "TimelineEvent_parse", 129);
    _static_1(Q, "vm_service_TimelineFlags_parse$closure", "TimelineFlags_parse", 130);
    _static_1(Q, "vm_service_Timestamp_parse$closure", "Timestamp_parse", 131);
    _static_1(Q, "vm_service_TypeArgumentsRef_parse$closure", "TypeArgumentsRef_parse", 132);
    _static_1(Q, "vm_service_TypeArguments_parse$closure", "TypeArguments_parse", 133);
    _static_1(Q, "vm_service_UnresolvedSourceLocation_parse$closure", "UnresolvedSourceLocation_parse", 134);
    _static_1(Q, "vm_service_Version_parse$closure", "Version_parse", 135);
    _static_1(Q, "vm_service_VMRef_parse$closure", "VMRef_parse", 136);
    _static_1(Q, "vm_service_VM_parse$closure", "VM_parse", 91);
    _instance_1_u(Q.VmService.prototype, "get$_processMessage", "_processMessage$1", 1);
  })();
  (function inheritance() {
    var _mixin = hunkHelpers.mixin,
      _inherit = hunkHelpers.inherit,
      _inheritMany = hunkHelpers.inheritMany;
    _inherit(P.Object, null);
    _inheritMany(P.Object, [H.JS_CONST, J.Interceptor, J.ArrayIterator, P.Error0, H.Closure, P.Iterable, H.ListIterator, P.Iterator, H.FixedLengthListMixin, H.Symbol, P.MapView, H.ConstantMap, H.JSInvocationMirror, H.TypeErrorDecoder, H.NullThrownFromJavaScriptException, H.ExceptionAndStackTrace, H._StackTrace, H._Required, P.MapMixin, H.LinkedHashMapCell, H.LinkedHashMapKeyIterator, H.Rti, H._FunctionParameters, H._Type, P._TimerImpl, P._AsyncAwaitCompleter, P._BufferingStreamSubscription, P._BroadcastStreamController, P._Completer, P._FutureListener, P._Future, P._AsyncCallbackEntry, P.Stream, P.StreamSubscription, P.StreamTransformerBase, P._StreamController, P._AsyncStreamControllerDispatch, P._StreamSinkWrapper, P._DelayedEvent, P._DelayedDone, P._PendingEvents, P._DoneStreamSubscription, P._StreamIterator, P.AsyncError, P._Zone, P.__SetBase_Object_SetMixin, P._LinkedHashSetCell, P._LinkedHashSetIterator, P.ListMixin, P._UnmodifiableMapMixin, P._ListQueueIterator, P.SetMixin, P.Codec, P._JsonStringifier, P._Utf8Decoder, P.DateTime, P.Duration, P.OutOfMemoryError, P.StackOverflowError, P._Exception, P.FormatException, P.Null, P._StringStackTrace, P.StringBuffer, W.EventStreamProvider, P._AcceptStructuredClone, P._JSRandom, V.ErrorResult, F.ValueResult, G.StreamQueue, G._NextRequest, Q._QueueList_Object_ListMixin, Y.Level, L.LogRecord0, F.Logger, R.StreamChannelMixin, K.Uuid, Q.VmService, Q.RPCError, Q.SentinelException, Q.ExtensionData, Q._NullLog, Q.Response, Q.BoundField, Q.ContextElement, Q.CpuSample, Q.Flag, Q.InboundReference, Q.LibraryDependency, Q.MapAssociation, Q.NativeFunction, Q.ProfileFunction, Q.Protocol, Q.RetainingObject, Q.SourceReportCoverage, Q.SourceReportRange, Q.TimelineEvent]);
    _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JSArray, J.JSNumber, J.JSString, H.NativeByteBuffer, H.NativeTypedData, W.DomException, W.Event0, W.EventTarget]);
    _inheritMany(J.JavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction]);
    _inherit(J.JSUnmodifiableArray, J.JSArray);
    _inheritMany(J.JSNumber, [J.JSInt, J.JSDouble]);
    _inheritMany(P.Error0, [H.LateError, H.ReachabilityError, H.NotNullableError, P.TypeError, H.JsNoSuchMethodError, H.UnknownJsTypeError, H.RuntimeError, P.AssertionError, H._Error, P.JsonUnsupportedObjectError, P.NullThrownError, P.ArgumentError, P.NoSuchMethodError, P.UnsupportedError, P.UnimplementedError, P.StateError, P.ConcurrentModificationError, P.CyclicInitializationError]);
    _inheritMany(H.Closure, [H.nullFuture_closure, H.ConstantMap_map_closure, H.Primitives_functionNoSuchMethod_closure, H.TearOffClosure, H.JsLinkedHashMap_addAll_closure, H.initHooks_closure, H.initHooks_closure0, H.initHooks_closure1, P._AsyncRun__initializeScheduleImmediate_internalCallback, P._AsyncRun__initializeScheduleImmediate_closure, P._AsyncRun__scheduleImmediateJsOverride_internalCallback, P._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, P._TimerImpl_internalCallback, P._awaitOnObject_closure, P._awaitOnObject_closure0, P._wrapJsFunctionForAsync_closure, P._SyncBroadcastStreamController__sendData_closure, P._Future__addListener_closure, P._Future__prependListeners_closure, P._Future__chainForeignFuture_closure, P._Future__chainForeignFuture_closure0, P._Future__chainForeignFuture_closure1, P._Future__asyncCompleteWithValue_closure, P._Future__chainFuture_closure, P._Future__asyncCompleteError_closure, P._Future__propagateToListeners_handleWhenCompleteCallback, P._Future__propagateToListeners_handleWhenCompleteCallback_closure, P._Future__propagateToListeners_handleValueCallback, P._Future__propagateToListeners_handleError, P.Stream_length_closure, P.Stream_length_closure0, P.Stream_first_closure, P.Stream_first_closure0, P._StreamController__subscribe_closure, P._StreamController__recordCancel_complete, P._BufferingStreamSubscription__sendError_sendError, P._BufferingStreamSubscription__sendDone_sendDone, P._PendingEvents_schedule_closure, P._cancelAndValue_closure, P._rootHandleUncaughtError_closure, P._RootZone_bindCallback_closure, P._RootZone_bindCallbackGuarded_closure, P._RootZone_bindUnaryCallbackGuarded_closure, P.MapBase_mapToString_closure, P.Utf8Decoder__decoder_closure, P.Utf8Decoder__decoderNonfatal_closure, P._JsonStringifier_writeMap_closure, P._symbolMapToStringMap_closure, P.NoSuchMethodError_toString_closure, P.Duration_toString_sixDigits, P.Duration_toString_twoDigits, W.HttpRequest_request_closure, W._EventStreamSubscription_closure, W._EventStreamSubscription_onData_closure, P._AcceptStructuredClone_walk_closure, P._convertDartToNative_Value_closure, P.convertDartToNative_Dictionary_closure, P.promiseToFuture_closure, P.promiseToFuture_closure0, G.StreamQueue__ensureListening_closure, G.StreamQueue__ensureListening_closure1, G.StreamQueue__ensureListening_closure0, F.Logger_Logger_closure, M.SseClient_closure, M.SseClient_closure0, M.SseClient__closure, Q.createServiceObject_closure, Q._createSpecificObject_closure, Q.VmService_closure, Q.AllocationProfile_toJson_closure, Q.Class_toJson_closure, Q.Class_toJson_closure0, Q.Class_toJson_closure1, Q.Class_toJson_closure2, Q.ClassList_toJson_closure, Q.Context_toJson_closure, Q.CpuSamples_toJson_closure, Q.CpuSamples_toJson_closure0, Q.CpuSample_toJson_closure, Q.Event_toJson_closure, Q.Event_toJson_closure0, Q.Event_toJson_closure1, Q.FlagList_toJson_closure, Q.Frame_toJson_closure, Q.Instance_toJson_closure, Q.Instance_toJson_closure0, Q.Instance_toJson_closure1, Q.Isolate_toJson_closure, Q.Isolate_toJson_closure0, Q.Isolate_toJson_closure1, Q.IsolateGroup_toJson_closure, Q.InboundReferences_toJson_closure, Q.InstanceSet_toJson_closure, Q.Library_toJson_closure, Q.Library_toJson_closure0, Q.Library_toJson_closure1, Q.Library_toJson_closure2, Q.Library_toJson_closure3, Q.ProtocolList_toJson_closure, Q.RetainingPath_toJson_closure, Q.Script$_fromJson_closure, Q.Script_toJson_closure, Q.ScriptList_toJson_closure, Q.SourceReport_toJson_closure, Q.SourceReport_toJson_closure0, Q.SourceReportCoverage_toJson_closure, Q.SourceReportCoverage_toJson_closure0, Q.SourceReportRange_toJson_closure, Q.Stack_toJson_closure, Q.Stack_toJson_closure0, Q.Stack_toJson_closure1, Q.Stack_toJson_closure2, Q.Timeline_toJson_closure, Q.TimelineFlags_toJson_closure, Q.TimelineFlags_toJson_closure0, Q.TypeArguments_toJson_closure, Q.VM_toJson_closure, Q.VM_toJson_closure0, E.main_closure]);
    _inheritMany(P.Iterable, [H.EfficientLengthIterable, H.MappedIterable, H._ConstantMapKeyIterable]);
    _inheritMany(H.EfficientLengthIterable, [H.ListIterable, H.LinkedHashMapKeyIterable]);
    _inherit(H.EfficientLengthMappedIterable, H.MappedIterable);
    _inherit(H.MappedIterator, P.Iterator);
    _inheritMany(H.ListIterable, [H.MappedListIterable, P.ListQueue, P._JsonMapKeyIterable]);
    _inherit(P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, P.MapView);
    _inherit(P.UnmodifiableMapView, P._UnmodifiableMapView_MapView__UnmodifiableMapMixin);
    _inherit(H.ConstantMapView, P.UnmodifiableMapView);
    _inherit(H.ConstantStringMap, H.ConstantMap);
    _inherit(H.NullError, P.TypeError);
    _inheritMany(H.TearOffClosure, [H.StaticClosure, H.BoundClosure]);
    _inherit(H._AssertionError, P.AssertionError);
    _inherit(P.MapBase, P.MapMixin);
    _inheritMany(P.MapBase, [H.JsLinkedHashMap, P._JsonMap]);
    _inheritMany(H.NativeTypedData, [H.NativeByteData, H.NativeTypedArray]);
    _inheritMany(H.NativeTypedArray, [H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin]);
    _inherit(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin);
    _inherit(H.NativeTypedArrayOfDouble, H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inherit(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin);
    _inherit(H.NativeTypedArrayOfInt, H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inheritMany(H.NativeTypedArrayOfDouble, [H.NativeFloat32List, H.NativeFloat64List]);
    _inheritMany(H.NativeTypedArrayOfInt, [H.NativeInt16List, H.NativeInt32List, H.NativeInt8List, H.NativeUint16List, H.NativeUint32List, H.NativeUint8ClampedList, H.NativeUint8List]);
    _inherit(H._TypeError, H._Error);
    _inheritMany(P._BufferingStreamSubscription, [P._ControllerSubscription, P._ForwardingStreamSubscription]);
    _inherit(P._BroadcastSubscription, P._ControllerSubscription);
    _inheritMany(P._BroadcastStreamController, [P._SyncBroadcastStreamController, P._AsyncBroadcastStreamController]);
    _inherit(P._AsyncCompleter, P._Completer);
    _inherit(P._AsyncStreamController, P._StreamController);
    _inheritMany(P.Stream, [P._StreamImpl, P._ForwardingStream, W._EventStream]);
    _inherit(P._ControllerStream, P._StreamImpl);
    _inheritMany(P._DelayedEvent, [P._DelayedData, P._DelayedError]);
    _inherit(P._StreamImplEvents, P._PendingEvents);
    _inherit(P._MapStream, P._ForwardingStream);
    _inherit(P._RootZone, P._Zone);
    _inherit(P._SetBase, P.__SetBase_Object_SetMixin);
    _inherit(P._LinkedHashSet, P._SetBase);
    _inherit(P.Converter, P.StreamTransformerBase);
    _inherit(P.JsonCyclicError, P.JsonUnsupportedObjectError);
    _inheritMany(P.Codec, [P.JsonCodec, N.HexCodec]);
    _inheritMany(P.Converter, [P.JsonEncoder, P.JsonDecoder, P.Utf8Decoder, R.HexEncoder]);
    _inherit(P._JsonStringStringifier, P._JsonStringifier);
    _inheritMany(P.ArgumentError, [P.RangeError, P.IndexError]);
    _inheritMany(W.EventTarget, [W.EventSource, W.HttpRequestEventTarget]);
    _inherit(W.HttpRequest, W.HttpRequestEventTarget);
    _inheritMany(W.Event0, [W.MessageEvent, W.ProgressEvent]);
    _inherit(W._EventStreamSubscription, P.StreamSubscription);
    _inherit(P._AcceptStructuredCloneDart2Js, P._AcceptStructuredClone);
    _inherit(Q.QueueList, Q._QueueList_Object_ListMixin);
    _inherit(M.SseClient, R.StreamChannelMixin);
    _inheritMany(Q.Response, [Q.AllocationProfile, Q.BoundVariable, Q.Obj, Q.ObjRef, Q.ClassHeapStats, Q.ClassList, Q.ClientName, Q.CpuSamples, Q.Event, Q.FlagList, Q.Frame, Q.IsolateRef, Q.Isolate, Q.IsolateGroupRef, Q.IsolateGroup, Q.InboundReferences, Q.InstanceSet, Q.LogRecord, Q.MemoryUsage, Q.Message, Q.ProtocolList, Q.ReloadReport, Q.RetainingPath, Q.Sentinel, Q.ScriptList, Q.SourceLocation, Q.SourceReport, Q.Stack, Q.Success, Q.Timeline, Q.TimelineFlags, Q.Timestamp, Q.UnresolvedSourceLocation, Q.Version, Q.VMRef, Q.VM]);
    _inheritMany(Q.Obj, [Q.Breakpoint, Q.Class, Q.Context, Q.Error, Q.Field, Q.Func, Q.Instance, Q.Library, Q.Script, Q.TypeArguments]);
    _inheritMany(Q.ObjRef, [Q.ClassRef, Q.CodeRef, Q.Code, Q.ContextRef, Q.ErrorRef, Q.FieldRef, Q.FuncRef, Q.InstanceRef, Q.LibraryRef, Q.ScriptRef, Q.TypeArgumentsRef]);
    _inherit(Q.NullValRef, Q.InstanceRef);
    _inherit(Q.NullVal, Q.Instance);
    _mixin(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, P.ListMixin);
    _mixin(H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, H.FixedLengthListMixin);
    _mixin(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin, P.ListMixin);
    _mixin(H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, H.FixedLengthListMixin);
    _mixin(P._AsyncStreamController, P._AsyncStreamControllerDispatch);
    _mixin(P._UnmodifiableMapView_MapView__UnmodifiableMapMixin, P._UnmodifiableMapMixin);
    _mixin(P.__SetBase_Object_SetMixin, P.SetMixin);
    _mixin(Q._QueueList_Object_ListMixin, P.ListMixin);
  })();
  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: {},
    getTypeFromName: getGlobalFromName,
    metadata: [],
    types: ["~()", "~(@)", "@(@)", "Null()", "int*(int*)", "String*(String*)", "~(~())", "~(Object,StackTrace)", "Map<String*,@>*(ClassRef*)", "Map<String*,@>*(ScriptRef*)", "Map<String*,@>*(Frame*)", "Null(@)", "~(Object?)", "~(Object?,Object?)", "@()", "~(Symbol0,@)", "String(int)", "~(Event0)", "~(Event0*)", "Null(Event0*)", "Map<String*,@>*(InstanceRef*)", "Map<String*,@>*(FieldRef*)", "Map<String*,@>*(FuncRef*)", "Map<String*,@>*(Breakpoint*)", "Map<String*,@>*(TimelineEvent*)", "Map<String*,@>*(IsolateRef*)", "Map<String*,@>*(BoundField*)", "Logger*()", "Null(~())", "Null(Object,StackTrace)", "Object*(@)", "Map<String*,@>*(ClassHeapStats*)", "_Future<@>(@)", "@(@,String)", "~(@,StackTrace)", "@(String)", "Map<String*,@>*(ContextElement*)", "Map<String*,@>*(ProfileFunction*)", "Map<String*,@>*(CpuSample*)", "~(String,@)", "Null(@,StackTrace)", "~(int,@)", "~(ProgressEvent)", "Map<String*,@>*(Flag*)", "Map<String*,@>*(BoundVariable*)", "Future<Null>()", "Map<String*,@>*(MapAssociation*)", "Map<String*,@>*(LibraryRef*)", "~(Object[StackTrace?])", "Map<String*,@>*(InboundReference*)", "Map<String*,@>*(ObjRef*)", "Map<String*,@>*(LibraryDependency*)", "@(@,@)", "Map<String*,@>*(Protocol*)", "Map<String*,@>*(RetainingObject*)", "List<int*>*(@)", "List<int*>*(List<int*>*)", "Map<String*,@>*(SourceReportRange*)", "~(@,@)", "Map<String*,@>*(Message*)", "Map<String*,@>*(IsolateGroupRef*)", "~(String*)", "Null(@,StackTrace*)", "ExtensionData*(Map<@,@>*)", "AllocationProfile*(Map<String*,@>*)", "BoundField*(Map<String*,@>*)", "BoundVariable*(Map<String*,@>*)", "Breakpoint*(Map<String*,@>*)", "ClassRef*(Map<String*,@>*)", "Class*(Map<String*,@>*)", "ClassHeapStats*(Map<String*,@>*)", "ClassList*(Map<String*,@>*)", "ClientName*(Map<String*,@>*)", "CodeRef*(Map<String*,@>*)", "Code*(Map<String*,@>*)", "ContextRef*(Map<String*,@>*)", "Context*(Map<String*,@>*)", "ContextElement*(Map<String*,@>*)", "CpuSamples*(Map<String*,@>*)", "CpuSample*(Map<String*,@>*)", "ErrorRef*(Map<String*,@>*)", "Error*(Map<String*,@>*)", "Event*(Map<String*,@>*)", "FieldRef*(Map<String*,@>*)", "Field*(Map<String*,@>*)", "Flag*(Map<String*,@>*)", "FlagList*(Map<String*,@>*)", "Frame*(Map<String*,@>*)", "FuncRef*(Map<String*,@>*)", "Func*(Map<String*,@>*)", "InstanceRef*(Map<String*,@>*)", "VM*(Map<String*,@>*)", "IsolateRef*(Map<String*,@>*)", "Isolate*(Map<String*,@>*)", "IsolateGroupRef*(Map<String*,@>*)", "IsolateGroup*(Map<String*,@>*)", "InboundReferences*(Map<String*,@>*)", "InboundReference*(Map<String*,@>*)", "InstanceSet*(Map<String*,@>*)", "LibraryRef*(Map<String*,@>*)", "Library*(Map<String*,@>*)", "LibraryDependency*(Map<String*,@>*)", "LogRecord*(Map<String*,@>*)", "MapAssociation*(Map<String*,@>*)", "MemoryUsage*(Map<String*,@>*)", "Message*(Map<String*,@>*)", "NativeFunction*(Map<String*,@>*)", "NullValRef*(Map<String*,@>*)", "NullVal*(Map<String*,@>*)", "ObjRef*(Map<String*,@>*)", "Obj*(Map<String*,@>*)", "ProfileFunction*(Map<String*,@>*)", "ProtocolList*(Map<String*,@>*)", "Protocol*(Map<String*,@>*)", "ReloadReport*(Map<String*,@>*)", "RetainingObject*(Map<String*,@>*)", "RetainingPath*(Map<String*,@>*)", "Response*(Map<String*,@>*)", "Sentinel*(Map<String*,@>*)", "ScriptRef*(Map<String*,@>*)", "Script*(Map<String*,@>*)", "ScriptList*(Map<String*,@>*)", "SourceLocation*(Map<String*,@>*)", "SourceReport*(Map<String*,@>*)", "SourceReportCoverage*(Map<String*,@>*)", "SourceReportRange*(Map<String*,@>*)", "Stack*(Map<String*,@>*)", "Success*(Map<String*,@>*)", "Timeline*(Map<String*,@>*)", "TimelineEvent*(Map<String*,@>*)", "TimelineFlags*(Map<String*,@>*)", "Timestamp*(Map<String*,@>*)", "TypeArgumentsRef*(Map<String*,@>*)", "TypeArguments*(Map<String*,@>*)", "UnresolvedSourceLocation*(Map<String*,@>*)", "Version*(Map<String*,@>*)", "VMRef*(Map<String*,@>*)", "Instance*(Map<String*,@>*)"],
    interceptorsByTag: null,
    leafTags: null,
    arrayRti: typeof Symbol == "function" && typeof Symbol() == "symbol" ? Symbol("$ti") : "$ti"
  };
  H._Universe_addRules(init.typeUniverse, JSON.parse('{"JavaScriptFunction":"JavaScriptObject","PlainJavaScriptObject":"JavaScriptObject","UnknownJavaScriptObject":"JavaScriptObject","AbortPaymentEvent":"Event0","ExtendableEvent":"Event0","_ResourceProgressEvent":"ProgressEvent","MessagePort":"EventTarget","JSBool":{"bool":[]},"JSNull":{"Null":[]},"JavaScriptObject":{"Function":[]},"JSArray":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"JSIndexable":["1"]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"JSIndexable":["1"]},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[]},"JSInt":{"double":[],"int":[],"num":[]},"JSDouble":{"double":[],"num":[]},"JSString":{"String":[],"Pattern":[],"JSIndexable":["@"]},"LateError":{"Error0":[]},"ReachabilityError":{"Error0":[]},"NotNullableError":{"Error0":[]},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["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"},"Symbol":{"Symbol0":[]},"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"]},"_ConstantMapKeyIterable":{"Iterable":["1"],"Iterable.E":"1"},"JSInvocationMirror":{"Invocation":[]},"NullError":{"Error0":[]},"JsNoSuchMethodError":{"Error0":[]},"UnknownJsTypeError":{"Error0":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"RuntimeError":{"Error0":[]},"_AssertionError":{"Error0":[]},"JsLinkedHashMap":{"MapMixin":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapMixin.K":"1","MapMixin.V":"2"},"LinkedHashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"NativeByteData":{"ByteData":[]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"],"JSIndexable":["1"]},"NativeTypedArrayOfDouble":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeFloat64List":{"ListMixin":["double"],"JavaScriptIndexingBehavior":["double"],"List":["double"],"EfficientLengthIterable":["double"],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"ListMixin.E":"double"},"NativeInt16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeInt8List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint16List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint32List":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8ClampedList":{"ListMixin":["int"],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"NativeUint8List":{"ListMixin":["int"],"Uint8List":[],"JavaScriptIndexingBehavior":["int"],"List":["int"],"EfficientLengthIterable":["int"],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"ListMixin.E":"int"},"_Error":{"Error0":[]},"_TypeError":{"Error0":[]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_BroadcastSubscription":{"_ControllerSubscription":["1"],"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_BroadcastStreamController":{"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_SyncBroadcastStreamController":{"_BroadcastStreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_AsyncBroadcastStreamController":{"_BroadcastStreamController":["1"],"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_Future":{"Future":["1"]},"_StreamController":{"StreamController":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["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"},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_StreamImplEvents":{"_PendingEvents":["1"]},"_DoneStreamSubscription":{"StreamSubscription":["1"]},"_ForwardingStream":{"Stream":["2"]},"_ForwardingStreamSubscription":{"_BufferingStreamSubscription":["2"],"StreamSubscription":["2"],"_EventSink":["2"],"_EventDispatch":["2"],"_BufferingStreamSubscription.T":"2"},"_MapStream":{"_ForwardingStream":["1","2"],"Stream":["2"],"Stream.T":"2"},"AsyncError":{"Error0":[]},"_Zone":{"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_LinkedHashSet":{"SetMixin":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_LinkedHashSetIterator":{"Iterator":["1"]},"MapBase":{"MapMixin":["1","2"],"Map":["1","2"]},"MapMixin":{"Map":["1","2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ListQueue":{"ListIterable":["1"],"Queue":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_ListQueueIterator":{"Iterator":["1"]},"_SetBase":{"SetMixin":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_JsonMap":{"MapMixin":["String","@"],"Map":["String","@"],"MapMixin.K":"String","MapMixin.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ListIterable.E":"String","Iterable.E":"String"},"JsonUnsupportedObjectError":{"Error0":[]},"JsonCyclicError":{"Error0":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"JsonEncoder":{"Converter":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"]},"Utf8Decoder":{"Converter":["List<int>","String"]},"double":{"num":[]},"int":{"num":[]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Pattern":[]},"AssertionError":{"Error0":[]},"TypeError":{"Error0":[]},"NullThrownError":{"Error0":[]},"ArgumentError":{"Error0":[]},"RangeError":{"Error0":[]},"IndexError":{"Error0":[]},"NoSuchMethodError":{"Error0":[]},"UnsupportedError":{"Error0":[]},"UnimplementedError":{"Error0":[]},"StateError":{"Error0":[]},"ConcurrentModificationError":{"Error0":[]},"OutOfMemoryError":{"Error0":[]},"StackOverflowError":{"Error0":[]},"CyclicInitializationError":{"Error0":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"EventSource":{"EventTarget":[]},"HttpRequest":{"EventTarget":[]},"HttpRequestEventTarget":{"EventTarget":[]},"MessageEvent":{"Event0":[]},"ProgressEvent":{"Event0":[]},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"_JSRandom":{"Random":[]},"ErrorResult":{"Result":["Null"]},"ValueResult":{"Result":["1*"]},"_NextRequest":{"_EventRequest":["1*"]},"QueueList":{"ListMixin":["1*"],"List":["1*"],"Queue":["1*"],"EfficientLengthIterable":["1*"],"Iterable":["1*"],"ListMixin.E":"1*"},"HexCodec":{"Codec":["List<int*>*","String*"],"Codec.S":"List<int*>*"},"HexEncoder":{"Converter":["List<int*>*","String*"]},"_NullLog":{"Log":[]},"Breakpoint":{"ObjRef":[]},"ClassRef":{"ObjRef":[]},"Class":{"ClassRef":[],"ObjRef":[]},"CodeRef":{"ObjRef":[]},"Code":{"CodeRef":[],"ObjRef":[]},"ContextRef":{"ObjRef":[]},"Context":{"ContextRef":[],"ObjRef":[]},"ErrorRef":{"ObjRef":[]},"Error":{"ErrorRef":[],"ObjRef":[]},"FieldRef":{"ObjRef":[]},"Field":{"FieldRef":[],"ObjRef":[]},"FuncRef":{"ObjRef":[]},"Func":{"FuncRef":[],"ObjRef":[]},"InstanceRef":{"ObjRef":[]},"Instance":{"InstanceRef":[],"ObjRef":[]},"Isolate":{"IsolateRef":[]},"IsolateGroup":{"IsolateGroupRef":[]},"LibraryRef":{"ObjRef":[]},"Library":{"LibraryRef":[],"ObjRef":[]},"NullValRef":{"InstanceRef":[],"ObjRef":[]},"NullVal":{"NullValRef":[],"InstanceRef":[],"ObjRef":[]},"Obj":{"ObjRef":[]},"ScriptRef":{"ObjRef":[]},"Script":{"ScriptRef":[],"ObjRef":[]},"TypeArgumentsRef":{"ObjRef":[]},"TypeArguments":{"TypeArgumentsRef":[],"ObjRef":[]},"VM":{"VMRef":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]}}'));
  H._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"EfficientLengthIterable":1,"NativeTypedArray":1,"StreamTransformerBase":2,"MapBase":2,"_SetBase":1,"__SetBase_Object_SetMixin":1,"MapEntry":2,"_QueueList_Object_ListMixin":1,"StreamChannelMixin":1}'));
  var string$ = {
    Cannot: "Cannot fire new event. Controller is already firing an event"
  };
  var type$ = (function rtii() {
    var findType = H.findType;
    return {
      $env_1_1_void: findType("@<~>"),
      AsyncError: findType("AsyncError"),
      ConstantMapView_Symbol_dynamic: findType("ConstantMapView<Symbol0,@>"),
      Duration: findType("Duration"),
      EfficientLengthIterable_dynamic: findType("EfficientLengthIterable<@>"),
      Error: findType("Error0"),
      Event: findType("Event0"),
      Function: findType("Function"),
      Future_dynamic: findType("Future<@>"),
      Future_void: findType("Future<~>"),
      HexCodec: findType("HexCodec"),
      Invocation: findType("Invocation"),
      Iterable_dynamic: findType("Iterable<@>"),
      JSArray_String: findType("JSArray<String>"),
      JSArray_dynamic: findType("JSArray<@>"),
      JSArray_legacy_Result_legacy_String: findType("JSArray<Result<String*>*>"),
      JSArray_legacy_String: findType("JSArray<String*>"),
      JSArray_legacy_int: findType("JSArray<int*>"),
      JSIndexable_dynamic: findType("JSIndexable<@>"),
      JSNull: findType("JSNull"),
      JavaScriptFunction: findType("JavaScriptFunction"),
      JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
      JsLinkedHashMap_String_dynamic: findType("JsLinkedHashMap<String,@>"),
      JsLinkedHashMap_Symbol_dynamic: findType("JsLinkedHashMap<Symbol0,@>"),
      JsLinkedHashMap_of_legacy_String_and_dynamic: findType("JsLinkedHashMap<String*,@>"),
      JsLinkedHashMap_of_legacy_String_and_legacy_int: findType("JsLinkedHashMap<String*,int*>"),
      ListQueue_legacy__EventRequest_dynamic: findType("ListQueue<_EventRequest<@>*>"),
      List_dynamic: findType("List<@>"),
      List_int: findType("List<int>"),
      Map_dynamic_dynamic: findType("Map<@,@>"),
      Null: findType("Null"),
      Object: findType("Object"),
      ProgressEvent: findType("ProgressEvent"),
      QueueList_legacy_Result_legacy_String: findType("QueueList<Result<String*>*>"),
      StackTrace: findType("StackTrace"),
      StreamQueue_legacy_String: findType("StreamQueue<String*>"),
      String: findType("String"),
      Symbol: findType("Symbol0"),
      UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
      _AsyncCompleter_HttpRequest: findType("_AsyncCompleter<HttpRequest>"),
      _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"),
      _AsyncCompleter_legacy_Version: findType("_AsyncCompleter<Version*>"),
      _EventStream_legacy_Event: findType("_EventStream<Event0*>"),
      _Future_HttpRequest: findType("_Future<HttpRequest>"),
      _Future_Null: findType("_Future<Null>"),
      _Future_bool: findType("_Future<bool>"),
      _Future_dynamic: findType("_Future<@>"),
      _Future_int: findType("_Future<int>"),
      _Future_legacy_Version: findType("_Future<Version*>"),
      _Future_void: findType("_Future<~>"),
      _StreamControllerAddStreamState_nullable_Object: findType("_StreamControllerAddStreamState<Object?>"),
      _StreamIterator_dynamic: findType("_StreamIterator<@>"),
      bool: findType("bool"),
      bool_Function_Object: findType("bool(Object)"),
      double: findType("double"),
      dynamic: findType("@"),
      dynamic_Function: findType("@()"),
      dynamic_Function_Object: findType("@(Object)"),
      dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
      dynamic_Function_dynamic_dynamic: findType("@(@,@)"),
      int: findType("int"),
      legacy_BoundField: findType("BoundField*"),
      legacy_BoundVariable: findType("BoundVariable*"),
      legacy_Breakpoint: findType("Breakpoint*"),
      legacy_ByteData: findType("ByteData*"),
      legacy_ClassHeapStats: findType("ClassHeapStats*"),
      legacy_ClassRef: findType("ClassRef*"),
      legacy_CodeRef: findType("CodeRef*"),
      legacy_Completer_dynamic: findType("Completer<@>*"),
      legacy_Context: findType("Context*"),
      legacy_ContextElement: findType("ContextElement*"),
      legacy_ContextRef: findType("ContextRef*"),
      legacy_CpuSample: findType("CpuSample*"),
      legacy_Error: findType("Error*"),
      legacy_ErrorRef: findType("ErrorRef*"),
      legacy_Event: findType("Event*"),
      legacy_Event_2: findType("Event0*"),
      legacy_FieldRef: findType("FieldRef*"),
      legacy_Flag: findType("Flag*"),
      legacy_Frame: findType("Frame*"),
      legacy_FuncRef: findType("FuncRef*"),
      legacy_InboundReference: findType("InboundReference*"),
      legacy_InstanceRef: findType("InstanceRef*"),
      legacy_IsolateGroupRef: findType("IsolateGroupRef*"),
      legacy_IsolateRef: findType("IsolateRef*"),
      legacy_Level: findType("Level*"),
      legacy_LibraryDependency: findType("LibraryDependency*"),
      legacy_LibraryRef: findType("LibraryRef*"),
      legacy_List_dynamic: findType("List<@>*"),
      legacy_List_legacy_BoundField: findType("List<BoundField*>*"),
      legacy_List_legacy_BoundVariable: findType("List<BoundVariable*>*"),
      legacy_List_legacy_Breakpoint: findType("List<Breakpoint*>*"),
      legacy_List_legacy_ClassHeapStats: findType("List<ClassHeapStats*>*"),
      legacy_List_legacy_ClassRef: findType("List<ClassRef*>*"),
      legacy_List_legacy_ContextElement: findType("List<ContextElement*>*"),
      legacy_List_legacy_CpuSample: findType("List<CpuSample*>*"),
      legacy_List_legacy_FieldRef: findType("List<FieldRef*>*"),
      legacy_List_legacy_Flag: findType("List<Flag*>*"),
      legacy_List_legacy_Frame: findType("List<Frame*>*"),
      legacy_List_legacy_FuncRef: findType("List<FuncRef*>*"),
      legacy_List_legacy_InboundReference: findType("List<InboundReference*>*"),
      legacy_List_legacy_InstanceRef: findType("List<InstanceRef*>*"),
      legacy_List_legacy_IsolateGroupRef: findType("List<IsolateGroupRef*>*"),
      legacy_List_legacy_IsolateRef: findType("List<IsolateRef*>*"),
      legacy_List_legacy_LibraryDependency: findType("List<LibraryDependency*>*"),
      legacy_List_legacy_LibraryRef: findType("List<LibraryRef*>*"),
      legacy_List_legacy_List_legacy_int: findType("List<List<int*>*>*"),
      legacy_List_legacy_MapAssociation: findType("List<MapAssociation*>*"),
      legacy_List_legacy_Message: findType("List<Message*>*"),
      legacy_List_legacy_ObjRef: findType("List<ObjRef*>*"),
      legacy_List_legacy_ProfileFunction: findType("List<ProfileFunction*>*"),
      legacy_List_legacy_Protocol: findType("List<Protocol*>*"),
      legacy_List_legacy_RetainingObject: findType("List<RetainingObject*>*"),
      legacy_List_legacy_ScriptRef: findType("List<ScriptRef*>*"),
      legacy_List_legacy_SourceReportRange: findType("List<SourceReportRange*>*"),
      legacy_List_legacy_String: findType("List<String*>*"),
      legacy_List_legacy_TimelineEvent: findType("List<TimelineEvent*>*"),
      legacy_List_legacy_int: findType("List<int*>*"),
      legacy_LogRecord: findType("LogRecord*"),
      legacy_Logger: findType("Logger*"),
      legacy_MapAssociation: findType("MapAssociation*"),
      legacy_Map_dynamic_dynamic: findType("Map<@,@>*"),
      legacy_Map_of_legacy_String_and_dynamic: findType("Map<String*,@>*"),
      legacy_Map_of_legacy_String_and_legacy_int: findType("Map<String*,int*>*"),
      legacy_Map_of_legacy_Symbol_and_dynamic: findType("Map<Symbol0*,@>*"),
      legacy_MemoryUsage: findType("MemoryUsage*"),
      legacy_Message: findType("Message*"),
      legacy_MessageEvent: findType("MessageEvent*"),
      legacy_Never: findType("0&*"),
      legacy_NullValRef: findType("NullValRef*"),
      legacy_ObjRef: findType("ObjRef*"),
      legacy_Object: findType("Object*"),
      legacy_ProfileFunction: findType("ProfileFunction*"),
      legacy_ProgressEvent: findType("ProgressEvent*"),
      legacy_Protocol: findType("Protocol*"),
      legacy_RetainingObject: findType("RetainingObject*"),
      legacy_ScriptRef: findType("ScriptRef*"),
      legacy_SourceLocation: findType("SourceLocation*"),
      legacy_SourceReportCoverage: findType("SourceReportCoverage*"),
      legacy_SourceReportRange: findType("SourceReportRange*"),
      legacy_StackTrace: findType("StackTrace*"),
      legacy_StreamController_legacy_Event: findType("StreamController<Event*>*"),
      legacy_String: findType("String*"),
      legacy_TimelineEvent: findType("TimelineEvent*"),
      legacy_TypeArgumentsRef: findType("TypeArgumentsRef*"),
      legacy_VMRef: findType("VMRef*"),
      legacy_int: findType("int*"),
      legacy_legacy_Future_dynamic_Function: findType("Future<@>*()*"),
      legacy_legacy_Future_legacy_Map_of_legacy_String_and_dynamic_Function_legacy_Map_of_legacy_String_and_dynamic: findType("Future<Map<String*,@>*>*(Map<String*,@>*)*"),
      nullable_Future_Null: findType("Future<Null>?"),
      nullable_List_dynamic: findType("List<@>?"),
      nullable_Object: findType("Object?"),
      nullable__DelayedEvent_dynamic: findType("_DelayedEvent<@>?"),
      nullable__EventRequest_dynamic: findType("_EventRequest<@>?"),
      nullable__FutureListener_dynamic_dynamic: findType("_FutureListener<@,@>?"),
      nullable__LinkedHashSetCell: findType("_LinkedHashSetCell?"),
      nullable_dynamic_Function_Event: findType("@(Event0)?"),
      nullable_nullable_Object_Function_2_nullable_Object_and_nullable_Object: findType("Object?(Object?,Object?)?"),
      nullable_nullable_Object_Function_dynamic: findType("Object?(@)?"),
      nullable_void_Function: findType("~()?"),
      nullable_void_Function_legacy_Event: findType("~(Event0*)?"),
      nullable_void_Function_legacy_ProgressEvent: findType("~(ProgressEvent*)?"),
      num: findType("num"),
      void: findType("~"),
      void_Function: findType("~()"),
      void_Function_Object: findType("~(Object)"),
      void_Function_Object_StackTrace: findType("~(Object,StackTrace)"),
      void_Function_String_dynamic: findType("~(String,@)")
    };
  })();
  (function constants() {
    var makeConstList = hunkHelpers.makeConstList;
    C.EventSource_methods = W.EventSource.prototype;
    C.HttpRequest_methods = W.HttpRequest.prototype;
    C.Interceptor_methods = J.Interceptor.prototype;
    C.JSArray_methods = J.JSArray.prototype;
    C.JSDouble_methods = J.JSDouble.prototype;
    C.JSInt_methods = J.JSInt.prototype;
    C.JSNull_methods = J.JSNull.prototype;
    C.JSNumber_methods = J.JSNumber.prototype;
    C.JSString_methods = J.JSString.prototype;
    C.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
    C.NativeByteData_methods = H.NativeByteData.prototype;
    C.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
    C.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
    C.C_HexCodec = new N.HexCodec();
    C.C_HexEncoder = new R.HexEncoder();
    C.C_JS_CONST = function getTagFallback(o) {
  var s = Object.prototype.toString.call(o);
  return s.substring(8, s.length - 1);
};
    C.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 };
};
    C.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;
  };
};
    C.C_JS_CONST1 = function(hooks) {
  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
};
    C.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;
};
    C.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;
};
    C.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;
};
    C.C_JS_CONST3 = function(hooks) { return hooks; }
;
    C.C_JsonCodec = new P.JsonCodec();
    C.C_OutOfMemoryError = new P.OutOfMemoryError();
    C.C__DelayedDone = new P._DelayedDone();
    C.C__JSRandom = new P._JSRandom();
    C.C__Required = new H._Required();
    C.C__RootZone = new P._RootZone();
    C.C__StringStackTrace = new P._StringStackTrace();
    C.Duration_0 = new P.Duration(0);
    C.Duration_5000000 = new P.Duration(5000000);
    C.JsonDecoder_null = new P.JsonDecoder(null);
    C.JsonEncoder_null = new P.JsonEncoder(null);
    C.Level_INFO_800 = new Y.Level("INFO", 800);
    C.Level_WARNING_900 = new Y.Level("WARNING", 900);
    C.List_AllocationProfile = H.setRuntimeTypeInfo(makeConstList(["AllocationProfile"]), type$.JSArray_legacy_String);
    C.List_BoundField = H.setRuntimeTypeInfo(makeConstList(["BoundField"]), type$.JSArray_legacy_String);
    C.List_BoundVariable = H.setRuntimeTypeInfo(makeConstList(["BoundVariable"]), type$.JSArray_legacy_String);
    C.List_Breakpoint = H.setRuntimeTypeInfo(makeConstList(["Breakpoint"]), type$.JSArray_legacy_String);
    C.List_ClassHeapStats = H.setRuntimeTypeInfo(makeConstList(["ClassHeapStats"]), type$.JSArray_legacy_String);
    C.List_ClassList = H.setRuntimeTypeInfo(makeConstList(["ClassList"]), type$.JSArray_legacy_String);
    C.List_ClassRef = H.setRuntimeTypeInfo(makeConstList(["ClassRef"]), type$.JSArray_legacy_String);
    C.List_ClientName = H.setRuntimeTypeInfo(makeConstList(["ClientName"]), type$.JSArray_legacy_String);
    C.List_CodeRef = H.setRuntimeTypeInfo(makeConstList(["CodeRef"]), type$.JSArray_legacy_String);
    C.List_Context = H.setRuntimeTypeInfo(makeConstList(["Context"]), type$.JSArray_legacy_String);
    C.List_ContextElement = H.setRuntimeTypeInfo(makeConstList(["ContextElement"]), type$.JSArray_legacy_String);
    C.List_ContextRef = H.setRuntimeTypeInfo(makeConstList(["ContextRef"]), type$.JSArray_legacy_String);
    C.List_CpuSample = H.setRuntimeTypeInfo(makeConstList(["CpuSample"]), type$.JSArray_legacy_String);
    C.List_CpuSamples = H.setRuntimeTypeInfo(makeConstList(["CpuSamples"]), type$.JSArray_legacy_String);
    C.List_Error = H.setRuntimeTypeInfo(makeConstList(["Error"]), type$.JSArray_legacy_String);
    C.List_ErrorRef = H.setRuntimeTypeInfo(makeConstList(["ErrorRef"]), type$.JSArray_legacy_String);
    C.List_Event = H.setRuntimeTypeInfo(makeConstList(["Event"]), type$.JSArray_legacy_String);
    C.List_FieldRef = H.setRuntimeTypeInfo(makeConstList(["FieldRef"]), type$.JSArray_legacy_String);
    C.List_Flag = H.setRuntimeTypeInfo(makeConstList(["Flag"]), type$.JSArray_legacy_String);
    C.List_FlagList = H.setRuntimeTypeInfo(makeConstList(["FlagList"]), type$.JSArray_legacy_String);
    C.List_Frame = H.setRuntimeTypeInfo(makeConstList(["Frame"]), type$.JSArray_legacy_String);
    C.List_FuncRef = H.setRuntimeTypeInfo(makeConstList(["FuncRef"]), type$.JSArray_legacy_String);
    C.List_InboundReference = H.setRuntimeTypeInfo(makeConstList(["InboundReference"]), type$.JSArray_legacy_String);
    C.List_InboundReferences = H.setRuntimeTypeInfo(makeConstList(["InboundReferences"]), type$.JSArray_legacy_String);
    C.List_InstanceRef = H.setRuntimeTypeInfo(makeConstList(["InstanceRef"]), type$.JSArray_legacy_String);
    C.List_InstanceRef_ErrorRef = H.setRuntimeTypeInfo(makeConstList(["InstanceRef", "ErrorRef"]), type$.JSArray_legacy_String);
    C.List_InstanceRef_Sentinel = H.setRuntimeTypeInfo(makeConstList(["InstanceRef", "Sentinel"]), type$.JSArray_legacy_String);
    C.List_InstanceSet = H.setRuntimeTypeInfo(makeConstList(["InstanceSet"]), type$.JSArray_legacy_String);
    C.List_Isolate = H.setRuntimeTypeInfo(makeConstList(["Isolate"]), type$.JSArray_legacy_String);
    C.List_IsolateGroup = H.setRuntimeTypeInfo(makeConstList(["IsolateGroup"]), type$.JSArray_legacy_String);
    C.List_IsolateGroupRef = H.setRuntimeTypeInfo(makeConstList(["IsolateGroupRef"]), type$.JSArray_legacy_String);
    C.List_IsolateRef = H.setRuntimeTypeInfo(makeConstList(["IsolateRef"]), type$.JSArray_legacy_String);
    C.List_LibraryRef = H.setRuntimeTypeInfo(makeConstList(["LibraryRef"]), type$.JSArray_legacy_String);
    C.List_LibraryRef_ClassRef_FuncRef = H.setRuntimeTypeInfo(makeConstList(["LibraryRef", "ClassRef", "FuncRef"]), type$.JSArray_legacy_String);
    C.List_LogRecord = H.setRuntimeTypeInfo(makeConstList(["LogRecord"]), type$.JSArray_legacy_String);
    C.List_MemoryUsage = H.setRuntimeTypeInfo(makeConstList(["MemoryUsage"]), type$.JSArray_legacy_String);
    C.List_Message = H.setRuntimeTypeInfo(makeConstList(["Message"]), type$.JSArray_legacy_String);
    C.List_Obj = H.setRuntimeTypeInfo(makeConstList(["Obj"]), type$.JSArray_legacy_String);
    C.List_ObjRef = H.setRuntimeTypeInfo(makeConstList(["ObjRef"]), type$.JSArray_legacy_String);
    C.List_PAk = H.setRuntimeTypeInfo(makeConstList(["InstanceRef", "TypeArgumentsRef", "Sentinel"]), type$.JSArray_legacy_String);
    C.List_ProfileFunction = H.setRuntimeTypeInfo(makeConstList(["ProfileFunction"]), type$.JSArray_legacy_String);
    C.List_Protocol = H.setRuntimeTypeInfo(makeConstList(["Protocol"]), type$.JSArray_legacy_String);
    C.List_ProtocolList = H.setRuntimeTypeInfo(makeConstList(["ProtocolList"]), type$.JSArray_legacy_String);
    C.List_ReloadReport = H.setRuntimeTypeInfo(makeConstList(["ReloadReport"]), type$.JSArray_legacy_String);
    C.List_RetainingObject = H.setRuntimeTypeInfo(makeConstList(["RetainingObject"]), type$.JSArray_legacy_String);
    C.List_RetainingPath = H.setRuntimeTypeInfo(makeConstList(["RetainingPath"]), type$.JSArray_legacy_String);
    C.List_ScriptList = H.setRuntimeTypeInfo(makeConstList(["ScriptList"]), type$.JSArray_legacy_String);
    C.List_ScriptRef = H.setRuntimeTypeInfo(makeConstList(["ScriptRef"]), type$.JSArray_legacy_String);
    C.List_SourceLocation = H.setRuntimeTypeInfo(makeConstList(["SourceLocation"]), type$.JSArray_legacy_String);
    C.List_SourceReport = H.setRuntimeTypeInfo(makeConstList(["SourceReport"]), type$.JSArray_legacy_String);
    C.List_Stack = H.setRuntimeTypeInfo(makeConstList(["Stack"]), type$.JSArray_legacy_String);
    C.List_Success = H.setRuntimeTypeInfo(makeConstList(["Success"]), type$.JSArray_legacy_String);
    C.List_Success_Error = H.setRuntimeTypeInfo(makeConstList(["Success", "Error"]), type$.JSArray_legacy_String);
    C.List_Timeline = H.setRuntimeTypeInfo(makeConstList(["Timeline"]), type$.JSArray_legacy_String);
    C.List_TimelineEvent = H.setRuntimeTypeInfo(makeConstList(["TimelineEvent"]), type$.JSArray_legacy_String);
    C.List_TimelineFlags = H.setRuntimeTypeInfo(makeConstList(["TimelineFlags"]), type$.JSArray_legacy_String);
    C.List_Timestamp = H.setRuntimeTypeInfo(makeConstList(["Timestamp"]), type$.JSArray_legacy_String);
    C.List_TypeArgumentsRef = H.setRuntimeTypeInfo(makeConstList(["TypeArgumentsRef"]), type$.JSArray_legacy_String);
    C.List_VM = H.setRuntimeTypeInfo(makeConstList(["VM"]), type$.JSArray_legacy_String);
    C.List_VMRef = H.setRuntimeTypeInfo(makeConstList(["VMRef"]), type$.JSArray_legacy_String);
    C.List_Version = H.setRuntimeTypeInfo(makeConstList(["Version"]), type$.JSArray_legacy_String);
    C.List_dynamic = H.setRuntimeTypeInfo(makeConstList(["dynamic"]), type$.JSArray_legacy_String);
    C.List_empty = H.setRuntimeTypeInfo(makeConstList([]), type$.JSArray_dynamic);
    C.List_oqh = H.setRuntimeTypeInfo(makeConstList(["SourceLocation", "UnresolvedSourceLocation"]), type$.JSArray_legacy_String);
    C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty, H.findType("ConstantStringMap<@,@>"));
    C.List_empty0 = H.setRuntimeTypeInfo(makeConstList([]), H.findType("JSArray<Symbol0*>"));
    C.Map_empty0 = new H.ConstantStringMap(0, {}, C.List_empty0, H.findType("ConstantStringMap<Symbol0*,@>"));
    C.Symbol_call = new H.Symbol("call");
    C.Type_ByteBuffer_RkP = H.typeLiteral("ByteBuffer");
    C.Type_ByteData_zNC = H.typeLiteral("ByteData");
    C.Type_Float32List_LB7 = H.typeLiteral("Float32List");
    C.Type_Float64List_LB7 = H.typeLiteral("Float64List");
    C.Type_Int16List_uXf = H.typeLiteral("Int16List");
    C.Type_Int32List_O50 = H.typeLiteral("Int32List");
    C.Type_Int8List_ekJ = H.typeLiteral("Int8List");
    C.Type_JSObject_8k0 = H.typeLiteral("JSObject");
    C.Type_Null_Yyn = H.typeLiteral("Null");
    C.Type_String_k8F = H.typeLiteral("String");
    C.Type_Uint16List_2bx = H.typeLiteral("Uint16List");
    C.Type_Uint32List_2bx = H.typeLiteral("Uint32List");
    C.Type_Uint8ClampedList_Jik = H.typeLiteral("Uint8ClampedList");
    C.Type_Uint8List_WLA = H.typeLiteral("Uint8List");
    C.Type_bool_lhE = H.typeLiteral("bool");
    C.Type_double_K1J = H.typeLiteral("double");
    C.Type_int_tHn = H.typeLiteral("int");
    C.Type_num_cv7 = H.typeLiteral("num");
    C.Utf8Decoder_false = new P.Utf8Decoder(false);
  })();
  (function staticFields() {
    $._JS_INTEROP_INTERCEPTOR_TAG = null;
    $.Closure_functionCounter = 0;
    $.BoundClosure_selfFieldNameCache = null;
    $.BoundClosure_receiverFieldNameCache = null;
    $.getTagFunction = null;
    $.alternateTagFunction = null;
    $.prototypeForTagFunction = null;
    $.dispatchRecordsForInstanceTags = null;
    $.interceptorsForUncacheableTags = null;
    $.initNativeDispatchFlag = null;
    $._nextCallback = null;
    $._lastCallback = null;
    $._lastPriorityCallback = null;
    $._isInCallbackLoop = false;
    $.Zone__current = C.C__RootZone;
    $._toStringVisiting = H.setRuntimeTypeInfo([], H.findType("JSArray<Object>"));
    $.LogRecord__nextNumber = 0;
    $.Logger__loggers = P.LinkedHashMap_LinkedHashMap$_empty(type$.legacy_String, type$.legacy_Logger);
    $._typeFactories = P.LinkedHashMap_LinkedHashMap$_literal(["AllocationProfile", Q.vm_service_AllocationProfile_parse$closure(), "BoundField", Q.vm_service_BoundField_parse$closure(), "BoundVariable", Q.vm_service_BoundVariable_parse$closure(), "Breakpoint", Q.vm_service_Breakpoint_parse$closure(), "@Class", Q.vm_service_ClassRef_parse$closure(), "Class", Q.vm_service_Class_parse$closure(), "ClassHeapStats", Q.vm_service_ClassHeapStats_parse$closure(), "ClassList", Q.vm_service_ClassList_parse$closure(), "ClientName", Q.vm_service_ClientName_parse$closure(), "@Code", Q.vm_service_CodeRef_parse$closure(), "Code", Q.vm_service_Code_parse$closure(), "@Context", Q.vm_service_ContextRef_parse$closure(), "Context", Q.vm_service_Context_parse$closure(), "ContextElement", Q.vm_service_ContextElement_parse$closure(), "CpuSamples", Q.vm_service_CpuSamples_parse$closure(), "CpuSample", Q.vm_service_CpuSample_parse$closure(), "@Error", Q.vm_service_ErrorRef_parse$closure(), "Error", Q.vm_service_Error_parse$closure(), "Event", Q.vm_service_Event_parse$closure(), "ExtensionData", Q.vm_service_ExtensionData_parse$closure(), "@Field", Q.vm_service_FieldRef_parse$closure(), "Field", Q.vm_service_Field_parse$closure(), "Flag", Q.vm_service_Flag_parse$closure(), "FlagList", Q.vm_service_FlagList_parse$closure(), "Frame", Q.vm_service_Frame_parse$closure(), "@Function", Q.vm_service_FuncRef_parse$closure(), "Function", Q.vm_service_Func_parse$closure(), "@Instance", Q.vm_service_InstanceRef_parse$closure(), "Instance", Q.vm_service_Instance_parse$closure(), "@Isolate", Q.vm_service_IsolateRef_parse$closure(), "Isolate", Q.vm_service_Isolate_parse$closure(), "@IsolateGroup", Q.vm_service_IsolateGroupRef_parse$closure(), "IsolateGroup", Q.vm_service_IsolateGroup_parse$closure(), "InboundReferences", Q.vm_service_InboundReferences_parse$closure(), "InboundReference", Q.vm_service_InboundReference_parse$closure(), "InstanceSet", Q.vm_service_InstanceSet_parse$closure(), "@Library", Q.vm_service_LibraryRef_parse$closure(), "Library", Q.vm_service_Library_parse$closure(), "LibraryDependency", Q.vm_service_LibraryDependency_parse$closure(), "LogRecord", Q.vm_service_LogRecord_parse$closure(), "MapAssociation", Q.vm_service_MapAssociation_parse$closure(), "MemoryUsage", Q.vm_service_MemoryUsage_parse$closure(), "Message", Q.vm_service_Message_parse$closure(), "NativeFunction", Q.vm_service_NativeFunction_parse$closure(), "@Null", Q.vm_service_NullValRef_parse$closure(), "Null", Q.vm_service_NullVal_parse$closure(), "@Object", Q.vm_service_ObjRef_parse$closure(), "Object", Q.vm_service_Obj_parse$closure(), "ProfileFunction", Q.vm_service_ProfileFunction_parse$closure(), "ProtocolList", Q.vm_service_ProtocolList_parse$closure(), "Protocol", Q.vm_service_Protocol_parse$closure(), "ReloadReport", Q.vm_service_ReloadReport_parse$closure(), "RetainingObject", Q.vm_service_RetainingObject_parse$closure(), "RetainingPath", Q.vm_service_RetainingPath_parse$closure(), "Response", Q.vm_service_Response_parse$closure(), "Sentinel", Q.vm_service_Sentinel_parse$closure(), "@Script", Q.vm_service_ScriptRef_parse$closure(), "Script", Q.vm_service_Script_parse$closure(), "ScriptList", Q.vm_service_ScriptList_parse$closure(), "SourceLocation", Q.vm_service_SourceLocation_parse$closure(), "SourceReport", Q.vm_service_SourceReport_parse$closure(), "SourceReportCoverage", Q.vm_service_SourceReportCoverage_parse$closure(), "SourceReportRange", Q.vm_service_SourceReportRange_parse$closure(), "Stack", Q.vm_service_Stack_parse$closure(), "Success", Q.vm_service_Success_parse$closure(), "Timeline", Q.vm_service_Timeline_parse$closure(), "TimelineEvent", Q.vm_service_TimelineEvent_parse$closure(), "TimelineFlags", Q.vm_service_TimelineFlags_parse$closure(), "Timestamp", Q.vm_service_Timestamp_parse$closure(), "@TypeArguments", Q.vm_service_TypeArgumentsRef_parse$closure(), "TypeArguments", Q.vm_service_TypeArguments_parse$closure(), "UnresolvedSourceLocation", Q.vm_service_UnresolvedSourceLocation_parse$closure(), "Version", Q.vm_service_Version_parse$closure(), "@VM", Q.vm_service_VMRef_parse$closure(), "VM", Q.vm_service_VM_parse$closure()], type$.legacy_String, H.findType("Function*"));
    $._methodReturnTypes = P.LinkedHashMap_LinkedHashMap$_literal(["addBreakpoint", C.List_Breakpoint, "addBreakpointWithScriptUri", C.List_Breakpoint, "addBreakpointAtEntry", C.List_Breakpoint, "clearCpuSamples", C.List_Success, "clearVMTimeline", C.List_Success, "invoke", C.List_InstanceRef_ErrorRef, "evaluate", C.List_InstanceRef_ErrorRef, "evaluateInFrame", C.List_InstanceRef_ErrorRef, "getAllocationProfile", C.List_AllocationProfile, "getClassList", C.List_ClassList, "getClientName", C.List_ClientName, "getCpuSamples", C.List_CpuSamples, "getFlagList", C.List_FlagList, "getInboundReferences", C.List_InboundReferences, "getInstances", C.List_InstanceSet, "getIsolate", C.List_Isolate, "getIsolateGroup", C.List_IsolateGroup, "getMemoryUsage", C.List_MemoryUsage, "getIsolateGroupMemoryUsage", C.List_MemoryUsage, "getScripts", C.List_ScriptList, "getObject", C.List_Obj, "getRetainingPath", C.List_RetainingPath, "getStack", C.List_Stack, "getSupportedProtocols", C.List_ProtocolList, "getSourceReport", C.List_SourceReport, "getVersion", C.List_Version, "getVM", C.List_VM, "getVMTimeline", C.List_Timeline, "getVMTimelineFlags", C.List_TimelineFlags, "getVMTimelineMicros", C.List_Timestamp, "pause", C.List_Success, "kill", C.List_Success, "registerService", C.List_Success, "reloadSources", C.List_ReloadReport, "removeBreakpoint", C.List_Success, "requestHeapSnapshot", C.List_Success, "requirePermissionToResume", C.List_Success, "resume", C.List_Success, "setClientName", C.List_Success, "setExceptionPauseMode", C.List_Success, "setFlag", C.List_Success_Error, "setLibraryDebuggable", C.List_Success, "setName", C.List_Success, "setVMName", C.List_Success, "setVMTimelineFlags", C.List_Success, "streamCancel", C.List_Success, "streamListen", C.List_Success], type$.legacy_String, type$.legacy_List_legacy_String);
  })();
  (function lazyInitializers() {
    var _lazyFinal = hunkHelpers.lazyFinal,
      _lazy = hunkHelpers.lazy,
      _lazyOld = hunkHelpers.lazyOld;
    _lazyFinal($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", function() {
      return H.getIsolateAffinityTag("_$dart_dartClosure");
    });
    _lazyFinal($, "nullFuture", "$get$nullFuture", function() {
      return C.C__RootZone.run$1$1(new H.nullFuture_closure(), H.findType("Future<Null>"));
    });
    _lazyFinal($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({
        toString: function() {
          return "$receiver$";
        }
      }));
    });
    _lazyFinal($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null,
        toString: function() {
          return "$receiver$";
        }
      }));
    });
    _lazyFinal($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
    });
    _lazyFinal($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", function() {
      return H.TypeErrorDecoder_extractPattern(function() {
        var $argumentsExpr$ = '$arguments$';
        try {
          null.$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }());
    });
    _lazyFinal($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
    });
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
      return H.TypeErrorDecoder_extractPattern(function() {
        var $argumentsExpr$ = '$arguments$';
        try {
          (void 0).$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }());
    });
    _lazyFinal($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
    });
    _lazyFinal($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
      return H.TypeErrorDecoder_extractPattern(function() {
        try {
          null.$method$;
        } catch (e) {
          return e.message;
        }
      }());
    });
    _lazyFinal($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", function() {
      return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
    });
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
      return H.TypeErrorDecoder_extractPattern(function() {
        try {
          (void 0).$method$;
        } catch (e) {
          return e.message;
        }
      }());
    });
    _lazyFinal($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", function() {
      return P._AsyncRun__initializeScheduleImmediate();
    });
    _lazyFinal($, "Future__nullFuture", "$get$Future__nullFuture", function() {
      return type$._Future_Null._as($.$get$nullFuture());
    });
    _lazyFinal($, "Future__falseFuture", "$get$Future__falseFuture", function() {
      var t1 = new P._Future(C.C__RootZone, type$._Future_bool);
      t1._setValue$1(false);
      return t1;
    });
    _lazyFinal($, "Utf8Decoder__decoder", "$get$Utf8Decoder__decoder", function() {
      return new P.Utf8Decoder__decoder_closure().call$0();
    });
    _lazyFinal($, "Utf8Decoder__decoderNonfatal", "$get$Utf8Decoder__decoderNonfatal", function() {
      return new P.Utf8Decoder__decoderNonfatal_closure().call$0();
    });
    _lazy($, "_hasErrorStackProperty", "$get$_hasErrorStackProperty", function() {
      return new Error().stack != void 0;
    });
    _lazyOld($, "Logger_root", "$get$Logger_root", function() {
      return F.Logger_Logger("");
    });
  })();
  (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({Blob: J.Interceptor, DOMError: J.Interceptor, File: J.Interceptor, MediaError: J.Interceptor, NavigatorUserMediaError: J.Interceptor, OverconstrainedError: J.Interceptor, PositionError: J.Interceptor, SQLError: J.Interceptor, ArrayBuffer: H.NativeByteBuffer, ArrayBufferView: H.NativeTypedData, DataView: H.NativeByteData, Float32Array: H.NativeFloat32List, Float64Array: H.NativeFloat64List, Int16Array: H.NativeInt16List, Int32Array: H.NativeInt32List, Int8Array: H.NativeInt8List, Uint16Array: H.NativeUint16List, Uint32Array: H.NativeUint32List, Uint8ClampedArray: H.NativeUint8ClampedList, CanvasPixelArray: H.NativeUint8ClampedList, Uint8Array: H.NativeUint8List, DOMException: W.DomException, AbortPaymentEvent: W.Event0, AnimationEvent: W.Event0, AnimationPlaybackEvent: W.Event0, ApplicationCacheErrorEvent: W.Event0, BackgroundFetchClickEvent: W.Event0, BackgroundFetchEvent: W.Event0, BackgroundFetchFailEvent: W.Event0, BackgroundFetchedEvent: W.Event0, BeforeInstallPromptEvent: W.Event0, BeforeUnloadEvent: W.Event0, BlobEvent: W.Event0, CanMakePaymentEvent: W.Event0, ClipboardEvent: W.Event0, CloseEvent: W.Event0, CompositionEvent: W.Event0, CustomEvent: W.Event0, DeviceMotionEvent: W.Event0, DeviceOrientationEvent: W.Event0, ErrorEvent: W.Event0, ExtendableEvent: W.Event0, ExtendableMessageEvent: W.Event0, FetchEvent: W.Event0, FocusEvent: W.Event0, FontFaceSetLoadEvent: W.Event0, ForeignFetchEvent: W.Event0, GamepadEvent: W.Event0, HashChangeEvent: W.Event0, InstallEvent: W.Event0, KeyboardEvent: W.Event0, MediaEncryptedEvent: W.Event0, MediaKeyMessageEvent: W.Event0, MediaQueryListEvent: W.Event0, MediaStreamEvent: W.Event0, MediaStreamTrackEvent: W.Event0, MIDIConnectionEvent: W.Event0, MIDIMessageEvent: W.Event0, MouseEvent: W.Event0, DragEvent: W.Event0, MutationEvent: W.Event0, NotificationEvent: W.Event0, PageTransitionEvent: W.Event0, PaymentRequestEvent: W.Event0, PaymentRequestUpdateEvent: W.Event0, PointerEvent: W.Event0, PopStateEvent: W.Event0, PresentationConnectionAvailableEvent: W.Event0, PresentationConnectionCloseEvent: W.Event0, PromiseRejectionEvent: W.Event0, PushEvent: W.Event0, RTCDataChannelEvent: W.Event0, RTCDTMFToneChangeEvent: W.Event0, RTCPeerConnectionIceEvent: W.Event0, RTCTrackEvent: W.Event0, SecurityPolicyViolationEvent: W.Event0, SensorErrorEvent: W.Event0, SpeechRecognitionError: W.Event0, SpeechRecognitionEvent: W.Event0, SpeechSynthesisEvent: W.Event0, StorageEvent: W.Event0, SyncEvent: W.Event0, TextEvent: W.Event0, TouchEvent: W.Event0, TrackEvent: W.Event0, TransitionEvent: W.Event0, WebKitTransitionEvent: W.Event0, UIEvent: W.Event0, VRDeviceEvent: W.Event0, VRDisplayEvent: W.Event0, VRSessionEvent: W.Event0, WheelEvent: W.Event0, MojoInterfaceRequestEvent: W.Event0, USBConnectionEvent: W.Event0, IDBVersionChangeEvent: W.Event0, AudioProcessingEvent: W.Event0, OfflineAudioCompletionEvent: W.Event0, WebGLContextEvent: W.Event0, Event: W.Event0, InputEvent: W.Event0, SubmitEvent: W.Event0, EventSource: W.EventSource, MessagePort: W.EventTarget, EventTarget: W.EventTarget, XMLHttpRequest: W.HttpRequest, XMLHttpRequestEventTarget: W.HttpRequestEventTarget, MessageEvent: W.MessageEvent, ProgressEvent: W.ProgressEvent, ResourceProgressEvent: W.ProgressEvent});
    hunkHelpers.setOrUpdateLeafTags({Blob: true, DOMError: true, File: true, MediaError: true, NavigatorUserMediaError: true, OverconstrainedError: true, PositionError: true, SQLError: 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, DOMException: true, 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, CompositionEvent: true, CustomEvent: true, DeviceMotionEvent: true, DeviceOrientationEvent: true, ErrorEvent: true, ExtendableEvent: true, ExtendableMessageEvent: true, FetchEvent: true, FocusEvent: true, FontFaceSetLoadEvent: true, ForeignFetchEvent: true, GamepadEvent: true, HashChangeEvent: true, InstallEvent: true, KeyboardEvent: true, MediaEncryptedEvent: true, MediaKeyMessageEvent: true, MediaQueryListEvent: true, MediaStreamEvent: true, MediaStreamTrackEvent: true, MIDIConnectionEvent: true, MIDIMessageEvent: true, MouseEvent: true, DragEvent: true, MutationEvent: true, NotificationEvent: true, PageTransitionEvent: true, PaymentRequestEvent: true, PaymentRequestUpdateEvent: true, PointerEvent: 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, TextEvent: true, TouchEvent: true, TrackEvent: true, TransitionEvent: true, WebKitTransitionEvent: true, UIEvent: true, VRDeviceEvent: true, VRDisplayEvent: true, VRSessionEvent: true, WheelEvent: true, MojoInterfaceRequestEvent: true, USBConnectionEvent: true, IDBVersionChangeEvent: true, AudioProcessingEvent: true, OfflineAudioCompletionEvent: true, WebGLContextEvent: true, Event: false, InputEvent: false, SubmitEvent: false, EventSource: true, MessagePort: true, EventTarget: false, XMLHttpRequest: true, XMLHttpRequestEventTarget: false, MessageEvent: true, ProgressEvent: true, ResourceProgressEvent: true});
    H.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView";
    H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    H._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    H.NativeTypedArrayOfDouble.$nativeSuperclassTag = "ArrayBufferView";
    H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    H._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    H.NativeTypedArrayOfInt.$nativeSuperclassTag = "ArrayBufferView";
  })();
  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 = E.main;
    if (typeof dartMainRunner === "function")
      dartMainRunner(callMain, []);
    else
      callMain([]);
  });
})();

//# sourceMappingURL=sse_smoke_driver.dart.js.map
