//@ defaultNoNoLLIntRun if $architecture == "mips" || $architecture == "arm"
/*
 * Copyright jQuery Foundation and other contributors, https://jquery.org/
 *
 * This software consists of voluntary contributions made by many
 * individuals. For exact contribution history, see the revision history
 * available at https://github.com/requirejs/requirejs
 * 
 * The following license applies to all parts of this software except as
 * documented below:
 * 
 * ====
 * 
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 * ====
 * 
 * Copyright and related rights for sample code are waived via CC0. Sample
 * code is defined as all source code displayed within the prose of the
 * documentation.
 * 
 * CC0: http://creativecommons.org/publicdomain/zero/1.0/
 * 
 * ====
 * 
 * Files located in the node_modules directory, and certain utilities used
 * to build or test the software in the test and dist directories, are
 * externally maintained libraries used by this software which have their own
 * licenses; we recommend you read them, as their terms may differ from the
 * terms above.
*/

console = {
    log() { }
};

function foo() {
const _library = Object.create(null);
const dart = Object.create(_library);
dart.library = _library;
const _debugger = Object.create(dart.library);
const _foreign_helper = Object.create(dart.library);
const _interceptors = Object.create(dart.library);
const _internal = Object.create(dart.library);
const _isolate_helper = Object.create(dart.library);
const _js_helper = Object.create(dart.library);
const _js_mirrors = Object.create(dart.library);
const _js_primitives = Object.create(dart.library);
const _metadata = Object.create(dart.library);
const _native_typed_data = Object.create(dart.library);
const async = Object.create(dart.library);
const collection = Object.create(dart.library);
const convert = Object.create(dart.library);
const core = Object.create(dart.library);
const developer = Object.create(dart.library);
const io = Object.create(dart.library);
const isolate = Object.create(dart.library);
const js = Object.create(dart.library);
const js_util = Object.create(dart.library);
const math = Object.create(dart.library);
const mirrors = Object.create(dart.library);
const typed_data = Object.create(dart.library);
const indexed_db = Object.create(dart.library);
const html$ = Object.create(dart.library);
const html_common = Object.create(dart.library);
const svg$ = Object.create(dart.library);
const web_audio = Object.create(dart.library);
const web_gl = Object.create(dart.library);
const web_sql = Object.create(dart.library);
const _http = Object.create(dart.library);
const dartx = Object.create(dart.library);
const _privateNames = Symbol("_privateNames");
dart.privateName = function(library, name) {
  let names = library[_privateNames];
  if (names == null) names = library[_privateNames] = new Map();
  let symbol = names.get(name);
  if (symbol == null) names.set(name, symbol = Symbol(name));
  return symbol;
};
const $clear = dartx.clear = Symbol("dartx.clear");
const $hashCode = dartx.hashCode = Symbol("dartx.hashCode");
const $cast = dartx.cast = Symbol("dartx.cast");
const $addAll = dartx.addAll = Symbol("dartx.addAll");
const $_set = dartx._set = Symbol("dartx._set");
const $_get = dartx._get = Symbol("dartx._get");
const $_equals = dartx._equals = Symbol("dartx._equals");
const $toString = dartx.toString = Symbol("dartx.toString");
const $noSuchMethod = dartx.noSuchMethod = Symbol("dartx.noSuchMethod");
const $runtimeType = dartx.runtimeType = Symbol("dartx.runtimeType");
const $length = dartx.length = Symbol("dartx.length");
const $containsKey = dartx.containsKey = Symbol("dartx.containsKey");
const $any = dartx.any = Symbol("dartx.any");
const $remove = dartx.remove = Symbol("dartx.remove");
const $keys = dartx.keys = Symbol("dartx.keys");
const $isNotEmpty = dartx.isNotEmpty = Symbol("dartx.isNotEmpty");
const $indexOf = dartx.indexOf = Symbol("dartx.indexOf");
const $toList = dartx.toList = Symbol("dartx.toList");
const $trim = dartx.trim = Symbol("dartx.trim");
const $map = dartx.map = Symbol("dartx.map");
const $split = dartx.split = Symbol("dartx.split");
const $substring = dartx.substring = Symbol("dartx.substring");
const $add = dartx.add = Symbol("dartx.add");
const $isEmpty = dartx.isEmpty = Symbol("dartx.isEmpty");
const $values = dartx.values = Symbol("dartx.values");
const $dartStack = dartx.dartStack = Symbol("dartx.dartStack");
const $startsWith = dartx.startsWith = Symbol("dartx.startsWith");
const $compareTo = dartx.compareTo = Symbol("dartx.compareTo");
const $sort = dartx.sort = Symbol("dartx.sort");
const $truncate = dartx.truncate = Symbol("dartx.truncate");
const $asMap = dartx.asMap = Symbol("dartx.asMap");
const $take = dartx.take = Symbol("dartx.take");
const $skip = dartx.skip = Symbol("dartx.skip");
const $forEach = dartx.forEach = Symbol("dartx.forEach");
const $elementAt = dartx.elementAt = Symbol("dartx.elementAt");
const $where = dartx.where = Symbol("dartx.where");
const $console = dartx.console = Symbol("dartx.console");
const $contains = dartx.contains = Symbol("dartx.contains");
const $last = dartx.last = Symbol("dartx.last");
const $join = dartx.join = Symbol("dartx.join");
const $firstWhere = dartx.firstWhere = Symbol("dartx.firstWhere");
const $replaceFirst = dartx.replaceFirst = Symbol("dartx.replaceFirst");
const $putIfAbsent = dartx.putIfAbsent = Symbol("dartx.putIfAbsent");
const $round = dartx.round = Symbol("dartx.round");
const $bitAnd = dartx['&'] = Symbol("dartx.&");
const $bitOr = dartx['|'] = Symbol("dartx.|");
const $bitXor = dartx['^'] = Symbol("dartx.^");
const $sublist = dartx.sublist = Symbol("dartx.sublist");
const $stackTrace = dartx.stackTrace = Symbol("dartx.stackTrace");
const $invalidValue = dartx.invalidValue = Symbol("dartx.invalidValue");
const $name = dartx.name = Symbol("dartx.name");
const $message = dartx.message = Symbol("dartx.message");
const $checkMutable = dartx.checkMutable = Symbol("dartx.checkMutable");
const $checkGrowable = dartx.checkGrowable = Symbol("dartx.checkGrowable");
const $removeAt = dartx.removeAt = Symbol("dartx.removeAt");
const $insert = dartx.insert = Symbol("dartx.insert");
const $setRange = dartx.setRange = Symbol("dartx.setRange");
const $insertAll = dartx.insertAll = Symbol("dartx.insertAll");
const $setAll = dartx.setAll = Symbol("dartx.setAll");
const $removeLast = dartx.removeLast = Symbol("dartx.removeLast");
const $removeWhere = dartx.removeWhere = Symbol("dartx.removeWhere");
const $retainWhere = dartx.retainWhere = Symbol("dartx.retainWhere");
const $expand = dartx.expand = Symbol("dartx.expand");
const $takeWhile = dartx.takeWhile = Symbol("dartx.takeWhile");
const $skipWhile = dartx.skipWhile = Symbol("dartx.skipWhile");
const $reduce = dartx.reduce = Symbol("dartx.reduce");
const $fold = dartx.fold = Symbol("dartx.fold");
const $lastWhere = dartx.lastWhere = Symbol("dartx.lastWhere");
const $singleWhere = dartx.singleWhere = Symbol("dartx.singleWhere");
const $getRange = dartx.getRange = Symbol("dartx.getRange");
const $first = dartx.first = Symbol("dartx.first");
const $single = dartx.single = Symbol("dartx.single");
const $removeRange = dartx.removeRange = Symbol("dartx.removeRange");
const $fillRange = dartx.fillRange = Symbol("dartx.fillRange");
const $replaceRange = dartx.replaceRange = Symbol("dartx.replaceRange");
const $every = dartx.every = Symbol("dartx.every");
const $reversed = dartx.reversed = Symbol("dartx.reversed");
const $shuffle = dartx.shuffle = Symbol("dartx.shuffle");
const $lastIndexOf = dartx.lastIndexOf = Symbol("dartx.lastIndexOf");
const $toSet = dartx.toSet = Symbol("dartx.toSet");
const $iterator = dartx.iterator = Symbol("dartx.iterator");
const $followedBy = dartx.followedBy = Symbol("dartx.followedBy");
const $whereType = dartx.whereType = Symbol("dartx.whereType");
const $plus = dartx['+'] = Symbol("dartx.+");
const $indexWhere = dartx.indexWhere = Symbol("dartx.indexWhere");
const $lastIndexWhere = dartx.lastIndexWhere = Symbol("dartx.lastIndexWhere");
const $isNegative = dartx.isNegative = Symbol("dartx.isNegative");
const $isNaN = dartx.isNaN = Symbol("dartx.isNaN");
const $isInfinite = dartx.isInfinite = Symbol("dartx.isInfinite");
const $isFinite = dartx.isFinite = Symbol("dartx.isFinite");
const $remainder = dartx.remainder = Symbol("dartx.remainder");
const $abs = dartx.abs = Symbol("dartx.abs");
const $sign = dartx.sign = Symbol("dartx.sign");
const $truncateToDouble = dartx.truncateToDouble = Symbol("dartx.truncateToDouble");
const $toInt = dartx.toInt = Symbol("dartx.toInt");
const $ceilToDouble = dartx.ceilToDouble = Symbol("dartx.ceilToDouble");
const $ceil = dartx.ceil = Symbol("dartx.ceil");
const $floorToDouble = dartx.floorToDouble = Symbol("dartx.floorToDouble");
const $floor = dartx.floor = Symbol("dartx.floor");
const $roundToDouble = dartx.roundToDouble = Symbol("dartx.roundToDouble");
const $clamp = dartx.clamp = Symbol("dartx.clamp");
const $toDouble = dartx.toDouble = Symbol("dartx.toDouble");
const $toStringAsFixed = dartx.toStringAsFixed = Symbol("dartx.toStringAsFixed");
const $toStringAsExponential = dartx.toStringAsExponential = Symbol("dartx.toStringAsExponential");
const $toStringAsPrecision = dartx.toStringAsPrecision = Symbol("dartx.toStringAsPrecision");
const $codeUnitAt = dartx.codeUnitAt = Symbol("dartx.codeUnitAt");
const $toRadixString = dartx.toRadixString = Symbol("dartx.toRadixString");
const $times = dartx['*'] = Symbol("dartx.*");
const $_negate = dartx._negate = Symbol("dartx._negate");
const $minus = dartx['-'] = Symbol("dartx.-");
const $divide = dartx['/'] = Symbol("dartx./");
const $modulo = dartx['%'] = Symbol("dartx.%");
const $floorDivide = dartx['~/'] = Symbol("dartx.~/");
const $leftShift = dartx['<<'] = Symbol("dartx.<<");
const $rightShift = dartx['>>'] = Symbol("dartx.>>");
const $lessThan = dartx['<'] = Symbol("dartx.<");
const $greaterThan = dartx['>'] = Symbol("dartx.>");
const $lessOrEquals = dartx['<='] = Symbol("dartx.<=");
const $greaterOrEquals = dartx['>='] = Symbol("dartx.>=");
const $isEven = dartx.isEven = Symbol("dartx.isEven");
const $isOdd = dartx.isOdd = Symbol("dartx.isOdd");
const $toUnsigned = dartx.toUnsigned = Symbol("dartx.toUnsigned");
const $toSigned = dartx.toSigned = Symbol("dartx.toSigned");
const $bitLength = dartx.bitLength = Symbol("dartx.bitLength");
const $modPow = dartx.modPow = Symbol("dartx.modPow");
const $modInverse = dartx.modInverse = Symbol("dartx.modInverse");
const $gcd = dartx.gcd = Symbol("dartx.gcd");
const $bitNot = dartx['~'] = Symbol("dartx.~");
const $allMatches = dartx.allMatches = Symbol("dartx.allMatches");
const $matchAsPrefix = dartx.matchAsPrefix = Symbol("dartx.matchAsPrefix");
const $endsWith = dartx.endsWith = Symbol("dartx.endsWith");
const $replaceAll = dartx.replaceAll = Symbol("dartx.replaceAll");
const $splitMapJoin = dartx.splitMapJoin = Symbol("dartx.splitMapJoin");
const $replaceAllMapped = dartx.replaceAllMapped = Symbol("dartx.replaceAllMapped");
const $replaceFirstMapped = dartx.replaceFirstMapped = Symbol("dartx.replaceFirstMapped");
const $toLowerCase = dartx.toLowerCase = Symbol("dartx.toLowerCase");
const $toUpperCase = dartx.toUpperCase = Symbol("dartx.toUpperCase");
const $trimLeft = dartx.trimLeft = Symbol("dartx.trimLeft");
const $trimRight = dartx.trimRight = Symbol("dartx.trimRight");
const $padLeft = dartx.padLeft = Symbol("dartx.padLeft");
const $padRight = dartx.padRight = Symbol("dartx.padRight");
const $codeUnits = dartx.codeUnits = Symbol("dartx.codeUnits");
const $runes = dartx.runes = Symbol("dartx.runes");
const $containsValue = dartx.containsValue = Symbol("dartx.containsValue");
const $update = dartx.update = Symbol("dartx.update");
const $updateAll = dartx.updateAll = Symbol("dartx.updateAll");
const $entries = dartx.entries = Symbol("dartx.entries");
const $addEntries = dartx.addEntries = Symbol("dartx.addEntries");
const $lengthInBytes = dartx.lengthInBytes = Symbol("dartx.lengthInBytes");
const $asUint8List = dartx.asUint8List = Symbol("dartx.asUint8List");
const $asInt8List = dartx.asInt8List = Symbol("dartx.asInt8List");
const $asUint8ClampedList = dartx.asUint8ClampedList = Symbol("dartx.asUint8ClampedList");
const $asUint16List = dartx.asUint16List = Symbol("dartx.asUint16List");
const $asInt16List = dartx.asInt16List = Symbol("dartx.asInt16List");
const $asUint32List = dartx.asUint32List = Symbol("dartx.asUint32List");
const $asInt32List = dartx.asInt32List = Symbol("dartx.asInt32List");
const $asUint64List = dartx.asUint64List = Symbol("dartx.asUint64List");
const $asInt64List = dartx.asInt64List = Symbol("dartx.asInt64List");
const $asInt32x4List = dartx.asInt32x4List = Symbol("dartx.asInt32x4List");
const $asFloat32List = dartx.asFloat32List = Symbol("dartx.asFloat32List");
const $asFloat64List = dartx.asFloat64List = Symbol("dartx.asFloat64List");
const $asFloat32x4List = dartx.asFloat32x4List = Symbol("dartx.asFloat32x4List");
const $asFloat64x2List = dartx.asFloat64x2List = Symbol("dartx.asFloat64x2List");
const $asByteData = dartx.asByteData = Symbol("dartx.asByteData");
const $offsetInBytes = dartx.offsetInBytes = Symbol("dartx.offsetInBytes");
const $buffer = dartx.buffer = Symbol("dartx.buffer");
const $elementSizeInBytes = dartx.elementSizeInBytes = Symbol("dartx.elementSizeInBytes");
const $getFloat32 = dartx.getFloat32 = Symbol("dartx.getFloat32");
const $getFloat64 = dartx.getFloat64 = Symbol("dartx.getFloat64");
const $getInt16 = dartx.getInt16 = Symbol("dartx.getInt16");
const $getInt32 = dartx.getInt32 = Symbol("dartx.getInt32");
const $getInt64 = dartx.getInt64 = Symbol("dartx.getInt64");
const $getInt8 = dartx.getInt8 = Symbol("dartx.getInt8");
const $getUint16 = dartx.getUint16 = Symbol("dartx.getUint16");
const $getUint32 = dartx.getUint32 = Symbol("dartx.getUint32");
const $getUint64 = dartx.getUint64 = Symbol("dartx.getUint64");
const $getUint8 = dartx.getUint8 = Symbol("dartx.getUint8");
const $setFloat32 = dartx.setFloat32 = Symbol("dartx.setFloat32");
const $setFloat64 = dartx.setFloat64 = Symbol("dartx.setFloat64");
const $setInt16 = dartx.setInt16 = Symbol("dartx.setInt16");
const $setInt32 = dartx.setInt32 = Symbol("dartx.setInt32");
const $setInt64 = dartx.setInt64 = Symbol("dartx.setInt64");
const $setInt8 = dartx.setInt8 = Symbol("dartx.setInt8");
const $setUint16 = dartx.setUint16 = Symbol("dartx.setUint16");
const $setUint32 = dartx.setUint32 = Symbol("dartx.setUint32");
const $setUint64 = dartx.setUint64 = Symbol("dartx.setUint64");
const $setUint8 = dartx.setUint8 = Symbol("dartx.setUint8");
const $left = dartx.left = Symbol("dartx.left");
const $width = dartx.width = Symbol("dartx.width");
const $top = dartx.top = Symbol("dartx.top");
const $height = dartx.height = Symbol("dartx.height");
const $right = dartx.right = Symbol("dartx.right");
const $bottom = dartx.bottom = Symbol("dartx.bottom");
const $intersection = dartx.intersection = Symbol("dartx.intersection");
const $intersects = dartx.intersects = Symbol("dartx.intersects");
const $boundingBox = dartx.boundingBox = Symbol("dartx.boundingBox");
const $containsRectangle = dartx.containsRectangle = Symbol("dartx.containsRectangle");
const $containsPoint = dartx.containsPoint = Symbol("dartx.containsPoint");
const $topLeft = dartx.topLeft = Symbol("dartx.topLeft");
const $topRight = dartx.topRight = Symbol("dartx.topRight");
const $bottomRight = dartx.bottomRight = Symbol("dartx.bottomRight");
const $bottomLeft = dartx.bottomLeft = Symbol("dartx.bottomLeft");
const $delete = dartx.delete = Symbol("dartx.delete");
const $next = dartx.next = Symbol("dartx.next");
const $direction = dartx.direction = Symbol("dartx.direction");
const $key = dartx.key = Symbol("dartx.key");
const $primaryKey = dartx.primaryKey = Symbol("dartx.primaryKey");
const $source = dartx.source = Symbol("dartx.source");
const $advance = dartx.advance = Symbol("dartx.advance");
const $continuePrimaryKey = dartx.continuePrimaryKey = Symbol("dartx.continuePrimaryKey");
const $value = dartx.value = Symbol("dartx.value");
const $createObjectStore = dartx.createObjectStore = Symbol("dartx.createObjectStore");
const $transaction = dartx.transaction = Symbol("dartx.transaction");
const $transactionStore = dartx.transactionStore = Symbol("dartx.transactionStore");
const $transactionList = dartx.transactionList = Symbol("dartx.transactionList");
const $transactionStores = dartx.transactionStores = Symbol("dartx.transactionStores");
const $objectStoreNames = dartx.objectStoreNames = Symbol("dartx.objectStoreNames");
const $version = dartx.version = Symbol("dartx.version");
const $close = dartx.close = Symbol("dartx.close");
const $deleteObjectStore = dartx.deleteObjectStore = Symbol("dartx.deleteObjectStore");
const $onAbort = dartx.onAbort = Symbol("dartx.onAbort");
const $onClose = dartx.onClose = Symbol("dartx.onClose");
const $onError = dartx.onError = Symbol("dartx.onError");
const $onVersionChange = dartx.onVersionChange = Symbol("dartx.onVersionChange");
const $on = dartx.on = Symbol("dartx.on");
const $addEventListener = dartx.addEventListener = Symbol("dartx.addEventListener");
const $removeEventListener = dartx.removeEventListener = Symbol("dartx.removeEventListener");
const $dispatchEvent = dartx.dispatchEvent = Symbol("dartx.dispatchEvent");
const $open = dartx.open = Symbol("dartx.open");
const $onBlocked = dartx.onBlocked = Symbol("dartx.onBlocked");
const $onSuccess = dartx.onSuccess = Symbol("dartx.onSuccess");
const $deleteDatabase = dartx.deleteDatabase = Symbol("dartx.deleteDatabase");
const $supportsDatabaseNames = dartx.supportsDatabaseNames = Symbol("dartx.supportsDatabaseNames");
const $cmp = dartx.cmp = Symbol("dartx.cmp");
const $result = dartx.result = Symbol("dartx.result");
const $count = dartx.count = Symbol("dartx.count");
const $get = dartx.get = Symbol("dartx.get");
const $getKey = dartx.getKey = Symbol("dartx.getKey");
const $openCursor = dartx.openCursor = Symbol("dartx.openCursor");
const $openKeyCursor = dartx.openKeyCursor = Symbol("dartx.openKeyCursor");
const $keyPath = dartx.keyPath = Symbol("dartx.keyPath");
const $multiEntry = dartx.multiEntry = Symbol("dartx.multiEntry");
const $objectStore = dartx.objectStore = Symbol("dartx.objectStore");
const $unique = dartx.unique = Symbol("dartx.unique");
const $getAll = dartx.getAll = Symbol("dartx.getAll");
const $getAllKeys = dartx.getAllKeys = Symbol("dartx.getAllKeys");
const $lower = dartx.lower = Symbol("dartx.lower");
const $lowerOpen = dartx.lowerOpen = Symbol("dartx.lowerOpen");
const $upper = dartx.upper = Symbol("dartx.upper");
const $upperOpen = dartx.upperOpen = Symbol("dartx.upperOpen");
const $includes = dartx.includes = Symbol("dartx.includes");
const $put = dartx.put = Symbol("dartx.put");
const $getObject = dartx.getObject = Symbol("dartx.getObject");
const $createIndex = dartx.createIndex = Symbol("dartx.createIndex");
const $autoIncrement = dartx.autoIncrement = Symbol("dartx.autoIncrement");
const $indexNames = dartx.indexNames = Symbol("dartx.indexNames");
const $deleteIndex = dartx.deleteIndex = Symbol("dartx.deleteIndex");
const $index = dartx.index = Symbol("dartx.index");
const $type = dartx.type = Symbol("dartx.type");
const $observe = dartx.observe = Symbol("dartx.observe");
const $unobserve = dartx.unobserve = Symbol("dartx.unobserve");
const $database = dartx.database = Symbol("dartx.database");
const $records = dartx.records = Symbol("dartx.records");
const $onUpgradeNeeded = dartx.onUpgradeNeeded = Symbol("dartx.onUpgradeNeeded");
const $error = dartx.error = Symbol("dartx.error");
const $readyState = dartx.readyState = Symbol("dartx.readyState");
const $onComplete = dartx.onComplete = Symbol("dartx.onComplete");
const $completed = dartx.completed = Symbol("dartx.completed");
const $db = dartx.db = Symbol("dartx.db");
const $mode = dartx.mode = Symbol("dartx.mode");
const $abort = dartx.abort = Symbol("dartx.abort");
const $dataLoss = dartx.dataLoss = Symbol("dartx.dataLoss");
const $dataLossMessage = dartx.dataLossMessage = Symbol("dartx.dataLossMessage");
const $newVersion = dartx.newVersion = Symbol("dartx.newVersion");
const $oldVersion = dartx.oldVersion = Symbol("dartx.oldVersion");
const $target = dartx.target = Symbol("dartx.target");
const $currentTarget = dartx.currentTarget = Symbol("dartx.currentTarget");
const $matches = dartx.matches = Symbol("dartx.matches");
const $parent = dartx.parent = Symbol("dartx.parent");
const $matchingTarget = dartx.matchingTarget = Symbol("dartx.matchingTarget");
const $path = dartx.path = Symbol("dartx.path");
const $bubbles = dartx.bubbles = Symbol("dartx.bubbles");
const $cancelable = dartx.cancelable = Symbol("dartx.cancelable");
const $composed = dartx.composed = Symbol("dartx.composed");
const $defaultPrevented = dartx.defaultPrevented = Symbol("dartx.defaultPrevented");
const $eventPhase = dartx.eventPhase = Symbol("dartx.eventPhase");
const $isTrusted = dartx.isTrusted = Symbol("dartx.isTrusted");
const $timeStamp = dartx.timeStamp = Symbol("dartx.timeStamp");
const $composedPath = dartx.composedPath = Symbol("dartx.composedPath");
const $preventDefault = dartx.preventDefault = Symbol("dartx.preventDefault");
const $stopImmediatePropagation = dartx.stopImmediatePropagation = Symbol("dartx.stopImmediatePropagation");
const $stopPropagation = dartx.stopPropagation = Symbol("dartx.stopPropagation");
const $nonce = dartx.nonce = Symbol("dartx.nonce");
const $createFragment = dartx.createFragment = Symbol("dartx.createFragment");
const $nodes = dartx.nodes = Symbol("dartx.nodes");
const $attributes = dartx.attributes = Symbol("dartx.attributes");
const $getAttribute = dartx.getAttribute = Symbol("dartx.getAttribute");
const $getAttributeNS = dartx.getAttributeNS = Symbol("dartx.getAttributeNS");
const $hasAttribute = dartx.hasAttribute = Symbol("dartx.hasAttribute");
const $hasAttributeNS = dartx.hasAttributeNS = Symbol("dartx.hasAttributeNS");
const $removeAttribute = dartx.removeAttribute = Symbol("dartx.removeAttribute");
const $removeAttributeNS = dartx.removeAttributeNS = Symbol("dartx.removeAttributeNS");
const $setAttribute = dartx.setAttribute = Symbol("dartx.setAttribute");
const $setAttributeNS = dartx.setAttributeNS = Symbol("dartx.setAttributeNS");
const $children = dartx.children = Symbol("dartx.children");
const $querySelectorAll = dartx.querySelectorAll = Symbol("dartx.querySelectorAll");
const $setApplyScroll = dartx.setApplyScroll = Symbol("dartx.setApplyScroll");
const $setDistributeScroll = dartx.setDistributeScroll = Symbol("dartx.setDistributeScroll");
const $classes = dartx.classes = Symbol("dartx.classes");
const $dataset = dartx.dataset = Symbol("dartx.dataset");
const $getNamespacedAttributes = dartx.getNamespacedAttributes = Symbol("dartx.getNamespacedAttributes");
const $getComputedStyle = dartx.getComputedStyle = Symbol("dartx.getComputedStyle");
const $client = dartx.client = Symbol("dartx.client");
const $offsetLeft = dartx.offsetLeft = Symbol("dartx.offsetLeft");
const $offsetTop = dartx.offsetTop = Symbol("dartx.offsetTop");
const $offsetWidth = dartx.offsetWidth = Symbol("dartx.offsetWidth");
const $offsetHeight = dartx.offsetHeight = Symbol("dartx.offsetHeight");
const $offset = dartx.offset = Symbol("dartx.offset");
const $append = dartx.append = Symbol("dartx.append");
const $appendText = dartx.appendText = Symbol("dartx.appendText");
const $insertAdjacentHtml = dartx.insertAdjacentHtml = Symbol("dartx.insertAdjacentHtml");
const $appendHtml = dartx.appendHtml = Symbol("dartx.appendHtml");
const $enteredView = dartx.enteredView = Symbol("dartx.enteredView");
const $attached = dartx.attached = Symbol("dartx.attached");
const $leftView = dartx.leftView = Symbol("dartx.leftView");
const $detached = dartx.detached = Symbol("dartx.detached");
const $getClientRects = dartx.getClientRects = Symbol("dartx.getClientRects");
const $animate = dartx.animate = Symbol("dartx.animate");
const $attributeChanged = dartx.attributeChanged = Symbol("dartx.attributeChanged");
const $localName = dartx.localName = Symbol("dartx.localName");
const $namespaceUri = dartx.namespaceUri = Symbol("dartx.namespaceUri");
const $scrollIntoView = dartx.scrollIntoView = Symbol("dartx.scrollIntoView");
const $insertAdjacentText = dartx.insertAdjacentText = Symbol("dartx.insertAdjacentText");
const $insertAdjacentElement = dartx.insertAdjacentElement = Symbol("dartx.insertAdjacentElement");
const $nextNode = dartx.nextNode = Symbol("dartx.nextNode");
const $matchesWithAncestors = dartx.matchesWithAncestors = Symbol("dartx.matchesWithAncestors");
const $createShadowRoot = dartx.createShadowRoot = Symbol("dartx.createShadowRoot");
const $shadowRoot = dartx.shadowRoot = Symbol("dartx.shadowRoot");
const $contentEdge = dartx.contentEdge = Symbol("dartx.contentEdge");
const $paddingEdge = dartx.paddingEdge = Symbol("dartx.paddingEdge");
const $borderEdge = dartx.borderEdge = Symbol("dartx.borderEdge");
const $marginEdge = dartx.marginEdge = Symbol("dartx.marginEdge");
const $offsetTo = dartx.offsetTo = Symbol("dartx.offsetTo");
const $documentOffset = dartx.documentOffset = Symbol("dartx.documentOffset");
const $createHtmlDocument = dartx.createHtmlDocument = Symbol("dartx.createHtmlDocument");
const $createElement = dartx.createElement = Symbol("dartx.createElement");
const $baseUri = dartx.baseUri = Symbol("dartx.baseUri");
const $head = dartx.head = Symbol("dartx.head");
const $setInnerHtml = dartx.setInnerHtml = Symbol("dartx.setInnerHtml");
const $innerHtml = dartx.innerHtml = Symbol("dartx.innerHtml");
const $text = dartx.text = Symbol("dartx.text");
const $offsetParent = dartx.offsetParent = Symbol("dartx.offsetParent");
const $scrollHeight = dartx.scrollHeight = Symbol("dartx.scrollHeight");
const $scrollLeft = dartx.scrollLeft = Symbol("dartx.scrollLeft");
const $scrollTop = dartx.scrollTop = Symbol("dartx.scrollTop");
const $scrollWidth = dartx.scrollWidth = Symbol("dartx.scrollWidth");
const $contentEditable = dartx.contentEditable = Symbol("dartx.contentEditable");
const $dir = dartx.dir = Symbol("dartx.dir");
const $draggable = dartx.draggable = Symbol("dartx.draggable");
const $hidden = dartx.hidden = Symbol("dartx.hidden");
const $inert = dartx.inert = Symbol("dartx.inert");
const $inputMode = dartx.inputMode = Symbol("dartx.inputMode");
const $isContentEditable = dartx.isContentEditable = Symbol("dartx.isContentEditable");
const $lang = dartx.lang = Symbol("dartx.lang");
const $spellcheck = dartx.spellcheck = Symbol("dartx.spellcheck");
const $style = dartx.style = Symbol("dartx.style");
const $tabIndex = dartx.tabIndex = Symbol("dartx.tabIndex");
const $title = dartx.title = Symbol("dartx.title");
const $translate = dartx.translate = Symbol("dartx.translate");
const $blur = dartx.blur = Symbol("dartx.blur");
const $click = dartx.click = Symbol("dartx.click");
const $focus = dartx.focus = Symbol("dartx.focus");
const $accessibleNode = dartx.accessibleNode = Symbol("dartx.accessibleNode");
const $assignedSlot = dartx.assignedSlot = Symbol("dartx.assignedSlot");
const $className = dartx.className = Symbol("dartx.className");
const $clientHeight = dartx.clientHeight = Symbol("dartx.clientHeight");
const $clientLeft = dartx.clientLeft = Symbol("dartx.clientLeft");
const $clientTop = dartx.clientTop = Symbol("dartx.clientTop");
const $clientWidth = dartx.clientWidth = Symbol("dartx.clientWidth");
const $computedName = dartx.computedName = Symbol("dartx.computedName");
const $computedRole = dartx.computedRole = Symbol("dartx.computedRole");
const $id = dartx.id = Symbol("dartx.id");
const $innerText = dartx.innerText = Symbol("dartx.innerText");
const $outerHtml = dartx.outerHtml = Symbol("dartx.outerHtml");
const $slot = dartx.slot = Symbol("dartx.slot");
const $styleMap = dartx.styleMap = Symbol("dartx.styleMap");
const $tagName = dartx.tagName = Symbol("dartx.tagName");
const $attachShadow = dartx.attachShadow = Symbol("dartx.attachShadow");
const $closest = dartx.closest = Symbol("dartx.closest");
const $getAnimations = dartx.getAnimations = Symbol("dartx.getAnimations");
const $getAttributeNames = dartx.getAttributeNames = Symbol("dartx.getAttributeNames");
const $getBoundingClientRect = dartx.getBoundingClientRect = Symbol("dartx.getBoundingClientRect");
const $getDestinationInsertionPoints = dartx.getDestinationInsertionPoints = Symbol("dartx.getDestinationInsertionPoints");
const $getElementsByClassName = dartx.getElementsByClassName = Symbol("dartx.getElementsByClassName");
const $hasPointerCapture = dartx.hasPointerCapture = Symbol("dartx.hasPointerCapture");
const $releasePointerCapture = dartx.releasePointerCapture = Symbol("dartx.releasePointerCapture");
const $requestPointerLock = dartx.requestPointerLock = Symbol("dartx.requestPointerLock");
const $scroll = dartx.scroll = Symbol("dartx.scroll");
const $scrollBy = dartx.scrollBy = Symbol("dartx.scrollBy");
const $scrollTo = dartx.scrollTo = Symbol("dartx.scrollTo");
const $setPointerCapture = dartx.setPointerCapture = Symbol("dartx.setPointerCapture");
const $requestFullscreen = dartx.requestFullscreen = Symbol("dartx.requestFullscreen");
const $after = dartx.after = Symbol("dartx.after");
const $before = dartx.before = Symbol("dartx.before");
const $nextElementSibling = dartx.nextElementSibling = Symbol("dartx.nextElementSibling");
const $previousElementSibling = dartx.previousElementSibling = Symbol("dartx.previousElementSibling");
const $querySelector = dartx.querySelector = Symbol("dartx.querySelector");
const $onBeforeCopy = dartx.onBeforeCopy = Symbol("dartx.onBeforeCopy");
const $onBeforeCut = dartx.onBeforeCut = Symbol("dartx.onBeforeCut");
const $onBeforePaste = dartx.onBeforePaste = Symbol("dartx.onBeforePaste");
const $onBlur = dartx.onBlur = Symbol("dartx.onBlur");
const $onCanPlay = dartx.onCanPlay = Symbol("dartx.onCanPlay");
const $onCanPlayThrough = dartx.onCanPlayThrough = Symbol("dartx.onCanPlayThrough");
const $onChange = dartx.onChange = Symbol("dartx.onChange");
const $onClick = dartx.onClick = Symbol("dartx.onClick");
const $onContextMenu = dartx.onContextMenu = Symbol("dartx.onContextMenu");
const $onCopy = dartx.onCopy = Symbol("dartx.onCopy");
const $onCut = dartx.onCut = Symbol("dartx.onCut");
const $onDoubleClick = dartx.onDoubleClick = Symbol("dartx.onDoubleClick");
const $onDrag = dartx.onDrag = Symbol("dartx.onDrag");
const $onDragEnd = dartx.onDragEnd = Symbol("dartx.onDragEnd");
const $onDragEnter = dartx.onDragEnter = Symbol("dartx.onDragEnter");
const $onDragLeave = dartx.onDragLeave = Symbol("dartx.onDragLeave");
const $onDragOver = dartx.onDragOver = Symbol("dartx.onDragOver");
const $onDragStart = dartx.onDragStart = Symbol("dartx.onDragStart");
const $onDrop = dartx.onDrop = Symbol("dartx.onDrop");
const $onDurationChange = dartx.onDurationChange = Symbol("dartx.onDurationChange");
const $onEmptied = dartx.onEmptied = Symbol("dartx.onEmptied");
const $onEnded = dartx.onEnded = Symbol("dartx.onEnded");
const $onFocus = dartx.onFocus = Symbol("dartx.onFocus");
const $onInput = dartx.onInput = Symbol("dartx.onInput");
const $onInvalid = dartx.onInvalid = Symbol("dartx.onInvalid");
const $onKeyDown = dartx.onKeyDown = Symbol("dartx.onKeyDown");
const $onKeyPress = dartx.onKeyPress = Symbol("dartx.onKeyPress");
const $onKeyUp = dartx.onKeyUp = Symbol("dartx.onKeyUp");
const $onLoad = dartx.onLoad = Symbol("dartx.onLoad");
const $onLoadedData = dartx.onLoadedData = Symbol("dartx.onLoadedData");
const $onLoadedMetadata = dartx.onLoadedMetadata = Symbol("dartx.onLoadedMetadata");
const $onMouseDown = dartx.onMouseDown = Symbol("dartx.onMouseDown");
const $onMouseEnter = dartx.onMouseEnter = Symbol("dartx.onMouseEnter");
const $onMouseLeave = dartx.onMouseLeave = Symbol("dartx.onMouseLeave");
const $onMouseMove = dartx.onMouseMove = Symbol("dartx.onMouseMove");
const $onMouseOut = dartx.onMouseOut = Symbol("dartx.onMouseOut");
const $onMouseOver = dartx.onMouseOver = Symbol("dartx.onMouseOver");
const $onMouseUp = dartx.onMouseUp = Symbol("dartx.onMouseUp");
const $onMouseWheel = dartx.onMouseWheel = Symbol("dartx.onMouseWheel");
const $onPaste = dartx.onPaste = Symbol("dartx.onPaste");
const $onPause = dartx.onPause = Symbol("dartx.onPause");
const $onPlay = dartx.onPlay = Symbol("dartx.onPlay");
const $onPlaying = dartx.onPlaying = Symbol("dartx.onPlaying");
const $onRateChange = dartx.onRateChange = Symbol("dartx.onRateChange");
const $onReset = dartx.onReset = Symbol("dartx.onReset");
const $onResize = dartx.onResize = Symbol("dartx.onResize");
const $onScroll = dartx.onScroll = Symbol("dartx.onScroll");
const $onSearch = dartx.onSearch = Symbol("dartx.onSearch");
const $onSeeked = dartx.onSeeked = Symbol("dartx.onSeeked");
const $onSeeking = dartx.onSeeking = Symbol("dartx.onSeeking");
const $onSelect = dartx.onSelect = Symbol("dartx.onSelect");
const $onSelectStart = dartx.onSelectStart = Symbol("dartx.onSelectStart");
const $onStalled = dartx.onStalled = Symbol("dartx.onStalled");
const $onSubmit = dartx.onSubmit = Symbol("dartx.onSubmit");
const $onSuspend = dartx.onSuspend = Symbol("dartx.onSuspend");
const $onTimeUpdate = dartx.onTimeUpdate = Symbol("dartx.onTimeUpdate");
const $onTouchCancel = dartx.onTouchCancel = Symbol("dartx.onTouchCancel");
const $onTouchEnd = dartx.onTouchEnd = Symbol("dartx.onTouchEnd");
const $onTouchEnter = dartx.onTouchEnter = Symbol("dartx.onTouchEnter");
const $onTouchLeave = dartx.onTouchLeave = Symbol("dartx.onTouchLeave");
const $onTouchMove = dartx.onTouchMove = Symbol("dartx.onTouchMove");
const $onTouchStart = dartx.onTouchStart = Symbol("dartx.onTouchStart");
const $onTransitionEnd = dartx.onTransitionEnd = Symbol("dartx.onTransitionEnd");
const $onVolumeChange = dartx.onVolumeChange = Symbol("dartx.onVolumeChange");
const $onWaiting = dartx.onWaiting = Symbol("dartx.onWaiting");
const $onFullscreenChange = dartx.onFullscreenChange = Symbol("dartx.onFullscreenChange");
const $onFullscreenError = dartx.onFullscreenError = Symbol("dartx.onFullscreenError");
const $onWheel = dartx.onWheel = Symbol("dartx.onWheel");
const $replaceWith = dartx.replaceWith = Symbol("dartx.replaceWith");
const $insertAllBefore = dartx.insertAllBefore = Symbol("dartx.insertAllBefore");
const $childNodes = dartx.childNodes = Symbol("dartx.childNodes");
const $firstChild = dartx.firstChild = Symbol("dartx.firstChild");
const $isConnected = dartx.isConnected = Symbol("dartx.isConnected");
const $lastChild = dartx.lastChild = Symbol("dartx.lastChild");
const $nodeName = dartx.nodeName = Symbol("dartx.nodeName");
const $nodeType = dartx.nodeType = Symbol("dartx.nodeType");
const $nodeValue = dartx.nodeValue = Symbol("dartx.nodeValue");
const $ownerDocument = dartx.ownerDocument = Symbol("dartx.ownerDocument");
const $parentNode = dartx.parentNode = Symbol("dartx.parentNode");
const $previousNode = dartx.previousNode = Symbol("dartx.previousNode");
const $clone = dartx.clone = Symbol("dartx.clone");
const $getRootNode = dartx.getRootNode = Symbol("dartx.getRootNode");
const $hasChildNodes = dartx.hasChildNodes = Symbol("dartx.hasChildNodes");
const $insertBefore = dartx.insertBefore = Symbol("dartx.insertBefore");
const $respondWith = dartx.respondWith = Symbol("dartx.respondWith");
const $waitUntil = dartx.waitUntil = Symbol("dartx.waitUntil");
const $quaternion = dartx.quaternion = Symbol("dartx.quaternion");
const $populateMatrix = dartx.populateMatrix = Symbol("dartx.populateMatrix");
const $activated = dartx.activated = Symbol("dartx.activated");
const $hasReading = dartx.hasReading = Symbol("dartx.hasReading");
const $timestamp = dartx.timestamp = Symbol("dartx.timestamp");
const $start = dartx.start = Symbol("dartx.start");
const $stop = dartx.stop = Symbol("dartx.stop");
const $x = dartx.x = Symbol("dartx.x");
const $y = dartx.y = Symbol("dartx.y");
const $z = dartx.z = Symbol("dartx.z");
const $activeDescendant = dartx.activeDescendant = Symbol("dartx.activeDescendant");
const $atomic = dartx.atomic = Symbol("dartx.atomic");
const $autocomplete = dartx.autocomplete = Symbol("dartx.autocomplete");
const $busy = dartx.busy = Symbol("dartx.busy");
const $checked = dartx.checked = Symbol("dartx.checked");
const $colCount = dartx.colCount = Symbol("dartx.colCount");
const $colIndex = dartx.colIndex = Symbol("dartx.colIndex");
const $colSpan = dartx.colSpan = Symbol("dartx.colSpan");
const $controls = dartx.controls = Symbol("dartx.controls");
const $current = dartx.current = Symbol("dartx.current");
const $describedBy = dartx.describedBy = Symbol("dartx.describedBy");
const $details = dartx.details = Symbol("dartx.details");
const $disabled = dartx.disabled = Symbol("dartx.disabled");
const $errorMessage = dartx.errorMessage = Symbol("dartx.errorMessage");
const $expanded = dartx.expanded = Symbol("dartx.expanded");
const $flowTo = dartx.flowTo = Symbol("dartx.flowTo");
const $hasPopUp = dartx.hasPopUp = Symbol("dartx.hasPopUp");
const $invalid = dartx.invalid = Symbol("dartx.invalid");
const $keyShortcuts = dartx.keyShortcuts = Symbol("dartx.keyShortcuts");
const $label = dartx.label = Symbol("dartx.label");
const $labeledBy = dartx.labeledBy = Symbol("dartx.labeledBy");
const $level = dartx.level = Symbol("dartx.level");
const $live = dartx.live = Symbol("dartx.live");
const $modal = dartx.modal = Symbol("dartx.modal");
const $multiline = dartx.multiline = Symbol("dartx.multiline");
const $multiselectable = dartx.multiselectable = Symbol("dartx.multiselectable");
const $orientation = dartx.orientation = Symbol("dartx.orientation");
const $owns = dartx.owns = Symbol("dartx.owns");
const $placeholder = dartx.placeholder = Symbol("dartx.placeholder");
const $posInSet = dartx.posInSet = Symbol("dartx.posInSet");
const $pressed = dartx.pressed = Symbol("dartx.pressed");
const $readOnly = dartx.readOnly = Symbol("dartx.readOnly");
const $relevant = dartx.relevant = Symbol("dartx.relevant");
const $required = dartx.required = Symbol("dartx.required");
const $role = dartx.role = Symbol("dartx.role");
const $roleDescription = dartx.roleDescription = Symbol("dartx.roleDescription");
const $rowCount = dartx.rowCount = Symbol("dartx.rowCount");
const $rowIndex = dartx.rowIndex = Symbol("dartx.rowIndex");
const $rowSpan = dartx.rowSpan = Symbol("dartx.rowSpan");
const $selected = dartx.selected = Symbol("dartx.selected");
const $setSize = dartx.setSize = Symbol("dartx.setSize");
const $valueMax = dartx.valueMax = Symbol("dartx.valueMax");
const $valueMin = dartx.valueMin = Symbol("dartx.valueMin");
const $valueNow = dartx.valueNow = Symbol("dartx.valueNow");
const $valueText = dartx.valueText = Symbol("dartx.valueText");
const $appendChild = dartx.appendChild = Symbol("dartx.appendChild");
const $onAccessibleClick = dartx.onAccessibleClick = Symbol("dartx.onAccessibleClick");
const $onAccessibleContextMenu = dartx.onAccessibleContextMenu = Symbol("dartx.onAccessibleContextMenu");
const $onAccessibleDecrement = dartx.onAccessibleDecrement = Symbol("dartx.onAccessibleDecrement");
const $onAccessibleFocus = dartx.onAccessibleFocus = Symbol("dartx.onAccessibleFocus");
const $onAccessibleIncrement = dartx.onAccessibleIncrement = Symbol("dartx.onAccessibleIncrement");
const $onAccessibleScrollIntoView = dartx.onAccessibleScrollIntoView = Symbol("dartx.onAccessibleScrollIntoView");
const $item = dartx.item = Symbol("dartx.item");
const $illuminance = dartx.illuminance = Symbol("dartx.illuminance");
const $download = dartx.download = Symbol("dartx.download");
const $hreflang = dartx.hreflang = Symbol("dartx.hreflang");
const $referrerPolicy = dartx.referrerPolicy = Symbol("dartx.referrerPolicy");
const $rel = dartx.rel = Symbol("dartx.rel");
const $hash = dartx.hash = Symbol("dartx.hash");
const $host = dartx.host = Symbol("dartx.host");
const $hostname = dartx.hostname = Symbol("dartx.hostname");
const $href = dartx.href = Symbol("dartx.href");
const $origin = dartx.origin = Symbol("dartx.origin");
const $password = dartx.password = Symbol("dartx.password");
const $pathname = dartx.pathname = Symbol("dartx.pathname");
const $port = dartx.port = Symbol("dartx.port");
const $protocol = dartx.protocol = Symbol("dartx.protocol");
const $search = dartx.search = Symbol("dartx.search");
const $username = dartx.username = Symbol("dartx.username");
const $currentTime = dartx.currentTime = Symbol("dartx.currentTime");
const $effect = dartx.effect = Symbol("dartx.effect");
const $finished = dartx.finished = Symbol("dartx.finished");
const $playState = dartx.playState = Symbol("dartx.playState");
const $playbackRate = dartx.playbackRate = Symbol("dartx.playbackRate");
const $ready = dartx.ready = Symbol("dartx.ready");
const $startTime = dartx.startTime = Symbol("dartx.startTime");
const $timeline = dartx.timeline = Symbol("dartx.timeline");
const $cancel = dartx.cancel = Symbol("dartx.cancel");
const $finish = dartx.finish = Symbol("dartx.finish");
const $pause = dartx.pause = Symbol("dartx.pause");
const $play = dartx.play = Symbol("dartx.play");
const $reverse = dartx.reverse = Symbol("dartx.reverse");
const $onCancel = dartx.onCancel = Symbol("dartx.onCancel");
const $onFinish = dartx.onFinish = Symbol("dartx.onFinish");
const $timing = dartx.timing = Symbol("dartx.timing");
const $getComputedTiming = dartx.getComputedTiming = Symbol("dartx.getComputedTiming");
const $delay = dartx.delay = Symbol("dartx.delay");
const $duration = dartx.duration = Symbol("dartx.duration");
const $easing = dartx.easing = Symbol("dartx.easing");
const $endDelay = dartx.endDelay = Symbol("dartx.endDelay");
const $fill = dartx.fill = Symbol("dartx.fill");
const $iterationStart = dartx.iterationStart = Symbol("dartx.iterationStart");
const $iterations = dartx.iterations = Symbol("dartx.iterations");
const $animationName = dartx.animationName = Symbol("dartx.animationName");
const $elapsedTime = dartx.elapsedTime = Symbol("dartx.elapsedTime");
const $timelineTime = dartx.timelineTime = Symbol("dartx.timelineTime");
const $registerAnimator = dartx.registerAnimator = Symbol("dartx.registerAnimator");
const $status = dartx.status = Symbol("dartx.status");
const $swapCache = dartx.swapCache = Symbol("dartx.swapCache");
const $onCached = dartx.onCached = Symbol("dartx.onCached");
const $onChecking = dartx.onChecking = Symbol("dartx.onChecking");
const $onDownloading = dartx.onDownloading = Symbol("dartx.onDownloading");
const $onNoUpdate = dartx.onNoUpdate = Symbol("dartx.onNoUpdate");
const $onObsolete = dartx.onObsolete = Symbol("dartx.onObsolete");
const $onProgress = dartx.onProgress = Symbol("dartx.onProgress");
const $onUpdateReady = dartx.onUpdateReady = Symbol("dartx.onUpdateReady");
const $reason = dartx.reason = Symbol("dartx.reason");
const $url = dartx.url = Symbol("dartx.url");
const $alt = dartx.alt = Symbol("dartx.alt");
const $coords = dartx.coords = Symbol("dartx.coords");
const $shape = dartx.shape = Symbol("dartx.shape");
const $audioTracks = dartx.audioTracks = Symbol("dartx.audioTracks");
const $autoplay = dartx.autoplay = Symbol("dartx.autoplay");
const $buffered = dartx.buffered = Symbol("dartx.buffered");
const $controlsList = dartx.controlsList = Symbol("dartx.controlsList");
const $crossOrigin = dartx.crossOrigin = Symbol("dartx.crossOrigin");
const $currentSrc = dartx.currentSrc = Symbol("dartx.currentSrc");
const $defaultMuted = dartx.defaultMuted = Symbol("dartx.defaultMuted");
const $defaultPlaybackRate = dartx.defaultPlaybackRate = Symbol("dartx.defaultPlaybackRate");
const $disableRemotePlayback = dartx.disableRemotePlayback = Symbol("dartx.disableRemotePlayback");
const $ended = dartx.ended = Symbol("dartx.ended");
const $loop = dartx.loop = Symbol("dartx.loop");
const $mediaKeys = dartx.mediaKeys = Symbol("dartx.mediaKeys");
const $muted = dartx.muted = Symbol("dartx.muted");
const $networkState = dartx.networkState = Symbol("dartx.networkState");
const $paused = dartx.paused = Symbol("dartx.paused");
const $played = dartx.played = Symbol("dartx.played");
const $preload = dartx.preload = Symbol("dartx.preload");
const $remote = dartx.remote = Symbol("dartx.remote");
const $seekable = dartx.seekable = Symbol("dartx.seekable");
const $seeking = dartx.seeking = Symbol("dartx.seeking");
const $sinkId = dartx.sinkId = Symbol("dartx.sinkId");
const $src = dartx.src = Symbol("dartx.src");
const $srcObject = dartx.srcObject = Symbol("dartx.srcObject");
const $textTracks = dartx.textTracks = Symbol("dartx.textTracks");
const $videoTracks = dartx.videoTracks = Symbol("dartx.videoTracks");
const $volume = dartx.volume = Symbol("dartx.volume");
const $audioDecodedByteCount = dartx.audioDecodedByteCount = Symbol("dartx.audioDecodedByteCount");
const $videoDecodedByteCount = dartx.videoDecodedByteCount = Symbol("dartx.videoDecodedByteCount");
const $addTextTrack = dartx.addTextTrack = Symbol("dartx.addTextTrack");
const $canPlayType = dartx.canPlayType = Symbol("dartx.canPlayType");
const $captureStream = dartx.captureStream = Symbol("dartx.captureStream");
const $load = dartx.load = Symbol("dartx.load");
const $setMediaKeys = dartx.setMediaKeys = Symbol("dartx.setMediaKeys");
const $setSinkId = dartx.setSinkId = Symbol("dartx.setSinkId");
const $authenticatorData = dartx.authenticatorData = Symbol("dartx.authenticatorData");
const $signature = dartx.signature = Symbol("dartx.signature");
const $clientDataJson = dartx.clientDataJson = Symbol("dartx.clientDataJson");
const $attestationObject = dartx.attestationObject = Symbol("dartx.attestationObject");
const $state = dartx.state = Symbol("dartx.state");
const $fetches = dartx.fetches = Symbol("dartx.fetches");
const $request = dartx.request = Symbol("dartx.request");
const $fetch = dartx.fetch = Symbol("dartx.fetch");
const $getIds = dartx.getIds = Symbol("dartx.getIds");
const $downloadTotal = dartx.downloadTotal = Symbol("dartx.downloadTotal");
const $downloaded = dartx.downloaded = Symbol("dartx.downloaded");
const $totalDownloadSize = dartx.totalDownloadSize = Symbol("dartx.totalDownloadSize");
const $uploadTotal = dartx.uploadTotal = Symbol("dartx.uploadTotal");
const $uploaded = dartx.uploaded = Symbol("dartx.uploaded");
const $response = dartx.response = Symbol("dartx.response");
const $updateUI = dartx.updateUI = Symbol("dartx.updateUI");
const $visible = dartx.visible = Symbol("dartx.visible");
const $detect = dartx.detect = Symbol("dartx.detect");
const $charging = dartx.charging = Symbol("dartx.charging");
const $chargingTime = dartx.chargingTime = Symbol("dartx.chargingTime");
const $dischargingTime = dartx.dischargingTime = Symbol("dartx.dischargingTime");
const $platforms = dartx.platforms = Symbol("dartx.platforms");
const $userChoice = dartx.userChoice = Symbol("dartx.userChoice");
const $prompt = dartx.prompt = Symbol("dartx.prompt");
const $returnValue = dartx.returnValue = Symbol("dartx.returnValue");
const $size = dartx.size = Symbol("dartx.size");
const $slice = dartx.slice = Symbol("dartx.slice");
const $data = dartx.data = Symbol("dartx.data");
const $timecode = dartx.timecode = Symbol("dartx.timecode");
const $characteristic = dartx.characteristic = Symbol("dartx.characteristic");
const $uuid = dartx.uuid = Symbol("dartx.uuid");
const $readValue = dartx.readValue = Symbol("dartx.readValue");
const $writeValue = dartx.writeValue = Symbol("dartx.writeValue");
const $bodyUsed = dartx.bodyUsed = Symbol("dartx.bodyUsed");
const $arrayBuffer = dartx.arrayBuffer = Symbol("dartx.arrayBuffer");
const $blob = dartx.blob = Symbol("dartx.blob");
const $formData = dartx.formData = Symbol("dartx.formData");
const $json = dartx.json = Symbol("dartx.json");
const $onHashChange = dartx.onHashChange = Symbol("dartx.onHashChange");
const $onMessage = dartx.onMessage = Symbol("dartx.onMessage");
const $onOffline = dartx.onOffline = Symbol("dartx.onOffline");
const $onOnline = dartx.onOnline = Symbol("dartx.onOnline");
const $onPopState = dartx.onPopState = Symbol("dartx.onPopState");
const $onStorage = dartx.onStorage = Symbol("dartx.onStorage");
const $onUnload = dartx.onUnload = Symbol("dartx.onUnload");
const $postMessage = dartx.postMessage = Symbol("dartx.postMessage");
const $budgetAt = dartx.budgetAt = Symbol("dartx.budgetAt");
const $time = dartx.time = Symbol("dartx.time");
const $autofocus = dartx.autofocus = Symbol("dartx.autofocus");
const $form = dartx.form = Symbol("dartx.form");
const $formAction = dartx.formAction = Symbol("dartx.formAction");
const $formEnctype = dartx.formEnctype = Symbol("dartx.formEnctype");
const $formMethod = dartx.formMethod = Symbol("dartx.formMethod");
const $formNoValidate = dartx.formNoValidate = Symbol("dartx.formNoValidate");
const $formTarget = dartx.formTarget = Symbol("dartx.formTarget");
const $labels = dartx.labels = Symbol("dartx.labels");
const $validationMessage = dartx.validationMessage = Symbol("dartx.validationMessage");
const $validity = dartx.validity = Symbol("dartx.validity");
const $willValidate = dartx.willValidate = Symbol("dartx.willValidate");
const $checkValidity = dartx.checkValidity = Symbol("dartx.checkValidity");
const $reportValidity = dartx.reportValidity = Symbol("dartx.reportValidity");
const $setCustomValidity = dartx.setCustomValidity = Symbol("dartx.setCustomValidity");
const $wholeText = dartx.wholeText = Symbol("dartx.wholeText");
const $splitText = dartx.splitText = Symbol("dartx.splitText");
const $appendData = dartx.appendData = Symbol("dartx.appendData");
const $deleteData = dartx.deleteData = Symbol("dartx.deleteData");
const $insertData = dartx.insertData = Symbol("dartx.insertData");
const $replaceData = dartx.replaceData = Symbol("dartx.replaceData");
const $substringData = dartx.substringData = Symbol("dartx.substringData");
const $has = dartx.has = Symbol("dartx.has");
const $match = dartx.match = Symbol("dartx.match");
const $methodData = dartx.methodData = Symbol("dartx.methodData");
const $modifiers = dartx.modifiers = Symbol("dartx.modifiers");
const $paymentRequestOrigin = dartx.paymentRequestOrigin = Symbol("dartx.paymentRequestOrigin");
const $topLevelOrigin = dartx.topLevelOrigin = Symbol("dartx.topLevelOrigin");
const $canvas = dartx.canvas = Symbol("dartx.canvas");
const $requestFrame = dartx.requestFrame = Symbol("dartx.requestFrame");
const $contentHint = dartx.contentHint = Symbol("dartx.contentHint");
const $enabled = dartx.enabled = Symbol("dartx.enabled");
const $kind = dartx.kind = Symbol("dartx.kind");
const $applyConstraints = dartx.applyConstraints = Symbol("dartx.applyConstraints");
const $getCapabilities = dartx.getCapabilities = Symbol("dartx.getCapabilities");
const $getConstraints = dartx.getConstraints = Symbol("dartx.getConstraints");
const $getSettings = dartx.getSettings = Symbol("dartx.getSettings");
const $onMute = dartx.onMute = Symbol("dartx.onMute");
const $onUnmute = dartx.onUnmute = Symbol("dartx.onUnmute");
const $getContext = dartx.getContext = Symbol("dartx.getContext");
const $transferControlToOffscreen = dartx.transferControlToOffscreen = Symbol("dartx.transferControlToOffscreen");
const $onWebGlContextLost = dartx.onWebGlContextLost = Symbol("dartx.onWebGlContextLost");
const $onWebGlContextRestored = dartx.onWebGlContextRestored = Symbol("dartx.onWebGlContextRestored");
const $context2D = dartx.context2D = Symbol("dartx.context2D");
const $getContext3d = dartx.getContext3d = Symbol("dartx.getContext3d");
const $toDataUrl = dartx.toDataUrl = Symbol("dartx.toDataUrl");
const $toBlob = dartx.toBlob = Symbol("dartx.toBlob");
const $addColorStop = dartx.addColorStop = Symbol("dartx.addColorStop");
const $setTransform = dartx.setTransform = Symbol("dartx.setTransform");
const $currentTransform = dartx.currentTransform = Symbol("dartx.currentTransform");
const $fillStyle = dartx.fillStyle = Symbol("dartx.fillStyle");
const $filter = dartx.filter = Symbol("dartx.filter");
const $font = dartx.font = Symbol("dartx.font");
const $globalAlpha = dartx.globalAlpha = Symbol("dartx.globalAlpha");
const $globalCompositeOperation = dartx.globalCompositeOperation = Symbol("dartx.globalCompositeOperation");
const $imageSmoothingEnabled = dartx.imageSmoothingEnabled = Symbol("dartx.imageSmoothingEnabled");
const $imageSmoothingQuality = dartx.imageSmoothingQuality = Symbol("dartx.imageSmoothingQuality");
const $lineCap = dartx.lineCap = Symbol("dartx.lineCap");
const $lineJoin = dartx.lineJoin = Symbol("dartx.lineJoin");
const $lineWidth = dartx.lineWidth = Symbol("dartx.lineWidth");
const $miterLimit = dartx.miterLimit = Symbol("dartx.miterLimit");
const $shadowBlur = dartx.shadowBlur = Symbol("dartx.shadowBlur");
const $shadowColor = dartx.shadowColor = Symbol("dartx.shadowColor");
const $shadowOffsetX = dartx.shadowOffsetX = Symbol("dartx.shadowOffsetX");
const $shadowOffsetY = dartx.shadowOffsetY = Symbol("dartx.shadowOffsetY");
const $strokeStyle = dartx.strokeStyle = Symbol("dartx.strokeStyle");
const $textAlign = dartx.textAlign = Symbol("dartx.textAlign");
const $textBaseline = dartx.textBaseline = Symbol("dartx.textBaseline");
const $addHitRegion = dartx.addHitRegion = Symbol("dartx.addHitRegion");
const $beginPath = dartx.beginPath = Symbol("dartx.beginPath");
const $clearHitRegions = dartx.clearHitRegions = Symbol("dartx.clearHitRegions");
const $clearRect = dartx.clearRect = Symbol("dartx.clearRect");
const $clip = dartx.clip = Symbol("dartx.clip");
const $createImageData = dartx.createImageData = Symbol("dartx.createImageData");
const $createLinearGradient = dartx.createLinearGradient = Symbol("dartx.createLinearGradient");
const $createPattern = dartx.createPattern = Symbol("dartx.createPattern");
const $createRadialGradient = dartx.createRadialGradient = Symbol("dartx.createRadialGradient");
const $drawFocusIfNeeded = dartx.drawFocusIfNeeded = Symbol("dartx.drawFocusIfNeeded");
const $fillRect = dartx.fillRect = Symbol("dartx.fillRect");
const $getContextAttributes = dartx.getContextAttributes = Symbol("dartx.getContextAttributes");
const $getImageData = dartx.getImageData = Symbol("dartx.getImageData");
const $isContextLost = dartx.isContextLost = Symbol("dartx.isContextLost");
const $isPointInPath = dartx.isPointInPath = Symbol("dartx.isPointInPath");
const $isPointInStroke = dartx.isPointInStroke = Symbol("dartx.isPointInStroke");
const $measureText = dartx.measureText = Symbol("dartx.measureText");
const $putImageData = dartx.putImageData = Symbol("dartx.putImageData");
const $removeHitRegion = dartx.removeHitRegion = Symbol("dartx.removeHitRegion");
const $resetTransform = dartx.resetTransform = Symbol("dartx.resetTransform");
const $restore = dartx.restore = Symbol("dartx.restore");
const $rotate = dartx.rotate = Symbol("dartx.rotate");
const $save = dartx.save = Symbol("dartx.save");
const $scale = dartx.scale = Symbol("dartx.scale");
const $scrollPathIntoView = dartx.scrollPathIntoView = Symbol("dartx.scrollPathIntoView");
const $stroke = dartx.stroke = Symbol("dartx.stroke");
const $strokeRect = dartx.strokeRect = Symbol("dartx.strokeRect");
const $strokeText = dartx.strokeText = Symbol("dartx.strokeText");
const $transform = dartx.transform = Symbol("dartx.transform");
const $arcTo = dartx.arcTo = Symbol("dartx.arcTo");
const $bezierCurveTo = dartx.bezierCurveTo = Symbol("dartx.bezierCurveTo");
const $closePath = dartx.closePath = Symbol("dartx.closePath");
const $ellipse = dartx.ellipse = Symbol("dartx.ellipse");
const $lineTo = dartx.lineTo = Symbol("dartx.lineTo");
const $moveTo = dartx.moveTo = Symbol("dartx.moveTo");
const $quadraticCurveTo = dartx.quadraticCurveTo = Symbol("dartx.quadraticCurveTo");
const $rect = dartx.rect = Symbol("dartx.rect");
const $createImageDataFromImageData = dartx.createImageDataFromImageData = Symbol("dartx.createImageDataFromImageData");
const $setFillColorRgb = dartx.setFillColorRgb = Symbol("dartx.setFillColorRgb");
const $setFillColorHsl = dartx.setFillColorHsl = Symbol("dartx.setFillColorHsl");
const $setStrokeColorRgb = dartx.setStrokeColorRgb = Symbol("dartx.setStrokeColorRgb");
const $setStrokeColorHsl = dartx.setStrokeColorHsl = Symbol("dartx.setStrokeColorHsl");
const $arc = dartx.arc = Symbol("dartx.arc");
const $createPatternFromImage = dartx.createPatternFromImage = Symbol("dartx.createPatternFromImage");
const $drawImageScaled = dartx.drawImageScaled = Symbol("dartx.drawImageScaled");
const $drawImageScaledFromSource = dartx.drawImageScaledFromSource = Symbol("dartx.drawImageScaledFromSource");
const $drawImageToRect = dartx.drawImageToRect = Symbol("dartx.drawImageToRect");
const $drawImage = dartx.drawImage = Symbol("dartx.drawImage");
const $lineDashOffset = dartx.lineDashOffset = Symbol("dartx.lineDashOffset");
const $getLineDash = dartx.getLineDash = Symbol("dartx.getLineDash");
const $setLineDash = dartx.setLineDash = Symbol("dartx.setLineDash");
const $fillText = dartx.fillText = Symbol("dartx.fillText");
const $backingStorePixelRatio = dartx.backingStorePixelRatio = Symbol("dartx.backingStorePixelRatio");
const $frameType = dartx.frameType = Symbol("dartx.frameType");
const $claim = dartx.claim = Symbol("dartx.claim");
const $matchAll = dartx.matchAll = Symbol("dartx.matchAll");
const $openWindow = dartx.openWindow = Symbol("dartx.openWindow");
const $clipboardData = dartx.clipboardData = Symbol("dartx.clipboardData");
const $code = dartx.code = Symbol("dartx.code");
const $wasClean = dartx.wasClean = Symbol("dartx.wasClean");
const $detail = dartx.detail = Symbol("dartx.detail");
const $sourceCapabilities = dartx.sourceCapabilities = Symbol("dartx.sourceCapabilities");
const $view = dartx.view = Symbol("dartx.view");
const $select = dartx.select = Symbol("dartx.select");
const $getDistributedNodes = dartx.getDistributedNodes = Symbol("dartx.getDistributedNodes");
const $set = dartx.set = Symbol("dartx.set");
const $accuracy = dartx.accuracy = Symbol("dartx.accuracy");
const $altitude = dartx.altitude = Symbol("dartx.altitude");
const $altitudeAccuracy = dartx.altitudeAccuracy = Symbol("dartx.altitudeAccuracy");
const $heading = dartx.heading = Symbol("dartx.heading");
const $latitude = dartx.latitude = Symbol("dartx.latitude");
const $longitude = dartx.longitude = Symbol("dartx.longitude");
const $speed = dartx.speed = Symbol("dartx.speed");
const $iconUrl = dartx.iconUrl = Symbol("dartx.iconUrl");
const $create = dartx.create = Symbol("dartx.create");
const $preventSilentAccess = dartx.preventSilentAccess = Symbol("dartx.preventSilentAccess");
const $requireUserMediation = dartx.requireUserMediation = Symbol("dartx.requireUserMediation");
const $store = dartx.store = Symbol("dartx.store");
const $getRandomValues = dartx.getRandomValues = Symbol("dartx.getRandomValues");
const $subtle = dartx.subtle = Symbol("dartx.subtle");
const $algorithm = dartx.algorithm = Symbol("dartx.algorithm");
const $extractable = dartx.extractable = Symbol("dartx.extractable");
const $usages = dartx.usages = Symbol("dartx.usages");
const $encoding = dartx.encoding = Symbol("dartx.encoding");
const $cssText = dartx.cssText = Symbol("dartx.cssText");
const $parentRule = dartx.parentRule = Symbol("dartx.parentRule");
const $parentStyleSheet = dartx.parentStyleSheet = Symbol("dartx.parentStyleSheet");
const $conditionText = dartx.conditionText = Symbol("dartx.conditionText");
const $cssRules = dartx.cssRules = Symbol("dartx.cssRules");
const $deleteRule = dartx.deleteRule = Symbol("dartx.deleteRule");
const $insertRule = dartx.insertRule = Symbol("dartx.insertRule");
const $intrinsicHeight = dartx.intrinsicHeight = Symbol("dartx.intrinsicHeight");
const $intrinsicRatio = dartx.intrinsicRatio = Symbol("dartx.intrinsicRatio");
const $intrinsicWidth = dartx.intrinsicWidth = Symbol("dartx.intrinsicWidth");
const $media = dartx.media = Symbol("dartx.media");
const $styleSheet = dartx.styleSheet = Symbol("dartx.styleSheet");
const $keyText = dartx.keyText = Symbol("dartx.keyText");
const $appendRule = dartx.appendRule = Symbol("dartx.appendRule");
const $findRule = dartx.findRule = Symbol("dartx.findRule");
const $matrix = dartx.matrix = Symbol("dartx.matrix");
const $is2D = dartx.is2D = Symbol("dartx.is2D");
const $prefix = dartx.prefix = Symbol("dartx.prefix");
const $div = dartx.div = Symbol("dartx.div");
const $mul = dartx.mul = Symbol("dartx.mul");
const $sub = dartx.sub = Symbol("dartx.sub");
const $to = dartx.to = Symbol("dartx.to");
const $selectorText = dartx.selectorText = Symbol("dartx.selectorText");
const $angle = dartx.angle = Symbol("dartx.angle");
const $ax = dartx.ax = Symbol("dartx.ax");
const $ay = dartx.ay = Symbol("dartx.ay");
const $getPropertyValue = dartx.getPropertyValue = Symbol("dartx.getPropertyValue");
const $supportsProperty = dartx.supportsProperty = Symbol("dartx.supportsProperty");
const $setProperty = dartx.setProperty = Symbol("dartx.setProperty");
const $cssFloat = dartx.cssFloat = Symbol("dartx.cssFloat");
const $getPropertyPriority = dartx.getPropertyPriority = Symbol("dartx.getPropertyPriority");
const $removeProperty = dartx.removeProperty = Symbol("dartx.removeProperty");
const $background = dartx.background = Symbol("dartx.background");
const $backgroundAttachment = dartx.backgroundAttachment = Symbol("dartx.backgroundAttachment");
const $backgroundColor = dartx.backgroundColor = Symbol("dartx.backgroundColor");
const $backgroundImage = dartx.backgroundImage = Symbol("dartx.backgroundImage");
const $backgroundPosition = dartx.backgroundPosition = Symbol("dartx.backgroundPosition");
const $backgroundRepeat = dartx.backgroundRepeat = Symbol("dartx.backgroundRepeat");
const $border = dartx.border = Symbol("dartx.border");
const $borderBottom = dartx.borderBottom = Symbol("dartx.borderBottom");
const $borderBottomColor = dartx.borderBottomColor = Symbol("dartx.borderBottomColor");
const $borderBottomStyle = dartx.borderBottomStyle = Symbol("dartx.borderBottomStyle");
const $borderBottomWidth = dartx.borderBottomWidth = Symbol("dartx.borderBottomWidth");
const $borderCollapse = dartx.borderCollapse = Symbol("dartx.borderCollapse");
const $borderColor = dartx.borderColor = Symbol("dartx.borderColor");
const $borderLeft = dartx.borderLeft = Symbol("dartx.borderLeft");
const $borderLeftColor = dartx.borderLeftColor = Symbol("dartx.borderLeftColor");
const $borderLeftStyle = dartx.borderLeftStyle = Symbol("dartx.borderLeftStyle");
const $borderLeftWidth = dartx.borderLeftWidth = Symbol("dartx.borderLeftWidth");
const $borderRight = dartx.borderRight = Symbol("dartx.borderRight");
const $borderRightColor = dartx.borderRightColor = Symbol("dartx.borderRightColor");
const $borderRightStyle = dartx.borderRightStyle = Symbol("dartx.borderRightStyle");
const $borderRightWidth = dartx.borderRightWidth = Symbol("dartx.borderRightWidth");
const $borderSpacing = dartx.borderSpacing = Symbol("dartx.borderSpacing");
const $borderStyle = dartx.borderStyle = Symbol("dartx.borderStyle");
const $borderTop = dartx.borderTop = Symbol("dartx.borderTop");
const $borderTopColor = dartx.borderTopColor = Symbol("dartx.borderTopColor");
const $borderTopStyle = dartx.borderTopStyle = Symbol("dartx.borderTopStyle");
const $borderTopWidth = dartx.borderTopWidth = Symbol("dartx.borderTopWidth");
const $borderWidth = dartx.borderWidth = Symbol("dartx.borderWidth");
const $captionSide = dartx.captionSide = Symbol("dartx.captionSide");
const $color = dartx.color = Symbol("dartx.color");
const $content = dartx.content = Symbol("dartx.content");
const $cursor = dartx.cursor = Symbol("dartx.cursor");
const $display = dartx.display = Symbol("dartx.display");
const $emptyCells = dartx.emptyCells = Symbol("dartx.emptyCells");
const $fontFamily = dartx.fontFamily = Symbol("dartx.fontFamily");
const $fontSize = dartx.fontSize = Symbol("dartx.fontSize");
const $fontStyle = dartx.fontStyle = Symbol("dartx.fontStyle");
const $fontVariant = dartx.fontVariant = Symbol("dartx.fontVariant");
const $fontWeight = dartx.fontWeight = Symbol("dartx.fontWeight");
const $letterSpacing = dartx.letterSpacing = Symbol("dartx.letterSpacing");
const $lineHeight = dartx.lineHeight = Symbol("dartx.lineHeight");
const $listStyle = dartx.listStyle = Symbol("dartx.listStyle");
const $listStyleImage = dartx.listStyleImage = Symbol("dartx.listStyleImage");
const $listStylePosition = dartx.listStylePosition = Symbol("dartx.listStylePosition");
const $listStyleType = dartx.listStyleType = Symbol("dartx.listStyleType");
const $margin = dartx.margin = Symbol("dartx.margin");
const $marginBottom = dartx.marginBottom = Symbol("dartx.marginBottom");
const $marginLeft = dartx.marginLeft = Symbol("dartx.marginLeft");
const $marginRight = dartx.marginRight = Symbol("dartx.marginRight");
const $marginTop = dartx.marginTop = Symbol("dartx.marginTop");
const $maxHeight = dartx.maxHeight = Symbol("dartx.maxHeight");
const $maxWidth = dartx.maxWidth = Symbol("dartx.maxWidth");
const $minHeight = dartx.minHeight = Symbol("dartx.minHeight");
const $minWidth = dartx.minWidth = Symbol("dartx.minWidth");
const $outline = dartx.outline = Symbol("dartx.outline");
const $outlineColor = dartx.outlineColor = Symbol("dartx.outlineColor");
const $outlineStyle = dartx.outlineStyle = Symbol("dartx.outlineStyle");
const $outlineWidth = dartx.outlineWidth = Symbol("dartx.outlineWidth");
const $overflow = dartx.overflow = Symbol("dartx.overflow");
const $padding = dartx.padding = Symbol("dartx.padding");
const $paddingBottom = dartx.paddingBottom = Symbol("dartx.paddingBottom");
const $paddingLeft = dartx.paddingLeft = Symbol("dartx.paddingLeft");
const $paddingRight = dartx.paddingRight = Symbol("dartx.paddingRight");
const $paddingTop = dartx.paddingTop = Symbol("dartx.paddingTop");
const $pageBreakAfter = dartx.pageBreakAfter = Symbol("dartx.pageBreakAfter");
const $pageBreakBefore = dartx.pageBreakBefore = Symbol("dartx.pageBreakBefore");
const $pageBreakInside = dartx.pageBreakInside = Symbol("dartx.pageBreakInside");
const $position = dartx.position = Symbol("dartx.position");
const $quotes = dartx.quotes = Symbol("dartx.quotes");
const $tableLayout = dartx.tableLayout = Symbol("dartx.tableLayout");
const $textDecoration = dartx.textDecoration = Symbol("dartx.textDecoration");
const $textIndent = dartx.textIndent = Symbol("dartx.textIndent");
const $textTransform = dartx.textTransform = Symbol("dartx.textTransform");
const $unicodeBidi = dartx.unicodeBidi = Symbol("dartx.unicodeBidi");
const $verticalAlign = dartx.verticalAlign = Symbol("dartx.verticalAlign");
const $visibility = dartx.visibility = Symbol("dartx.visibility");
const $whiteSpace = dartx.whiteSpace = Symbol("dartx.whiteSpace");
const $wordSpacing = dartx.wordSpacing = Symbol("dartx.wordSpacing");
const $zIndex = dartx.zIndex = Symbol("dartx.zIndex");
const $alignContent = dartx.alignContent = Symbol("dartx.alignContent");
const $alignItems = dartx.alignItems = Symbol("dartx.alignItems");
const $alignSelf = dartx.alignSelf = Symbol("dartx.alignSelf");
const $animation = dartx.animation = Symbol("dartx.animation");
const $animationDelay = dartx.animationDelay = Symbol("dartx.animationDelay");
const $animationDirection = dartx.animationDirection = Symbol("dartx.animationDirection");
const $animationDuration = dartx.animationDuration = Symbol("dartx.animationDuration");
const $animationFillMode = dartx.animationFillMode = Symbol("dartx.animationFillMode");
const $animationIterationCount = dartx.animationIterationCount = Symbol("dartx.animationIterationCount");
const $animationPlayState = dartx.animationPlayState = Symbol("dartx.animationPlayState");
const $animationTimingFunction = dartx.animationTimingFunction = Symbol("dartx.animationTimingFunction");
const $appRegion = dartx.appRegion = Symbol("dartx.appRegion");
const $appearance = dartx.appearance = Symbol("dartx.appearance");
const $aspectRatio = dartx.aspectRatio = Symbol("dartx.aspectRatio");
const $backfaceVisibility = dartx.backfaceVisibility = Symbol("dartx.backfaceVisibility");
const $backgroundBlendMode = dartx.backgroundBlendMode = Symbol("dartx.backgroundBlendMode");
const $backgroundClip = dartx.backgroundClip = Symbol("dartx.backgroundClip");
const $backgroundComposite = dartx.backgroundComposite = Symbol("dartx.backgroundComposite");
const $backgroundOrigin = dartx.backgroundOrigin = Symbol("dartx.backgroundOrigin");
const $backgroundPositionX = dartx.backgroundPositionX = Symbol("dartx.backgroundPositionX");
const $backgroundPositionY = dartx.backgroundPositionY = Symbol("dartx.backgroundPositionY");
const $backgroundRepeatX = dartx.backgroundRepeatX = Symbol("dartx.backgroundRepeatX");
const $backgroundRepeatY = dartx.backgroundRepeatY = Symbol("dartx.backgroundRepeatY");
const $backgroundSize = dartx.backgroundSize = Symbol("dartx.backgroundSize");
const $borderAfter = dartx.borderAfter = Symbol("dartx.borderAfter");
const $borderAfterColor = dartx.borderAfterColor = Symbol("dartx.borderAfterColor");
const $borderAfterStyle = dartx.borderAfterStyle = Symbol("dartx.borderAfterStyle");
const $borderAfterWidth = dartx.borderAfterWidth = Symbol("dartx.borderAfterWidth");
const $borderBefore = dartx.borderBefore = Symbol("dartx.borderBefore");
const $borderBeforeColor = dartx.borderBeforeColor = Symbol("dartx.borderBeforeColor");
const $borderBeforeStyle = dartx.borderBeforeStyle = Symbol("dartx.borderBeforeStyle");
const $borderBeforeWidth = dartx.borderBeforeWidth = Symbol("dartx.borderBeforeWidth");
const $borderBottomLeftRadius = dartx.borderBottomLeftRadius = Symbol("dartx.borderBottomLeftRadius");
const $borderBottomRightRadius = dartx.borderBottomRightRadius = Symbol("dartx.borderBottomRightRadius");
const $borderEnd = dartx.borderEnd = Symbol("dartx.borderEnd");
const $borderEndColor = dartx.borderEndColor = Symbol("dartx.borderEndColor");
const $borderEndStyle = dartx.borderEndStyle = Symbol("dartx.borderEndStyle");
const $borderEndWidth = dartx.borderEndWidth = Symbol("dartx.borderEndWidth");
const $borderFit = dartx.borderFit = Symbol("dartx.borderFit");
const $borderHorizontalSpacing = dartx.borderHorizontalSpacing = Symbol("dartx.borderHorizontalSpacing");
const $borderImage = dartx.borderImage = Symbol("dartx.borderImage");
const $borderImageOutset = dartx.borderImageOutset = Symbol("dartx.borderImageOutset");
const $borderImageRepeat = dartx.borderImageRepeat = Symbol("dartx.borderImageRepeat");
const $borderImageSlice = dartx.borderImageSlice = Symbol("dartx.borderImageSlice");
const $borderImageSource = dartx.borderImageSource = Symbol("dartx.borderImageSource");
const $borderImageWidth = dartx.borderImageWidth = Symbol("dartx.borderImageWidth");
const $borderRadius = dartx.borderRadius = Symbol("dartx.borderRadius");
const $borderStart = dartx.borderStart = Symbol("dartx.borderStart");
const $borderStartColor = dartx.borderStartColor = Symbol("dartx.borderStartColor");
const $borderStartStyle = dartx.borderStartStyle = Symbol("dartx.borderStartStyle");
const $borderStartWidth = dartx.borderStartWidth = Symbol("dartx.borderStartWidth");
const $borderTopLeftRadius = dartx.borderTopLeftRadius = Symbol("dartx.borderTopLeftRadius");
const $borderTopRightRadius = dartx.borderTopRightRadius = Symbol("dartx.borderTopRightRadius");
const $borderVerticalSpacing = dartx.borderVerticalSpacing = Symbol("dartx.borderVerticalSpacing");
const $boxAlign = dartx.boxAlign = Symbol("dartx.boxAlign");
const $boxDecorationBreak = dartx.boxDecorationBreak = Symbol("dartx.boxDecorationBreak");
const $boxDirection = dartx.boxDirection = Symbol("dartx.boxDirection");
const $boxFlex = dartx.boxFlex = Symbol("dartx.boxFlex");
const $boxFlexGroup = dartx.boxFlexGroup = Symbol("dartx.boxFlexGroup");
const $boxLines = dartx.boxLines = Symbol("dartx.boxLines");
const $boxOrdinalGroup = dartx.boxOrdinalGroup = Symbol("dartx.boxOrdinalGroup");
const $boxOrient = dartx.boxOrient = Symbol("dartx.boxOrient");
const $boxPack = dartx.boxPack = Symbol("dartx.boxPack");
const $boxReflect = dartx.boxReflect = Symbol("dartx.boxReflect");
const $boxShadow = dartx.boxShadow = Symbol("dartx.boxShadow");
const $boxSizing = dartx.boxSizing = Symbol("dartx.boxSizing");
const $clipPath = dartx.clipPath = Symbol("dartx.clipPath");
const $columnBreakAfter = dartx.columnBreakAfter = Symbol("dartx.columnBreakAfter");
const $columnBreakBefore = dartx.columnBreakBefore = Symbol("dartx.columnBreakBefore");
const $columnBreakInside = dartx.columnBreakInside = Symbol("dartx.columnBreakInside");
const $columnCount = dartx.columnCount = Symbol("dartx.columnCount");
const $columnFill = dartx.columnFill = Symbol("dartx.columnFill");
const $columnGap = dartx.columnGap = Symbol("dartx.columnGap");
const $columnRule = dartx.columnRule = Symbol("dartx.columnRule");
const $columnRuleColor = dartx.columnRuleColor = Symbol("dartx.columnRuleColor");
const $columnRuleStyle = dartx.columnRuleStyle = Symbol("dartx.columnRuleStyle");
const $columnRuleWidth = dartx.columnRuleWidth = Symbol("dartx.columnRuleWidth");
const $columnSpan = dartx.columnSpan = Symbol("dartx.columnSpan");
const $columnWidth = dartx.columnWidth = Symbol("dartx.columnWidth");
const $columns = dartx.columns = Symbol("dartx.columns");
const $counterIncrement = dartx.counterIncrement = Symbol("dartx.counterIncrement");
const $counterReset = dartx.counterReset = Symbol("dartx.counterReset");
const $flex = dartx.flex = Symbol("dartx.flex");
const $flexBasis = dartx.flexBasis = Symbol("dartx.flexBasis");
const $flexDirection = dartx.flexDirection = Symbol("dartx.flexDirection");
const $flexFlow = dartx.flexFlow = Symbol("dartx.flexFlow");
const $flexGrow = dartx.flexGrow = Symbol("dartx.flexGrow");
const $flexShrink = dartx.flexShrink = Symbol("dartx.flexShrink");
const $flexWrap = dartx.flexWrap = Symbol("dartx.flexWrap");
const $float = dartx.float = Symbol("dartx.float");
const $fontFeatureSettings = dartx.fontFeatureSettings = Symbol("dartx.fontFeatureSettings");
const $fontKerning = dartx.fontKerning = Symbol("dartx.fontKerning");
const $fontSizeDelta = dartx.fontSizeDelta = Symbol("dartx.fontSizeDelta");
const $fontSmoothing = dartx.fontSmoothing = Symbol("dartx.fontSmoothing");
const $fontStretch = dartx.fontStretch = Symbol("dartx.fontStretch");
const $fontVariantLigatures = dartx.fontVariantLigatures = Symbol("dartx.fontVariantLigatures");
const $grid = dartx.grid = Symbol("dartx.grid");
const $gridArea = dartx.gridArea = Symbol("dartx.gridArea");
const $gridAutoColumns = dartx.gridAutoColumns = Symbol("dartx.gridAutoColumns");
const $gridAutoFlow = dartx.gridAutoFlow = Symbol("dartx.gridAutoFlow");
const $gridAutoRows = dartx.gridAutoRows = Symbol("dartx.gridAutoRows");
const $gridColumn = dartx.gridColumn = Symbol("dartx.gridColumn");
const $gridColumnEnd = dartx.gridColumnEnd = Symbol("dartx.gridColumnEnd");
const $gridColumnStart = dartx.gridColumnStart = Symbol("dartx.gridColumnStart");
const $gridRow = dartx.gridRow = Symbol("dartx.gridRow");
const $gridRowEnd = dartx.gridRowEnd = Symbol("dartx.gridRowEnd");
const $gridRowStart = dartx.gridRowStart = Symbol("dartx.gridRowStart");
const $gridTemplate = dartx.gridTemplate = Symbol("dartx.gridTemplate");
const $gridTemplateAreas = dartx.gridTemplateAreas = Symbol("dartx.gridTemplateAreas");
const $gridTemplateColumns = dartx.gridTemplateColumns = Symbol("dartx.gridTemplateColumns");
const $gridTemplateRows = dartx.gridTemplateRows = Symbol("dartx.gridTemplateRows");
const $highlight = dartx.highlight = Symbol("dartx.highlight");
const $hyphenateCharacter = dartx.hyphenateCharacter = Symbol("dartx.hyphenateCharacter");
const $imageRendering = dartx.imageRendering = Symbol("dartx.imageRendering");
const $isolation = dartx.isolation = Symbol("dartx.isolation");
const $justifyContent = dartx.justifyContent = Symbol("dartx.justifyContent");
const $justifySelf = dartx.justifySelf = Symbol("dartx.justifySelf");
const $lineBoxContain = dartx.lineBoxContain = Symbol("dartx.lineBoxContain");
const $lineBreak = dartx.lineBreak = Symbol("dartx.lineBreak");
const $lineClamp = dartx.lineClamp = Symbol("dartx.lineClamp");
const $locale = dartx.locale = Symbol("dartx.locale");
const $logicalHeight = dartx.logicalHeight = Symbol("dartx.logicalHeight");
const $logicalWidth = dartx.logicalWidth = Symbol("dartx.logicalWidth");
const $marginAfter = dartx.marginAfter = Symbol("dartx.marginAfter");
const $marginAfterCollapse = dartx.marginAfterCollapse = Symbol("dartx.marginAfterCollapse");
const $marginBefore = dartx.marginBefore = Symbol("dartx.marginBefore");
const $marginBeforeCollapse = dartx.marginBeforeCollapse = Symbol("dartx.marginBeforeCollapse");
const $marginBottomCollapse = dartx.marginBottomCollapse = Symbol("dartx.marginBottomCollapse");
const $marginCollapse = dartx.marginCollapse = Symbol("dartx.marginCollapse");
const $marginEnd = dartx.marginEnd = Symbol("dartx.marginEnd");
const $marginStart = dartx.marginStart = Symbol("dartx.marginStart");
const $marginTopCollapse = dartx.marginTopCollapse = Symbol("dartx.marginTopCollapse");
const $mask = dartx.mask = Symbol("dartx.mask");
const $maskBoxImage = dartx.maskBoxImage = Symbol("dartx.maskBoxImage");
const $maskBoxImageOutset = dartx.maskBoxImageOutset = Symbol("dartx.maskBoxImageOutset");
const $maskBoxImageRepeat = dartx.maskBoxImageRepeat = Symbol("dartx.maskBoxImageRepeat");
const $maskBoxImageSlice = dartx.maskBoxImageSlice = Symbol("dartx.maskBoxImageSlice");
const $maskBoxImageSource = dartx.maskBoxImageSource = Symbol("dartx.maskBoxImageSource");
const $maskBoxImageWidth = dartx.maskBoxImageWidth = Symbol("dartx.maskBoxImageWidth");
const $maskClip = dartx.maskClip = Symbol("dartx.maskClip");
const $maskComposite = dartx.maskComposite = Symbol("dartx.maskComposite");
const $maskImage = dartx.maskImage = Symbol("dartx.maskImage");
const $maskOrigin = dartx.maskOrigin = Symbol("dartx.maskOrigin");
const $maskPosition = dartx.maskPosition = Symbol("dartx.maskPosition");
const $maskPositionX = dartx.maskPositionX = Symbol("dartx.maskPositionX");
const $maskPositionY = dartx.maskPositionY = Symbol("dartx.maskPositionY");
const $maskRepeat = dartx.maskRepeat = Symbol("dartx.maskRepeat");
const $maskRepeatX = dartx.maskRepeatX = Symbol("dartx.maskRepeatX");
const $maskRepeatY = dartx.maskRepeatY = Symbol("dartx.maskRepeatY");
const $maskSize = dartx.maskSize = Symbol("dartx.maskSize");
const $maskSourceType = dartx.maskSourceType = Symbol("dartx.maskSourceType");
const $maxLogicalHeight = dartx.maxLogicalHeight = Symbol("dartx.maxLogicalHeight");
const $maxLogicalWidth = dartx.maxLogicalWidth = Symbol("dartx.maxLogicalWidth");
const $maxZoom = dartx.maxZoom = Symbol("dartx.maxZoom");
const $minLogicalHeight = dartx.minLogicalHeight = Symbol("dartx.minLogicalHeight");
const $minLogicalWidth = dartx.minLogicalWidth = Symbol("dartx.minLogicalWidth");
const $minZoom = dartx.minZoom = Symbol("dartx.minZoom");
const $mixBlendMode = dartx.mixBlendMode = Symbol("dartx.mixBlendMode");
const $objectFit = dartx.objectFit = Symbol("dartx.objectFit");
const $objectPosition = dartx.objectPosition = Symbol("dartx.objectPosition");
const $opacity = dartx.opacity = Symbol("dartx.opacity");
const $order = dartx.order = Symbol("dartx.order");
const $orphans = dartx.orphans = Symbol("dartx.orphans");
const $outlineOffset = dartx.outlineOffset = Symbol("dartx.outlineOffset");
const $overflowWrap = dartx.overflowWrap = Symbol("dartx.overflowWrap");
const $overflowX = dartx.overflowX = Symbol("dartx.overflowX");
const $overflowY = dartx.overflowY = Symbol("dartx.overflowY");
const $paddingAfter = dartx.paddingAfter = Symbol("dartx.paddingAfter");
const $paddingBefore = dartx.paddingBefore = Symbol("dartx.paddingBefore");
const $paddingEnd = dartx.paddingEnd = Symbol("dartx.paddingEnd");
const $paddingStart = dartx.paddingStart = Symbol("dartx.paddingStart");
const $page = dartx.page = Symbol("dartx.page");
const $perspective = dartx.perspective = Symbol("dartx.perspective");
const $perspectiveOrigin = dartx.perspectiveOrigin = Symbol("dartx.perspectiveOrigin");
const $perspectiveOriginX = dartx.perspectiveOriginX = Symbol("dartx.perspectiveOriginX");
const $perspectiveOriginY = dartx.perspectiveOriginY = Symbol("dartx.perspectiveOriginY");
const $pointerEvents = dartx.pointerEvents = Symbol("dartx.pointerEvents");
const $printColorAdjust = dartx.printColorAdjust = Symbol("dartx.printColorAdjust");
const $resize = dartx.resize = Symbol("dartx.resize");
const $rtlOrdering = dartx.rtlOrdering = Symbol("dartx.rtlOrdering");
const $rubyPosition = dartx.rubyPosition = Symbol("dartx.rubyPosition");
const $scrollBehavior = dartx.scrollBehavior = Symbol("dartx.scrollBehavior");
const $shapeImageThreshold = dartx.shapeImageThreshold = Symbol("dartx.shapeImageThreshold");
const $shapeMargin = dartx.shapeMargin = Symbol("dartx.shapeMargin");
const $shapeOutside = dartx.shapeOutside = Symbol("dartx.shapeOutside");
const $speak = dartx.speak = Symbol("dartx.speak");
const $tabSize = dartx.tabSize = Symbol("dartx.tabSize");
const $tapHighlightColor = dartx.tapHighlightColor = Symbol("dartx.tapHighlightColor");
const $textAlignLast = dartx.textAlignLast = Symbol("dartx.textAlignLast");
const $textCombine = dartx.textCombine = Symbol("dartx.textCombine");
const $textDecorationColor = dartx.textDecorationColor = Symbol("dartx.textDecorationColor");
const $textDecorationLine = dartx.textDecorationLine = Symbol("dartx.textDecorationLine");
const $textDecorationStyle = dartx.textDecorationStyle = Symbol("dartx.textDecorationStyle");
const $textDecorationsInEffect = dartx.textDecorationsInEffect = Symbol("dartx.textDecorationsInEffect");
const $textEmphasis = dartx.textEmphasis = Symbol("dartx.textEmphasis");
const $textEmphasisColor = dartx.textEmphasisColor = Symbol("dartx.textEmphasisColor");
const $textEmphasisPosition = dartx.textEmphasisPosition = Symbol("dartx.textEmphasisPosition");
const $textEmphasisStyle = dartx.textEmphasisStyle = Symbol("dartx.textEmphasisStyle");
const $textFillColor = dartx.textFillColor = Symbol("dartx.textFillColor");
const $textJustify = dartx.textJustify = Symbol("dartx.textJustify");
const $textLineThroughColor = dartx.textLineThroughColor = Symbol("dartx.textLineThroughColor");
const $textLineThroughMode = dartx.textLineThroughMode = Symbol("dartx.textLineThroughMode");
const $textLineThroughStyle = dartx.textLineThroughStyle = Symbol("dartx.textLineThroughStyle");
const $textLineThroughWidth = dartx.textLineThroughWidth = Symbol("dartx.textLineThroughWidth");
const $textOrientation = dartx.textOrientation = Symbol("dartx.textOrientation");
const $textOverflow = dartx.textOverflow = Symbol("dartx.textOverflow");
const $textOverlineColor = dartx.textOverlineColor = Symbol("dartx.textOverlineColor");
const $textOverlineMode = dartx.textOverlineMode = Symbol("dartx.textOverlineMode");
const $textOverlineStyle = dartx.textOverlineStyle = Symbol("dartx.textOverlineStyle");
const $textOverlineWidth = dartx.textOverlineWidth = Symbol("dartx.textOverlineWidth");
const $textRendering = dartx.textRendering = Symbol("dartx.textRendering");
const $textSecurity = dartx.textSecurity = Symbol("dartx.textSecurity");
const $textShadow = dartx.textShadow = Symbol("dartx.textShadow");
const $textStroke = dartx.textStroke = Symbol("dartx.textStroke");
const $textStrokeColor = dartx.textStrokeColor = Symbol("dartx.textStrokeColor");
const $textStrokeWidth = dartx.textStrokeWidth = Symbol("dartx.textStrokeWidth");
const $textUnderlineColor = dartx.textUnderlineColor = Symbol("dartx.textUnderlineColor");
const $textUnderlineMode = dartx.textUnderlineMode = Symbol("dartx.textUnderlineMode");
const $textUnderlinePosition = dartx.textUnderlinePosition = Symbol("dartx.textUnderlinePosition");
const $textUnderlineStyle = dartx.textUnderlineStyle = Symbol("dartx.textUnderlineStyle");
const $textUnderlineWidth = dartx.textUnderlineWidth = Symbol("dartx.textUnderlineWidth");
const $touchAction = dartx.touchAction = Symbol("dartx.touchAction");
const $touchActionDelay = dartx.touchActionDelay = Symbol("dartx.touchActionDelay");
const $transformOrigin = dartx.transformOrigin = Symbol("dartx.transformOrigin");
const $transformOriginX = dartx.transformOriginX = Symbol("dartx.transformOriginX");
const $transformOriginY = dartx.transformOriginY = Symbol("dartx.transformOriginY");
const $transformOriginZ = dartx.transformOriginZ = Symbol("dartx.transformOriginZ");
const $transformStyle = dartx.transformStyle = Symbol("dartx.transformStyle");
const $transition = dartx.transition = Symbol("dartx.transition");
const $transitionDelay = dartx.transitionDelay = Symbol("dartx.transitionDelay");
const $transitionDuration = dartx.transitionDuration = Symbol("dartx.transitionDuration");
const $transitionProperty = dartx.transitionProperty = Symbol("dartx.transitionProperty");
const $transitionTimingFunction = dartx.transitionTimingFunction = Symbol("dartx.transitionTimingFunction");
const $unicodeRange = dartx.unicodeRange = Symbol("dartx.unicodeRange");
const $userDrag = dartx.userDrag = Symbol("dartx.userDrag");
const $userModify = dartx.userModify = Symbol("dartx.userModify");
const $userSelect = dartx.userSelect = Symbol("dartx.userSelect");
const $userZoom = dartx.userZoom = Symbol("dartx.userZoom");
const $widows = dartx.widows = Symbol("dartx.widows");
const $willChange = dartx.willChange = Symbol("dartx.willChange");
const $wordBreak = dartx.wordBreak = Symbol("dartx.wordBreak");
const $wordWrap = dartx.wordWrap = Symbol("dartx.wordWrap");
const $wrapFlow = dartx.wrapFlow = Symbol("dartx.wrapFlow");
const $wrapThrough = dartx.wrapThrough = Symbol("dartx.wrapThrough");
const $writingMode = dartx.writingMode = Symbol("dartx.writingMode");
const $zoom = dartx.zoom = Symbol("dartx.zoom");
const $ownerRule = dartx.ownerRule = Symbol("dartx.ownerRule");
const $rules = dartx.rules = Symbol("dartx.rules");
const $addRule = dartx.addRule = Symbol("dartx.addRule");
const $removeRule = dartx.removeRule = Symbol("dartx.removeRule");
const $ownerNode = dartx.ownerNode = Symbol("dartx.ownerNode");
const $componentAtIndex = dartx.componentAtIndex = Symbol("dartx.componentAtIndex");
const $toMatrix = dartx.toMatrix = Symbol("dartx.toMatrix");
const $unit = dartx.unit = Symbol("dartx.unit");
const $fragmentAtIndex = dartx.fragmentAtIndex = Symbol("dartx.fragmentAtIndex");
const $fallback = dartx.fallback = Symbol("dartx.fallback");
const $variable = dartx.variable = Symbol("dartx.variable");
const $define = dartx.define = Symbol("dartx.define");
const $whenDefined = dartx.whenDefined = Symbol("dartx.whenDefined");
const $options = dartx.options = Symbol("dartx.options");
const $dropEffect = dartx.dropEffect = Symbol("dartx.dropEffect");
const $effectAllowed = dartx.effectAllowed = Symbol("dartx.effectAllowed");
const $files = dartx.files = Symbol("dartx.files");
const $items = dartx.items = Symbol("dartx.items");
const $types = dartx.types = Symbol("dartx.types");
const $clearData = dartx.clearData = Symbol("dartx.clearData");
const $getData = dartx.getData = Symbol("dartx.getData");
const $setData = dartx.setData = Symbol("dartx.setData");
const $setDragImage = dartx.setDragImage = Symbol("dartx.setDragImage");
const $getAsEntry = dartx.getAsEntry = Symbol("dartx.getAsEntry");
const $getAsFile = dartx.getAsFile = Symbol("dartx.getAsFile");
const $addData = dartx.addData = Symbol("dartx.addData");
const $addFile = dartx.addFile = Symbol("dartx.addFile");
const $requestFileSystemSync = dartx.requestFileSystemSync = Symbol("dartx.requestFileSystemSync");
const $resolveLocalFileSystemSyncUrl = dartx.resolveLocalFileSystemSyncUrl = Symbol("dartx.resolveLocalFileSystemSyncUrl");
const $addressSpace = dartx.addressSpace = Symbol("dartx.addressSpace");
const $caches = dartx.caches = Symbol("dartx.caches");
const $crypto = dartx.crypto = Symbol("dartx.crypto");
const $indexedDB = dartx.indexedDB = Symbol("dartx.indexedDB");
const $isSecureContext = dartx.isSecureContext = Symbol("dartx.isSecureContext");
const $location = dartx.location = Symbol("dartx.location");
const $navigator = dartx.navigator = Symbol("dartx.navigator");
const $performance = dartx.performance = Symbol("dartx.performance");
const $self = dartx.self = Symbol("dartx.self");
const $importScripts = dartx.importScripts = Symbol("dartx.importScripts");
const $atob = dartx.atob = Symbol("dartx.atob");
const $btoa = dartx.btoa = Symbol("dartx.btoa");
const $queryUsageAndQuota = dartx.queryUsageAndQuota = Symbol("dartx.queryUsageAndQuota");
const $requestQuota = dartx.requestQuota = Symbol("dartx.requestQuota");
const $lineNumber = dartx.lineNumber = Symbol("dartx.lineNumber");
const $sourceFile = dartx.sourceFile = Symbol("dartx.sourceFile");
const $cornerPoints = dartx.cornerPoints = Symbol("dartx.cornerPoints");
const $rawValue = dartx.rawValue = Symbol("dartx.rawValue");
const $landmarks = dartx.landmarks = Symbol("dartx.landmarks");
const $acceleration = dartx.acceleration = Symbol("dartx.acceleration");
const $accelerationIncludingGravity = dartx.accelerationIncludingGravity = Symbol("dartx.accelerationIncludingGravity");
const $interval = dartx.interval = Symbol("dartx.interval");
const $rotationRate = dartx.rotationRate = Symbol("dartx.rotationRate");
const $absolute = dartx.absolute = Symbol("dartx.absolute");
const $alpha = dartx.alpha = Symbol("dartx.alpha");
const $beta = dartx.beta = Symbol("dartx.beta");
const $gamma = dartx.gamma = Symbol("dartx.gamma");
const $show = dartx.show = Symbol("dartx.show");
const $showModal = dartx.showModal = Symbol("dartx.showModal");
const $createDirectory = dartx.createDirectory = Symbol("dartx.createDirectory");
const $createReader = dartx.createReader = Symbol("dartx.createReader");
const $getDirectory = dartx.getDirectory = Symbol("dartx.getDirectory");
const $createFile = dartx.createFile = Symbol("dartx.createFile");
const $getFile = dartx.getFile = Symbol("dartx.getFile");
const $removeRecursively = dartx.removeRecursively = Symbol("dartx.removeRecursively");
const $filesystem = dartx.filesystem = Symbol("dartx.filesystem");
const $fullPath = dartx.fullPath = Symbol("dartx.fullPath");
const $isDirectory = dartx.isDirectory = Symbol("dartx.isDirectory");
const $isFile = dartx.isFile = Symbol("dartx.isFile");
const $copyTo = dartx.copyTo = Symbol("dartx.copyTo");
const $getMetadata = dartx.getMetadata = Symbol("dartx.getMetadata");
const $getParent = dartx.getParent = Symbol("dartx.getParent");
const $toUrl = dartx.toUrl = Symbol("dartx.toUrl");
const $readEntries = dartx.readEntries = Symbol("dartx.readEntries");
const $contentType = dartx.contentType = Symbol("dartx.contentType");
const $cookie = dartx.cookie = Symbol("dartx.cookie");
const $currentScript = dartx.currentScript = Symbol("dartx.currentScript");
const $window = dartx.window = Symbol("dartx.window");
const $documentElement = dartx.documentElement = Symbol("dartx.documentElement");
const $domain = dartx.domain = Symbol("dartx.domain");
const $fullscreenEnabled = dartx.fullscreenEnabled = Symbol("dartx.fullscreenEnabled");
const $implementation = dartx.implementation = Symbol("dartx.implementation");
const $rootElement = dartx.rootElement = Symbol("dartx.rootElement");
const $rootScroller = dartx.rootScroller = Symbol("dartx.rootScroller");
const $scrollingElement = dartx.scrollingElement = Symbol("dartx.scrollingElement");
const $suborigin = dartx.suborigin = Symbol("dartx.suborigin");
const $adoptNode = dartx.adoptNode = Symbol("dartx.adoptNode");
const $createDocumentFragment = dartx.createDocumentFragment = Symbol("dartx.createDocumentFragment");
const $createRange = dartx.createRange = Symbol("dartx.createRange");
const $execCommand = dartx.execCommand = Symbol("dartx.execCommand");
const $exitFullscreen = dartx.exitFullscreen = Symbol("dartx.exitFullscreen");
const $exitPointerLock = dartx.exitPointerLock = Symbol("dartx.exitPointerLock");
const $getElementsByName = dartx.getElementsByName = Symbol("dartx.getElementsByName");
const $getElementsByTagName = dartx.getElementsByTagName = Symbol("dartx.getElementsByTagName");
const $importNode = dartx.importNode = Symbol("dartx.importNode");
const $queryCommandEnabled = dartx.queryCommandEnabled = Symbol("dartx.queryCommandEnabled");
const $queryCommandIndeterm = dartx.queryCommandIndeterm = Symbol("dartx.queryCommandIndeterm");
const $queryCommandState = dartx.queryCommandState = Symbol("dartx.queryCommandState");
const $queryCommandSupported = dartx.queryCommandSupported = Symbol("dartx.queryCommandSupported");
const $queryCommandValue = dartx.queryCommandValue = Symbol("dartx.queryCommandValue");
const $registerElement2 = dartx.registerElement2 = Symbol("dartx.registerElement2");
const $getElementById = dartx.getElementById = Symbol("dartx.getElementById");
const $activeElement = dartx.activeElement = Symbol("dartx.activeElement");
const $fullscreenElement = dartx.fullscreenElement = Symbol("dartx.fullscreenElement");
const $pointerLockElement = dartx.pointerLockElement = Symbol("dartx.pointerLockElement");
const $elementsFromPoint = dartx.elementsFromPoint = Symbol("dartx.elementsFromPoint");
const $fonts = dartx.fonts = Symbol("dartx.fonts");
const $onPointerLockChange = dartx.onPointerLockChange = Symbol("dartx.onPointerLockChange");
const $onPointerLockError = dartx.onPointerLockError = Symbol("dartx.onPointerLockError");
const $onReadyStateChange = dartx.onReadyStateChange = Symbol("dartx.onReadyStateChange");
const $onSecurityPolicyViolation = dartx.onSecurityPolicyViolation = Symbol("dartx.onSecurityPolicyViolation");
const $onSelectionChange = dartx.onSelectionChange = Symbol("dartx.onSelectionChange");
const $supportsRegisterElement = dartx.supportsRegisterElement = Symbol("dartx.supportsRegisterElement");
const $supportsRegister = dartx.supportsRegister = Symbol("dartx.supportsRegister");
const $registerElement = dartx.registerElement = Symbol("dartx.registerElement");
const $createElementNS = dartx.createElementNS = Symbol("dartx.createElementNS");
const $visibilityState = dartx.visibilityState = Symbol("dartx.visibilityState");
const $styleSheets = dartx.styleSheets = Symbol("dartx.styleSheets");
const $elementFromPoint = dartx.elementFromPoint = Symbol("dartx.elementFromPoint");
const $getSelection = dartx.getSelection = Symbol("dartx.getSelection");
const $createDocument = dartx.createDocument = Symbol("dartx.createDocument");
const $createDocumentType = dartx.createDocumentType = Symbol("dartx.createDocumentType");
const $hasFeature = dartx.hasFeature = Symbol("dartx.hasFeature");
const $a = dartx.a = Symbol("dartx.a");
const $b = dartx.b = Symbol("dartx.b");
const $c = dartx.c = Symbol("dartx.c");
const $d = dartx.d = Symbol("dartx.d");
const $e = dartx.e = Symbol("dartx.e");
const $f = dartx.f = Symbol("dartx.f");
const $m11 = dartx.m11 = Symbol("dartx.m11");
const $m12 = dartx.m12 = Symbol("dartx.m12");
const $m13 = dartx.m13 = Symbol("dartx.m13");
const $m14 = dartx.m14 = Symbol("dartx.m14");
const $m21 = dartx.m21 = Symbol("dartx.m21");
const $m22 = dartx.m22 = Symbol("dartx.m22");
const $m23 = dartx.m23 = Symbol("dartx.m23");
const $m24 = dartx.m24 = Symbol("dartx.m24");
const $m31 = dartx.m31 = Symbol("dartx.m31");
const $m32 = dartx.m32 = Symbol("dartx.m32");
const $m33 = dartx.m33 = Symbol("dartx.m33");
const $m34 = dartx.m34 = Symbol("dartx.m34");
const $m41 = dartx.m41 = Symbol("dartx.m41");
const $m42 = dartx.m42 = Symbol("dartx.m42");
const $m43 = dartx.m43 = Symbol("dartx.m43");
const $m44 = dartx.m44 = Symbol("dartx.m44");
const $invertSelf = dartx.invertSelf = Symbol("dartx.invertSelf");
const $multiplySelf = dartx.multiplySelf = Symbol("dartx.multiplySelf");
const $preMultiplySelf = dartx.preMultiplySelf = Symbol("dartx.preMultiplySelf");
const $rotateAxisAngleSelf = dartx.rotateAxisAngleSelf = Symbol("dartx.rotateAxisAngleSelf");
const $rotateFromVectorSelf = dartx.rotateFromVectorSelf = Symbol("dartx.rotateFromVectorSelf");
const $rotateSelf = dartx.rotateSelf = Symbol("dartx.rotateSelf");
const $scale3dSelf = dartx.scale3dSelf = Symbol("dartx.scale3dSelf");
const $scaleSelf = dartx.scaleSelf = Symbol("dartx.scaleSelf");
const $setMatrixValue = dartx.setMatrixValue = Symbol("dartx.setMatrixValue");
const $skewXSelf = dartx.skewXSelf = Symbol("dartx.skewXSelf");
const $skewYSelf = dartx.skewYSelf = Symbol("dartx.skewYSelf");
const $translateSelf = dartx.translateSelf = Symbol("dartx.translateSelf");
const $isIdentity = dartx.isIdentity = Symbol("dartx.isIdentity");
const $flipX = dartx.flipX = Symbol("dartx.flipX");
const $flipY = dartx.flipY = Symbol("dartx.flipY");
const $inverse = dartx.inverse = Symbol("dartx.inverse");
const $multiply = dartx.multiply = Symbol("dartx.multiply");
const $rotateAxisAngle = dartx.rotateAxisAngle = Symbol("dartx.rotateAxisAngle");
const $rotateFromVector = dartx.rotateFromVector = Symbol("dartx.rotateFromVector");
const $scale3d = dartx.scale3d = Symbol("dartx.scale3d");
const $skewX = dartx.skewX = Symbol("dartx.skewX");
const $skewY = dartx.skewY = Symbol("dartx.skewY");
const $toFloat32Array = dartx.toFloat32Array = Symbol("dartx.toFloat32Array");
const $toFloat64Array = dartx.toFloat64Array = Symbol("dartx.toFloat64Array");
const $transformPoint = dartx.transformPoint = Symbol("dartx.transformPoint");
const $parseFromString = dartx.parseFromString = Symbol("dartx.parseFromString");
const $w = dartx.w = Symbol("dartx.w");
const $matrixTransform = dartx.matrixTransform = Symbol("dartx.matrixTransform");
const $p1 = dartx.p1 = Symbol("dartx.p1");
const $p2 = dartx.p2 = Symbol("dartx.p2");
const $p3 = dartx.p3 = Symbol("dartx.p3");
const $p4 = dartx.p4 = Symbol("dartx.p4");
const $getBounds = dartx.getBounds = Symbol("dartx.getBounds");
const $replace = dartx.replace = Symbol("dartx.replace");
const $supports = dartx.supports = Symbol("dartx.supports");
const $toggle = dartx.toggle = Symbol("dartx.toggle");
const $colno = dartx.colno = Symbol("dartx.colno");
const $filename = dartx.filename = Symbol("dartx.filename");
const $lineno = dartx.lineno = Symbol("dartx.lineno");
const $withCredentials = dartx.withCredentials = Symbol("dartx.withCredentials");
const $onOpen = dartx.onOpen = Symbol("dartx.onOpen");
const $lastEventId = dartx.lastEventId = Symbol("dartx.lastEventId");
const $ports = dartx.ports = Symbol("dartx.ports");
const $AddSearchProvider = dartx.AddSearchProvider = Symbol("dartx.AddSearchProvider");
const $IsSearchProviderInstalled = dartx.IsSearchProviderInstalled = Symbol("dartx.IsSearchProviderInstalled");
const $provider = dartx.provider = Symbol("dartx.provider");
const $clientId = dartx.clientId = Symbol("dartx.clientId");
const $isReload = dartx.isReload = Symbol("dartx.isReload");
const $preloadResponse = dartx.preloadResponse = Symbol("dartx.preloadResponse");
const $elements = dartx.elements = Symbol("dartx.elements");
const $lastModified = dartx.lastModified = Symbol("dartx.lastModified");
const $lastModifiedDate = dartx.lastModifiedDate = Symbol("dartx.lastModifiedDate");
const $relativePath = dartx.relativePath = Symbol("dartx.relativePath");
const $createWriter = dartx.createWriter = Symbol("dartx.createWriter");
const $file = dartx.file = Symbol("dartx.file");
const $readAsArrayBuffer = dartx.readAsArrayBuffer = Symbol("dartx.readAsArrayBuffer");
const $readAsDataUrl = dartx.readAsDataUrl = Symbol("dartx.readAsDataUrl");
const $readAsText = dartx.readAsText = Symbol("dartx.readAsText");
const $onLoadEnd = dartx.onLoadEnd = Symbol("dartx.onLoadEnd");
const $onLoadStart = dartx.onLoadStart = Symbol("dartx.onLoadStart");
const $root = dartx.root = Symbol("dartx.root");
const $seek = dartx.seek = Symbol("dartx.seek");
const $write = dartx.write = Symbol("dartx.write");
const $onWrite = dartx.onWrite = Symbol("dartx.onWrite");
const $onWriteEnd = dartx.onWriteEnd = Symbol("dartx.onWriteEnd");
const $onWriteStart = dartx.onWriteStart = Symbol("dartx.onWriteStart");
const $relatedTarget = dartx.relatedTarget = Symbol("dartx.relatedTarget");
const $family = dartx.family = Symbol("dartx.family");
const $featureSettings = dartx.featureSettings = Symbol("dartx.featureSettings");
const $loaded = dartx.loaded = Symbol("dartx.loaded");
const $stretch = dartx.stretch = Symbol("dartx.stretch");
const $variant = dartx.variant = Symbol("dartx.variant");
const $weight = dartx.weight = Symbol("dartx.weight");
const $check = dartx.check = Symbol("dartx.check");
const $onLoading = dartx.onLoading = Symbol("dartx.onLoading");
const $onLoadingDone = dartx.onLoadingDone = Symbol("dartx.onLoadingDone");
const $onLoadingError = dartx.onLoadingError = Symbol("dartx.onLoadingError");
const $fontfaces = dartx.fontfaces = Symbol("dartx.fontfaces");
const $appendBlob = dartx.appendBlob = Symbol("dartx.appendBlob");
const $acceptCharset = dartx.acceptCharset = Symbol("dartx.acceptCharset");
const $action = dartx.action = Symbol("dartx.action");
const $enctype = dartx.enctype = Symbol("dartx.enctype");
const $method = dartx.method = Symbol("dartx.method");
const $noValidate = dartx.noValidate = Symbol("dartx.noValidate");
const $requestAutocomplete = dartx.requestAutocomplete = Symbol("dartx.requestAutocomplete");
const $reset = dartx.reset = Symbol("dartx.reset");
const $submit = dartx.submit = Symbol("dartx.submit");
const $axes = dartx.axes = Symbol("dartx.axes");
const $buttons = dartx.buttons = Symbol("dartx.buttons");
const $connected = dartx.connected = Symbol("dartx.connected");
const $displayId = dartx.displayId = Symbol("dartx.displayId");
const $hand = dartx.hand = Symbol("dartx.hand");
const $mapping = dartx.mapping = Symbol("dartx.mapping");
const $pose = dartx.pose = Symbol("dartx.pose");
const $touched = dartx.touched = Symbol("dartx.touched");
const $gamepad = dartx.gamepad = Symbol("dartx.gamepad");
const $angularAcceleration = dartx.angularAcceleration = Symbol("dartx.angularAcceleration");
const $angularVelocity = dartx.angularVelocity = Symbol("dartx.angularVelocity");
const $hasOrientation = dartx.hasOrientation = Symbol("dartx.hasOrientation");
const $hasPosition = dartx.hasPosition = Symbol("dartx.hasPosition");
const $linearAcceleration = dartx.linearAcceleration = Symbol("dartx.linearAcceleration");
const $linearVelocity = dartx.linearVelocity = Symbol("dartx.linearVelocity");
const $getCurrentPosition = dartx.getCurrentPosition = Symbol("dartx.getCurrentPosition");
const $watchPosition = dartx.watchPosition = Symbol("dartx.watchPosition");
const $newUrl = dartx.newUrl = Symbol("dartx.newUrl");
const $oldUrl = dartx.oldUrl = Symbol("dartx.oldUrl");
const $scrollRestoration = dartx.scrollRestoration = Symbol("dartx.scrollRestoration");
const $back = dartx.back = Symbol("dartx.back");
const $forward = dartx.forward = Symbol("dartx.forward");
const $go = dartx.go = Symbol("dartx.go");
const $pushState = dartx.pushState = Symbol("dartx.pushState");
const $replaceState = dartx.replaceState = Symbol("dartx.replaceState");
const $namedItem = dartx.namedItem = Symbol("dartx.namedItem");
const $body = dartx.body = Symbol("dartx.body");
const $caretRangeFromPoint = dartx.caretRangeFromPoint = Symbol("dartx.caretRangeFromPoint");
const $preferredStylesheetSet = dartx.preferredStylesheetSet = Symbol("dartx.preferredStylesheetSet");
const $referrer = dartx.referrer = Symbol("dartx.referrer");
const $selectedStylesheetSet = dartx.selectedStylesheetSet = Symbol("dartx.selectedStylesheetSet");
const $register = dartx.register = Symbol("dartx.register");
const $onVisibilityChange = dartx.onVisibilityChange = Symbol("dartx.onVisibilityChange");
const $createElementUpgrader = dartx.createElementUpgrader = Symbol("dartx.createElementUpgrader");
const $responseHeaders = dartx.responseHeaders = Symbol("dartx.responseHeaders");
const $responseText = dartx.responseText = Symbol("dartx.responseText");
const $responseType = dartx.responseType = Symbol("dartx.responseType");
const $responseUrl = dartx.responseUrl = Symbol("dartx.responseUrl");
const $responseXml = dartx.responseXml = Symbol("dartx.responseXml");
const $statusText = dartx.statusText = Symbol("dartx.statusText");
const $timeout = dartx.timeout = Symbol("dartx.timeout");
const $upload = dartx.upload = Symbol("dartx.upload");
const $getAllResponseHeaders = dartx.getAllResponseHeaders = Symbol("dartx.getAllResponseHeaders");
const $getResponseHeader = dartx.getResponseHeader = Symbol("dartx.getResponseHeader");
const $overrideMimeType = dartx.overrideMimeType = Symbol("dartx.overrideMimeType");
const $send = dartx.send = Symbol("dartx.send");
const $setRequestHeader = dartx.setRequestHeader = Symbol("dartx.setRequestHeader");
const $onTimeout = dartx.onTimeout = Symbol("dartx.onTimeout");
const $allow = dartx.allow = Symbol("dartx.allow");
const $allowFullscreen = dartx.allowFullscreen = Symbol("dartx.allowFullscreen");
const $allowPaymentRequest = dartx.allowPaymentRequest = Symbol("dartx.allowPaymentRequest");
const $contentWindow = dartx.contentWindow = Symbol("dartx.contentWindow");
const $csp = dartx.csp = Symbol("dartx.csp");
const $sandbox = dartx.sandbox = Symbol("dartx.sandbox");
const $srcdoc = dartx.srcdoc = Symbol("dartx.srcdoc");
const $didTimeout = dartx.didTimeout = Symbol("dartx.didTimeout");
const $timeRemaining = dartx.timeRemaining = Symbol("dartx.timeRemaining");
const $transferFromImageBitmap = dartx.transferFromImageBitmap = Symbol("dartx.transferFromImageBitmap");
const $track = dartx.track = Symbol("dartx.track");
const $getPhotoCapabilities = dartx.getPhotoCapabilities = Symbol("dartx.getPhotoCapabilities");
const $getPhotoSettings = dartx.getPhotoSettings = Symbol("dartx.getPhotoSettings");
const $grabFrame = dartx.grabFrame = Symbol("dartx.grabFrame");
const $setOptions = dartx.setOptions = Symbol("dartx.setOptions");
const $takePhoto = dartx.takePhoto = Symbol("dartx.takePhoto");
const $async = dartx.async = Symbol("dartx.async");
const $complete = dartx.complete = Symbol("dartx.complete");
const $isMap = dartx.isMap = Symbol("dartx.isMap");
const $naturalHeight = dartx.naturalHeight = Symbol("dartx.naturalHeight");
const $naturalWidth = dartx.naturalWidth = Symbol("dartx.naturalWidth");
const $sizes = dartx.sizes = Symbol("dartx.sizes");
const $srcset = dartx.srcset = Symbol("dartx.srcset");
const $useMap = dartx.useMap = Symbol("dartx.useMap");
const $decode = dartx.decode = Symbol("dartx.decode");
const $firesTouchEvents = dartx.firesTouchEvents = Symbol("dartx.firesTouchEvents");
const $accept = dartx.accept = Symbol("dartx.accept");
const $autocapitalize = dartx.autocapitalize = Symbol("dartx.autocapitalize");
const $capture = dartx.capture = Symbol("dartx.capture");
const $defaultChecked = dartx.defaultChecked = Symbol("dartx.defaultChecked");
const $defaultValue = dartx.defaultValue = Symbol("dartx.defaultValue");
const $dirName = dartx.dirName = Symbol("dartx.dirName");
const $incremental = dartx.incremental = Symbol("dartx.incremental");
const $indeterminate = dartx.indeterminate = Symbol("dartx.indeterminate");
const $list = dartx.list = Symbol("dartx.list");
const $max = dartx.max = Symbol("dartx.max");
const $maxLength = dartx.maxLength = Symbol("dartx.maxLength");
const $min = dartx.min = Symbol("dartx.min");
const $minLength = dartx.minLength = Symbol("dartx.minLength");
const $multiple = dartx.multiple = Symbol("dartx.multiple");
const $pattern = dartx.pattern = Symbol("dartx.pattern");
const $selectionDirection = dartx.selectionDirection = Symbol("dartx.selectionDirection");
const $selectionEnd = dartx.selectionEnd = Symbol("dartx.selectionEnd");
const $selectionStart = dartx.selectionStart = Symbol("dartx.selectionStart");
const $step = dartx.step = Symbol("dartx.step");
const $valueAsDate = dartx.valueAsDate = Symbol("dartx.valueAsDate");
const $valueAsNumber = dartx.valueAsNumber = Symbol("dartx.valueAsNumber");
const $directory = dartx.directory = Symbol("dartx.directory");
const $setRangeText = dartx.setRangeText = Symbol("dartx.setRangeText");
const $setSelectionRange = dartx.setSelectionRange = Symbol("dartx.setSelectionRange");
const $stepDown = dartx.stepDown = Symbol("dartx.stepDown");
const $stepUp = dartx.stepUp = Symbol("dartx.stepUp");
const $registerForeignFetch = dartx.registerForeignFetch = Symbol("dartx.registerForeignFetch");
const $rootMargin = dartx.rootMargin = Symbol("dartx.rootMargin");
const $thresholds = dartx.thresholds = Symbol("dartx.thresholds");
const $disconnect = dartx.disconnect = Symbol("dartx.disconnect");
const $takeRecords = dartx.takeRecords = Symbol("dartx.takeRecords");
const $boundingClientRect = dartx.boundingClientRect = Symbol("dartx.boundingClientRect");
const $intersectionRatio = dartx.intersectionRatio = Symbol("dartx.intersectionRatio");
const $intersectionRect = dartx.intersectionRect = Symbol("dartx.intersectionRect");
const $isIntersecting = dartx.isIntersecting = Symbol("dartx.isIntersecting");
const $rootBounds = dartx.rootBounds = Symbol("dartx.rootBounds");
const $keyCode = dartx.keyCode = Symbol("dartx.keyCode");
const $charCode = dartx.charCode = Symbol("dartx.charCode");
const $which = dartx.which = Symbol("dartx.which");
const $altKey = dartx.altKey = Symbol("dartx.altKey");
const $ctrlKey = dartx.ctrlKey = Symbol("dartx.ctrlKey");
const $isComposing = dartx.isComposing = Symbol("dartx.isComposing");
const $metaKey = dartx.metaKey = Symbol("dartx.metaKey");
const $repeat = dartx.repeat = Symbol("dartx.repeat");
const $shiftKey = dartx.shiftKey = Symbol("dartx.shiftKey");
const $getModifierState = dartx.getModifierState = Symbol("dartx.getModifierState");
const $control = dartx.control = Symbol("dartx.control");
const $htmlFor = dartx.htmlFor = Symbol("dartx.htmlFor");
const $as = dartx.as = Symbol("dartx.as");
const $import = dartx.import = Symbol("dartx.import");
const $integrity = dartx.integrity = Symbol("dartx.integrity");
const $relList = dartx.relList = Symbol("dartx.relList");
const $scope = dartx.scope = Symbol("dartx.scope");
const $sheet = dartx.sheet = Symbol("dartx.sheet");
const $supportsImport = dartx.supportsImport = Symbol("dartx.supportsImport");
const $ancestorOrigins = dartx.ancestorOrigins = Symbol("dartx.ancestorOrigins");
const $trustedHref = dartx.trustedHref = Symbol("dartx.trustedHref");
const $assign = dartx.assign = Symbol("dartx.assign");
const $reload = dartx.reload = Symbol("dartx.reload");
const $areas = dartx.areas = Symbol("dartx.areas");
const $decodingInfo = dartx.decodingInfo = Symbol("dartx.decodingInfo");
const $encodingInfo = dartx.encodingInfo = Symbol("dartx.encodingInfo");
const $powerEfficient = dartx.powerEfficient = Symbol("dartx.powerEfficient");
const $smooth = dartx.smooth = Symbol("dartx.smooth");
const $supported = dartx.supported = Symbol("dartx.supported");
const $deviceId = dartx.deviceId = Symbol("dartx.deviceId");
const $groupId = dartx.groupId = Symbol("dartx.groupId");
const $enumerateDevices = dartx.enumerateDevices = Symbol("dartx.enumerateDevices");
const $getSupportedConstraints = dartx.getSupportedConstraints = Symbol("dartx.getSupportedConstraints");
const $initData = dartx.initData = Symbol("dartx.initData");
const $initDataType = dartx.initDataType = Symbol("dartx.initDataType");
const $messageType = dartx.messageType = Symbol("dartx.messageType");
const $closed = dartx.closed = Symbol("dartx.closed");
const $expiration = dartx.expiration = Symbol("dartx.expiration");
const $keyStatuses = dartx.keyStatuses = Symbol("dartx.keyStatuses");
const $sessionId = dartx.sessionId = Symbol("dartx.sessionId");
const $generateRequest = dartx.generateRequest = Symbol("dartx.generateRequest");
const $keySystem = dartx.keySystem = Symbol("dartx.keySystem");
const $createMediaKeys = dartx.createMediaKeys = Symbol("dartx.createMediaKeys");
const $getConfiguration = dartx.getConfiguration = Symbol("dartx.getConfiguration");
const $getStatusForPolicy = dartx.getStatusForPolicy = Symbol("dartx.getStatusForPolicy");
const $setServerCertificate = dartx.setServerCertificate = Symbol("dartx.setServerCertificate");
const $minHdcpVersion = dartx.minHdcpVersion = Symbol("dartx.minHdcpVersion");
const $mediaText = dartx.mediaText = Symbol("dartx.mediaText");
const $appendMedium = dartx.appendMedium = Symbol("dartx.appendMedium");
const $deleteMedium = dartx.deleteMedium = Symbol("dartx.deleteMedium");
const $album = dartx.album = Symbol("dartx.album");
const $artist = dartx.artist = Symbol("dartx.artist");
const $artwork = dartx.artwork = Symbol("dartx.artwork");
const $addListener = dartx.addListener = Symbol("dartx.addListener");
const $removeListener = dartx.removeListener = Symbol("dartx.removeListener");
const $audioBitsPerSecond = dartx.audioBitsPerSecond = Symbol("dartx.audioBitsPerSecond");
const $mimeType = dartx.mimeType = Symbol("dartx.mimeType");
const $stream = dartx.stream = Symbol("dartx.stream");
const $videoBitsPerSecond = dartx.videoBitsPerSecond = Symbol("dartx.videoBitsPerSecond");
const $requestData = dartx.requestData = Symbol("dartx.requestData");
const $resume = dartx.resume = Symbol("dartx.resume");
const $metadata = dartx.metadata = Symbol("dartx.metadata");
const $playbackState = dartx.playbackState = Symbol("dartx.playbackState");
const $setActionHandler = dartx.setActionHandler = Symbol("dartx.setActionHandler");
const $activeSourceBuffers = dartx.activeSourceBuffers = Symbol("dartx.activeSourceBuffers");
const $sourceBuffers = dartx.sourceBuffers = Symbol("dartx.sourceBuffers");
const $addSourceBuffer = dartx.addSourceBuffer = Symbol("dartx.addSourceBuffer");
const $clearLiveSeekableRange = dartx.clearLiveSeekableRange = Symbol("dartx.clearLiveSeekableRange");
const $endOfStream = dartx.endOfStream = Symbol("dartx.endOfStream");
const $removeSourceBuffer = dartx.removeSourceBuffer = Symbol("dartx.removeSourceBuffer");
const $setLiveSeekableRange = dartx.setLiveSeekableRange = Symbol("dartx.setLiveSeekableRange");
const $active = dartx.active = Symbol("dartx.active");
const $addTrack = dartx.addTrack = Symbol("dartx.addTrack");
const $getAudioTracks = dartx.getAudioTracks = Symbol("dartx.getAudioTracks");
const $getTrackById = dartx.getTrackById = Symbol("dartx.getTrackById");
const $getTracks = dartx.getTracks = Symbol("dartx.getTracks");
const $getVideoTracks = dartx.getVideoTracks = Symbol("dartx.getVideoTracks");
const $removeTrack = dartx.removeTrack = Symbol("dartx.removeTrack");
const $onAddTrack = dartx.onAddTrack = Symbol("dartx.onAddTrack");
const $onRemoveTrack = dartx.onRemoveTrack = Symbol("dartx.onRemoveTrack");
const $jsHeapSizeLimit = dartx.jsHeapSizeLimit = Symbol("dartx.jsHeapSizeLimit");
const $totalJSHeapSize = dartx.totalJSHeapSize = Symbol("dartx.totalJSHeapSize");
const $usedJSHeapSize = dartx.usedJSHeapSize = Symbol("dartx.usedJSHeapSize");
const $port1 = dartx.port1 = Symbol("dartx.port1");
const $port2 = dartx.port2 = Symbol("dartx.port2");
const $httpEquiv = dartx.httpEquiv = Symbol("dartx.httpEquiv");
const $modificationTime = dartx.modificationTime = Symbol("dartx.modificationTime");
const $high = dartx.high = Symbol("dartx.high");
const $low = dartx.low = Symbol("dartx.low");
const $optimum = dartx.optimum = Symbol("dartx.optimum");
const $inputs = dartx.inputs = Symbol("dartx.inputs");
const $outputs = dartx.outputs = Symbol("dartx.outputs");
const $sysexEnabled = dartx.sysexEnabled = Symbol("dartx.sysexEnabled");
const $onMidiMessage = dartx.onMidiMessage = Symbol("dartx.onMidiMessage");
const $connection = dartx.connection = Symbol("dartx.connection");
const $manufacturer = dartx.manufacturer = Symbol("dartx.manufacturer");
const $description = dartx.description = Symbol("dartx.description");
const $enabledPlugin = dartx.enabledPlugin = Symbol("dartx.enabledPlugin");
const $suffixes = dartx.suffixes = Symbol("dartx.suffixes");
const $cite = dartx.cite = Symbol("dartx.cite");
const $dateTime = dartx.dateTime = Symbol("dartx.dateTime");
const $button = dartx.button = Symbol("dartx.button");
const $fromElement = dartx.fromElement = Symbol("dartx.fromElement");
const $region = dartx.region = Symbol("dartx.region");
const $toElement = dartx.toElement = Symbol("dartx.toElement");
const $movement = dartx.movement = Symbol("dartx.movement");
const $screen = dartx.screen = Symbol("dartx.screen");
const $layer = dartx.layer = Symbol("dartx.layer");
const $dataTransfer = dartx.dataTransfer = Symbol("dartx.dataTransfer");
const $attrChange = dartx.attrChange = Symbol("dartx.attrChange");
const $attrName = dartx.attrName = Symbol("dartx.attrName");
const $newValue = dartx.newValue = Symbol("dartx.newValue");
const $prevValue = dartx.prevValue = Symbol("dartx.prevValue");
const $relatedNode = dartx.relatedNode = Symbol("dartx.relatedNode");
const $initMutationEvent = dartx.initMutationEvent = Symbol("dartx.initMutationEvent");
const $addedNodes = dartx.addedNodes = Symbol("dartx.addedNodes");
const $attributeName = dartx.attributeName = Symbol("dartx.attributeName");
const $attributeNamespace = dartx.attributeNamespace = Symbol("dartx.attributeNamespace");
const $nextSibling = dartx.nextSibling = Symbol("dartx.nextSibling");
const $oldValue = dartx.oldValue = Symbol("dartx.oldValue");
const $previousSibling = dartx.previousSibling = Symbol("dartx.previousSibling");
const $removedNodes = dartx.removedNodes = Symbol("dartx.removedNodes");
const $disable = dartx.disable = Symbol("dartx.disable");
const $enable = dartx.enable = Symbol("dartx.enable");
const $getState = dartx.getState = Symbol("dartx.getState");
const $getGamepads = dartx.getGamepads = Symbol("dartx.getGamepads");
const $language = dartx.language = Symbol("dartx.language");
const $getUserMedia = dartx.getUserMedia = Symbol("dartx.getUserMedia");
const $budget = dartx.budget = Symbol("dartx.budget");
const $clipboard = dartx.clipboard = Symbol("dartx.clipboard");
const $credentials = dartx.credentials = Symbol("dartx.credentials");
const $deviceMemory = dartx.deviceMemory = Symbol("dartx.deviceMemory");
const $doNotTrack = dartx.doNotTrack = Symbol("dartx.doNotTrack");
const $geolocation = dartx.geolocation = Symbol("dartx.geolocation");
const $maxTouchPoints = dartx.maxTouchPoints = Symbol("dartx.maxTouchPoints");
const $mediaCapabilities = dartx.mediaCapabilities = Symbol("dartx.mediaCapabilities");
const $mediaDevices = dartx.mediaDevices = Symbol("dartx.mediaDevices");
const $mediaSession = dartx.mediaSession = Symbol("dartx.mediaSession");
const $mimeTypes = dartx.mimeTypes = Symbol("dartx.mimeTypes");
const $nfc = dartx.nfc = Symbol("dartx.nfc");
const $permissions = dartx.permissions = Symbol("dartx.permissions");
const $presentation = dartx.presentation = Symbol("dartx.presentation");
const $productSub = dartx.productSub = Symbol("dartx.productSub");
const $serviceWorker = dartx.serviceWorker = Symbol("dartx.serviceWorker");
const $storage = dartx.storage = Symbol("dartx.storage");
const $vendor = dartx.vendor = Symbol("dartx.vendor");
const $vendorSub = dartx.vendorSub = Symbol("dartx.vendorSub");
const $vr = dartx.vr = Symbol("dartx.vr");
const $persistentStorage = dartx.persistentStorage = Symbol("dartx.persistentStorage");
const $temporaryStorage = dartx.temporaryStorage = Symbol("dartx.temporaryStorage");
const $cancelKeyboardLock = dartx.cancelKeyboardLock = Symbol("dartx.cancelKeyboardLock");
const $getBattery = dartx.getBattery = Symbol("dartx.getBattery");
const $getInstalledRelatedApps = dartx.getInstalledRelatedApps = Symbol("dartx.getInstalledRelatedApps");
const $getVRDisplays = dartx.getVRDisplays = Symbol("dartx.getVRDisplays");
const $registerProtocolHandler = dartx.registerProtocolHandler = Symbol("dartx.registerProtocolHandler");
const $requestKeyboardLock = dartx.requestKeyboardLock = Symbol("dartx.requestKeyboardLock");
const $requestMidiAccess = dartx.requestMidiAccess = Symbol("dartx.requestMidiAccess");
const $requestMediaKeySystemAccess = dartx.requestMediaKeySystemAccess = Symbol("dartx.requestMediaKeySystemAccess");
const $sendBeacon = dartx.sendBeacon = Symbol("dartx.sendBeacon");
const $share = dartx.share = Symbol("dartx.share");
const $webdriver = dartx.webdriver = Symbol("dartx.webdriver");
const $cookieEnabled = dartx.cookieEnabled = Symbol("dartx.cookieEnabled");
const $appCodeName = dartx.appCodeName = Symbol("dartx.appCodeName");
const $appName = dartx.appName = Symbol("dartx.appName");
const $appVersion = dartx.appVersion = Symbol("dartx.appVersion");
const $dartEnabled = dartx.dartEnabled = Symbol("dartx.dartEnabled");
const $platform = dartx.platform = Symbol("dartx.platform");
const $product = dartx.product = Symbol("dartx.product");
const $userAgent = dartx.userAgent = Symbol("dartx.userAgent");
const $languages = dartx.languages = Symbol("dartx.languages");
const $onLine = dartx.onLine = Symbol("dartx.onLine");
const $hardwareConcurrency = dartx.hardwareConcurrency = Symbol("dartx.hardwareConcurrency");
const $constraintName = dartx.constraintName = Symbol("dartx.constraintName");
const $downlink = dartx.downlink = Symbol("dartx.downlink");
const $downlinkMax = dartx.downlinkMax = Symbol("dartx.downlinkMax");
const $effectiveType = dartx.effectiveType = Symbol("dartx.effectiveType");
const $rtt = dartx.rtt = Symbol("dartx.rtt");
const $pointerBeforeReferenceNode = dartx.pointerBeforeReferenceNode = Symbol("dartx.pointerBeforeReferenceNode");
const $referenceNode = dartx.referenceNode = Symbol("dartx.referenceNode");
const $whatToShow = dartx.whatToShow = Symbol("dartx.whatToShow");
const $detach = dartx.detach = Symbol("dartx.detach");
const $actions = dartx.actions = Symbol("dartx.actions");
const $badge = dartx.badge = Symbol("dartx.badge");
const $icon = dartx.icon = Symbol("dartx.icon");
const $image = dartx.image = Symbol("dartx.image");
const $renotify = dartx.renotify = Symbol("dartx.renotify");
const $requireInteraction = dartx.requireInteraction = Symbol("dartx.requireInteraction");
const $silent = dartx.silent = Symbol("dartx.silent");
const $tag = dartx.tag = Symbol("dartx.tag");
const $vibrate = dartx.vibrate = Symbol("dartx.vibrate");
const $onShow = dartx.onShow = Symbol("dartx.onShow");
const $notification = dartx.notification = Symbol("dartx.notification");
const $reply = dartx.reply = Symbol("dartx.reply");
const $convertToBlob = dartx.convertToBlob = Symbol("dartx.convertToBlob");
const $transferToImageBitmap = dartx.transferToImageBitmap = Symbol("dartx.transferToImageBitmap");
const $commit = dartx.commit = Symbol("dartx.commit");
const $defaultSelected = dartx.defaultSelected = Symbol("dartx.defaultSelected");
const $constraint = dartx.constraint = Symbol("dartx.constraint");
const $persisted = dartx.persisted = Symbol("dartx.persisted");
const $devicePixelRatio = dartx.devicePixelRatio = Symbol("dartx.devicePixelRatio");
const $registerPaint = dartx.registerPaint = Symbol("dartx.registerPaint");
const $additionalData = dartx.additionalData = Symbol("dartx.additionalData");
const $idName = dartx.idName = Symbol("dartx.idName");
const $passwordName = dartx.passwordName = Symbol("dartx.passwordName");
const $addPath = dartx.addPath = Symbol("dartx.addPath");
const $addressLine = dartx.addressLine = Symbol("dartx.addressLine");
const $city = dartx.city = Symbol("dartx.city");
const $country = dartx.country = Symbol("dartx.country");
const $dependentLocality = dartx.dependentLocality = Symbol("dartx.dependentLocality");
const $languageCode = dartx.languageCode = Symbol("dartx.languageCode");
const $organization = dartx.organization = Symbol("dartx.organization");
const $phone = dartx.phone = Symbol("dartx.phone");
const $postalCode = dartx.postalCode = Symbol("dartx.postalCode");
const $recipient = dartx.recipient = Symbol("dartx.recipient");
const $sortingCode = dartx.sortingCode = Symbol("dartx.sortingCode");
const $instruments = dartx.instruments = Symbol("dartx.instruments");
const $userHint = dartx.userHint = Symbol("dartx.userHint");
const $shippingAddress = dartx.shippingAddress = Symbol("dartx.shippingAddress");
const $shippingOption = dartx.shippingOption = Symbol("dartx.shippingOption");
const $shippingType = dartx.shippingType = Symbol("dartx.shippingType");
const $canMakePayment = dartx.canMakePayment = Symbol("dartx.canMakePayment");
const $instrumentKey = dartx.instrumentKey = Symbol("dartx.instrumentKey");
const $paymentRequestId = dartx.paymentRequestId = Symbol("dartx.paymentRequestId");
const $total = dartx.total = Symbol("dartx.total");
const $updateWith = dartx.updateWith = Symbol("dartx.updateWith");
const $methodName = dartx.methodName = Symbol("dartx.methodName");
const $payerEmail = dartx.payerEmail = Symbol("dartx.payerEmail");
const $payerName = dartx.payerName = Symbol("dartx.payerName");
const $payerPhone = dartx.payerPhone = Symbol("dartx.payerPhone");
const $requestId = dartx.requestId = Symbol("dartx.requestId");
const $memory = dartx.memory = Symbol("dartx.memory");
const $navigation = dartx.navigation = Symbol("dartx.navigation");
const $timeOrigin = dartx.timeOrigin = Symbol("dartx.timeOrigin");
const $clearMarks = dartx.clearMarks = Symbol("dartx.clearMarks");
const $clearMeasures = dartx.clearMeasures = Symbol("dartx.clearMeasures");
const $clearResourceTimings = dartx.clearResourceTimings = Symbol("dartx.clearResourceTimings");
const $getEntries = dartx.getEntries = Symbol("dartx.getEntries");
const $getEntriesByName = dartx.getEntriesByName = Symbol("dartx.getEntriesByName");
const $getEntriesByType = dartx.getEntriesByType = Symbol("dartx.getEntriesByType");
const $mark = dartx.mark = Symbol("dartx.mark");
const $measure = dartx.measure = Symbol("dartx.measure");
const $now = dartx.now = Symbol("dartx.now");
const $setResourceTimingBufferSize = dartx.setResourceTimingBufferSize = Symbol("dartx.setResourceTimingBufferSize");
const $entryType = dartx.entryType = Symbol("dartx.entryType");
const $attribution = dartx.attribution = Symbol("dartx.attribution");
const $redirectCount = dartx.redirectCount = Symbol("dartx.redirectCount");
const $domComplete = dartx.domComplete = Symbol("dartx.domComplete");
const $domContentLoadedEventEnd = dartx.domContentLoadedEventEnd = Symbol("dartx.domContentLoadedEventEnd");
const $domContentLoadedEventStart = dartx.domContentLoadedEventStart = Symbol("dartx.domContentLoadedEventStart");
const $domInteractive = dartx.domInteractive = Symbol("dartx.domInteractive");
const $loadEventEnd = dartx.loadEventEnd = Symbol("dartx.loadEventEnd");
const $loadEventStart = dartx.loadEventStart = Symbol("dartx.loadEventStart");
const $unloadEventEnd = dartx.unloadEventEnd = Symbol("dartx.unloadEventEnd");
const $unloadEventStart = dartx.unloadEventStart = Symbol("dartx.unloadEventStart");
const $connectEnd = dartx.connectEnd = Symbol("dartx.connectEnd");
const $connectStart = dartx.connectStart = Symbol("dartx.connectStart");
const $decodedBodySize = dartx.decodedBodySize = Symbol("dartx.decodedBodySize");
const $domainLookupEnd = dartx.domainLookupEnd = Symbol("dartx.domainLookupEnd");
const $domainLookupStart = dartx.domainLookupStart = Symbol("dartx.domainLookupStart");
const $encodedBodySize = dartx.encodedBodySize = Symbol("dartx.encodedBodySize");
const $fetchStart = dartx.fetchStart = Symbol("dartx.fetchStart");
const $initiatorType = dartx.initiatorType = Symbol("dartx.initiatorType");
const $nextHopProtocol = dartx.nextHopProtocol = Symbol("dartx.nextHopProtocol");
const $redirectEnd = dartx.redirectEnd = Symbol("dartx.redirectEnd");
const $redirectStart = dartx.redirectStart = Symbol("dartx.redirectStart");
const $requestStart = dartx.requestStart = Symbol("dartx.requestStart");
const $responseEnd = dartx.responseEnd = Symbol("dartx.responseEnd");
const $responseStart = dartx.responseStart = Symbol("dartx.responseStart");
const $secureConnectionStart = dartx.secureConnectionStart = Symbol("dartx.secureConnectionStart");
const $serverTiming = dartx.serverTiming = Symbol("dartx.serverTiming");
const $transferSize = dartx.transferSize = Symbol("dartx.transferSize");
const $workerStart = dartx.workerStart = Symbol("dartx.workerStart");
const $domLoading = dartx.domLoading = Symbol("dartx.domLoading");
const $navigationStart = dartx.navigationStart = Symbol("dartx.navigationStart");
const $query = dartx.query = Symbol("dartx.query");
const $requestAll = dartx.requestAll = Symbol("dartx.requestAll");
const $revoke = dartx.revoke = Symbol("dartx.revoke");
const $fillLightMode = dartx.fillLightMode = Symbol("dartx.fillLightMode");
const $imageHeight = dartx.imageHeight = Symbol("dartx.imageHeight");
const $imageWidth = dartx.imageWidth = Symbol("dartx.imageWidth");
const $redEyeReduction = dartx.redEyeReduction = Symbol("dartx.redEyeReduction");
const $refresh = dartx.refresh = Symbol("dartx.refresh");
const $isPrimary = dartx.isPrimary = Symbol("dartx.isPrimary");
const $pointerId = dartx.pointerId = Symbol("dartx.pointerId");
const $pointerType = dartx.pointerType = Symbol("dartx.pointerType");
const $pressure = dartx.pressure = Symbol("dartx.pressure");
const $tangentialPressure = dartx.tangentialPressure = Symbol("dartx.tangentialPressure");
const $tiltX = dartx.tiltX = Symbol("dartx.tiltX");
const $tiltY = dartx.tiltY = Symbol("dartx.tiltY");
const $twist = dartx.twist = Symbol("dartx.twist");
const $getCoalescedEvents = dartx.getCoalescedEvents = Symbol("dartx.getCoalescedEvents");
const $defaultRequest = dartx.defaultRequest = Symbol("dartx.defaultRequest");
const $receiver = dartx.receiver = Symbol("dartx.receiver");
const $binaryType = dartx.binaryType = Symbol("dartx.binaryType");
const $terminate = dartx.terminate = Symbol("dartx.terminate");
const $connections = dartx.connections = Symbol("dartx.connections");
const $connectionList = dartx.connectionList = Symbol("dartx.connectionList");
const $getAvailability = dartx.getAvailability = Symbol("dartx.getAvailability");
const $reconnect = dartx.reconnect = Symbol("dartx.reconnect");
const $lengthComputable = dartx.lengthComputable = Symbol("dartx.lengthComputable");
const $promise = dartx.promise = Symbol("dartx.promise");
const $rawId = dartx.rawId = Symbol("dartx.rawId");
const $getSubscription = dartx.getSubscription = Symbol("dartx.getSubscription");
const $permissionState = dartx.permissionState = Symbol("dartx.permissionState");
const $subscribe = dartx.subscribe = Symbol("dartx.subscribe");
const $endpoint = dartx.endpoint = Symbol("dartx.endpoint");
const $expirationTime = dartx.expirationTime = Symbol("dartx.expirationTime");
const $unsubscribe = dartx.unsubscribe = Symbol("dartx.unsubscribe");
const $applicationServerKey = dartx.applicationServerKey = Symbol("dartx.applicationServerKey");
const $userVisibleOnly = dartx.userVisibleOnly = Symbol("dartx.userVisibleOnly");
const $collapsed = dartx.collapsed = Symbol("dartx.collapsed");
const $commonAncestorContainer = dartx.commonAncestorContainer = Symbol("dartx.commonAncestorContainer");
const $endContainer = dartx.endContainer = Symbol("dartx.endContainer");
const $endOffset = dartx.endOffset = Symbol("dartx.endOffset");
const $startContainer = dartx.startContainer = Symbol("dartx.startContainer");
const $startOffset = dartx.startOffset = Symbol("dartx.startOffset");
const $cloneContents = dartx.cloneContents = Symbol("dartx.cloneContents");
const $cloneRange = dartx.cloneRange = Symbol("dartx.cloneRange");
const $collapse = dartx.collapse = Symbol("dartx.collapse");
const $compareBoundaryPoints = dartx.compareBoundaryPoints = Symbol("dartx.compareBoundaryPoints");
const $comparePoint = dartx.comparePoint = Symbol("dartx.comparePoint");
const $createContextualFragment = dartx.createContextualFragment = Symbol("dartx.createContextualFragment");
const $deleteContents = dartx.deleteContents = Symbol("dartx.deleteContents");
const $extractContents = dartx.extractContents = Symbol("dartx.extractContents");
const $insertNode = dartx.insertNode = Symbol("dartx.insertNode");
const $isPointInRange = dartx.isPointInRange = Symbol("dartx.isPointInRange");
const $selectNode = dartx.selectNode = Symbol("dartx.selectNode");
const $selectNodeContents = dartx.selectNodeContents = Symbol("dartx.selectNodeContents");
const $setEnd = dartx.setEnd = Symbol("dartx.setEnd");
const $setEndAfter = dartx.setEndAfter = Symbol("dartx.setEndAfter");
const $setEndBefore = dartx.setEndBefore = Symbol("dartx.setEndBefore");
const $setStart = dartx.setStart = Symbol("dartx.setStart");
const $setStartAfter = dartx.setStartAfter = Symbol("dartx.setStartAfter");
const $setStartBefore = dartx.setStartBefore = Symbol("dartx.setStartBefore");
const $surroundContents = dartx.surroundContents = Symbol("dartx.surroundContents");
const $cancelWatchAvailability = dartx.cancelWatchAvailability = Symbol("dartx.cancelWatchAvailability");
const $watchAvailability = dartx.watchAvailability = Symbol("dartx.watchAvailability");
const $contentRect = dartx.contentRect = Symbol("dartx.contentRect");
const $expires = dartx.expires = Symbol("dartx.expires");
const $getFingerprints = dartx.getFingerprints = Symbol("dartx.getFingerprints");
const $bufferedAmount = dartx.bufferedAmount = Symbol("dartx.bufferedAmount");
const $bufferedAmountLowThreshold = dartx.bufferedAmountLowThreshold = Symbol("dartx.bufferedAmountLowThreshold");
const $maxRetransmitTime = dartx.maxRetransmitTime = Symbol("dartx.maxRetransmitTime");
const $maxRetransmits = dartx.maxRetransmits = Symbol("dartx.maxRetransmits");
const $negotiated = dartx.negotiated = Symbol("dartx.negotiated");
const $ordered = dartx.ordered = Symbol("dartx.ordered");
const $reliable = dartx.reliable = Symbol("dartx.reliable");
const $sendBlob = dartx.sendBlob = Symbol("dartx.sendBlob");
const $sendByteBuffer = dartx.sendByteBuffer = Symbol("dartx.sendByteBuffer");
const $sendString = dartx.sendString = Symbol("dartx.sendString");
const $sendTypedData = dartx.sendTypedData = Symbol("dartx.sendTypedData");
const $channel = dartx.channel = Symbol("dartx.channel");
const $canInsertDtmf = dartx.canInsertDtmf = Symbol("dartx.canInsertDtmf");
const $interToneGap = dartx.interToneGap = Symbol("dartx.interToneGap");
const $toneBuffer = dartx.toneBuffer = Symbol("dartx.toneBuffer");
const $insertDtmf = dartx.insertDtmf = Symbol("dartx.insertDtmf");
const $onToneChange = dartx.onToneChange = Symbol("dartx.onToneChange");
const $tone = dartx.tone = Symbol("dartx.tone");
const $candidate = dartx.candidate = Symbol("dartx.candidate");
const $sdpMLineIndex = dartx.sdpMLineIndex = Symbol("dartx.sdpMLineIndex");
const $sdpMid = dartx.sdpMid = Symbol("dartx.sdpMid");
const $names = dartx.names = Symbol("dartx.names");
const $stat = dartx.stat = Symbol("dartx.stat");
const $getLegacyStats = dartx.getLegacyStats = Symbol("dartx.getLegacyStats");
const $iceConnectionState = dartx.iceConnectionState = Symbol("dartx.iceConnectionState");
const $iceGatheringState = dartx.iceGatheringState = Symbol("dartx.iceGatheringState");
const $localDescription = dartx.localDescription = Symbol("dartx.localDescription");
const $remoteDescription = dartx.remoteDescription = Symbol("dartx.remoteDescription");
const $signalingState = dartx.signalingState = Symbol("dartx.signalingState");
const $addIceCandidate = dartx.addIceCandidate = Symbol("dartx.addIceCandidate");
const $addStream = dartx.addStream = Symbol("dartx.addStream");
const $createAnswer = dartx.createAnswer = Symbol("dartx.createAnswer");
const $createDtmfSender = dartx.createDtmfSender = Symbol("dartx.createDtmfSender");
const $createDataChannel = dartx.createDataChannel = Symbol("dartx.createDataChannel");
const $createOffer = dartx.createOffer = Symbol("dartx.createOffer");
const $getLocalStreams = dartx.getLocalStreams = Symbol("dartx.getLocalStreams");
const $getReceivers = dartx.getReceivers = Symbol("dartx.getReceivers");
const $getRemoteStreams = dartx.getRemoteStreams = Symbol("dartx.getRemoteStreams");
const $getSenders = dartx.getSenders = Symbol("dartx.getSenders");
const $getStats = dartx.getStats = Symbol("dartx.getStats");
const $removeStream = dartx.removeStream = Symbol("dartx.removeStream");
const $setConfiguration = dartx.setConfiguration = Symbol("dartx.setConfiguration");
const $setLocalDescription = dartx.setLocalDescription = Symbol("dartx.setLocalDescription");
const $setRemoteDescription = dartx.setRemoteDescription = Symbol("dartx.setRemoteDescription");
const $onAddStream = dartx.onAddStream = Symbol("dartx.onAddStream");
const $onDataChannel = dartx.onDataChannel = Symbol("dartx.onDataChannel");
const $onIceCandidate = dartx.onIceCandidate = Symbol("dartx.onIceCandidate");
const $onIceConnectionStateChange = dartx.onIceConnectionStateChange = Symbol("dartx.onIceConnectionStateChange");
const $onNegotiationNeeded = dartx.onNegotiationNeeded = Symbol("dartx.onNegotiationNeeded");
const $onRemoveStream = dartx.onRemoveStream = Symbol("dartx.onRemoveStream");
const $onSignalingStateChange = dartx.onSignalingStateChange = Symbol("dartx.onSignalingStateChange");
const $getContributingSources = dartx.getContributingSources = Symbol("dartx.getContributingSources");
const $sdp = dartx.sdp = Symbol("dartx.sdp");
const $streams = dartx.streams = Symbol("dartx.streams");
const $available = dartx.available = Symbol("dartx.available");
const $colorDepth = dartx.colorDepth = Symbol("dartx.colorDepth");
const $keepAwake = dartx.keepAwake = Symbol("dartx.keepAwake");
const $pixelDepth = dartx.pixelDepth = Symbol("dartx.pixelDepth");
const $lock = dartx.lock = Symbol("dartx.lock");
const $unlock = dartx.unlock = Symbol("dartx.unlock");
const $charset = dartx.charset = Symbol("dartx.charset");
const $defer = dartx.defer = Symbol("dartx.defer");
const $noModule = dartx.noModule = Symbol("dartx.noModule");
const $deltaGranularity = dartx.deltaGranularity = Symbol("dartx.deltaGranularity");
const $deltaX = dartx.deltaX = Symbol("dartx.deltaX");
const $deltaY = dartx.deltaY = Symbol("dartx.deltaY");
const $fromUserInput = dartx.fromUserInput = Symbol("dartx.fromUserInput");
const $inInertialPhase = dartx.inInertialPhase = Symbol("dartx.inInertialPhase");
const $isBeginning = dartx.isBeginning = Symbol("dartx.isBeginning");
const $isDirectManipulation = dartx.isDirectManipulation = Symbol("dartx.isDirectManipulation");
const $isEnding = dartx.isEnding = Symbol("dartx.isEnding");
const $positionX = dartx.positionX = Symbol("dartx.positionX");
const $positionY = dartx.positionY = Symbol("dartx.positionY");
const $velocityX = dartx.velocityX = Symbol("dartx.velocityX");
const $velocityY = dartx.velocityY = Symbol("dartx.velocityY");
const $consumeDelta = dartx.consumeDelta = Symbol("dartx.consumeDelta");
const $distributeToScrollChainDescendant = dartx.distributeToScrollChainDescendant = Symbol("dartx.distributeToScrollChainDescendant");
const $scrollSource = dartx.scrollSource = Symbol("dartx.scrollSource");
const $timeRange = dartx.timeRange = Symbol("dartx.timeRange");
const $blockedUri = dartx.blockedUri = Symbol("dartx.blockedUri");
const $columnNumber = dartx.columnNumber = Symbol("dartx.columnNumber");
const $disposition = dartx.disposition = Symbol("dartx.disposition");
const $documentUri = dartx.documentUri = Symbol("dartx.documentUri");
const $effectiveDirective = dartx.effectiveDirective = Symbol("dartx.effectiveDirective");
const $originalPolicy = dartx.originalPolicy = Symbol("dartx.originalPolicy");
const $sample = dartx.sample = Symbol("dartx.sample");
const $statusCode = dartx.statusCode = Symbol("dartx.statusCode");
const $violatedDirective = dartx.violatedDirective = Symbol("dartx.violatedDirective");
const $selectedIndex = dartx.selectedIndex = Symbol("dartx.selectedIndex");
const $selectedOptions = dartx.selectedOptions = Symbol("dartx.selectedOptions");
const $anchorNode = dartx.anchorNode = Symbol("dartx.anchorNode");
const $anchorOffset = dartx.anchorOffset = Symbol("dartx.anchorOffset");
const $baseNode = dartx.baseNode = Symbol("dartx.baseNode");
const $baseOffset = dartx.baseOffset = Symbol("dartx.baseOffset");
const $extentNode = dartx.extentNode = Symbol("dartx.extentNode");
const $extentOffset = dartx.extentOffset = Symbol("dartx.extentOffset");
const $focusNode = dartx.focusNode = Symbol("dartx.focusNode");
const $focusOffset = dartx.focusOffset = Symbol("dartx.focusOffset");
const $isCollapsed = dartx.isCollapsed = Symbol("dartx.isCollapsed");
const $rangeCount = dartx.rangeCount = Symbol("dartx.rangeCount");
const $addRange = dartx.addRange = Symbol("dartx.addRange");
const $collapseToEnd = dartx.collapseToEnd = Symbol("dartx.collapseToEnd");
const $collapseToStart = dartx.collapseToStart = Symbol("dartx.collapseToStart");
const $containsNode = dartx.containsNode = Symbol("dartx.containsNode");
const $deleteFromDocument = dartx.deleteFromDocument = Symbol("dartx.deleteFromDocument");
const $empty = dartx.empty = Symbol("dartx.empty");
const $extend = dartx.extend = Symbol("dartx.extend");
const $getRangeAt = dartx.getRangeAt = Symbol("dartx.getRangeAt");
const $modify = dartx.modify = Symbol("dartx.modify");
const $removeAllRanges = dartx.removeAllRanges = Symbol("dartx.removeAllRanges");
const $selectAllChildren = dartx.selectAllChildren = Symbol("dartx.selectAllChildren");
const $setBaseAndExtent = dartx.setBaseAndExtent = Symbol("dartx.setBaseAndExtent");
const $setPosition = dartx.setPosition = Symbol("dartx.setPosition");
const $scriptUrl = dartx.scriptUrl = Symbol("dartx.scriptUrl");
const $controller = dartx.controller = Symbol("dartx.controller");
const $getRegistration = dartx.getRegistration = Symbol("dartx.getRegistration");
const $getRegistrations = dartx.getRegistrations = Symbol("dartx.getRegistrations");
const $clients = dartx.clients = Symbol("dartx.clients");
const $registration = dartx.registration = Symbol("dartx.registration");
const $skipWaiting = dartx.skipWaiting = Symbol("dartx.skipWaiting");
const $onActivate = dartx.onActivate = Symbol("dartx.onActivate");
const $onFetch = dartx.onFetch = Symbol("dartx.onFetch");
const $onForeignfetch = dartx.onForeignfetch = Symbol("dartx.onForeignfetch");
const $onInstall = dartx.onInstall = Symbol("dartx.onInstall");
const $backgroundFetch = dartx.backgroundFetch = Symbol("dartx.backgroundFetch");
const $installing = dartx.installing = Symbol("dartx.installing");
const $navigationPreload = dartx.navigationPreload = Symbol("dartx.navigationPreload");
const $paymentManager = dartx.paymentManager = Symbol("dartx.paymentManager");
const $pushManager = dartx.pushManager = Symbol("dartx.pushManager");
const $sync = dartx.sync = Symbol("dartx.sync");
const $waiting = dartx.waiting = Symbol("dartx.waiting");
const $getNotifications = dartx.getNotifications = Symbol("dartx.getNotifications");
const $showNotification = dartx.showNotification = Symbol("dartx.showNotification");
const $unregister = dartx.unregister = Symbol("dartx.unregister");
const $delegatesFocus = dartx.delegatesFocus = Symbol("dartx.delegatesFocus");
const $olderShadowRoot = dartx.olderShadowRoot = Symbol("dartx.olderShadowRoot");
const $resetStyleInheritance = dartx.resetStyleInheritance = Symbol("dartx.resetStyleInheritance");
const $applyAuthorStyles = dartx.applyAuthorStyles = Symbol("dartx.applyAuthorStyles");
const $byteLength = dartx.byteLength = Symbol("dartx.byteLength");
const $onConnect = dartx.onConnect = Symbol("dartx.onConnect");
const $assignedNodes = dartx.assignedNodes = Symbol("dartx.assignedNodes");
const $appendWindowEnd = dartx.appendWindowEnd = Symbol("dartx.appendWindowEnd");
const $appendWindowStart = dartx.appendWindowStart = Symbol("dartx.appendWindowStart");
const $timestampOffset = dartx.timestampOffset = Symbol("dartx.timestampOffset");
const $trackDefaults = dartx.trackDefaults = Symbol("dartx.trackDefaults");
const $updating = dartx.updating = Symbol("dartx.updating");
const $appendBuffer = dartx.appendBuffer = Symbol("dartx.appendBuffer");
const $appendTypedData = dartx.appendTypedData = Symbol("dartx.appendTypedData");
const $addFromString = dartx.addFromString = Symbol("dartx.addFromString");
const $addFromUri = dartx.addFromUri = Symbol("dartx.addFromUri");
const $audioTrack = dartx.audioTrack = Symbol("dartx.audioTrack");
const $continuous = dartx.continuous = Symbol("dartx.continuous");
const $grammars = dartx.grammars = Symbol("dartx.grammars");
const $interimResults = dartx.interimResults = Symbol("dartx.interimResults");
const $maxAlternatives = dartx.maxAlternatives = Symbol("dartx.maxAlternatives");
const $onAudioEnd = dartx.onAudioEnd = Symbol("dartx.onAudioEnd");
const $onAudioStart = dartx.onAudioStart = Symbol("dartx.onAudioStart");
const $onEnd = dartx.onEnd = Symbol("dartx.onEnd");
const $onNoMatch = dartx.onNoMatch = Symbol("dartx.onNoMatch");
const $onResult = dartx.onResult = Symbol("dartx.onResult");
const $onSoundEnd = dartx.onSoundEnd = Symbol("dartx.onSoundEnd");
const $onSoundStart = dartx.onSoundStart = Symbol("dartx.onSoundStart");
const $onSpeechEnd = dartx.onSpeechEnd = Symbol("dartx.onSpeechEnd");
const $onSpeechStart = dartx.onSpeechStart = Symbol("dartx.onSpeechStart");
const $onStart = dartx.onStart = Symbol("dartx.onStart");
const $confidence = dartx.confidence = Symbol("dartx.confidence");
const $transcript = dartx.transcript = Symbol("dartx.transcript");
const $emma = dartx.emma = Symbol("dartx.emma");
const $interpretation = dartx.interpretation = Symbol("dartx.interpretation");
const $resultIndex = dartx.resultIndex = Symbol("dartx.resultIndex");
const $results = dartx.results = Symbol("dartx.results");
const $isFinal = dartx.isFinal = Symbol("dartx.isFinal");
const $getVoices = dartx.getVoices = Symbol("dartx.getVoices");
const $pending = dartx.pending = Symbol("dartx.pending");
const $speaking = dartx.speaking = Symbol("dartx.speaking");
const $charIndex = dartx.charIndex = Symbol("dartx.charIndex");
const $utterance = dartx.utterance = Symbol("dartx.utterance");
const $pitch = dartx.pitch = Symbol("dartx.pitch");
const $rate = dartx.rate = Symbol("dartx.rate");
const $voice = dartx.voice = Symbol("dartx.voice");
const $onBoundary = dartx.onBoundary = Symbol("dartx.onBoundary");
const $onMark = dartx.onMark = Symbol("dartx.onMark");
const $onResume = dartx.onResume = Symbol("dartx.onResume");
const $localService = dartx.localService = Symbol("dartx.localService");
const $voiceUri = dartx.voiceUri = Symbol("dartx.voiceUri");
const $storageArea = dartx.storageArea = Symbol("dartx.storageArea");
const $estimate = dartx.estimate = Symbol("dartx.estimate");
const $persist = dartx.persist = Symbol("dartx.persist");
const $matchMedium = dartx.matchMedium = Symbol("dartx.matchMedium");
const $getProperties = dartx.getProperties = Symbol("dartx.getProperties");
const $lastChance = dartx.lastChance = Symbol("dartx.lastChance");
const $getTags = dartx.getTags = Symbol("dartx.getTags");
const $cellIndex = dartx.cellIndex = Symbol("dartx.cellIndex");
const $headers = dartx.headers = Symbol("dartx.headers");
const $span = dartx.span = Symbol("dartx.span");
const $tBodies = dartx.tBodies = Symbol("dartx.tBodies");
const $rows = dartx.rows = Symbol("dartx.rows");
const $insertRow = dartx.insertRow = Symbol("dartx.insertRow");
const $addRow = dartx.addRow = Symbol("dartx.addRow");
const $createCaption = dartx.createCaption = Symbol("dartx.createCaption");
const $createTBody = dartx.createTBody = Symbol("dartx.createTBody");
const $createTFoot = dartx.createTFoot = Symbol("dartx.createTFoot");
const $createTHead = dartx.createTHead = Symbol("dartx.createTHead");
const $caption = dartx.caption = Symbol("dartx.caption");
const $tFoot = dartx.tFoot = Symbol("dartx.tFoot");
const $tHead = dartx.tHead = Symbol("dartx.tHead");
const $deleteCaption = dartx.deleteCaption = Symbol("dartx.deleteCaption");
const $deleteRow = dartx.deleteRow = Symbol("dartx.deleteRow");
const $deleteTFoot = dartx.deleteTFoot = Symbol("dartx.deleteTFoot");
const $deleteTHead = dartx.deleteTHead = Symbol("dartx.deleteTHead");
const $cells = dartx.cells = Symbol("dartx.cells");
const $insertCell = dartx.insertCell = Symbol("dartx.insertCell");
const $addCell = dartx.addCell = Symbol("dartx.addCell");
const $sectionRowIndex = dartx.sectionRowIndex = Symbol("dartx.sectionRowIndex");
const $deleteCell = dartx.deleteCell = Symbol("dartx.deleteCell");
const $containerId = dartx.containerId = Symbol("dartx.containerId");
const $containerName = dartx.containerName = Symbol("dartx.containerName");
const $containerSrc = dartx.containerSrc = Symbol("dartx.containerSrc");
const $containerType = dartx.containerType = Symbol("dartx.containerType");
const $cols = dartx.cols = Symbol("dartx.cols");
const $textLength = dartx.textLength = Symbol("dartx.textLength");
const $wrap = dartx.wrap = Symbol("dartx.wrap");
const $actualBoundingBoxAscent = dartx.actualBoundingBoxAscent = Symbol("dartx.actualBoundingBoxAscent");
const $actualBoundingBoxDescent = dartx.actualBoundingBoxDescent = Symbol("dartx.actualBoundingBoxDescent");
const $actualBoundingBoxLeft = dartx.actualBoundingBoxLeft = Symbol("dartx.actualBoundingBoxLeft");
const $actualBoundingBoxRight = dartx.actualBoundingBoxRight = Symbol("dartx.actualBoundingBoxRight");
const $alphabeticBaseline = dartx.alphabeticBaseline = Symbol("dartx.alphabeticBaseline");
const $emHeightAscent = dartx.emHeightAscent = Symbol("dartx.emHeightAscent");
const $emHeightDescent = dartx.emHeightDescent = Symbol("dartx.emHeightDescent");
const $fontBoundingBoxAscent = dartx.fontBoundingBoxAscent = Symbol("dartx.fontBoundingBoxAscent");
const $fontBoundingBoxDescent = dartx.fontBoundingBoxDescent = Symbol("dartx.fontBoundingBoxDescent");
const $hangingBaseline = dartx.hangingBaseline = Symbol("dartx.hangingBaseline");
const $ideographicBaseline = dartx.ideographicBaseline = Symbol("dartx.ideographicBaseline");
const $activeCues = dartx.activeCues = Symbol("dartx.activeCues");
const $cues = dartx.cues = Symbol("dartx.cues");
const $addCue = dartx.addCue = Symbol("dartx.addCue");
const $removeCue = dartx.removeCue = Symbol("dartx.removeCue");
const $onCueChange = dartx.onCueChange = Symbol("dartx.onCueChange");
const $endTime = dartx.endTime = Symbol("dartx.endTime");
const $pauseOnExit = dartx.pauseOnExit = Symbol("dartx.pauseOnExit");
const $onEnter = dartx.onEnter = Symbol("dartx.onEnter");
const $onExit = dartx.onExit = Symbol("dartx.onExit");
const $getCueById = dartx.getCueById = Symbol("dartx.getCueById");
const $end = dartx.end = Symbol("dartx.end");
const $force = dartx.force = Symbol("dartx.force");
const $identifier = dartx.identifier = Symbol("dartx.identifier");
const $rotationAngle = dartx.rotationAngle = Symbol("dartx.rotationAngle");
const $radiusX = dartx.radiusX = Symbol("dartx.radiusX");
const $radiusY = dartx.radiusY = Symbol("dartx.radiusY");
const $changedTouches = dartx.changedTouches = Symbol("dartx.changedTouches");
const $targetTouches = dartx.targetTouches = Symbol("dartx.targetTouches");
const $touches = dartx.touches = Symbol("dartx.touches");
const $byteStreamTrackID = dartx.byteStreamTrackID = Symbol("dartx.byteStreamTrackID");
const $kinds = dartx.kinds = Symbol("dartx.kinds");
const $srclang = dartx.srclang = Symbol("dartx.srclang");
const $propertyName = dartx.propertyName = Symbol("dartx.propertyName");
const $pseudoElement = dartx.pseudoElement = Symbol("dartx.pseudoElement");
const $currentNode = dartx.currentNode = Symbol("dartx.currentNode");
const $notifyLockAcquired = dartx.notifyLockAcquired = Symbol("dartx.notifyLockAcquired");
const $notifyLockReleased = dartx.notifyLockReleased = Symbol("dartx.notifyLockReleased");
const $pull = dartx.pull = Symbol("dartx.pull");
const $searchParams = dartx.searchParams = Symbol("dartx.searchParams");
const $getDevices = dartx.getDevices = Symbol("dartx.getDevices");
const $getTransformTo = dartx.getTransformTo = Symbol("dartx.getTransformTo");
const $deviceName = dartx.deviceName = Symbol("dartx.deviceName");
const $isExternal = dartx.isExternal = Symbol("dartx.isExternal");
const $requestSession = dartx.requestSession = Symbol("dartx.requestSession");
const $supportsSession = dartx.supportsSession = Symbol("dartx.supportsSession");
const $device = dartx.device = Symbol("dartx.device");
const $capabilities = dartx.capabilities = Symbol("dartx.capabilities");
const $depthFar = dartx.depthFar = Symbol("dartx.depthFar");
const $depthNear = dartx.depthNear = Symbol("dartx.depthNear");
const $displayName = dartx.displayName = Symbol("dartx.displayName");
const $isPresenting = dartx.isPresenting = Symbol("dartx.isPresenting");
const $stageParameters = dartx.stageParameters = Symbol("dartx.stageParameters");
const $cancelAnimationFrame = dartx.cancelAnimationFrame = Symbol("dartx.cancelAnimationFrame");
const $exitPresent = dartx.exitPresent = Symbol("dartx.exitPresent");
const $getEyeParameters = dartx.getEyeParameters = Symbol("dartx.getEyeParameters");
const $getFrameData = dartx.getFrameData = Symbol("dartx.getFrameData");
const $getLayers = dartx.getLayers = Symbol("dartx.getLayers");
const $requestAnimationFrame = dartx.requestAnimationFrame = Symbol("dartx.requestAnimationFrame");
const $requestPresent = dartx.requestPresent = Symbol("dartx.requestPresent");
const $submitFrame = dartx.submitFrame = Symbol("dartx.submitFrame");
const $canPresent = dartx.canPresent = Symbol("dartx.canPresent");
const $hasExternalDisplay = dartx.hasExternalDisplay = Symbol("dartx.hasExternalDisplay");
const $maxLayers = dartx.maxLayers = Symbol("dartx.maxLayers");
const $renderHeight = dartx.renderHeight = Symbol("dartx.renderHeight");
const $renderWidth = dartx.renderWidth = Symbol("dartx.renderWidth");
const $leftProjectionMatrix = dartx.leftProjectionMatrix = Symbol("dartx.leftProjectionMatrix");
const $leftViewMatrix = dartx.leftViewMatrix = Symbol("dartx.leftViewMatrix");
const $rightProjectionMatrix = dartx.rightProjectionMatrix = Symbol("dartx.rightProjectionMatrix");
const $rightViewMatrix = dartx.rightViewMatrix = Symbol("dartx.rightViewMatrix");
const $bounds = dartx.bounds = Symbol("dartx.bounds");
const $emulatedHeight = dartx.emulatedHeight = Symbol("dartx.emulatedHeight");
const $exclusive = dartx.exclusive = Symbol("dartx.exclusive");
const $requestFrameOfReference = dartx.requestFrameOfReference = Symbol("dartx.requestFrameOfReference");
const $session = dartx.session = Symbol("dartx.session");
const $geometry = dartx.geometry = Symbol("dartx.geometry");
const $sittingToStandingTransform = dartx.sittingToStandingTransform = Symbol("dartx.sittingToStandingTransform");
const $sizeX = dartx.sizeX = Symbol("dartx.sizeX");
const $sizeZ = dartx.sizeZ = Symbol("dartx.sizeZ");
const $badInput = dartx.badInput = Symbol("dartx.badInput");
const $customError = dartx.customError = Symbol("dartx.customError");
const $patternMismatch = dartx.patternMismatch = Symbol("dartx.patternMismatch");
const $rangeOverflow = dartx.rangeOverflow = Symbol("dartx.rangeOverflow");
const $rangeUnderflow = dartx.rangeUnderflow = Symbol("dartx.rangeUnderflow");
const $stepMismatch = dartx.stepMismatch = Symbol("dartx.stepMismatch");
const $tooLong = dartx.tooLong = Symbol("dartx.tooLong");
const $tooShort = dartx.tooShort = Symbol("dartx.tooShort");
const $typeMismatch = dartx.typeMismatch = Symbol("dartx.typeMismatch");
const $valid = dartx.valid = Symbol("dartx.valid");
const $valueMissing = dartx.valueMissing = Symbol("dartx.valueMissing");
const $poster = dartx.poster = Symbol("dartx.poster");
const $videoHeight = dartx.videoHeight = Symbol("dartx.videoHeight");
const $videoWidth = dartx.videoWidth = Symbol("dartx.videoWidth");
const $decodedFrameCount = dartx.decodedFrameCount = Symbol("dartx.decodedFrameCount");
const $droppedFrameCount = dartx.droppedFrameCount = Symbol("dartx.droppedFrameCount");
const $getVideoPlaybackQuality = dartx.getVideoPlaybackQuality = Symbol("dartx.getVideoPlaybackQuality");
const $enterFullscreen = dartx.enterFullscreen = Symbol("dartx.enterFullscreen");
const $corruptedVideoFrames = dartx.corruptedVideoFrames = Symbol("dartx.corruptedVideoFrames");
const $creationTime = dartx.creationTime = Symbol("dartx.creationTime");
const $droppedVideoFrames = dartx.droppedVideoFrames = Symbol("dartx.droppedVideoFrames");
const $totalVideoFrames = dartx.totalVideoFrames = Symbol("dartx.totalVideoFrames");
const $sourceBuffer = dartx.sourceBuffer = Symbol("dartx.sourceBuffer");
const $pageLeft = dartx.pageLeft = Symbol("dartx.pageLeft");
const $pageTop = dartx.pageTop = Symbol("dartx.pageTop");
const $align = dartx.align = Symbol("dartx.align");
const $line = dartx.line = Symbol("dartx.line");
const $snapToLines = dartx.snapToLines = Symbol("dartx.snapToLines");
const $vertical = dartx.vertical = Symbol("dartx.vertical");
const $getCueAsHtml = dartx.getCueAsHtml = Symbol("dartx.getCueAsHtml");
const $lines = dartx.lines = Symbol("dartx.lines");
const $regionAnchorX = dartx.regionAnchorX = Symbol("dartx.regionAnchorX");
const $regionAnchorY = dartx.regionAnchorY = Symbol("dartx.regionAnchorY");
const $viewportAnchorX = dartx.viewportAnchorX = Symbol("dartx.viewportAnchorX");
const $viewportAnchorY = dartx.viewportAnchorY = Symbol("dartx.viewportAnchorY");
const $extensions = dartx.extensions = Symbol("dartx.extensions");
const $deltaZ = dartx.deltaZ = Symbol("dartx.deltaZ");
const $deltaMode = dartx.deltaMode = Symbol("dartx.deltaMode");
const $animationFrame = dartx.animationFrame = Symbol("dartx.animationFrame");
const $document = dartx.document = Symbol("dartx.document");
const $requestFileSystem = dartx.requestFileSystem = Symbol("dartx.requestFileSystem");
const $animationWorklet = dartx.animationWorklet = Symbol("dartx.animationWorklet");
const $applicationCache = dartx.applicationCache = Symbol("dartx.applicationCache");
const $audioWorklet = dartx.audioWorklet = Symbol("dartx.audioWorklet");
const $cookieStore = dartx.cookieStore = Symbol("dartx.cookieStore");
const $customElements = dartx.customElements = Symbol("dartx.customElements");
const $defaultStatus = dartx.defaultStatus = Symbol("dartx.defaultStatus");
const $defaultstatus = dartx.defaultstatus = Symbol("dartx.defaultstatus");
const $external = dartx.external = Symbol("dartx.external");
const $history = dartx.history = Symbol("dartx.history");
const $innerHeight = dartx.innerHeight = Symbol("dartx.innerHeight");
const $innerWidth = dartx.innerWidth = Symbol("dartx.innerWidth");
const $localStorage = dartx.localStorage = Symbol("dartx.localStorage");
const $locationbar = dartx.locationbar = Symbol("dartx.locationbar");
const $menubar = dartx.menubar = Symbol("dartx.menubar");
const $offscreenBuffering = dartx.offscreenBuffering = Symbol("dartx.offscreenBuffering");
const $opener = dartx.opener = Symbol("dartx.opener");
const $outerHeight = dartx.outerHeight = Symbol("dartx.outerHeight");
const $outerWidth = dartx.outerWidth = Symbol("dartx.outerWidth");
const $screenLeft = dartx.screenLeft = Symbol("dartx.screenLeft");
const $screenTop = dartx.screenTop = Symbol("dartx.screenTop");
const $screenX = dartx.screenX = Symbol("dartx.screenX");
const $screenY = dartx.screenY = Symbol("dartx.screenY");
const $scrollbars = dartx.scrollbars = Symbol("dartx.scrollbars");
const $sessionStorage = dartx.sessionStorage = Symbol("dartx.sessionStorage");
const $speechSynthesis = dartx.speechSynthesis = Symbol("dartx.speechSynthesis");
const $statusbar = dartx.statusbar = Symbol("dartx.statusbar");
const $styleMedia = dartx.styleMedia = Symbol("dartx.styleMedia");
const $toolbar = dartx.toolbar = Symbol("dartx.toolbar");
const $visualViewport = dartx.visualViewport = Symbol("dartx.visualViewport");
const $alert = dartx.alert = Symbol("dartx.alert");
const $cancelIdleCallback = dartx.cancelIdleCallback = Symbol("dartx.cancelIdleCallback");
const $confirm = dartx.confirm = Symbol("dartx.confirm");
const $find = dartx.find = Symbol("dartx.find");
const $getComputedStyleMap = dartx.getComputedStyleMap = Symbol("dartx.getComputedStyleMap");
const $getMatchedCssRules = dartx.getMatchedCssRules = Symbol("dartx.getMatchedCssRules");
const $matchMedia = dartx.matchMedia = Symbol("dartx.matchMedia");
const $moveBy = dartx.moveBy = Symbol("dartx.moveBy");
const $print = dartx.print = Symbol("dartx.print");
const $requestIdleCallback = dartx.requestIdleCallback = Symbol("dartx.requestIdleCallback");
const $resizeBy = dartx.resizeBy = Symbol("dartx.resizeBy");
const $resizeTo = dartx.resizeTo = Symbol("dartx.resizeTo");
const $resolveLocalFileSystemUrl = dartx.resolveLocalFileSystemUrl = Symbol("dartx.resolveLocalFileSystemUrl");
const $onContentLoaded = dartx.onContentLoaded = Symbol("dartx.onContentLoaded");
const $onDeviceMotion = dartx.onDeviceMotion = Symbol("dartx.onDeviceMotion");
const $onDeviceOrientation = dartx.onDeviceOrientation = Symbol("dartx.onDeviceOrientation");
const $onPageHide = dartx.onPageHide = Symbol("dartx.onPageHide");
const $onPageShow = dartx.onPageShow = Symbol("dartx.onPageShow");
const $onAnimationEnd = dartx.onAnimationEnd = Symbol("dartx.onAnimationEnd");
const $onAnimationIteration = dartx.onAnimationIteration = Symbol("dartx.onAnimationIteration");
const $onAnimationStart = dartx.onAnimationStart = Symbol("dartx.onAnimationStart");
const $onBeforeUnload = dartx.onBeforeUnload = Symbol("dartx.onBeforeUnload");
const $openDatabase = dartx.openDatabase = Symbol("dartx.openDatabase");
const $pageXOffset = dartx.pageXOffset = Symbol("dartx.pageXOffset");
const $pageYOffset = dartx.pageYOffset = Symbol("dartx.pageYOffset");
const $scrollX = dartx.scrollX = Symbol("dartx.scrollX");
const $scrollY = dartx.scrollY = Symbol("dartx.scrollY");
const $focused = dartx.focused = Symbol("dartx.focused");
const $navigate = dartx.navigate = Symbol("dartx.navigate");
const $createExpression = dartx.createExpression = Symbol("dartx.createExpression");
const $createNSResolver = dartx.createNSResolver = Symbol("dartx.createNSResolver");
const $evaluate = dartx.evaluate = Symbol("dartx.evaluate");
const $lookupNamespaceUri = dartx.lookupNamespaceUri = Symbol("dartx.lookupNamespaceUri");
const $booleanValue = dartx.booleanValue = Symbol("dartx.booleanValue");
const $invalidIteratorState = dartx.invalidIteratorState = Symbol("dartx.invalidIteratorState");
const $numberValue = dartx.numberValue = Symbol("dartx.numberValue");
const $resultType = dartx.resultType = Symbol("dartx.resultType");
const $singleNodeValue = dartx.singleNodeValue = Symbol("dartx.singleNodeValue");
const $snapshotLength = dartx.snapshotLength = Symbol("dartx.snapshotLength");
const $stringValue = dartx.stringValue = Symbol("dartx.stringValue");
const $iterateNext = dartx.iterateNext = Symbol("dartx.iterateNext");
const $snapshotItem = dartx.snapshotItem = Symbol("dartx.snapshotItem");
const $serializeToString = dartx.serializeToString = Symbol("dartx.serializeToString");
const $clearParameters = dartx.clearParameters = Symbol("dartx.clearParameters");
const $getParameter = dartx.getParameter = Symbol("dartx.getParameter");
const $importStylesheet = dartx.importStylesheet = Symbol("dartx.importStylesheet");
const $removeParameter = dartx.removeParameter = Symbol("dartx.removeParameter");
const $setParameter = dartx.setParameter = Symbol("dartx.setParameter");
const $transformToDocument = dartx.transformToDocument = Symbol("dartx.transformToDocument");
const $transformToFragment = dartx.transformToFragment = Symbol("dartx.transformToFragment");
const $getBudget = dartx.getBudget = Symbol("dartx.getBudget");
const $getCost = dartx.getCost = Symbol("dartx.getCost");
const $reserve = dartx.reserve = Symbol("dartx.reserve");
const $read = dartx.read = Symbol("dartx.read");
const $readText = dartx.readText = Symbol("dartx.readText");
const $writeText = dartx.writeText = Symbol("dartx.writeText");
const $getNamedItem = dartx.getNamedItem = Symbol("dartx.getNamedItem");
const $getNamedItemNS = dartx.getNamedItemNS = Symbol("dartx.getNamedItemNS");
const $removeNamedItem = dartx.removeNamedItem = Symbol("dartx.removeNamedItem");
const $removeNamedItemNS = dartx.removeNamedItemNS = Symbol("dartx.removeNamedItemNS");
const $setNamedItem = dartx.setNamedItem = Symbol("dartx.setNamedItem");
const $setNamedItemNS = dartx.setNamedItemNS = Symbol("dartx.setNamedItemNS");
const $cache = dartx.cache = Symbol("dartx.cache");
const $redirect = dartx.redirect = Symbol("dartx.redirect");
const $farthestViewportElement = dartx.farthestViewportElement = Symbol("dartx.farthestViewportElement");
const $nearestViewportElement = dartx.nearestViewportElement = Symbol("dartx.nearestViewportElement");
const $getBBox = dartx.getBBox = Symbol("dartx.getBBox");
const $getCtm = dartx.getCtm = Symbol("dartx.getCtm");
const $getScreenCtm = dartx.getScreenCtm = Symbol("dartx.getScreenCtm");
const $requiredExtensions = dartx.requiredExtensions = Symbol("dartx.requiredExtensions");
const $systemLanguage = dartx.systemLanguage = Symbol("dartx.systemLanguage");
const $ownerSvgElement = dartx.ownerSvgElement = Symbol("dartx.ownerSvgElement");
const $viewportElement = dartx.viewportElement = Symbol("dartx.viewportElement");
const $unitType = dartx.unitType = Symbol("dartx.unitType");
const $valueAsString = dartx.valueAsString = Symbol("dartx.valueAsString");
const $valueInSpecifiedUnits = dartx.valueInSpecifiedUnits = Symbol("dartx.valueInSpecifiedUnits");
const $convertToSpecifiedUnits = dartx.convertToSpecifiedUnits = Symbol("dartx.convertToSpecifiedUnits");
const $newValueSpecifiedUnits = dartx.newValueSpecifiedUnits = Symbol("dartx.newValueSpecifiedUnits");
const $targetElement = dartx.targetElement = Symbol("dartx.targetElement");
const $beginElement = dartx.beginElement = Symbol("dartx.beginElement");
const $beginElementAt = dartx.beginElementAt = Symbol("dartx.beginElementAt");
const $endElement = dartx.endElement = Symbol("dartx.endElement");
const $endElementAt = dartx.endElementAt = Symbol("dartx.endElementAt");
const $getCurrentTime = dartx.getCurrentTime = Symbol("dartx.getCurrentTime");
const $getSimpleDuration = dartx.getSimpleDuration = Symbol("dartx.getSimpleDuration");
const $getStartTime = dartx.getStartTime = Symbol("dartx.getStartTime");
const $animVal = dartx.animVal = Symbol("dartx.animVal");
const $baseVal = dartx.baseVal = Symbol("dartx.baseVal");
const $cx = dartx.cx = Symbol("dartx.cx");
const $cy = dartx.cy = Symbol("dartx.cy");
const $r = dartx.r = Symbol("dartx.r");
const $pathLength = dartx.pathLength = Symbol("dartx.pathLength");
const $getPointAtLength = dartx.getPointAtLength = Symbol("dartx.getPointAtLength");
const $getTotalLength = dartx.getTotalLength = Symbol("dartx.getTotalLength");
const $isPointInFill = dartx.isPointInFill = Symbol("dartx.isPointInFill");
const $clipPathUnits = dartx.clipPathUnits = Symbol("dartx.clipPathUnits");
const $rx = dartx.rx = Symbol("dartx.rx");
const $ry = dartx.ry = Symbol("dartx.ry");
const $in1 = dartx.in1 = Symbol("dartx.in1");
const $in2 = dartx.in2 = Symbol("dartx.in2");
const $k1 = dartx.k1 = Symbol("dartx.k1");
const $k2 = dartx.k2 = Symbol("dartx.k2");
const $k3 = dartx.k3 = Symbol("dartx.k3");
const $k4 = dartx.k4 = Symbol("dartx.k4");
const $operator = dartx.operator = Symbol("dartx.operator");
const $bias = dartx.bias = Symbol("dartx.bias");
const $divisor = dartx.divisor = Symbol("dartx.divisor");
const $edgeMode = dartx.edgeMode = Symbol("dartx.edgeMode");
const $kernelMatrix = dartx.kernelMatrix = Symbol("dartx.kernelMatrix");
const $kernelUnitLengthX = dartx.kernelUnitLengthX = Symbol("dartx.kernelUnitLengthX");
const $kernelUnitLengthY = dartx.kernelUnitLengthY = Symbol("dartx.kernelUnitLengthY");
const $orderX = dartx.orderX = Symbol("dartx.orderX");
const $orderY = dartx.orderY = Symbol("dartx.orderY");
const $preserveAlpha = dartx.preserveAlpha = Symbol("dartx.preserveAlpha");
const $targetX = dartx.targetX = Symbol("dartx.targetX");
const $targetY = dartx.targetY = Symbol("dartx.targetY");
const $diffuseConstant = dartx.diffuseConstant = Symbol("dartx.diffuseConstant");
const $surfaceScale = dartx.surfaceScale = Symbol("dartx.surfaceScale");
const $xChannelSelector = dartx.xChannelSelector = Symbol("dartx.xChannelSelector");
const $yChannelSelector = dartx.yChannelSelector = Symbol("dartx.yChannelSelector");
const $azimuth = dartx.azimuth = Symbol("dartx.azimuth");
const $elevation = dartx.elevation = Symbol("dartx.elevation");
const $stdDeviationX = dartx.stdDeviationX = Symbol("dartx.stdDeviationX");
const $stdDeviationY = dartx.stdDeviationY = Symbol("dartx.stdDeviationY");
const $setStdDeviation = dartx.setStdDeviation = Symbol("dartx.setStdDeviation");
const $preserveAspectRatio = dartx.preserveAspectRatio = Symbol("dartx.preserveAspectRatio");
const $dx = dartx.dx = Symbol("dartx.dx");
const $dy = dartx.dy = Symbol("dartx.dy");
const $specularConstant = dartx.specularConstant = Symbol("dartx.specularConstant");
const $specularExponent = dartx.specularExponent = Symbol("dartx.specularExponent");
const $limitingConeAngle = dartx.limitingConeAngle = Symbol("dartx.limitingConeAngle");
const $pointsAtX = dartx.pointsAtX = Symbol("dartx.pointsAtX");
const $pointsAtY = dartx.pointsAtY = Symbol("dartx.pointsAtY");
const $pointsAtZ = dartx.pointsAtZ = Symbol("dartx.pointsAtZ");
const $baseFrequencyX = dartx.baseFrequencyX = Symbol("dartx.baseFrequencyX");
const $baseFrequencyY = dartx.baseFrequencyY = Symbol("dartx.baseFrequencyY");
const $numOctaves = dartx.numOctaves = Symbol("dartx.numOctaves");
const $seed = dartx.seed = Symbol("dartx.seed");
const $stitchTiles = dartx.stitchTiles = Symbol("dartx.stitchTiles");
const $filterUnits = dartx.filterUnits = Symbol("dartx.filterUnits");
const $primitiveUnits = dartx.primitiveUnits = Symbol("dartx.primitiveUnits");
const $viewBox = dartx.viewBox = Symbol("dartx.viewBox");
const $numberOfItems = dartx.numberOfItems = Symbol("dartx.numberOfItems");
const $appendItem = dartx.appendItem = Symbol("dartx.appendItem");
const $getItem = dartx.getItem = Symbol("dartx.getItem");
const $initialize = dartx.initialize = Symbol("dartx.initialize");
const $insertItemBefore = dartx.insertItemBefore = Symbol("dartx.insertItemBefore");
const $removeItem = dartx.removeItem = Symbol("dartx.removeItem");
const $replaceItem = dartx.replaceItem = Symbol("dartx.replaceItem");
const $x1 = dartx.x1 = Symbol("dartx.x1");
const $x2 = dartx.x2 = Symbol("dartx.x2");
const $y1 = dartx.y1 = Symbol("dartx.y1");
const $y2 = dartx.y2 = Symbol("dartx.y2");
const $gradientTransform = dartx.gradientTransform = Symbol("dartx.gradientTransform");
const $gradientUnits = dartx.gradientUnits = Symbol("dartx.gradientUnits");
const $spreadMethod = dartx.spreadMethod = Symbol("dartx.spreadMethod");
const $markerHeight = dartx.markerHeight = Symbol("dartx.markerHeight");
const $markerUnits = dartx.markerUnits = Symbol("dartx.markerUnits");
const $markerWidth = dartx.markerWidth = Symbol("dartx.markerWidth");
const $orientAngle = dartx.orientAngle = Symbol("dartx.orientAngle");
const $orientType = dartx.orientType = Symbol("dartx.orientType");
const $refX = dartx.refX = Symbol("dartx.refX");
const $refY = dartx.refY = Symbol("dartx.refY");
const $setOrientToAngle = dartx.setOrientToAngle = Symbol("dartx.setOrientToAngle");
const $setOrientToAuto = dartx.setOrientToAuto = Symbol("dartx.setOrientToAuto");
const $maskContentUnits = dartx.maskContentUnits = Symbol("dartx.maskContentUnits");
const $maskUnits = dartx.maskUnits = Symbol("dartx.maskUnits");
const $scaleNonUniform = dartx.scaleNonUniform = Symbol("dartx.scaleNonUniform");
const $patternContentUnits = dartx.patternContentUnits = Symbol("dartx.patternContentUnits");
const $patternTransform = dartx.patternTransform = Symbol("dartx.patternTransform");
const $patternUnits = dartx.patternUnits = Symbol("dartx.patternUnits");
const $animatedPoints = dartx.animatedPoints = Symbol("dartx.animatedPoints");
const $points = dartx.points = Symbol("dartx.points");
const $meetOrSlice = dartx.meetOrSlice = Symbol("dartx.meetOrSlice");
const $fr = dartx.fr = Symbol("dartx.fr");
const $fx = dartx.fx = Symbol("dartx.fx");
const $fy = dartx.fy = Symbol("dartx.fy");
const $gradientOffset = dartx.gradientOffset = Symbol("dartx.gradientOffset");
const $currentScale = dartx.currentScale = Symbol("dartx.currentScale");
const $currentTranslate = dartx.currentTranslate = Symbol("dartx.currentTranslate");
const $animationsPaused = dartx.animationsPaused = Symbol("dartx.animationsPaused");
const $checkEnclosure = dartx.checkEnclosure = Symbol("dartx.checkEnclosure");
const $checkIntersection = dartx.checkIntersection = Symbol("dartx.checkIntersection");
const $createSvgAngle = dartx.createSvgAngle = Symbol("dartx.createSvgAngle");
const $createSvgLength = dartx.createSvgLength = Symbol("dartx.createSvgLength");
const $createSvgMatrix = dartx.createSvgMatrix = Symbol("dartx.createSvgMatrix");
const $createSvgNumber = dartx.createSvgNumber = Symbol("dartx.createSvgNumber");
const $createSvgPoint = dartx.createSvgPoint = Symbol("dartx.createSvgPoint");
const $createSvgRect = dartx.createSvgRect = Symbol("dartx.createSvgRect");
const $createSvgTransform = dartx.createSvgTransform = Symbol("dartx.createSvgTransform");
const $createSvgTransformFromMatrix = dartx.createSvgTransformFromMatrix = Symbol("dartx.createSvgTransformFromMatrix");
const $deselectAll = dartx.deselectAll = Symbol("dartx.deselectAll");
const $forceRedraw = dartx.forceRedraw = Symbol("dartx.forceRedraw");
const $getEnclosureList = dartx.getEnclosureList = Symbol("dartx.getEnclosureList");
const $getIntersectionList = dartx.getIntersectionList = Symbol("dartx.getIntersectionList");
const $pauseAnimations = dartx.pauseAnimations = Symbol("dartx.pauseAnimations");
const $setCurrentTime = dartx.setCurrentTime = Symbol("dartx.setCurrentTime");
const $suspendRedraw = dartx.suspendRedraw = Symbol("dartx.suspendRedraw");
const $unpauseAnimations = dartx.unpauseAnimations = Symbol("dartx.unpauseAnimations");
const $unsuspendRedraw = dartx.unsuspendRedraw = Symbol("dartx.unsuspendRedraw");
const $unsuspendRedrawAll = dartx.unsuspendRedrawAll = Symbol("dartx.unsuspendRedrawAll");
const $zoomAndPan = dartx.zoomAndPan = Symbol("dartx.zoomAndPan");
const $lengthAdjust = dartx.lengthAdjust = Symbol("dartx.lengthAdjust");
const $getCharNumAtPosition = dartx.getCharNumAtPosition = Symbol("dartx.getCharNumAtPosition");
const $getComputedTextLength = dartx.getComputedTextLength = Symbol("dartx.getComputedTextLength");
const $getEndPositionOfChar = dartx.getEndPositionOfChar = Symbol("dartx.getEndPositionOfChar");
const $getExtentOfChar = dartx.getExtentOfChar = Symbol("dartx.getExtentOfChar");
const $getNumberOfChars = dartx.getNumberOfChars = Symbol("dartx.getNumberOfChars");
const $getRotationOfChar = dartx.getRotationOfChar = Symbol("dartx.getRotationOfChar");
const $getStartPositionOfChar = dartx.getStartPositionOfChar = Symbol("dartx.getStartPositionOfChar");
const $getSubStringLength = dartx.getSubStringLength = Symbol("dartx.getSubStringLength");
const $selectSubString = dartx.selectSubString = Symbol("dartx.selectSubString");
const $spacing = dartx.spacing = Symbol("dartx.spacing");
const $setMatrix = dartx.setMatrix = Symbol("dartx.setMatrix");
const $setRotate = dartx.setRotate = Symbol("dartx.setRotate");
const $setScale = dartx.setScale = Symbol("dartx.setScale");
const $setSkewX = dartx.setSkewX = Symbol("dartx.setSkewX");
const $setSkewY = dartx.setSkewY = Symbol("dartx.setSkewY");
const $setTranslate = dartx.setTranslate = Symbol("dartx.setTranslate");
const $consolidate = dartx.consolidate = Symbol("dartx.consolidate");
const $fftSize = dartx.fftSize = Symbol("dartx.fftSize");
const $frequencyBinCount = dartx.frequencyBinCount = Symbol("dartx.frequencyBinCount");
const $maxDecibels = dartx.maxDecibels = Symbol("dartx.maxDecibels");
const $minDecibels = dartx.minDecibels = Symbol("dartx.minDecibels");
const $smoothingTimeConstant = dartx.smoothingTimeConstant = Symbol("dartx.smoothingTimeConstant");
const $getByteFrequencyData = dartx.getByteFrequencyData = Symbol("dartx.getByteFrequencyData");
const $getByteTimeDomainData = dartx.getByteTimeDomainData = Symbol("dartx.getByteTimeDomainData");
const $getFloatFrequencyData = dartx.getFloatFrequencyData = Symbol("dartx.getFloatFrequencyData");
const $getFloatTimeDomainData = dartx.getFloatTimeDomainData = Symbol("dartx.getFloatTimeDomainData");
const $channelCount = dartx.channelCount = Symbol("dartx.channelCount");
const $channelCountMode = dartx.channelCountMode = Symbol("dartx.channelCountMode");
const $channelInterpretation = dartx.channelInterpretation = Symbol("dartx.channelInterpretation");
const $context = dartx.context = Symbol("dartx.context");
const $numberOfInputs = dartx.numberOfInputs = Symbol("dartx.numberOfInputs");
const $numberOfOutputs = dartx.numberOfOutputs = Symbol("dartx.numberOfOutputs");
const $connectNode = dartx.connectNode = Symbol("dartx.connectNode");
const $connectParam = dartx.connectParam = Symbol("dartx.connectParam");
const $numberOfChannels = dartx.numberOfChannels = Symbol("dartx.numberOfChannels");
const $sampleRate = dartx.sampleRate = Symbol("dartx.sampleRate");
const $copyFromChannel = dartx.copyFromChannel = Symbol("dartx.copyFromChannel");
const $copyToChannel = dartx.copyToChannel = Symbol("dartx.copyToChannel");
const $getChannelData = dartx.getChannelData = Symbol("dartx.getChannelData");
const $detune = dartx.detune = Symbol("dartx.detune");
const $loopEnd = dartx.loopEnd = Symbol("dartx.loopEnd");
const $loopStart = dartx.loopStart = Symbol("dartx.loopStart");
const $start2 = dartx.start2 = Symbol("dartx.start2");
const $baseLatency = dartx.baseLatency = Symbol("dartx.baseLatency");
const $getOutputTimestamp = dartx.getOutputTimestamp = Symbol("dartx.getOutputTimestamp");
const $suspend = dartx.suspend = Symbol("dartx.suspend");
const $createGain = dartx.createGain = Symbol("dartx.createGain");
const $createScriptProcessor = dartx.createScriptProcessor = Symbol("dartx.createScriptProcessor");
const $decodeAudioData = dartx.decodeAudioData = Symbol("dartx.decodeAudioData");
const $destination = dartx.destination = Symbol("dartx.destination");
const $listener = dartx.listener = Symbol("dartx.listener");
const $createAnalyser = dartx.createAnalyser = Symbol("dartx.createAnalyser");
const $createBiquadFilter = dartx.createBiquadFilter = Symbol("dartx.createBiquadFilter");
const $createBuffer = dartx.createBuffer = Symbol("dartx.createBuffer");
const $createBufferSource = dartx.createBufferSource = Symbol("dartx.createBufferSource");
const $createChannelMerger = dartx.createChannelMerger = Symbol("dartx.createChannelMerger");
const $createChannelSplitter = dartx.createChannelSplitter = Symbol("dartx.createChannelSplitter");
const $createConstantSource = dartx.createConstantSource = Symbol("dartx.createConstantSource");
const $createConvolver = dartx.createConvolver = Symbol("dartx.createConvolver");
const $createDelay = dartx.createDelay = Symbol("dartx.createDelay");
const $createDynamicsCompressor = dartx.createDynamicsCompressor = Symbol("dartx.createDynamicsCompressor");
const $createIirFilter = dartx.createIirFilter = Symbol("dartx.createIirFilter");
const $createMediaElementSource = dartx.createMediaElementSource = Symbol("dartx.createMediaElementSource");
const $createMediaStreamDestination = dartx.createMediaStreamDestination = Symbol("dartx.createMediaStreamDestination");
const $createMediaStreamSource = dartx.createMediaStreamSource = Symbol("dartx.createMediaStreamSource");
const $createOscillator = dartx.createOscillator = Symbol("dartx.createOscillator");
const $createPanner = dartx.createPanner = Symbol("dartx.createPanner");
const $createPeriodicWave = dartx.createPeriodicWave = Symbol("dartx.createPeriodicWave");
const $createStereoPanner = dartx.createStereoPanner = Symbol("dartx.createStereoPanner");
const $createWaveShaper = dartx.createWaveShaper = Symbol("dartx.createWaveShaper");
const $maxChannelCount = dartx.maxChannelCount = Symbol("dartx.maxChannelCount");
const $forwardX = dartx.forwardX = Symbol("dartx.forwardX");
const $forwardY = dartx.forwardY = Symbol("dartx.forwardY");
const $forwardZ = dartx.forwardZ = Symbol("dartx.forwardZ");
const $positionZ = dartx.positionZ = Symbol("dartx.positionZ");
const $upX = dartx.upX = Symbol("dartx.upX");
const $upY = dartx.upY = Symbol("dartx.upY");
const $upZ = dartx.upZ = Symbol("dartx.upZ");
const $setOrientation = dartx.setOrientation = Symbol("dartx.setOrientation");
const $maxValue = dartx.maxValue = Symbol("dartx.maxValue");
const $minValue = dartx.minValue = Symbol("dartx.minValue");
const $cancelAndHoldAtTime = dartx.cancelAndHoldAtTime = Symbol("dartx.cancelAndHoldAtTime");
const $cancelScheduledValues = dartx.cancelScheduledValues = Symbol("dartx.cancelScheduledValues");
const $exponentialRampToValueAtTime = dartx.exponentialRampToValueAtTime = Symbol("dartx.exponentialRampToValueAtTime");
const $linearRampToValueAtTime = dartx.linearRampToValueAtTime = Symbol("dartx.linearRampToValueAtTime");
const $setTargetAtTime = dartx.setTargetAtTime = Symbol("dartx.setTargetAtTime");
const $setValueAtTime = dartx.setValueAtTime = Symbol("dartx.setValueAtTime");
const $setValueCurveAtTime = dartx.setValueCurveAtTime = Symbol("dartx.setValueCurveAtTime");
const $inputBuffer = dartx.inputBuffer = Symbol("dartx.inputBuffer");
const $outputBuffer = dartx.outputBuffer = Symbol("dartx.outputBuffer");
const $playbackTime = dartx.playbackTime = Symbol("dartx.playbackTime");
const $registerProcessor = dartx.registerProcessor = Symbol("dartx.registerProcessor");
const $parameters = dartx.parameters = Symbol("dartx.parameters");
const $Q = dartx.Q = Symbol("dartx.Q");
const $frequency = dartx.frequency = Symbol("dartx.frequency");
const $gain = dartx.gain = Symbol("dartx.gain");
const $getFrequencyResponse = dartx.getFrequencyResponse = Symbol("dartx.getFrequencyResponse");
const $normalize = dartx.normalize = Symbol("dartx.normalize");
const $delayTime = dartx.delayTime = Symbol("dartx.delayTime");
const $attack = dartx.attack = Symbol("dartx.attack");
const $knee = dartx.knee = Symbol("dartx.knee");
const $ratio = dartx.ratio = Symbol("dartx.ratio");
const $reduction = dartx.reduction = Symbol("dartx.reduction");
const $release = dartx.release = Symbol("dartx.release");
const $threshold = dartx.threshold = Symbol("dartx.threshold");
const $mediaElement = dartx.mediaElement = Symbol("dartx.mediaElement");
const $mediaStream = dartx.mediaStream = Symbol("dartx.mediaStream");
const $renderedBuffer = dartx.renderedBuffer = Symbol("dartx.renderedBuffer");
const $startRendering = dartx.startRendering = Symbol("dartx.startRendering");
const $suspendFor = dartx.suspendFor = Symbol("dartx.suspendFor");
const $setPeriodicWave = dartx.setPeriodicWave = Symbol("dartx.setPeriodicWave");
const $coneInnerAngle = dartx.coneInnerAngle = Symbol("dartx.coneInnerAngle");
const $coneOuterAngle = dartx.coneOuterAngle = Symbol("dartx.coneOuterAngle");
const $coneOuterGain = dartx.coneOuterGain = Symbol("dartx.coneOuterGain");
const $distanceModel = dartx.distanceModel = Symbol("dartx.distanceModel");
const $maxDistance = dartx.maxDistance = Symbol("dartx.maxDistance");
const $orientationX = dartx.orientationX = Symbol("dartx.orientationX");
const $orientationY = dartx.orientationY = Symbol("dartx.orientationY");
const $orientationZ = dartx.orientationZ = Symbol("dartx.orientationZ");
const $panningModel = dartx.panningModel = Symbol("dartx.panningModel");
const $refDistance = dartx.refDistance = Symbol("dartx.refDistance");
const $rolloffFactor = dartx.rolloffFactor = Symbol("dartx.rolloffFactor");
const $bufferSize = dartx.bufferSize = Symbol("dartx.bufferSize");
const $setEventListener = dartx.setEventListener = Symbol("dartx.setEventListener");
const $onAudioProcess = dartx.onAudioProcess = Symbol("dartx.onAudioProcess");
const $pan = dartx.pan = Symbol("dartx.pan");
const $curve = dartx.curve = Symbol("dartx.curve");
const $oversample = dartx.oversample = Symbol("dartx.oversample");
const $drawArraysInstancedAngle = dartx.drawArraysInstancedAngle = Symbol("dartx.drawArraysInstancedAngle");
const $drawElementsInstancedAngle = dartx.drawElementsInstancedAngle = Symbol("dartx.drawElementsInstancedAngle");
const $vertexAttribDivisorAngle = dartx.vertexAttribDivisorAngle = Symbol("dartx.vertexAttribDivisorAngle");
const $offscreenCanvas = dartx.offscreenCanvas = Symbol("dartx.offscreenCanvas");
const $statusMessage = dartx.statusMessage = Symbol("dartx.statusMessage");
const $getTranslatedShaderSource = dartx.getTranslatedShaderSource = Symbol("dartx.getTranslatedShaderSource");
const $drawBuffersWebgl = dartx.drawBuffersWebgl = Symbol("dartx.drawBuffersWebgl");
const $beginQueryExt = dartx.beginQueryExt = Symbol("dartx.beginQueryExt");
const $createQueryExt = dartx.createQueryExt = Symbol("dartx.createQueryExt");
const $deleteQueryExt = dartx.deleteQueryExt = Symbol("dartx.deleteQueryExt");
const $endQueryExt = dartx.endQueryExt = Symbol("dartx.endQueryExt");
const $getQueryExt = dartx.getQueryExt = Symbol("dartx.getQueryExt");
const $getQueryObjectExt = dartx.getQueryObjectExt = Symbol("dartx.getQueryObjectExt");
const $isQueryExt = dartx.isQueryExt = Symbol("dartx.isQueryExt");
const $queryCounterExt = dartx.queryCounterExt = Symbol("dartx.queryCounterExt");
const $getBufferSubDataAsync = dartx.getBufferSubDataAsync = Symbol("dartx.getBufferSubDataAsync");
const $loseContext = dartx.loseContext = Symbol("dartx.loseContext");
const $restoreContext = dartx.restoreContext = Symbol("dartx.restoreContext");
const $bindVertexArray = dartx.bindVertexArray = Symbol("dartx.bindVertexArray");
const $createVertexArray = dartx.createVertexArray = Symbol("dartx.createVertexArray");
const $deleteVertexArray = dartx.deleteVertexArray = Symbol("dartx.deleteVertexArray");
const $isVertexArray = dartx.isVertexArray = Symbol("dartx.isVertexArray");
const $drawingBufferHeight = dartx.drawingBufferHeight = Symbol("dartx.drawingBufferHeight");
const $drawingBufferWidth = dartx.drawingBufferWidth = Symbol("dartx.drawingBufferWidth");
const $activeTexture = dartx.activeTexture = Symbol("dartx.activeTexture");
const $attachShader = dartx.attachShader = Symbol("dartx.attachShader");
const $bindAttribLocation = dartx.bindAttribLocation = Symbol("dartx.bindAttribLocation");
const $bindBuffer = dartx.bindBuffer = Symbol("dartx.bindBuffer");
const $bindFramebuffer = dartx.bindFramebuffer = Symbol("dartx.bindFramebuffer");
const $bindRenderbuffer = dartx.bindRenderbuffer = Symbol("dartx.bindRenderbuffer");
const $bindTexture = dartx.bindTexture = Symbol("dartx.bindTexture");
const $blendColor = dartx.blendColor = Symbol("dartx.blendColor");
const $blendEquation = dartx.blendEquation = Symbol("dartx.blendEquation");
const $blendEquationSeparate = dartx.blendEquationSeparate = Symbol("dartx.blendEquationSeparate");
const $blendFunc = dartx.blendFunc = Symbol("dartx.blendFunc");
const $blendFuncSeparate = dartx.blendFuncSeparate = Symbol("dartx.blendFuncSeparate");
const $bufferData = dartx.bufferData = Symbol("dartx.bufferData");
const $bufferSubData = dartx.bufferSubData = Symbol("dartx.bufferSubData");
const $checkFramebufferStatus = dartx.checkFramebufferStatus = Symbol("dartx.checkFramebufferStatus");
const $clearColor = dartx.clearColor = Symbol("dartx.clearColor");
const $clearDepth = dartx.clearDepth = Symbol("dartx.clearDepth");
const $clearStencil = dartx.clearStencil = Symbol("dartx.clearStencil");
const $colorMask = dartx.colorMask = Symbol("dartx.colorMask");
const $compileShader = dartx.compileShader = Symbol("dartx.compileShader");
const $compressedTexImage2D = dartx.compressedTexImage2D = Symbol("dartx.compressedTexImage2D");
const $compressedTexSubImage2D = dartx.compressedTexSubImage2D = Symbol("dartx.compressedTexSubImage2D");
const $copyTexImage2D = dartx.copyTexImage2D = Symbol("dartx.copyTexImage2D");
const $copyTexSubImage2D = dartx.copyTexSubImage2D = Symbol("dartx.copyTexSubImage2D");
const $createFramebuffer = dartx.createFramebuffer = Symbol("dartx.createFramebuffer");
const $createProgram = dartx.createProgram = Symbol("dartx.createProgram");
const $createRenderbuffer = dartx.createRenderbuffer = Symbol("dartx.createRenderbuffer");
const $createShader = dartx.createShader = Symbol("dartx.createShader");
const $createTexture = dartx.createTexture = Symbol("dartx.createTexture");
const $cullFace = dartx.cullFace = Symbol("dartx.cullFace");
const $deleteBuffer = dartx.deleteBuffer = Symbol("dartx.deleteBuffer");
const $deleteFramebuffer = dartx.deleteFramebuffer = Symbol("dartx.deleteFramebuffer");
const $deleteProgram = dartx.deleteProgram = Symbol("dartx.deleteProgram");
const $deleteRenderbuffer = dartx.deleteRenderbuffer = Symbol("dartx.deleteRenderbuffer");
const $deleteShader = dartx.deleteShader = Symbol("dartx.deleteShader");
const $deleteTexture = dartx.deleteTexture = Symbol("dartx.deleteTexture");
const $depthFunc = dartx.depthFunc = Symbol("dartx.depthFunc");
const $depthMask = dartx.depthMask = Symbol("dartx.depthMask");
const $depthRange = dartx.depthRange = Symbol("dartx.depthRange");
const $detachShader = dartx.detachShader = Symbol("dartx.detachShader");
const $disableVertexAttribArray = dartx.disableVertexAttribArray = Symbol("dartx.disableVertexAttribArray");
const $drawArrays = dartx.drawArrays = Symbol("dartx.drawArrays");
const $drawElements = dartx.drawElements = Symbol("dartx.drawElements");
const $enableVertexAttribArray = dartx.enableVertexAttribArray = Symbol("dartx.enableVertexAttribArray");
const $flush = dartx.flush = Symbol("dartx.flush");
const $framebufferRenderbuffer = dartx.framebufferRenderbuffer = Symbol("dartx.framebufferRenderbuffer");
const $framebufferTexture2D = dartx.framebufferTexture2D = Symbol("dartx.framebufferTexture2D");
const $frontFace = dartx.frontFace = Symbol("dartx.frontFace");
const $generateMipmap = dartx.generateMipmap = Symbol("dartx.generateMipmap");
const $getActiveAttrib = dartx.getActiveAttrib = Symbol("dartx.getActiveAttrib");
const $getActiveUniform = dartx.getActiveUniform = Symbol("dartx.getActiveUniform");
const $getAttachedShaders = dartx.getAttachedShaders = Symbol("dartx.getAttachedShaders");
const $getAttribLocation = dartx.getAttribLocation = Symbol("dartx.getAttribLocation");
const $getBufferParameter = dartx.getBufferParameter = Symbol("dartx.getBufferParameter");
const $getError = dartx.getError = Symbol("dartx.getError");
const $getExtension = dartx.getExtension = Symbol("dartx.getExtension");
const $getFramebufferAttachmentParameter = dartx.getFramebufferAttachmentParameter = Symbol("dartx.getFramebufferAttachmentParameter");
const $getProgramInfoLog = dartx.getProgramInfoLog = Symbol("dartx.getProgramInfoLog");
const $getProgramParameter = dartx.getProgramParameter = Symbol("dartx.getProgramParameter");
const $getRenderbufferParameter = dartx.getRenderbufferParameter = Symbol("dartx.getRenderbufferParameter");
const $getShaderInfoLog = dartx.getShaderInfoLog = Symbol("dartx.getShaderInfoLog");
const $getShaderParameter = dartx.getShaderParameter = Symbol("dartx.getShaderParameter");
const $getShaderPrecisionFormat = dartx.getShaderPrecisionFormat = Symbol("dartx.getShaderPrecisionFormat");
const $getShaderSource = dartx.getShaderSource = Symbol("dartx.getShaderSource");
const $getSupportedExtensions = dartx.getSupportedExtensions = Symbol("dartx.getSupportedExtensions");
const $getTexParameter = dartx.getTexParameter = Symbol("dartx.getTexParameter");
const $getUniform = dartx.getUniform = Symbol("dartx.getUniform");
const $getUniformLocation = dartx.getUniformLocation = Symbol("dartx.getUniformLocation");
const $getVertexAttrib = dartx.getVertexAttrib = Symbol("dartx.getVertexAttrib");
const $getVertexAttribOffset = dartx.getVertexAttribOffset = Symbol("dartx.getVertexAttribOffset");
const $hint = dartx.hint = Symbol("dartx.hint");
const $isBuffer = dartx.isBuffer = Symbol("dartx.isBuffer");
const $isEnabled = dartx.isEnabled = Symbol("dartx.isEnabled");
const $isFramebuffer = dartx.isFramebuffer = Symbol("dartx.isFramebuffer");
const $isProgram = dartx.isProgram = Symbol("dartx.isProgram");
const $isRenderbuffer = dartx.isRenderbuffer = Symbol("dartx.isRenderbuffer");
const $isShader = dartx.isShader = Symbol("dartx.isShader");
const $isTexture = dartx.isTexture = Symbol("dartx.isTexture");
const $linkProgram = dartx.linkProgram = Symbol("dartx.linkProgram");
const $pixelStorei = dartx.pixelStorei = Symbol("dartx.pixelStorei");
const $polygonOffset = dartx.polygonOffset = Symbol("dartx.polygonOffset");
const $renderbufferStorage = dartx.renderbufferStorage = Symbol("dartx.renderbufferStorage");
const $sampleCoverage = dartx.sampleCoverage = Symbol("dartx.sampleCoverage");
const $scissor = dartx.scissor = Symbol("dartx.scissor");
const $shaderSource = dartx.shaderSource = Symbol("dartx.shaderSource");
const $stencilFunc = dartx.stencilFunc = Symbol("dartx.stencilFunc");
const $stencilFuncSeparate = dartx.stencilFuncSeparate = Symbol("dartx.stencilFuncSeparate");
const $stencilMask = dartx.stencilMask = Symbol("dartx.stencilMask");
const $stencilMaskSeparate = dartx.stencilMaskSeparate = Symbol("dartx.stencilMaskSeparate");
const $stencilOp = dartx.stencilOp = Symbol("dartx.stencilOp");
const $stencilOpSeparate = dartx.stencilOpSeparate = Symbol("dartx.stencilOpSeparate");
const $texImage2D = dartx.texImage2D = Symbol("dartx.texImage2D");
const $texParameterf = dartx.texParameterf = Symbol("dartx.texParameterf");
const $texParameteri = dartx.texParameteri = Symbol("dartx.texParameteri");
const $texSubImage2D = dartx.texSubImage2D = Symbol("dartx.texSubImage2D");
const $uniform1f = dartx.uniform1f = Symbol("dartx.uniform1f");
const $uniform1fv = dartx.uniform1fv = Symbol("dartx.uniform1fv");
const $uniform1i = dartx.uniform1i = Symbol("dartx.uniform1i");
const $uniform1iv = dartx.uniform1iv = Symbol("dartx.uniform1iv");
const $uniform2f = dartx.uniform2f = Symbol("dartx.uniform2f");
const $uniform2fv = dartx.uniform2fv = Symbol("dartx.uniform2fv");
const $uniform2i = dartx.uniform2i = Symbol("dartx.uniform2i");
const $uniform2iv = dartx.uniform2iv = Symbol("dartx.uniform2iv");
const $uniform3f = dartx.uniform3f = Symbol("dartx.uniform3f");
const $uniform3fv = dartx.uniform3fv = Symbol("dartx.uniform3fv");
const $uniform3i = dartx.uniform3i = Symbol("dartx.uniform3i");
const $uniform3iv = dartx.uniform3iv = Symbol("dartx.uniform3iv");
const $uniform4f = dartx.uniform4f = Symbol("dartx.uniform4f");
const $uniform4fv = dartx.uniform4fv = Symbol("dartx.uniform4fv");
const $uniform4i = dartx.uniform4i = Symbol("dartx.uniform4i");
const $uniform4iv = dartx.uniform4iv = Symbol("dartx.uniform4iv");
const $uniformMatrix2fv = dartx.uniformMatrix2fv = Symbol("dartx.uniformMatrix2fv");
const $uniformMatrix3fv = dartx.uniformMatrix3fv = Symbol("dartx.uniformMatrix3fv");
const $uniformMatrix4fv = dartx.uniformMatrix4fv = Symbol("dartx.uniformMatrix4fv");
const $useProgram = dartx.useProgram = Symbol("dartx.useProgram");
const $validateProgram = dartx.validateProgram = Symbol("dartx.validateProgram");
const $vertexAttrib1f = dartx.vertexAttrib1f = Symbol("dartx.vertexAttrib1f");
const $vertexAttrib1fv = dartx.vertexAttrib1fv = Symbol("dartx.vertexAttrib1fv");
const $vertexAttrib2f = dartx.vertexAttrib2f = Symbol("dartx.vertexAttrib2f");
const $vertexAttrib2fv = dartx.vertexAttrib2fv = Symbol("dartx.vertexAttrib2fv");
const $vertexAttrib3f = dartx.vertexAttrib3f = Symbol("dartx.vertexAttrib3f");
const $vertexAttrib3fv = dartx.vertexAttrib3fv = Symbol("dartx.vertexAttrib3fv");
const $vertexAttrib4f = dartx.vertexAttrib4f = Symbol("dartx.vertexAttrib4f");
const $vertexAttrib4fv = dartx.vertexAttrib4fv = Symbol("dartx.vertexAttrib4fv");
const $vertexAttribPointer = dartx.vertexAttribPointer = Symbol("dartx.vertexAttribPointer");
const $viewport = dartx.viewport = Symbol("dartx.viewport");
const $readPixels = dartx.readPixels = Symbol("dartx.readPixels");
const $texImage2DUntyped = dartx.texImage2DUntyped = Symbol("dartx.texImage2DUntyped");
const $texImage2DTyped = dartx.texImage2DTyped = Symbol("dartx.texImage2DTyped");
const $texSubImage2DUntyped = dartx.texSubImage2DUntyped = Symbol("dartx.texSubImage2DUntyped");
const $texSubImage2DTyped = dartx.texSubImage2DTyped = Symbol("dartx.texSubImage2DTyped");
const $bufferDataTyped = dartx.bufferDataTyped = Symbol("dartx.bufferDataTyped");
const $bufferSubDataTyped = dartx.bufferSubDataTyped = Symbol("dartx.bufferSubDataTyped");
const $beginQuery = dartx.beginQuery = Symbol("dartx.beginQuery");
const $beginTransformFeedback = dartx.beginTransformFeedback = Symbol("dartx.beginTransformFeedback");
const $bindBufferBase = dartx.bindBufferBase = Symbol("dartx.bindBufferBase");
const $bindBufferRange = dartx.bindBufferRange = Symbol("dartx.bindBufferRange");
const $bindSampler = dartx.bindSampler = Symbol("dartx.bindSampler");
const $bindTransformFeedback = dartx.bindTransformFeedback = Symbol("dartx.bindTransformFeedback");
const $blitFramebuffer = dartx.blitFramebuffer = Symbol("dartx.blitFramebuffer");
const $bufferData2 = dartx.bufferData2 = Symbol("dartx.bufferData2");
const $bufferSubData2 = dartx.bufferSubData2 = Symbol("dartx.bufferSubData2");
const $clearBufferfi = dartx.clearBufferfi = Symbol("dartx.clearBufferfi");
const $clearBufferfv = dartx.clearBufferfv = Symbol("dartx.clearBufferfv");
const $clearBufferiv = dartx.clearBufferiv = Symbol("dartx.clearBufferiv");
const $clearBufferuiv = dartx.clearBufferuiv = Symbol("dartx.clearBufferuiv");
const $clientWaitSync = dartx.clientWaitSync = Symbol("dartx.clientWaitSync");
const $compressedTexImage2D2 = dartx.compressedTexImage2D2 = Symbol("dartx.compressedTexImage2D2");
const $compressedTexImage2D3 = dartx.compressedTexImage2D3 = Symbol("dartx.compressedTexImage2D3");
const $compressedTexImage3D = dartx.compressedTexImage3D = Symbol("dartx.compressedTexImage3D");
const $compressedTexImage3D2 = dartx.compressedTexImage3D2 = Symbol("dartx.compressedTexImage3D2");
const $compressedTexSubImage2D2 = dartx.compressedTexSubImage2D2 = Symbol("dartx.compressedTexSubImage2D2");
const $compressedTexSubImage2D3 = dartx.compressedTexSubImage2D3 = Symbol("dartx.compressedTexSubImage2D3");
const $compressedTexSubImage3D = dartx.compressedTexSubImage3D = Symbol("dartx.compressedTexSubImage3D");
const $compressedTexSubImage3D2 = dartx.compressedTexSubImage3D2 = Symbol("dartx.compressedTexSubImage3D2");
const $copyBufferSubData = dartx.copyBufferSubData = Symbol("dartx.copyBufferSubData");
const $copyTexSubImage3D = dartx.copyTexSubImage3D = Symbol("dartx.copyTexSubImage3D");
const $createQuery = dartx.createQuery = Symbol("dartx.createQuery");
const $createSampler = dartx.createSampler = Symbol("dartx.createSampler");
const $createTransformFeedback = dartx.createTransformFeedback = Symbol("dartx.createTransformFeedback");
const $deleteQuery = dartx.deleteQuery = Symbol("dartx.deleteQuery");
const $deleteSampler = dartx.deleteSampler = Symbol("dartx.deleteSampler");
const $deleteSync = dartx.deleteSync = Symbol("dartx.deleteSync");
const $deleteTransformFeedback = dartx.deleteTransformFeedback = Symbol("dartx.deleteTransformFeedback");
const $drawArraysInstanced = dartx.drawArraysInstanced = Symbol("dartx.drawArraysInstanced");
const $drawBuffers = dartx.drawBuffers = Symbol("dartx.drawBuffers");
const $drawElementsInstanced = dartx.drawElementsInstanced = Symbol("dartx.drawElementsInstanced");
const $drawRangeElements = dartx.drawRangeElements = Symbol("dartx.drawRangeElements");
const $endQuery = dartx.endQuery = Symbol("dartx.endQuery");
const $endTransformFeedback = dartx.endTransformFeedback = Symbol("dartx.endTransformFeedback");
const $fenceSync = dartx.fenceSync = Symbol("dartx.fenceSync");
const $framebufferTextureLayer = dartx.framebufferTextureLayer = Symbol("dartx.framebufferTextureLayer");
const $getActiveUniformBlockName = dartx.getActiveUniformBlockName = Symbol("dartx.getActiveUniformBlockName");
const $getActiveUniformBlockParameter = dartx.getActiveUniformBlockParameter = Symbol("dartx.getActiveUniformBlockParameter");
const $getActiveUniforms = dartx.getActiveUniforms = Symbol("dartx.getActiveUniforms");
const $getBufferSubData = dartx.getBufferSubData = Symbol("dartx.getBufferSubData");
const $getFragDataLocation = dartx.getFragDataLocation = Symbol("dartx.getFragDataLocation");
const $getIndexedParameter = dartx.getIndexedParameter = Symbol("dartx.getIndexedParameter");
const $getInternalformatParameter = dartx.getInternalformatParameter = Symbol("dartx.getInternalformatParameter");
const $getQuery = dartx.getQuery = Symbol("dartx.getQuery");
const $getQueryParameter = dartx.getQueryParameter = Symbol("dartx.getQueryParameter");
const $getSamplerParameter = dartx.getSamplerParameter = Symbol("dartx.getSamplerParameter");
const $getSyncParameter = dartx.getSyncParameter = Symbol("dartx.getSyncParameter");
const $getTransformFeedbackVarying = dartx.getTransformFeedbackVarying = Symbol("dartx.getTransformFeedbackVarying");
const $getUniformBlockIndex = dartx.getUniformBlockIndex = Symbol("dartx.getUniformBlockIndex");
const $getUniformIndices = dartx.getUniformIndices = Symbol("dartx.getUniformIndices");
const $invalidateFramebuffer = dartx.invalidateFramebuffer = Symbol("dartx.invalidateFramebuffer");
const $invalidateSubFramebuffer = dartx.invalidateSubFramebuffer = Symbol("dartx.invalidateSubFramebuffer");
const $isQuery = dartx.isQuery = Symbol("dartx.isQuery");
const $isSampler = dartx.isSampler = Symbol("dartx.isSampler");
const $isSync = dartx.isSync = Symbol("dartx.isSync");
const $isTransformFeedback = dartx.isTransformFeedback = Symbol("dartx.isTransformFeedback");
const $pauseTransformFeedback = dartx.pauseTransformFeedback = Symbol("dartx.pauseTransformFeedback");
const $readBuffer = dartx.readBuffer = Symbol("dartx.readBuffer");
const $readPixels2 = dartx.readPixels2 = Symbol("dartx.readPixels2");
const $renderbufferStorageMultisample = dartx.renderbufferStorageMultisample = Symbol("dartx.renderbufferStorageMultisample");
const $resumeTransformFeedback = dartx.resumeTransformFeedback = Symbol("dartx.resumeTransformFeedback");
const $samplerParameterf = dartx.samplerParameterf = Symbol("dartx.samplerParameterf");
const $samplerParameteri = dartx.samplerParameteri = Symbol("dartx.samplerParameteri");
const $texImage2D2 = dartx.texImage2D2 = Symbol("dartx.texImage2D2");
const $texImage3D = dartx.texImage3D = Symbol("dartx.texImage3D");
const $texStorage2D = dartx.texStorage2D = Symbol("dartx.texStorage2D");
const $texStorage3D = dartx.texStorage3D = Symbol("dartx.texStorage3D");
const $texSubImage2D2 = dartx.texSubImage2D2 = Symbol("dartx.texSubImage2D2");
const $texSubImage3D = dartx.texSubImage3D = Symbol("dartx.texSubImage3D");
const $transformFeedbackVaryings = dartx.transformFeedbackVaryings = Symbol("dartx.transformFeedbackVaryings");
const $uniform1fv2 = dartx.uniform1fv2 = Symbol("dartx.uniform1fv2");
const $uniform1iv2 = dartx.uniform1iv2 = Symbol("dartx.uniform1iv2");
const $uniform1ui = dartx.uniform1ui = Symbol("dartx.uniform1ui");
const $uniform1uiv = dartx.uniform1uiv = Symbol("dartx.uniform1uiv");
const $uniform2fv2 = dartx.uniform2fv2 = Symbol("dartx.uniform2fv2");
const $uniform2iv2 = dartx.uniform2iv2 = Symbol("dartx.uniform2iv2");
const $uniform2ui = dartx.uniform2ui = Symbol("dartx.uniform2ui");
const $uniform2uiv = dartx.uniform2uiv = Symbol("dartx.uniform2uiv");
const $uniform3fv2 = dartx.uniform3fv2 = Symbol("dartx.uniform3fv2");
const $uniform3iv2 = dartx.uniform3iv2 = Symbol("dartx.uniform3iv2");
const $uniform3ui = dartx.uniform3ui = Symbol("dartx.uniform3ui");
const $uniform3uiv = dartx.uniform3uiv = Symbol("dartx.uniform3uiv");
const $uniform4fv2 = dartx.uniform4fv2 = Symbol("dartx.uniform4fv2");
const $uniform4iv2 = dartx.uniform4iv2 = Symbol("dartx.uniform4iv2");
const $uniform4ui = dartx.uniform4ui = Symbol("dartx.uniform4ui");
const $uniform4uiv = dartx.uniform4uiv = Symbol("dartx.uniform4uiv");
const $uniformBlockBinding = dartx.uniformBlockBinding = Symbol("dartx.uniformBlockBinding");
const $uniformMatrix2fv2 = dartx.uniformMatrix2fv2 = Symbol("dartx.uniformMatrix2fv2");
const $uniformMatrix2x3fv = dartx.uniformMatrix2x3fv = Symbol("dartx.uniformMatrix2x3fv");
const $uniformMatrix2x4fv = dartx.uniformMatrix2x4fv = Symbol("dartx.uniformMatrix2x4fv");
const $uniformMatrix3fv2 = dartx.uniformMatrix3fv2 = Symbol("dartx.uniformMatrix3fv2");
const $uniformMatrix3x2fv = dartx.uniformMatrix3x2fv = Symbol("dartx.uniformMatrix3x2fv");
const $uniformMatrix3x4fv = dartx.uniformMatrix3x4fv = Symbol("dartx.uniformMatrix3x4fv");
const $uniformMatrix4fv2 = dartx.uniformMatrix4fv2 = Symbol("dartx.uniformMatrix4fv2");
const $uniformMatrix4x2fv = dartx.uniformMatrix4x2fv = Symbol("dartx.uniformMatrix4x2fv");
const $uniformMatrix4x3fv = dartx.uniformMatrix4x3fv = Symbol("dartx.uniformMatrix4x3fv");
const $vertexAttribDivisor = dartx.vertexAttribDivisor = Symbol("dartx.vertexAttribDivisor");
const $vertexAttribI4i = dartx.vertexAttribI4i = Symbol("dartx.vertexAttribI4i");
const $vertexAttribI4iv = dartx.vertexAttribI4iv = Symbol("dartx.vertexAttribI4iv");
const $vertexAttribI4ui = dartx.vertexAttribI4ui = Symbol("dartx.vertexAttribI4ui");
const $vertexAttribI4uiv = dartx.vertexAttribI4uiv = Symbol("dartx.vertexAttribI4uiv");
const $vertexAttribIPointer = dartx.vertexAttribIPointer = Symbol("dartx.vertexAttribIPointer");
const $waitSync = dartx.waitSync = Symbol("dartx.waitSync");
const $precision = dartx.precision = Symbol("dartx.precision");
const $rangeMax = dartx.rangeMax = Symbol("dartx.rangeMax");
const $rangeMin = dartx.rangeMin = Symbol("dartx.rangeMin");
const $lastUploadedVideoFrameWasSkipped = dartx.lastUploadedVideoFrameWasSkipped = Symbol("dartx.lastUploadedVideoFrameWasSkipped");
const $lastUploadedVideoHeight = dartx.lastUploadedVideoHeight = Symbol("dartx.lastUploadedVideoHeight");
const $lastUploadedVideoTimestamp = dartx.lastUploadedVideoTimestamp = Symbol("dartx.lastUploadedVideoTimestamp");
const $lastUploadedVideoWidth = dartx.lastUploadedVideoWidth = Symbol("dartx.lastUploadedVideoWidth");
const $changeVersion = dartx.changeVersion = Symbol("dartx.changeVersion");
const $readTransaction = dartx.readTransaction = Symbol("dartx.readTransaction");
const $transaction_future = dartx.transaction_future = Symbol("dartx.transaction_future");
const $insertId = dartx.insertId = Symbol("dartx.insertId");
const $rowsAffected = dartx.rowsAffected = Symbol("dartx.rowsAffected");
const $executeSql = dartx.executeSql = Symbol("dartx.executeSql");
let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
let IdentityMapOfString$Object = () => (IdentityMapOfString$Object = dart.constFn(_js_helper.IdentityMap$(core.String, core.Object)))();
let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
let IdentityMapOfString$ListOfString = () => (IdentityMapOfString$ListOfString = dart.constFn(_js_helper.IdentityMap$(core.String, ListOfString())))();
let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
let IdentityMapOfObject$int = () => (IdentityMapOfObject$int = dart.constFn(_js_helper.IdentityMap$(core.Object, core.int)))();
let ListOfObject = () => (ListOfObject = dart.constFn(core.List$(core.Object)))();
let IdentityMapOfTypeVariable$Object = () => (IdentityMapOfTypeVariable$Object = dart.constFn(_js_helper.IdentityMap$(dart.TypeVariable, core.Object)))();
let ListOfTypeVariable = () => (ListOfTypeVariable = dart.constFn(core.List$(dart.TypeVariable)))();
let IterableOfTypeVariable = () => (IterableOfTypeVariable = dart.constFn(core.Iterable$(dart.TypeVariable)))();
let JSArrayOfTypeVariable = () => (JSArrayOfTypeVariable = dart.constFn(_interceptors.JSArray$(dart.TypeVariable)))();
let ListOfType = () => (ListOfType = dart.constFn(core.List$(core.Type)))();
let IterableOfTypeConstraint = () => (IterableOfTypeConstraint = dart.constFn(core.Iterable$(dart.TypeConstraint)))();
let MapOfTypeVariable$TypeConstraint = () => (MapOfTypeVariable$TypeConstraint = dart.constFn(core.Map$(dart.TypeVariable, dart.TypeConstraint)))();
let JSArrayOfObject = () => (JSArrayOfObject = dart.constFn(_interceptors.JSArray$(core.Object)))();
let MapOfSymbol$dynamic = () => (MapOfSymbol$dynamic = dart.constFn(core.Map$(core.Symbol, dart.dynamic)))();
let NameValuePairAndNameValuePairToint = () => (NameValuePairAndNameValuePairToint = dart.constFn(dart.fnType(core.int, [_debugger.NameValuePair, _debugger.NameValuePair])))();
let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.fnType(core.Null, [core.int, dart.dynamic])))();
let StringTobool = () => (StringTobool = dart.constFn(dart.fnType(core.bool, [core.String])))();
let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.fnType(dart.dynamic, [dart.dynamic])))();
let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.fnType(core.Object, [dart.dynamic])))();
let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
let _HashSetOfNameValuePair = () => (_HashSetOfNameValuePair = dart.constFn(collection._HashSet$(_debugger.NameValuePair)))();
let IdentityMapOfString$String = () => (IdentityMapOfString$String = dart.constFn(_js_helper.IdentityMap$(core.String, core.String)))();
let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.fnType(core.Null, [dart.dynamic, dart.dynamic])))();
let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
let dynamicToString = () => (dynamicToString = dart.constFn(dart.fnType(core.String, [dart.dynamic])))();
let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
let VoidToNull = () => (VoidToNull = dart.constFn(dart.fnType(core.Null, [])))();
let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.fnType(_debugger.NameValuePair, [core.String])))();
let IterableOfNameValuePair = () => (IterableOfNameValuePair = dart.constFn(core.Iterable$(_debugger.NameValuePair)))();
let JSArrayOf_CallMethodRecord = () => (JSArrayOf_CallMethodRecord = dart.constFn(_interceptors.JSArray$(_debugger._CallMethodRecord)))();
let IdentityMapOfString$_MethodStats = () => (IdentityMapOfString$_MethodStats = dart.constFn(_js_helper.IdentityMap$(core.String, _debugger._MethodStats)))();
let VoidToString = () => (VoidToString = dart.constFn(dart.fnType(core.String, [])))();
let StringToString = () => (StringToString = dart.constFn(dart.fnType(core.String, [core.String])))();
let VoidTo_MethodStats = () => (VoidTo_MethodStats = dart.constFn(dart.fnType(_debugger._MethodStats, [])))();
let StringAndStringToint = () => (StringAndStringToint = dart.constFn(dart.fnType(core.int, [core.String, core.String])))();
let JSArrayOfListOfObject = () => (JSArrayOfListOfObject = dart.constFn(_interceptors.JSArray$(ListOfObject())))();
let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.fnType(core.int, [dart.dynamic, dart.dynamic])))();
let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.fnType(core.Null, [dart.dynamic])))();
let ComparableOfnum = () => (ComparableOfnum = dart.constFn(core.Comparable$(core.num)))();
let FutureOfNull = () => (FutureOfNull = dart.constFn(async.Future$(core.Null)))();
let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.fnType(core.Null, [dart.dynamic, core.StackTrace])))();
let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.fnType(dart.void, [])))();
let TimerToNull = () => (TimerToNull = dart.constFn(dart.fnType(core.Null, [async.Timer])))();
let _FutureOfNull = () => (_FutureOfNull = dart.constFn(async._Future$(core.Null)))();
let VoidTo_FutureOfNull = () => (VoidTo_FutureOfNull = dart.constFn(dart.fnType(_FutureOfNull(), [])))();
let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.fnType(async.Future, [])))();
let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.fnType(async.Future, [dart.dynamic])))();
let _FutureOfString = () => (_FutureOfString = dart.constFn(async._Future$(core.String)))();
let _FutureOfbool = () => (_FutureOfbool = dart.constFn(async._Future$(core.bool)))();
let VoidTobool = () => (VoidTobool = dart.constFn(dart.fnType(core.bool, [])))();
let boolToNull = () => (boolToNull = dart.constFn(dart.fnType(core.Null, [core.bool])))();
let _FutureOfint = () => (_FutureOfint = dart.constFn(async._Future$(core.int)))();
let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.fnType(dart.void, [dart.dynamic, core.StackTrace])))();
let NullAndNullTodynamic = () => (NullAndNullTodynamic = dart.constFn(dart.fnType(dart.dynamic, [core.Null, core.Null])))();
let ObjectAndStackTraceTodynamic = () => (ObjectAndStackTraceTodynamic = dart.constFn(dart.fnType(dart.dynamic, [core.Object, core.StackTrace])))();
let ObjectTodynamic = () => (ObjectTodynamic = dart.constFn(dart.fnType(dart.dynamic, [core.Object])))();
let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.fnType(dart.void, [dart.dynamic])))();
let EventSinkTo_ConverterStreamEventSink = () => (EventSinkTo_ConverterStreamEventSink = dart.constFn(dart.fnType(convert._ConverterStreamEventSink, [async.EventSink])))();
let VoidToSetOfR = () => (VoidToSetOfR = dart.constFn(dart.gFnType(R => [core.Set$(R), []])))();
let EmptyIteratorOfNull = () => (EmptyIteratorOfNull = dart.constFn(_internal.EmptyIterator$(core.Null)))();
let IterableOfObject = () => (IterableOfObject = dart.constFn(core.Iterable$(core.Object)))();
let IteratorOfObject = () => (IteratorOfObject = dart.constFn(core.Iterator$(core.Object)))();
let VoidToint = () => (VoidToint = dart.constFn(dart.fnType(core.int, [])))();
let JSArrayOfint = () => (JSArrayOfint = dart.constFn(_interceptors.JSArray$(core.int)))();
let ObjectTobool = () => (ObjectTobool = dart.constFn(dart.fnType(core.bool, [core.Object])))();
let SubListIterableOfString = () => (SubListIterableOfString = dart.constFn(_internal.SubListIterable$(core.String)))();
let IteratorOfRegExpMatch = () => (IteratorOfRegExpMatch = dart.constFn(core.Iterator$(core.RegExpMatch)))();
let IteratorOfMatch = () => (IteratorOfMatch = dart.constFn(core.Iterator$(core.Match)))();
let MatchToString = () => (MatchToString = dart.constFn(dart.fnType(core.String, [core.Match])))();
let LinkedMapOfSymbol$dynamic = () => (LinkedMapOfSymbol$dynamic = dart.constFn(_js_helper.LinkedMap$(core.Symbol, dart.dynamic)))();
let SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.fnType(core.Null, [core.Symbol, dart.dynamic])))();
let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
let FutureOfLibraryMirror = () => (FutureOfLibraryMirror = dart.constFn(async.Future$(mirrors.LibraryMirror)))();
let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.fnType(mirrors.TypeMirror, [dart.dynamic])))();
let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
let dynamicToInstanceMirror = () => (dynamicToInstanceMirror = dart.constFn(dart.fnType(mirrors.InstanceMirror, [dart.dynamic])))();
let LinkedMapOfSymbol$DeclarationMirror = () => (LinkedMapOfSymbol$DeclarationMirror = dart.constFn(_js_helper.LinkedMap$(core.Symbol, mirrors.DeclarationMirror)))();
let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
let JSArrayOfClassMirror = () => (JSArrayOfClassMirror = dart.constFn(_interceptors.JSArray$(mirrors.ClassMirror)))();
let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.fnType(mirrors.TypeMirror, [core.Type])))();
let IterableOfTypeMirror = () => (IterableOfTypeMirror = dart.constFn(core.Iterable$(mirrors.TypeMirror)))();
let ListOfClassMirror = () => (ListOfClassMirror = dart.constFn(core.List$(mirrors.ClassMirror)))();
let ListOfTypeVariableMirror = () => (ListOfTypeVariableMirror = dart.constFn(core.List$(mirrors.TypeVariableMirror)))();
let MapOfSymbol$MethodMirror = () => (MapOfSymbol$MethodMirror = dart.constFn(core.Map$(core.Symbol, mirrors.MethodMirror)))();
let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
let ListOfint = () => (ListOfint = dart.constFn(core.List$(core.int)))();
let ObjectAndStackTraceToNull = () => (ObjectAndStackTraceToNull = dart.constFn(dart.fnType(core.Null, [core.Object, core.StackTrace])))();
let __Tovoid = () => (__Tovoid = dart.constFn(dart.fnType(dart.void, [], [core.Object])))();
let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.fnType(dart.void, [core.Object])))();
let Object__Tovoid = () => (Object__Tovoid = dart.constFn(dart.fnType(dart.void, [core.Object], [core.StackTrace])))();
let ObjectAndStackTraceTovoid = () => (ObjectAndStackTraceTovoid = dart.constFn(dart.fnType(dart.void, [core.Object, core.StackTrace])))();
let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.fnType(core.bool, [dart.dynamic])))();
let FutureOfbool = () => (FutureOfbool = dart.constFn(async.Future$(core.bool)))();
let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
let VoidToFutureOrOfbool = () => (VoidToFutureOrOfbool = dart.constFn(dart.fnType(FutureOrOfbool(), [])))();
let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.fnType(core.Null, [dart.dynamic], [core.StackTrace])))();
let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.fnType(async._Future, [dart.dynamic])))();
let ZoneAndZoneDelegateAndZone__Tovoid = () => (ZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(dart.fnType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.gFnType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.fnType(R, [])]])))();
let ZoneAndZoneDelegateAndZone__ToR$ = () => (ZoneAndZoneDelegateAndZone__ToR$ = dart.constFn(dart.gFnType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.fnType(R, [T]), T]])))();
let ZoneAndZoneDelegateAndZone__ToR$0 = () => (ZoneAndZoneDelegateAndZone__ToR$0 = dart.constFn(dart.gFnType((R, T1, T2) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.fnType(R, [T1, T2]), T1, T2]])))();
let ZoneAndZoneDelegateAndZone__ToFn = () => (ZoneAndZoneDelegateAndZone__ToFn = dart.constFn(dart.gFnType(R => [dart.fnType(R, []), [async.Zone, async.ZoneDelegate, async.Zone, dart.fnType(R, [])]])))();
let ZoneAndZoneDelegateAndZone__ToFn$ = () => (ZoneAndZoneDelegateAndZone__ToFn$ = dart.constFn(dart.gFnType((R, T) => [dart.fnType(R, [T]), [async.Zone, async.ZoneDelegate, async.Zone, dart.fnType(R, [T])]])))();
let ZoneAndZoneDelegateAndZone__ToFn$0 = () => (ZoneAndZoneDelegateAndZone__ToFn$0 = dart.constFn(dart.gFnType((R, T1, T2) => [dart.fnType(R, [T1, T2]), [async.Zone, async.ZoneDelegate, async.Zone, dart.fnType(R, [T1, T2])]])))();
let ZoneAndZoneDelegateAndZone__ToAsyncError = () => (ZoneAndZoneDelegateAndZone__ToAsyncError = dart.constFn(dart.fnType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
let ZoneAndZoneDelegateAndZone__Tovoid$ = () => (ZoneAndZoneDelegateAndZone__Tovoid$ = dart.constFn(dart.fnType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTovoid()])))();
let ZoneAndZoneDelegateAndZone__ToTimer = () => (ZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(dart.fnType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()])))();
let TimerTovoid = () => (TimerTovoid = dart.constFn(dart.fnType(dart.void, [async.Timer])))();
let ZoneAndZoneDelegateAndZone__ToTimer$ = () => (ZoneAndZoneDelegateAndZone__ToTimer$ = dart.constFn(dart.fnType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()])))();
let ZoneAndZoneDelegateAndZone__Tovoid$0 = () => (ZoneAndZoneDelegateAndZone__Tovoid$0 = dart.constFn(dart.fnType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])))();
let ZoneAndZoneDelegateAndZone__ToZone = () => (ZoneAndZoneDelegateAndZone__ToZone = dart.constFn(dart.fnType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map])))();
let _ZoneFunctionOfFunction = () => (_ZoneFunctionOfFunction = dart.constFn(async._ZoneFunction$(core.Function)))();
let _ZoneFunctionOfZoneAndZoneDelegateAndZone__ToAsyncError = () => (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToAsyncError = dart.constFn(async._ZoneFunction$(ZoneAndZoneDelegateAndZone__ToAsyncError())))();
let _ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid = () => (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(async._ZoneFunction$(ZoneAndZoneDelegateAndZone__Tovoid$())))();
let _ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer = () => (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(async._ZoneFunction$(ZoneAndZoneDelegateAndZone__ToTimer())))();
let _ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer$ = () => (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer$ = dart.constFn(async._ZoneFunction$(ZoneAndZoneDelegateAndZone__ToTimer$())))();
let _ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$ = () => (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$ = dart.constFn(async._ZoneFunction$(ZoneAndZoneDelegateAndZone__Tovoid$0())))();
let _ZoneFunctionOfZoneAndZoneDelegateAndZone__ToZone = () => (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToZone = dart.constFn(async._ZoneFunction$(ZoneAndZoneDelegateAndZone__ToZone())))();
let _ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$0 = () => (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$0 = dart.constFn(async._ZoneFunction$(ZoneAndZoneDelegateAndZone__Tovoid())))();
let StringTovoid = () => (StringTovoid = dart.constFn(dart.fnType(dart.void, [core.String])))();
let ZoneAndZoneDelegateAndZone__Tovoid$1 = () => (ZoneAndZoneDelegateAndZone__Tovoid$1 = dart.constFn(dart.fnType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace])))();
let ZoneAndZoneDelegateAndZone__ToNull = () => (ZoneAndZoneDelegateAndZone__ToNull = dart.constFn(dart.fnType(core.Null, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
let ObjectToint = () => (ObjectToint = dart.constFn(dart.fnType(core.int, [core.Object])))();
let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.fnType(core.bool, [core.Object, core.Object])))();
let ComparableAndComparableToint = () => (ComparableAndComparableToint = dart.constFn(dart.fnType(core.int, [core.Comparable, core.Comparable])))();
let _SplayTreeMapNodeTobool = () => (_SplayTreeMapNodeTobool = dart.constFn(dart.fnType(core.bool, [collection._SplayTreeMapNode])))();
let MappedIterableOfString$dynamic = () => (MappedIterableOfString$dynamic = dart.constFn(_internal.MappedIterable$(core.String, dart.dynamic)))();
let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.fnType(core.Null, [core.String, dart.dynamic])))();
let IdentityMapOfString$dynamic = () => (IdentityMapOfString$dynamic = dart.constFn(_js_helper.IdentityMap$(core.String, dart.dynamic)))();
let ComparableOfString = () => (ComparableOfString = dart.constFn(core.Comparable$(core.String)))();
let ObjectAndObjectTodynamic = () => (ObjectAndObjectTodynamic = dart.constFn(dart.fnType(dart.dynamic, [core.Object, core.Object])))();
let SinkOfObject = () => (SinkOfObject = dart.constFn(core.Sink$(core.Object)))();
let StringBufferToString = () => (StringBufferToString = dart.constFn(dart.fnType(core.String, [core.StringBuffer])))();
let StringBufferAndStringToStringBuffer = () => (StringBufferAndStringToStringBuffer = dart.constFn(dart.fnType(core.StringBuffer, [core.StringBuffer, core.String])))();
let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
let FutureOfStringBuffer = () => (FutureOfStringBuffer = dart.constFn(async.Future$(core.StringBuffer)))();
let FutureOfString = () => (FutureOfString = dart.constFn(async.Future$(core.String)))();
let IdentityMapOfString$Encoding = () => (IdentityMapOfString$Encoding = dart.constFn(_js_helper.IdentityMap$(core.String, convert.Encoding)))();
let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.fnType(dart.void, [ListOfint()])))();
let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.fnType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
let SyncIterableOfString = () => (SyncIterableOfString = dart.constFn(_js_helper.SyncIterable$(core.String)))();
let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
let EventSinkOfStringTo_LineSplitterEventSink = () => (EventSinkOfStringTo_LineSplitterEventSink = dart.constFn(dart.fnType(convert._LineSplitterEventSink, [EventSinkOfString()])))();
let _StringSinkConversionSinkOfStringSink = () => (_StringSinkConversionSinkOfStringSink = dart.constFn(convert._StringSinkConversionSink$(core.StringSink)))();
let intAndintToint = () => (intAndintToint = dart.constFn(dart.fnType(core.int, [core.int, core.int])))();
let intToint = () => (intToint = dart.constFn(dart.fnType(core.int, [core.int])))();
let ComparableOfBigInt = () => (ComparableOfBigInt = dart.constFn(core.Comparable$(core.BigInt)))();
let StringToint = () => (StringToint = dart.constFn(dart.fnType(core.int, [core.String])))();
let ComparableOfDateTime = () => (ComparableOfDateTime = dart.constFn(core.Comparable$(core.DateTime)))();
let intToString = () => (intToString = dart.constFn(dart.fnType(core.String, [core.int])))();
let ComparableOfDuration = () => (ComparableOfDuration = dart.constFn(core.Comparable$(core.Duration)))();
let MapOfSymbol$Object = () => (MapOfSymbol$Object = dart.constFn(core.Map$(core.Symbol, core.Object)))();
let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.fnType(MapOfString$String(), [MapOfString$String(), core.String])))();
let StringAndintTovoid = () => (StringAndintTovoid = dart.constFn(dart.fnType(dart.void, [core.String, core.int])))();
let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.fnType(dart.void, [core.String], [dart.dynamic])))();
let StringToNull = () => (StringToNull = dart.constFn(dart.fnType(core.Null, [core.String])))();
let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.fnType(dart.void, [core.String, core.String])))();
let VoidToListOfString = () => (VoidToListOfString = dart.constFn(dart.fnType(ListOfString(), [])))();
let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.fnType(dart.void, [core.int, core.int, core.int])))();
let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.fnType(core.Null, [core.String, core.String])))();
let intToUint8List = () => (intToUint8List = dart.constFn(dart.fnType(typed_data.Uint8List, [core.int])))();
let ListOfUint8List = () => (ListOfUint8List = dart.constFn(core.List$(typed_data.Uint8List)))();
let dynamicAnddynamicToUint8List = () => (dynamicAnddynamicToUint8List = dart.constFn(dart.fnType(typed_data.Uint8List, [dart.dynamic, dart.dynamic])))();
let Uint8ListAndStringAndintTovoid = () => (Uint8ListAndStringAndintTovoid = dart.constFn(dart.fnType(dart.void, [typed_data.Uint8List, core.String, core.int])))();
let FutureOfServiceExtensionResponse = () => (FutureOfServiceExtensionResponse = dart.constFn(async.Future$(developer.ServiceExtensionResponse)))();
let StringAndMapOfString$StringToFutureOfServiceExtensionResponse = () => (StringAndMapOfString$StringToFutureOfServiceExtensionResponse = dart.constFn(dart.fnType(FutureOfServiceExtensionResponse(), [core.String, MapOfString$String()])))();
let IdentityMapOfString$StringAndMapOfString$StringToFutureOfServiceExtensionResponse = () => (IdentityMapOfString$StringAndMapOfString$StringToFutureOfServiceExtensionResponse = dart.constFn(_js_helper.IdentityMap$(core.String, StringAndMapOfString$StringToFutureOfServiceExtensionResponse())))();
let IdentityMapOfString$Metric = () => (IdentityMapOfString$Metric = dart.constFn(_js_helper.IdentityMap$(core.String, developer.Metric)))();
let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
let UriTovoid = () => (UriTovoid = dart.constFn(dart.fnType(dart.void, [core.Uri])))();
let JSArrayOf_SyncBlock = () => (JSArrayOf_SyncBlock = dart.constFn(_interceptors.JSArray$(developer._SyncBlock)))();
let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.fnType(FutureOfDirectory(), [io.Directory])))();
let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.fnType(FutureOrOfDirectory(), [core.bool])))();
let dynamicTo_Directory = () => (dynamicTo_Directory = dart.constFn(dart.fnType(io._Directory, [dart.dynamic])))();
let dynamicToDirectory = () => (dynamicToDirectory = dart.constFn(dart.fnType(io.Directory, [dart.dynamic])))();
let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.fnType(FutureOrOfString(), [dart.dynamic])))();
let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.fnType(FutureOrOfbool(), [dart.dynamic])))();
let FileSystemEntityTypeTobool = () => (FileSystemEntityTypeTobool = dart.constFn(dart.fnType(core.bool, [io.FileSystemEntityType])))();
let dynamicToFileSystemEntityType = () => (dynamicToFileSystemEntityType = dart.constFn(dart.fnType(io.FileSystemEntityType, [dart.dynamic])))();
let FutureOfFileSystemEntityType = () => (FutureOfFileSystemEntityType = dart.constFn(async.Future$(io.FileSystemEntityType)))();
let StreamControllerOfFileSystemEntity = () => (StreamControllerOfFileSystemEntity = dart.constFn(async.StreamController$(io.FileSystemEntity)))();
let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.fnType(core.Null, [ListOfint()])))();
let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.fnType(dart.void, [io.RandomAccessFile])))();
let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.fnType(dart.void, [dart.dynamic, dart.dynamic])))();
let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.fnType(dart.void, [dart.dynamic], [core.StackTrace])))();
let RandomAccessFileTodynamic = () => (RandomAccessFileTodynamic = dart.constFn(dart.fnType(dart.dynamic, [io.RandomAccessFile])))();
let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.fnType(core.Null, [io.RandomAccessFile])))();
let voidToFile = () => (voidToFile = dart.constFn(dart.fnType(io.File, [dart.void])))();
let FutureOfvoid = () => (FutureOfvoid = dart.constFn(async.Future$(dart.void)))();
let RandomAccessFileToFutureOfvoid = () => (RandomAccessFileToFutureOfvoid = dart.constFn(dart.fnType(FutureOfvoid(), [io.RandomAccessFile])))();
let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.fnType(io._File, [dart.dynamic])))();
let DirectoryToFuture = () => (DirectoryToFuture = dart.constFn(dart.fnType(async.Future, [io.Directory])))();
let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.fnType(io._File, [io.FileSystemEntity])))();
let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.fnType(io.File, [dart.dynamic])))();
let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.fnType(io._RandomAccessFile, [dart.dynamic])))();
let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.fnType(FutureOrOfint(), [dart.dynamic])))();
let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.fnType(core.DateTime, [dart.dynamic])))();
let FutureOfDateTime = () => (FutureOfDateTime = dart.constFn(async.Future$(core.DateTime)))();
let CompleterOfListOfint = () => (CompleterOfListOfint = dart.constFn(async.Completer$(ListOfint())))();
let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.fnType(FutureOfListOfint(), [io.RandomAccessFile])))();
let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.fnType(FutureOfListOfint(), [core.int])))();
let ListOfintToFutureOrOfString = () => (ListOfintToFutureOrOfString = dart.constFn(dart.fnType(FutureOrOfString(), [ListOfint()])))();
let FutureOfListOfString = () => (FutureOfListOfString = dart.constFn(async.Future$(ListOfString())))();
let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.fnType(io._File, [io.RandomAccessFile])))();
let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.fnType(FutureOrOfFile(), [io.RandomAccessFile])))();
let RandomAccessFileToFutureOfFile = () => (RandomAccessFileToFutureOfFile = dart.constFn(dart.fnType(FutureOfFile(), [io.RandomAccessFile])))();
let dynamicAnddynamicToFutureOfServiceExtensionResponse = () => (dynamicAnddynamicToFutureOfServiceExtensionResponse = dart.constFn(dart.fnType(FutureOfServiceExtensionResponse(), [dart.dynamic, dart.dynamic])))();
let dynamicToListOfint = () => (dynamicToListOfint = dart.constFn(dart.fnType(ListOfint(), [dart.dynamic])))();
let dynamicToint = () => (dynamicToint = dart.constFn(dart.fnType(core.int, [dart.dynamic])))();
let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.fnType(io.FileStat, [dart.dynamic])))();
let FutureOfFileStat = () => (FutureOfFileStat = dart.constFn(async.Future$(io.FileStat)))();
let _FileResourceInfoToMapOfString$dynamic = () => (_FileResourceInfoToMapOfString$dynamic = dart.constFn(dart.fnType(MapOfString$dynamic(), [io._FileResourceInfo])))();
let ListOfMapOfString$dynamic = () => (ListOfMapOfString$dynamic = dart.constFn(core.List$(MapOfString$dynamic())))();
let IdentityMapOfint$_FileResourceInfo = () => (IdentityMapOfint$_FileResourceInfo = dart.constFn(_js_helper.IdentityMap$(core.int, io._FileResourceInfo)))();
let _ProcessResourceInfoToMapOfString$dynamic = () => (_ProcessResourceInfoToMapOfString$dynamic = dart.constFn(dart.fnType(MapOfString$dynamic(), [io._ProcessResourceInfo])))();
let IdentityMapOfint$_ProcessResourceInfo = () => (IdentityMapOfint$_ProcessResourceInfo = dart.constFn(_js_helper.IdentityMap$(core.int, io._ProcessResourceInfo)))();
let _SocketResourceInfoToMapOfString$dynamic = () => (_SocketResourceInfoToMapOfString$dynamic = dart.constFn(dart.fnType(MapOfString$dynamic(), [io._SocketResourceInfo])))();
let IdentityMapOfint$_SocketResourceInfo = () => (IdentityMapOfint$_SocketResourceInfo = dart.constFn(_js_helper.IdentityMap$(core.int, io._SocketResourceInfo)))();
let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.fnType(io._Link, [dart.dynamic])))();
let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.fnType(FutureOfLink(), [io.FileSystemEntity])))();
let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.fnType(io._Link, [io.FileSystemEntity])))();
let dynamicToLink = () => (dynamicToLink = dart.constFn(dart.fnType(io.Link, [dart.dynamic])))();
let Fn__ToR = () => (Fn__ToR = dart.constFn(dart.gFnType(R => [R, [dart.fnType(R, [])], {zoneValues: core.Map, zoneSpecification: async.ZoneSpecification, onError: core.Function}])))();
let StringToDirectory = () => (StringToDirectory = dart.constFn(dart.fnType(io.Directory, [core.String])))();
let VoidToDirectory = () => (VoidToDirectory = dart.constFn(dart.fnType(io.Directory, [])))();
let StringToFile = () => (StringToFile = dart.constFn(dart.fnType(io.File, [core.String])))();
let StringToFutureOfFileStat = () => (StringToFutureOfFileStat = dart.constFn(dart.fnType(FutureOfFileStat(), [core.String])))();
let StringToFileStat = () => (StringToFileStat = dart.constFn(dart.fnType(io.FileStat, [core.String])))();
let StringAndStringToFutureOfbool = () => (StringAndStringToFutureOfbool = dart.constFn(dart.fnType(FutureOfbool(), [core.String, core.String])))();
let StringAndStringTobool = () => (StringAndStringTobool = dart.constFn(dart.fnType(core.bool, [core.String, core.String])))();
let StringAndboolToFutureOfFileSystemEntityType = () => (StringAndboolToFutureOfFileSystemEntityType = dart.constFn(dart.fnType(FutureOfFileSystemEntityType(), [core.String, core.bool])))();
let StringAndboolToFileSystemEntityType = () => (StringAndboolToFileSystemEntityType = dart.constFn(dart.fnType(io.FileSystemEntityType, [core.String, core.bool])))();
let StreamOfFileSystemEvent = () => (StreamOfFileSystemEvent = dart.constFn(async.Stream$(io.FileSystemEvent)))();
let StringAndintAndboolToStreamOfFileSystemEvent = () => (StringAndintAndboolToStreamOfFileSystemEvent = dart.constFn(dart.fnType(StreamOfFileSystemEvent(), [core.String, core.int, core.bool])))();
let StringToLink = () => (StringToLink = dart.constFn(dart.fnType(io.Link, [core.String])))();
let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
let dynamicAndint__ToFutureOfSocket = () => (dynamicAndint__ToFutureOfSocket = dart.constFn(dart.fnType(FutureOfSocket(), [dart.dynamic, core.int], {sourceAddress: dart.dynamic, timeout: core.Duration})))();
let ConnectionTaskOfSocket = () => (ConnectionTaskOfSocket = dart.constFn(io.ConnectionTask$(io.Socket)))();
let FutureOfConnectionTaskOfSocket = () => (FutureOfConnectionTaskOfSocket = dart.constFn(async.Future$(ConnectionTaskOfSocket())))();
let dynamicAndint__ToFutureOfConnectionTaskOfSocket = () => (dynamicAndint__ToFutureOfConnectionTaskOfSocket = dart.constFn(dart.fnType(FutureOfConnectionTaskOfSocket(), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})))();
let _CaseInsensitiveStringMapOfString = () => (_CaseInsensitiveStringMapOfString = dart.constFn(io._CaseInsensitiveStringMap$(core.String)))();
let RawSecureServerSocketToSecureServerSocket = () => (RawSecureServerSocketToSecureServerSocket = dart.constFn(dart.fnType(io.SecureServerSocket, [io.RawSecureServerSocket])))();
let FutureOfSecureServerSocket = () => (FutureOfSecureServerSocket = dart.constFn(async.Future$(io.SecureServerSocket)))();
let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.fnType(io.SecureSocket, [io.RawSecureSocket])))();
let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
let ConnectionTaskOfSecureSocket = () => (ConnectionTaskOfSecureSocket = dart.constFn(io.ConnectionTask$(io.SecureSocket)))();
let ConnectionTaskOfRawSecureSocket = () => (ConnectionTaskOfRawSecureSocket = dart.constFn(io.ConnectionTask$(io.RawSecureSocket)))();
let ConnectionTaskOfRawSecureSocketToConnectionTaskOfSecureSocket = () => (ConnectionTaskOfRawSecureSocketToConnectionTaskOfSecureSocket = dart.constFn(dart.fnType(ConnectionTaskOfSecureSocket(), [ConnectionTaskOfRawSecureSocket()])))();
let FutureOfConnectionTaskOfSecureSocket = () => (FutureOfConnectionTaskOfSecureSocket = dart.constFn(async.Future$(ConnectionTaskOfSecureSocket())))();
let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.fnType(FutureOfRawSecureSocket(), [dart.dynamic])))();
let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.fnType(io.RawSecureServerSocket, [io.RawServerSocket])))();
let FutureOfRawSecureServerSocket = () => (FutureOfRawSecureServerSocket = dart.constFn(async.Future$(io.RawSecureServerSocket)))();
let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.fnType(core.Null, [io.RawSecureSocket])))();
let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.fnType(FutureOfRawSecureSocket(), [io.RawSocket])))();
let ConnectionTaskOfRawSocket = () => (ConnectionTaskOfRawSocket = dart.constFn(io.ConnectionTask$(io.RawSocket)))();
let ConnectionTaskOfRawSocketToConnectionTaskOfRawSecureSocket = () => (ConnectionTaskOfRawSocketToConnectionTaskOfRawSecureSocket = dart.constFn(dart.fnType(ConnectionTaskOfRawSecureSocket(), [ConnectionTaskOfRawSocket()])))();
let FutureOfConnectionTaskOfRawSecureSocket = () => (FutureOfConnectionTaskOfRawSecureSocket = dart.constFn(async.Future$(ConnectionTaskOfRawSecureSocket())))();
let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
let CompleterOfRawSecureSocket = () => (CompleterOfRawSecureSocket = dart.constFn(async.Completer$(io.RawSecureSocket)))();
let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.fnType(core.Null, [io._FilterStatus])))();
let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.fnType(io._FilterStatus, [dart.dynamic])))();
let FutureOf_FilterStatus = () => (FutureOf_FilterStatus = dart.constFn(async.Future$(io._FilterStatus)))();
let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.fnType(dart.void, [ListOfint(), core.String])))();
let StreamOfRawSocket = () => (StreamOfRawSocket = dart.constFn(async.Stream$(io.RawSocket)))();
let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.fnType(js._DartObject, [dart.dynamic])))();
let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
let RectangleOfnum = () => (RectangleOfnum = dart.constFn(math.Rectangle$(core.num)))();
let LibraryMirrorTobool = () => (LibraryMirrorTobool = dart.constFn(dart.fnType(core.bool, [mirrors.LibraryMirror])))();
let ListOfdouble = () => (ListOfdouble = dart.constFn(core.List$(core.double)))();
let ListOfFloat32x4 = () => (ListOfFloat32x4 = dart.constFn(core.List$(typed_data.Float32x4)))();
let ListOfInt32x4 = () => (ListOfInt32x4 = dart.constFn(core.List$(typed_data.Int32x4)))();
let ListOfFloat64x2 = () => (ListOfFloat64x2 = dart.constFn(core.List$(typed_data.Float64x2)))();
let EventStreamProviderOfEvent = () => (EventStreamProviderOfEvent = dart.constFn(html$.EventStreamProvider$(html$.Event)))();
let EventStreamProviderOfVersionChangeEvent = () => (EventStreamProviderOfVersionChangeEvent = dart.constFn(html$.EventStreamProvider$(indexed_db.VersionChangeEvent)))();
let FutureOfDatabase = () => (FutureOfDatabase = dart.constFn(async.Future$(indexed_db.Database)))();
let CompleterOfIdbFactory = () => (CompleterOfIdbFactory = dart.constFn(async.Completer$(indexed_db.IdbFactory)))();
let EventToNull = () => (EventToNull = dart.constFn(dart.fnType(core.Null, [html$.Event])))();
let FutureOfIdbFactory = () => (FutureOfIdbFactory = dart.constFn(async.Future$(indexed_db.IdbFactory)))();
let ObserverChangesTovoid = () => (ObserverChangesTovoid = dart.constFn(dart.fnType(dart.void, [indexed_db.ObserverChanges])))();
let CompleterOfDatabase = () => (CompleterOfDatabase = dart.constFn(async.Completer$(indexed_db.Database)))();
let JSArrayOfEventTarget = () => (JSArrayOfEventTarget = dart.constFn(_interceptors.JSArray$(html$.EventTarget)))();
let CompleterOfMapOfString$dynamic = () => (CompleterOfMapOfString$dynamic = dart.constFn(async.Completer$(MapOfString$dynamic())))();
let NodeTobool = () => (NodeTobool = dart.constFn(dart.fnType(core.bool, [html$.Node])))();
let CompleterOfScrollState = () => (CompleterOfScrollState = dart.constFn(async.Completer$(html$.ScrollState)))();
let ScrollStateToNull = () => (ScrollStateToNull = dart.constFn(dart.fnType(core.Null, [html$.ScrollState])))();
let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.fnType(core.bool, [MapOfString$dynamic()])))();
let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.fnType(dart.dynamic, [core.Map], [ObjectTovoid()])))();
let ListOfNode = () => (ListOfNode = dart.constFn(core.List$(html$.Node)))();
let EventTargetToString = () => (EventTargetToString = dart.constFn(dart.fnType(core.String, [html$.EventTarget])))();
let _CustomEventStreamProviderOfWheelEvent = () => (_CustomEventStreamProviderOfWheelEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.WheelEvent)))();
let _CustomEventStreamProviderOfTransitionEvent = () => (_CustomEventStreamProviderOfTransitionEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.TransitionEvent)))();
let EventStreamProviderOfMouseEvent = () => (EventStreamProviderOfMouseEvent = dart.constFn(html$.EventStreamProvider$(html$.MouseEvent)))();
let EventStreamProviderOfClipboardEvent = () => (EventStreamProviderOfClipboardEvent = dart.constFn(html$.EventStreamProvider$(html$.ClipboardEvent)))();
let EventStreamProviderOfKeyboardEvent = () => (EventStreamProviderOfKeyboardEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyboardEvent)))();
let EventStreamProviderOfTouchEvent = () => (EventStreamProviderOfTouchEvent = dart.constFn(html$.EventStreamProvider$(html$.TouchEvent)))();
let EventStreamProviderOfWheelEvent = () => (EventStreamProviderOfWheelEvent = dart.constFn(html$.EventStreamProvider$(html$.WheelEvent)))();
let ListOfnum = () => (ListOfnum = dart.constFn(core.List$(core.num)))();
let EventStreamProviderOfProgressEvent = () => (EventStreamProviderOfProgressEvent = dart.constFn(html$.EventStreamProvider$(html$.ProgressEvent)))();
let ListOfBackgroundFetchSettledFetch = () => (ListOfBackgroundFetchSettledFetch = dart.constFn(core.List$(html$.BackgroundFetchSettledFetch)))();
let ListOfDetectedBarcode = () => (ListOfDetectedBarcode = dart.constFn(core.List$(html$.DetectedBarcode)))();
let EventStreamProviderOfMessageEvent = () => (EventStreamProviderOfMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MessageEvent)))();
let EventStreamProviderOfPopStateEvent = () => (EventStreamProviderOfPopStateEvent = dart.constFn(html$.EventStreamProvider$(html$.PopStateEvent)))();
let EventStreamProviderOfStorageEvent = () => (EventStreamProviderOfStorageEvent = dart.constFn(html$.EventStreamProvider$(html$.StorageEvent)))();
let CompleterOfBlob = () => (CompleterOfBlob = dart.constFn(async.Completer$(html$.Blob)))();
let BlobToNull = () => (BlobToNull = dart.constFn(dart.fnType(core.Null, [html$.Blob])))();
let EventStreamProviderOfContextEvent = () => (EventStreamProviderOfContextEvent = dart.constFn(html$.EventStreamProvider$(web_gl.ContextEvent)))();
let ListOfClient = () => (ListOfClient = dart.constFn(core.List$(html$.Client)))();
let ListOfCssRule = () => (ListOfCssRule = dart.constFn(core.List$(html$.CssRule)))();
let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.fnType(html$.CssStyleDeclaration, [dart.dynamic])))();
let IterableOfCssStyleDeclaration = () => (IterableOfCssStyleDeclaration = dart.constFn(core.Iterable$(html$.CssStyleDeclaration)))();
let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.fnType(dart.void, [html$.CssStyleDeclaration])))();
let IterableOfElement = () => (IterableOfElement = dart.constFn(core.Iterable$(html$.Element)))();
let ListOfCssTransformComponent = () => (ListOfCssTransformComponent = dart.constFn(core.List$(html$.CssTransformComponent)))();
let ListOfFile = () => (ListOfFile = dart.constFn(core.List$(html$.File)))();
let CompleterOfEntry = () => (CompleterOfEntry = dart.constFn(async.Completer$(html$.Entry)))();
let EntryToNull = () => (EntryToNull = dart.constFn(dart.fnType(core.Null, [html$.Entry])))();
let DomExceptionToNull = () => (DomExceptionToNull = dart.constFn(dart.fnType(core.Null, [html$.DomException])))();
let CompleterOfMetadata = () => (CompleterOfMetadata = dart.constFn(async.Completer$(html$.Metadata)))();
let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.fnType(core.Null, [html$.Metadata])))();
let ListOfEntry = () => (ListOfEntry = dart.constFn(core.List$(html$.Entry)))();
let CompleterOfListOfEntry = () => (CompleterOfListOfEntry = dart.constFn(async.Completer$(ListOfEntry())))();
let ListToNull = () => (ListToNull = dart.constFn(dart.fnType(core.Null, [core.List])))();
let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html$.StyleSheet)))();
let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html$.EventStreamProvider$(html$.SecurityPolicyViolationEvent)))();
let ListOfElement = () => (ListOfElement = dart.constFn(core.List$(html$.Element)))();
let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
let JavaScriptIndexingBehaviorOfRectangleOfnum = () => (JavaScriptIndexingBehaviorOfRectangleOfnum = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(RectangleOfnum())))();
let JavaScriptIndexingBehaviorOfString = () => (JavaScriptIndexingBehaviorOfString = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(core.String)))();
let ElementTobool = () => (ElementTobool = dart.constFn(dart.fnType(core.bool, [html$.Element])))();
let _EventStreamOfEvent = () => (_EventStreamOfEvent = dart.constFn(html$._EventStream$(html$.Event)))();
let _ElementEventStreamImplOfEvent = () => (_ElementEventStreamImplOfEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.Event)))();
let ListOfMessagePort = () => (ListOfMessagePort = dart.constFn(core.List$(html$.MessagePort)))();
let ListOfDetectedFace = () => (ListOfDetectedFace = dart.constFn(core.List$(html$.DetectedFace)))();
let CompleterOfFileWriter = () => (CompleterOfFileWriter = dart.constFn(async.Completer$(html$.FileWriter)))();
let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.fnType(core.Null, [html$.FileWriter])))();
let CompleterOfFile$ = () => (CompleterOfFile$ = dart.constFn(async.Completer$(html$.File)))();
let FileToNull = () => (FileToNull = dart.constFn(dart.fnType(core.Null, [html$.File])))();
let JavaScriptIndexingBehaviorOfFile = () => (JavaScriptIndexingBehaviorOfFile = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.File)))();
let EventStreamProviderOfFontFaceSetLoadEvent = () => (EventStreamProviderOfFontFaceSetLoadEvent = dart.constFn(html$.EventStreamProvider$(html$.FontFaceSetLoadEvent)))();
let ListOfFontFace = () => (ListOfFontFace = dart.constFn(core.List$(html$.FontFace)))();
let ListOfGamepadButton = () => (ListOfGamepadButton = dart.constFn(core.List$(html$.GamepadButton)))();
let CompleterOfGeoposition = () => (CompleterOfGeoposition = dart.constFn(async.Completer$(html$.Geoposition)))();
let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.fnType(core.Null, [html$.Geoposition])))();
let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.fnType(core.Null, [html$.PositionError])))();
let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
let GeopositionTovoid = () => (GeopositionTovoid = dart.constFn(dart.fnType(dart.void, [html$.Geoposition])))();
let JavaScriptIndexingBehaviorOfNode = () => (JavaScriptIndexingBehaviorOfNode = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.Node)))();
let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.fnType(core.String, [html$.HttpRequest])))();
let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.fnType(core.Null, [html$.ProgressEvent])))();
let CompleterOfString = () => (CompleterOfString = dart.constFn(async.Completer$(core.String)))();
let ListAndIntersectionObserverTovoid = () => (ListAndIntersectionObserverTovoid = dart.constFn(dart.fnType(dart.void, [core.List, html$.IntersectionObserver])))();
let ListOfMediaDeviceInfo = () => (ListOfMediaDeviceInfo = dart.constFn(core.List$(html$.MediaDeviceInfo)))();
let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
let EventStreamProviderOfMidiMessageEvent = () => (EventStreamProviderOfMidiMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MidiMessageEvent)))();
let MapTobool = () => (MapTobool = dart.constFn(dart.fnType(core.bool, [core.Map])))();
let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.fnType(dart.void, [core.String, dart.dynamic])))();
let JSArrayOfMap = () => (JSArrayOfMap = dart.constFn(_interceptors.JSArray$(core.Map)))();
let ListOfMimeType = () => (ListOfMimeType = dart.constFn(core.List$(html$.MimeType)))();
let JavaScriptIndexingBehaviorOfMimeType = () => (JavaScriptIndexingBehaviorOfMimeType = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.MimeType)))();
let ListAndMutationObserverTovoid = () => (ListAndMutationObserverTovoid = dart.constFn(dart.fnType(dart.void, [core.List, html$.MutationObserver])))();
let CompleterOfMediaStream = () => (CompleterOfMediaStream = dart.constFn(async.Completer$(html$.MediaStream)))();
let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.fnType(core.Null, [html$.MediaStream])))();
let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.fnType(core.Null, [html$.NavigatorUserMediaError])))();
let IterableOfNode = () => (IterableOfNode = dart.constFn(core.Iterable$(html$.Node)))();
let ListOfTaskAttributionTiming = () => (ListOfTaskAttributionTiming = dart.constFn(core.List$(html$.TaskAttributionTiming)))();
let ListOfPerformanceServerTiming = () => (ListOfPerformanceServerTiming = dart.constFn(core.List$(html$.PerformanceServerTiming)))();
let PerformanceObserverEntryListAndPerformanceObserverTovoid = () => (PerformanceObserverEntryListAndPerformanceObserverTovoid = dart.constFn(dart.fnType(dart.void, [html$.PerformanceObserverEntryList, html$.PerformanceObserver])))();
let JavaScriptIndexingBehaviorOfPlugin = () => (JavaScriptIndexingBehaviorOfPlugin = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.Plugin)))();
let ListOfPlugin = () => (ListOfPlugin = dart.constFn(core.List$(html$.Plugin)))();
let ListOfPresentationConnection = () => (ListOfPresentationConnection = dart.constFn(core.List$(html$.PresentationConnection)))();
let ListAndReportingObserverTovoid = () => (ListAndReportingObserverTovoid = dart.constFn(dart.fnType(dart.void, [core.List, html$.ReportingObserver])))();
let ListOfResizeObserverEntry = () => (ListOfResizeObserverEntry = dart.constFn(core.List$(html$.ResizeObserverEntry)))();
let ListOfResizeObserverEntryAndResizeObserverTovoid = () => (ListOfResizeObserverEntryAndResizeObserverTovoid = dart.constFn(dart.fnType(dart.void, [ListOfResizeObserverEntry(), html$.ResizeObserver])))();
let EventStreamProviderOfRtcDtmfToneChangeEvent = () => (EventStreamProviderOfRtcDtmfToneChangeEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDtmfToneChangeEvent)))();
let JSArrayOfMapOfString$String = () => (JSArrayOfMapOfString$String = dart.constFn(_interceptors.JSArray$(MapOfString$String())))();
let CompleterOfRtcStatsResponse = () => (CompleterOfRtcStatsResponse = dart.constFn(async.Completer$(html$.RtcStatsResponse)))();
let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.fnType(core.Null, [html$.RtcStatsResponse])))();
let EventStreamProviderOfMediaStreamEvent = () => (EventStreamProviderOfMediaStreamEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaStreamEvent)))();
let EventStreamProviderOfRtcDataChannelEvent = () => (EventStreamProviderOfRtcDataChannelEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDataChannelEvent)))();
let EventStreamProviderOfRtcPeerConnectionIceEvent = () => (EventStreamProviderOfRtcPeerConnectionIceEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcPeerConnectionIceEvent)))();
let ListOfMediaStream = () => (ListOfMediaStream = dart.constFn(core.List$(html$.MediaStream)))();
let IterableOfOptionElement = () => (IterableOfOptionElement = dart.constFn(core.Iterable$(html$.OptionElement)))();
let UnmodifiableListViewOfOptionElement = () => (UnmodifiableListViewOfOptionElement = dart.constFn(collection.UnmodifiableListView$(html$.OptionElement)))();
let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.fnType(core.bool, [html$.OptionElement])))();
let JSArrayOfOptionElement = () => (JSArrayOfOptionElement = dart.constFn(_interceptors.JSArray$(html$.OptionElement)))();
let ListOfServiceWorkerRegistration = () => (ListOfServiceWorkerRegistration = dart.constFn(core.List$(html$.ServiceWorkerRegistration)))();
let EventStreamProviderOfForeignFetchEvent = () => (EventStreamProviderOfForeignFetchEvent = dart.constFn(html$.EventStreamProvider$(html$.ForeignFetchEvent)))();
let ListOfNotification = () => (ListOfNotification = dart.constFn(core.List$(html$.Notification)))();
let JavaScriptIndexingBehaviorOfSourceBuffer = () => (JavaScriptIndexingBehaviorOfSourceBuffer = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.SourceBuffer)))();
let ListOfSourceBuffer = () => (ListOfSourceBuffer = dart.constFn(core.List$(html$.SourceBuffer)))();
let JavaScriptIndexingBehaviorOfSpeechGrammar = () => (JavaScriptIndexingBehaviorOfSpeechGrammar = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.SpeechGrammar)))();
let ListOfSpeechGrammar = () => (ListOfSpeechGrammar = dart.constFn(core.List$(html$.SpeechGrammar)))();
let EventStreamProviderOfSpeechRecognitionError = () => (EventStreamProviderOfSpeechRecognitionError = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionError)))();
let EventStreamProviderOfSpeechRecognitionEvent = () => (EventStreamProviderOfSpeechRecognitionEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionEvent)))();
let ListOfSpeechRecognitionResult = () => (ListOfSpeechRecognitionResult = dart.constFn(core.List$(html$.SpeechRecognitionResult)))();
let EventStreamProviderOfSpeechSynthesisEvent = () => (EventStreamProviderOfSpeechSynthesisEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechSynthesisEvent)))();
let _WrappedListOfTableSectionElement = () => (_WrappedListOfTableSectionElement = dart.constFn(html$._WrappedList$(html$.TableSectionElement)))();
let _WrappedListOfTableRowElement = () => (_WrappedListOfTableRowElement = dart.constFn(html$._WrappedList$(html$.TableRowElement)))();
let _WrappedListOfTableCellElement = () => (_WrappedListOfTableCellElement = dart.constFn(html$._WrappedList$(html$.TableCellElement)))();
let ListOfDetectedText = () => (ListOfDetectedText = dart.constFn(core.List$(html$.DetectedText)))();
let ListOfTextTrackCue = () => (ListOfTextTrackCue = dart.constFn(core.List$(html$.TextTrackCue)))();
let JavaScriptIndexingBehaviorOfTextTrackCue = () => (JavaScriptIndexingBehaviorOfTextTrackCue = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.TextTrackCue)))();
let ListOfTextTrack = () => (ListOfTextTrack = dart.constFn(core.List$(html$.TextTrack)))();
let JavaScriptIndexingBehaviorOfTextTrack = () => (JavaScriptIndexingBehaviorOfTextTrack = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.TextTrack)))();
let EventStreamProviderOfTrackEvent = () => (EventStreamProviderOfTrackEvent = dart.constFn(html$.EventStreamProvider$(html$.TrackEvent)))();
let JavaScriptIndexingBehaviorOfTouch = () => (JavaScriptIndexingBehaviorOfTouch = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.Touch)))();
let ListOfTouch = () => (ListOfTouch = dart.constFn(core.List$(html$.Touch)))();
let ListOfVRStageBoundsPoint = () => (ListOfVRStageBoundsPoint = dart.constFn(core.List$(html$.VRStageBoundsPoint)))();
let EventStreamProviderOfCloseEvent = () => (EventStreamProviderOfCloseEvent = dart.constFn(html$.EventStreamProvider$(html$.CloseEvent)))();
let CompleterOfnum = () => (CompleterOfnum = dart.constFn(async.Completer$(core.num)))();
let numToNull = () => (numToNull = dart.constFn(dart.fnType(core.Null, [core.num])))();
let IdleDeadlineTovoid = () => (IdleDeadlineTovoid = dart.constFn(dart.fnType(dart.void, [html$.IdleDeadline])))();
let CompleterOfFileSystem = () => (CompleterOfFileSystem = dart.constFn(async.Completer$(html$.FileSystem)))();
let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.fnType(core.Null, [html$.FileSystem])))();
let EventStreamProviderOfDeviceMotionEvent = () => (EventStreamProviderOfDeviceMotionEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceMotionEvent)))();
let EventStreamProviderOfDeviceOrientationEvent = () => (EventStreamProviderOfDeviceOrientationEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceOrientationEvent)))();
let EventStreamProviderOfAnimationEvent = () => (EventStreamProviderOfAnimationEvent = dart.constFn(html$.EventStreamProvider$(html$.AnimationEvent)))();
let _EventStreamOfBeforeUnloadEvent = () => (_EventStreamOfBeforeUnloadEvent = dart.constFn(html$._EventStream$(html$.BeforeUnloadEvent)))();
let StreamControllerOfBeforeUnloadEvent = () => (StreamControllerOfBeforeUnloadEvent = dart.constFn(async.StreamController$(html$.BeforeUnloadEvent)))();
let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.fnType(core.Null, [html$.BeforeUnloadEvent])))();
let _ElementEventStreamImplOfBeforeUnloadEvent = () => (_ElementEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.BeforeUnloadEvent)))();
let _ElementListEventStreamImplOfBeforeUnloadEvent = () => (_ElementListEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementListEventStreamImpl$(html$.BeforeUnloadEvent)))();
let EventStreamProviderOfBeforeUnloadEvent = () => (EventStreamProviderOfBeforeUnloadEvent = dart.constFn(html$.EventStreamProvider$(html$.BeforeUnloadEvent)))();
let JavaScriptIndexingBehaviorOfCssRule = () => (JavaScriptIndexingBehaviorOfCssRule = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.CssRule)))();
let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
let JavaScriptIndexingBehaviorOfGamepad = () => (JavaScriptIndexingBehaviorOfGamepad = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.Gamepad)))();
let JavaScriptIndexingBehaviorOfSpeechRecognitionResult = () => (JavaScriptIndexingBehaviorOfSpeechRecognitionResult = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.SpeechRecognitionResult)))();
let JavaScriptIndexingBehaviorOfStyleSheet = () => (JavaScriptIndexingBehaviorOfStyleSheet = dart.constFn(_js_helper.JavaScriptIndexingBehavior$(html$.StyleSheet)))();
let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
let ElementTodynamic = () => (ElementTodynamic = dart.constFn(dart.fnType(dart.dynamic, [html$.Element])))();
let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.fnType(html$.CssClassSet, [html$.Element])))();
let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
let _IdentityHashSetOfString = () => (_IdentityHashSetOfString = dart.constFn(collection._IdentityHashSet$(core.String)))();
let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.fnType(dart.void, [html_common.CssClassSetImpl])))();
let CssClassSetImplTodynamic = () => (CssClassSetImplTodynamic = dart.constFn(dart.fnType(dart.dynamic, [html_common.CssClassSetImpl])))();
let boolAndCssClassSetImplTobool = () => (boolAndCssClassSetImplTobool = dart.constFn(dart.fnType(core.bool, [core.bool, html_common.CssClassSetImpl])))();
let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.fnType(core.String, [core.String, core.String])))();
let SetOfStringTobool = () => (SetOfStringTobool = dart.constFn(dart.fnType(core.bool, [SetOfString()])))();
let SetOfStringTovoid = () => (SetOfStringTovoid = dart.constFn(dart.fnType(dart.void, [SetOfString()])))();
let EventTodynamic = () => (EventTodynamic = dart.constFn(dart.fnType(dart.dynamic, [html$.Event])))();
let EventTovoid = () => (EventTovoid = dart.constFn(dart.fnType(dart.void, [html$.Event])))();
let CustomStreamOfKeyEvent = () => (CustomStreamOfKeyEvent = dart.constFn(html$.CustomStream$(html$.KeyEvent)))();
let ElementAndStringAndString__Tobool = () => (ElementAndStringAndString__Tobool = dart.constFn(dart.fnType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator])))();
let IdentityMapOfString$Function = () => (IdentityMapOfString$Function = dart.constFn(_js_helper.IdentityMap$(core.String, core.Function)))();
let JSArrayOfKeyEvent = () => (JSArrayOfKeyEvent = dart.constFn(_interceptors.JSArray$(html$.KeyEvent)))();
let KeyEventTobool = () => (KeyEventTobool = dart.constFn(dart.fnType(core.bool, [html$.KeyEvent])))();
let ListOfKeyEvent = () => (ListOfKeyEvent = dart.constFn(core.List$(html$.KeyEvent)))();
let JSArrayOfNodeValidator = () => (JSArrayOfNodeValidator = dart.constFn(_interceptors.JSArray$(html$.NodeValidator)))();
let NodeValidatorTobool = () => (NodeValidatorTobool = dart.constFn(dart.fnType(core.bool, [html$.NodeValidator])))();
let ListOfNodeValidator = () => (ListOfNodeValidator = dart.constFn(core.List$(html$.NodeValidator)))();
let NodeAndNodeToint = () => (NodeAndNodeToint = dart.constFn(dart.fnType(core.int, [html$.Node, html$.Node])))();
let IteratorOfNode = () => (IteratorOfNode = dart.constFn(core.Iterator$(html$.Node)))();
let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.fnType(dart.void, [html$.Node, html$.Node])))();
let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
let NodeToElement = () => (NodeToElement = dart.constFn(dart.fnType(html$.Element, [html$.Node])))();
let ListOfLength = () => (ListOfLength = dart.constFn(core.List$(svg$.Length)))();
let ListOfNumber = () => (ListOfNumber = dart.constFn(core.List$(svg$.Number)))();
let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg$.Transform)))();
let FutureOfAudioBuffer = () => (FutureOfAudioBuffer = dart.constFn(async.Future$(web_audio.AudioBuffer)))();
let CompleterOfAudioBuffer = () => (CompleterOfAudioBuffer = dart.constFn(async.Completer$(web_audio.AudioBuffer)))();
let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.fnType(core.Null, [web_audio.AudioBuffer])))();
let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html$.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
let CompleterOfSqlTransaction = () => (CompleterOfSqlTransaction = dart.constFn(async.Completer$(web_sql.SqlTransaction)))();
let SqlTransactionToNull = () => (SqlTransactionToNull = dart.constFn(dart.fnType(core.Null, [web_sql.SqlTransaction])))();
let SqlErrorToNull = () => (SqlErrorToNull = dart.constFn(dart.fnType(core.Null, [web_sql.SqlError])))();
let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
let CompleterOfSqlResultSet = () => (CompleterOfSqlResultSet = dart.constFn(async.Completer$(web_sql.SqlResultSet)))();
let SqlTransactionAndSqlResultSetToNull = () => (SqlTransactionAndSqlResultSetToNull = dart.constFn(dart.fnType(core.Null, [web_sql.SqlTransaction, web_sql.SqlResultSet])))();
let SqlTransactionAndSqlErrorToNull = () => (SqlTransactionAndSqlErrorToNull = dart.constFn(dart.fnType(core.Null, [web_sql.SqlTransaction, web_sql.SqlError])))();
let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(_http.HttpRequest)))();
let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(_http.RedirectInfo)))();
let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.fnType(ListOfString(), [core.String, ListOfString()])))();
let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.fnType(core.Null, [core.String, ListOfString()])))();
let JSArrayOfCookie = () => (JSArrayOfCookie = dart.constFn(_interceptors.JSArray$(_http.Cookie)))();
let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(_http.Cookie)))();
let CookieToString = () => (CookieToString = dart.constFn(dart.fnType(core.String, [_http.Cookie])))();
let CookieTobool = () => (CookieTobool = dart.constFn(dart.fnType(core.bool, [_http.Cookie])))();
let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(_http.HttpClientResponse)))();
let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.fnType(FutureOfHttpClientResponse(), [_http._HttpClientRequest])))();
let dynamicToFutureOfHttpClientResponse = () => (dynamicToFutureOfHttpClientResponse = dart.constFn(dart.fnType(FutureOfHttpClientResponse(), [dart.dynamic])))();
let VoidToFutureOfHttpClientResponse = () => (VoidToFutureOfHttpClientResponse = dart.constFn(dart.fnType(FutureOfHttpClientResponse(), [])))();
let _AuthenticationSchemeTo_Credentials = () => (_AuthenticationSchemeTo_Credentials = dart.constFn(dart.fnType(_http._Credentials, [_http._AuthenticationScheme])))();
let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.fnType(dart.void, [_http._Credentials])))();
let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.fnType(async.Future, [_http._AuthenticationScheme, core.String])))();
let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(_http.HttpClientResponse)))();
let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.fnType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
let CookieToNull = () => (CookieToNull = dart.constFn(dart.fnType(core.Null, [_http.Cookie])))();
let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(_http.HttpClientResponse)))();
let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(_http.RedirectInfo)))();
let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.fnType(FutureOrOfHttpClientResponse(), [core.List])))();
let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.fnType(dart.void, [_http.HttpClientResponse])))();
let CompleterOfSocket = () => (CompleterOfSocket = dart.constFn(async.Completer$(io.Socket)))();
let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.fnType(core.Iterable, [dart.dynamic])))();
let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.fnType(_http._HttpOutboundMessage, [dart.dynamic])))();
let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.fnType(_http._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.fnType(core.Null, [_http._HttpIncoming])))();
let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(_http._HttpIncoming)))();
let SocketToSocket = () => (SocketToSocket = dart.constFn(dart.fnType(io.Socket, [io.Socket])))();
let SocketTo_DetachedSocket = () => (SocketTo_DetachedSocket = dart.constFn(dart.fnType(_http._DetachedSocket, [io.Socket])))();
let SocketTovoid = () => (SocketTovoid = dart.constFn(dart.fnType(dart.void, [io.Socket])))();
let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.fnType(_http._HttpClientConnection, [io.SecureSocket])))();
let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.fnType(FutureOfSecureSocket(), [_http.HttpClientResponse])))();
let FutureOf_HttpClientConnection = () => (FutureOf_HttpClientConnection = dart.constFn(async.Future$(_http._HttpClientConnection)))();
let _HashSetOf_HttpClientConnection = () => (_HashSetOf_HttpClientConnection = dart.constFn(collection._HashSet$(_http._HttpClientConnection)))();
let _HashSetOfConnectionTask = () => (_HashSetOfConnectionTask = dart.constFn(collection._HashSet$(io.ConnectionTask)))();
let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(_http._ConnectionInfo)))();
let CompleterOf_ConnectionInfo = () => (CompleterOf_ConnectionInfo = dart.constFn(async.Completer$(_http._ConnectionInfo)))();
let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.fnType(core.bool, [io.X509Certificate])))();
let _HttpClientConnectionTo_ConnectionInfo = () => (_HttpClientConnectionTo_ConnectionInfo = dart.constFn(dart.fnType(_http._ConnectionInfo, [_http._HttpClientConnection])))();
let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(_http._ConnectionInfo)))();
let dynamicToFutureOrOf_ConnectionInfo = () => (dynamicToFutureOrOf_ConnectionInfo = dart.constFn(dart.fnType(FutureOrOf_ConnectionInfo(), [dart.dynamic])))();
let ConnectionTaskToFutureOf_ConnectionInfo = () => (ConnectionTaskToFutureOf_ConnectionInfo = dart.constFn(dart.fnType(FutureOf_ConnectionInfo(), [io.ConnectionTask])))();
let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(_http._HttpClientConnection)))();
let SetOfConnectionTask = () => (SetOfConnectionTask = dart.constFn(core.Set$(io.ConnectionTask)))();
let IdentityMapOfString$_ConnectionTarget = () => (IdentityMapOfString$_ConnectionTarget = dart.constFn(_js_helper.IdentityMap$(core.String, _http._ConnectionTarget)))();
let JSArrayOf_Credentials = () => (JSArrayOf_Credentials = dart.constFn(_interceptors.JSArray$(_http._Credentials)))();
let JSArrayOf_ProxyCredentials = () => (JSArrayOf_ProxyCredentials = dart.constFn(_interceptors.JSArray$(_http._ProxyCredentials)))();
let Uri__ToString = () => (Uri__ToString = dart.constFn(dart.fnType(core.String, [core.Uri], {environment: MapOfString$String()})))();
let _ConnectionTargetTobool = () => (_ConnectionTargetTobool = dart.constFn(dart.fnType(core.bool, [_http._ConnectionTarget])))();
let FutureOf_HttpClientRequest = () => (FutureOf_HttpClientRequest = dart.constFn(async.Future$(_http._HttpClientRequest)))();
let _ConnectionInfoTo_HttpClientRequest = () => (_ConnectionInfoTo_HttpClientRequest = dart.constFn(dart.fnType(_http._HttpClientRequest, [_http._ConnectionInfo])))();
let FutureOrOf_HttpClientRequest = () => (FutureOrOf_HttpClientRequest = dart.constFn(async.FutureOr$(_http._HttpClientRequest)))();
let _ConnectionInfoToFutureOrOf_HttpClientRequest = () => (_ConnectionInfoToFutureOrOf_HttpClientRequest = dart.constFn(dart.fnType(FutureOrOf_HttpClientRequest(), [_http._ConnectionInfo])))();
let _HttpClientRequestTo_HttpClientRequest = () => (_HttpClientRequestTo_HttpClientRequest = dart.constFn(dart.fnType(_http._HttpClientRequest, [_http._HttpClientRequest])))();
let VoidTo_ConnectionTarget = () => (VoidTo_ConnectionTarget = dart.constFn(dart.fnType(_http._ConnectionTarget, [])))();
let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.fnType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.fnType(_http._SiteCredentials, [_http._SiteCredentials, _http._Credentials])))();
let MapOfString$_ConnectionTarget = () => (MapOfString$_ConnectionTarget = dart.constFn(core.Map$(core.String, _http._ConnectionTarget)))();
let ListOf_Credentials = () => (ListOf_Credentials = dart.constFn(core.List$(_http._Credentials)))();
let ListOf_ProxyCredentials = () => (ListOf_ProxyCredentials = dart.constFn(core.List$(_http._ProxyCredentials)))();
let X509CertificateAndStringAndintTobool = () => (X509CertificateAndStringAndintTobool = dart.constFn(dart.fnType(core.bool, [io.X509Certificate, core.String, core.int])))();
let SocketToNull = () => (SocketToNull = dart.constFn(dart.fnType(core.Null, [io.Socket])))();
let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.fnType(_http._DetachedSocket, [dart.dynamic])))();
let IdentityMapOfint$_HttpConnection = () => (IdentityMapOfint$_HttpConnection = dart.constFn(_js_helper.IdentityMap$(core.int, _http._HttpConnection)))();
let LinkedListOf_HttpConnection = () => (LinkedListOf_HttpConnection = dart.constFn(collection.LinkedList$(_http._HttpConnection)))();
let StreamControllerOfHttpRequest = () => (StreamControllerOfHttpRequest = dart.constFn(async.StreamController$(_http.HttpRequest)))();
let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.fnType(_http._HttpServer, [io.ServerSocket])))();
let FutureOfHttpServer = () => (FutureOfHttpServer = dart.constFn(async.Future$(_http.HttpServer)))();
let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.fnType(_http._HttpServer, [io.SecureServerSocket])))();
let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.fnType(core.Null, [_http._HttpConnection])))();
let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.fnType(core.Map, [_http._HttpConnection])))();
let IterableOfMap = () => (IterableOfMap = dart.constFn(core.Iterable$(core.Map)))();
let IdentityMapOfint$_HttpServer = () => (IdentityMapOfint$_HttpServer = dart.constFn(_js_helper.IdentityMap$(core.int, _http._HttpServer)))();
let JSArrayOf_Proxy = () => (JSArrayOf_Proxy = dart.constFn(_interceptors.JSArray$(_http._Proxy)))();
let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(_http._Proxy)))();
let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(_http._HttpIncoming)))();
let IdentityMapOfString$_HttpSession = () => (IdentityMapOfString$_HttpSession = dart.constFn(_js_helper.IdentityMap$(core.String, _http._HttpSession)))();
let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, _http._HttpSession)))();
let SecurityContextToHttpClient = () => (SecurityContextToHttpClient = dart.constFn(dart.fnType(_http.HttpClient, [io.SecurityContext])))();
let UriAndMapOfString$StringToString = () => (UriAndMapOfString$StringToString = dart.constFn(dart.fnType(core.String, [core.Uri, MapOfString$String()])))();
let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(_http.HttpRequest, _http.WebSocket)))();
let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.fnType(_http._WebSocketProtocolTransformer, [async.EventSink])))();
let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(_http.WebSocket)))();
let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.fnType(dart.void, [_http.WebSocket])))();
let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.fnType(core.Null, [_http.HttpRequest])))();
let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(_http.WebSocket)))();
let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.fnType(_http._WebSocketImpl, [io.Socket])))();
let StringToFutureOfWebSocket = () => (StringToFutureOfWebSocket = dart.constFn(dart.fnType(FutureOfWebSocket(), [core.String])))();
let VoidToFutureOrOfString = () => (VoidToFutureOrOfString = dart.constFn(dart.fnType(FutureOrOfString(), [])))();
let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.fnType(dart.dynamic, [ListOfString()])))();
let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.fnType(_http._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
let CompleterOfWebSocket = () => (CompleterOfWebSocket = dart.constFn(async.Completer$(_http.WebSocket)))();
let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.fnType(_http._WebSocketImpl, [dart.dynamic])))();
let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.fnType(FutureOfWebSocket(), [_http.HttpClientResponse])))();
let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.fnType(FutureOfHttpClientResponse(), [_http.HttpClientRequest])))();
let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.fnType(core.Map, [dart.dynamic])))();
let IdentityMapOfint$_WebSocketImpl = () => (IdentityMapOfint$_WebSocketImpl = dart.constFn(_js_helper.IdentityMap$(core.int, _http._WebSocketImpl)))();
dart.polyfill = function(window) {
  if (window[dart._polyfilled]) return false;
  window[dart._polyfilled] = true;
  if (typeof window.NodeList !== "undefined") {
    window.NodeList.prototype.get = function(i) {
      return this[i];
    };
    window.NamedNodeMap.prototype.get = function(i) {
      return this[i];
    };
    window.DOMTokenList.prototype.get = function(i) {
      return this[i];
    };
    window.HTMLCollection.prototype.get = function(i) {
      return this[i];
    };
    if (typeof window.PannerNode == "undefined") {
      let audioContext;
    }
    if (typeof window.AudioSourceNode == "undefined") {
      window.AudioSourceNode = MediaElementAudioSourceNode.__proto__;
    }
    if (typeof window.FontFaceSet == "undefined") {
      if (typeof window.document.fonts != "undefined") {
        window.FontFaceSet = window.document.fonts.__proto__.constructor;
      }
    }
    if (typeof window.MemoryInfo == "undefined") {
      if (typeof window.performance.memory != "undefined") {
        window.MemoryInfo = window.performance.memory.constructor;
      }
    }
    if (typeof window.Geolocation == "undefined") {
      window.Geolocation == window.navigator.geolocation.constructor;
    }
    if (typeof window.Animation == "undefined") {
      let d = window.document.createElement('div');
      if (typeof d.animate != "undefined") {
        window.Animation = d.animate(d).constructor;
      }
    }
    if (typeof window.SourceBufferList == "undefined") {
      if ('MediaSource' in window) {
        window.SourceBufferList = new window.MediaSource().sourceBuffers.constructor;
      }
    }
    if (typeof window.SpeechRecognition == "undefined") {
      window.SpeechRecognition = window.webkitSpeechRecognition;
      window.SpeechRecognitionError = window.webkitSpeechRecognitionError;
      window.SpeechRecognitionEvent = window.webkitSpeechRecognitionEvent;
    }
  }
  return true;
};
dart.trackProfile = function(flag) {
  dart.__trackProfile = flag;
};
dart.setStartAsyncSynchronously = function(value) {
  if (value === void 0) value = true;
  dart.startAsyncSynchronously = value;
};
dart.hotRestart = function() {
  for (let f of dart._resetFields)
    f();
  dart._resetFields[$clear]();
  for (let m of dart._cacheMaps)
    m.clear();
  dart._cacheMaps[$clear]();
  dart.constantMaps.clear();
  dart._ignoreSubtypeCache.clear();
};
dart.defineValue = function(obj, name, value) {
  dart.defineAccessor(obj, name, {value: value, configurable: true, writable: true});
  return value;
};
dart.throwTypeError = function(message) {
  if (dart.__trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.TypeErrorImpl.new(message));
};
dart.throwInternalError = function(message) {
  if (dart.__trapRuntimeErrors) debugger;
  throw Error(message);
};
dart.getOwnNamesAndSymbols = function(obj) {
  let names = dart.getOwnPropertyNames(obj);
  let symbols = dart.getOwnPropertySymbols(obj);
  return names.concat(symbols);
};
dart.safeGetOwnProperty = function(obj, name) {
  let desc = dart.getOwnPropertyDescriptor(obj, name);
  if (desc != null) return desc.value;
};
dart.defineLazyField = function(to, name, desc) {
  const initializer = desc.get;
  let init = initializer;
  let value = null;
  desc.get = function() {
    if (init == null) return value;
    let f = init;
    init = dart.throwCyclicInitializationError;
    if (f === init) f(name);
    dart._resetFields.push(() => {
      init = initializer;
      value = null;
    });
    try {
      value = f();
      init = null;
      return value;
    } catch (e) {
      init = null;
      value = null;
      throw e;
    }
  };
  desc.configurable = true;
  if (desc.set != null) {
    desc.set = function(x) {
      init = null;
      value = x;
    };
  }
  return dart.defineProperty(to, name, desc);
};
dart.copyTheseProperties = function(to, from, names) {
  for (let i = 0, n = names.length; i < n; ++i) {
    let name = names[i];
    if (dart.equals(name, "constructor")) continue;
    dart.copyProperty(to, from, name);
  }
  return to;
};
dart.copyProperty = function(to, from, name) {
  let desc = dart.getOwnPropertyDescriptor(from, name);
  if (name == Symbol.iterator) {
    let existing = dart.getOwnPropertyDescriptor(to, name);
    if (existing != null) {
      if (existing.writable) {
        to[name] = desc.value;
      }
      return;
    }
  }
  dart.defineProperty(to, name, desc);
};
dart.export = function(to, from, name) {
  return dart.copyProperty(to, from, name);
};
dart.copyProperties = function(to, from) {
  return dart.copyTheseProperties(to, from, dart.getOwnNamesAndSymbols(from));
};
dart.applyMixin = function(to, from) {
  to[dart._mixin] = from;
  let toProto = to.prototype;
  let fromProto = from.prototype;
  dart._copyMembers(toProto, fromProto);
  dart._mixinSignature(to, from, dart._methodSig);
  dart._mixinSignature(to, from, dart._fieldSig);
  dart._mixinSignature(to, from, dart._getterSig);
  dart._mixinSignature(to, from, dart._setterSig);
  let mixinOnFn = from[dart.mixinOn];
  if (mixinOnFn != null) {
    let proto = mixinOnFn(to.__proto__).prototype;
    dart._copyMembers(toProto, proto);
  }
};
dart._copyMembers = function(to, from) {
  let names = dart.getOwnNamesAndSymbols(from);
  for (let i = 0, n = names.length; i < n; ++i) {
    let name = names[i];
    if (name === "constructor") continue;
    dart._copyMember(to, from, name);
  }
  return to;
};
dart._copyMember = function(to, from, name) {
  let desc = dart.getOwnPropertyDescriptor(from, name);
  if (name == Symbol.iterator) {
    let existing = dart.getOwnPropertyDescriptor(to, name);
    if (existing != null) {
      if (existing.writable) {
        to[name] = desc.value;
      }
      return;
    }
  }
  let getter = desc.get;
  let setter = desc.set;
  if (getter != null) {
    if (setter == null) {
      let obj = desc.set = {
        __proto__: to.__proto__,
        set [name](x) {
          return super[name] = x;
        }
      };
      desc.set = dart.getOwnPropertyDescriptor(obj, name).set;
    }
  } else if (setter != null) {
    if (getter == null) {
      let obj = desc.get = {
        __proto__: to.__proto__,
        get [name]() {
          return super[name];
        }
      };
      desc.get = dart.getOwnPropertyDescriptor(obj, name).get;
    }
  }
  dart.defineProperty(to, name, desc);
};
dart._mixinSignature = function(to, from, kind) {
  to[kind] = () => {
    let baseMembers = dart._getMembers(to.__proto__, kind);
    let fromMembers = dart._getMembers(from, kind);
    if (fromMembers == null) return baseMembers;
    let toSignature = {__proto__: baseMembers};
    dart.copyProperties(toSignature, fromMembers);
    return toSignature;
  };
};
dart.getMixin = function(clazz) {
  return Object.hasOwnProperty.call(clazz, dart._mixin) ? clazz[dart._mixin] : null;
};
dart.getImplements = function(clazz) {
  return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
};
dart.generic = function(typeConstructor, setBaseClass) {
  let length = typeConstructor.length;
  if (length < 1) {
    dart.throwInternalError('must have at least one generic type argument');
  }
  let resultMap = new Map();
  dart._cacheMaps.push(resultMap);
  function makeGenericType(...args) {
    if (args.length != length && args.length != 0) {
      dart.throwInternalError('requires ' + length + ' or 0 type arguments');
    }
    while (args.length < length)
      args.push(dart.dynamic);
    let value = resultMap;
    for (let i = 0; i < length; i++) {
      let arg = args[i];
      if (arg == null) {
        dart.throwInternalError('type arguments should not be null: ' + typeConstructor);
      }
      let map = value;
      value = map.get(arg);
      if (value === void 0) {
        if (i + 1 == length) {
          value = typeConstructor.apply(null, args);
          if (value) {
            value[dart._typeArguments] = args;
            value[dart._originalDeclaration] = makeGenericType;
          }
          map.set(arg, value);
          if (setBaseClass != null) setBaseClass.apply(null, args);
        } else {
          value = new Map();
          map.set(arg, value);
        }
      }
    }
    return value;
  }
  makeGenericType[dart._genericTypeCtor] = typeConstructor;
  return makeGenericType;
};
dart.getGenericClass = function(type) {
  return dart.safeGetOwnProperty(type, dart._originalDeclaration);
};
dart.getGenericArgs = function(type) {
  return dart.safeGetOwnProperty(type, dart._typeArguments);
};
dart.getGenericTypeFormals = function(genericClass) {
  return dart._typeFormalsFromFunction(dart.getGenericTypeCtor(genericClass));
};
dart.instantiateClass = function(genericClass, typeArgs) {
  return genericClass.apply(null, typeArgs);
};
dart.getConstructors = function(value) {
  return dart._getMembers(value, dart._constructorSig);
};
dart.getMethods = function(value) {
  return dart._getMembers(value, dart._methodSig);
};
dart.getFields = function(value) {
  return dart._getMembers(value, dart._fieldSig);
};
dart.getGetters = function(value) {
  return dart._getMembers(value, dart._getterSig);
};
dart.getSetters = function(value) {
  return dart._getMembers(value, dart._setterSig);
};
dart.getStaticMethods = function(value) {
  return dart._getMembers(value, dart._staticMethodSig);
};
dart.getStaticFields = function(value) {
  return dart._getMembers(value, dart._staticFieldSig);
};
dart.getStaticGetters = function(value) {
  return dart._getMembers(value, dart._staticGetterSig);
};
dart.getStaticSetters = function(value) {
  return dart._getMembers(value, dart._staticSetterSig);
};
dart.getGenericTypeCtor = function(value) {
  return value[dart._genericTypeCtor];
};
dart.getType = function(obj) {
  return obj == null ? core.Object : obj.__proto__.constructor;
};
dart.getLibraryUri = function(value) {
  return value[dart._libraryUri];
};
dart.setLibraryUri = function(f, uri) {
  return f[dart._libraryUri] = uri;
};
dart.isJsInterop = function(obj) {
  if (obj == null) return false;
  if (typeof obj === "function") {
    return obj[dart._runtimeType] == null;
  }
  if (typeof obj !== "object") return false;
  if (obj[dart._extensionType] != null) return false;
  return !(obj instanceof core.Object);
};
dart.getMethodType = function(type, name) {
  let m = dart.getMethods(type);
  return m != null ? m[name] : null;
};
dart.getSetterType = function(type, name) {
  let setters = dart.getSetters(type);
  if (setters != null) {
    let type = setters[name];
    if (type != null) {
      if (type instanceof Array) {
        return type[0];
      }
      return type;
    }
  }
  let fields = dart.getFields(type);
  if (fields != null) {
    let fieldInfo = fields[name];
    if (fieldInfo != null && !fieldInfo.isFinal) {
      return fieldInfo.type;
    }
  }
  return null;
};
dart.finalFieldType = function(type, metadata) {
  return {type: type, isFinal: true, metadata: metadata};
};
dart.fieldType = function(type, metadata) {
  return {type: type, isFinal: false, metadata: metadata};
};
dart.classGetConstructorType = function(cls, name) {
  if (cls == null) return null;
  if (name == null) name = "new";
  let ctors = dart.getConstructors(cls);
  return ctors != null ? ctors[name] : null;
};
dart.setMethodSignature = function(f, sigF) {
  return f[dart._methodSig] = sigF;
};
dart.setFieldSignature = function(f, sigF) {
  return f[dart._fieldSig] = sigF;
};
dart.setGetterSignature = function(f, sigF) {
  return f[dart._getterSig] = sigF;
};
dart.setSetterSignature = function(f, sigF) {
  return f[dart._setterSig] = sigF;
};
dart.setConstructorSignature = function(f, sigF) {
  return f[dart._constructorSig] = sigF;
};
dart.setStaticMethodSignature = function(f, sigF) {
  return f[dart._staticMethodSig] = sigF;
};
dart.setStaticFieldSignature = function(f, sigF) {
  return f[dart._staticFieldSig] = sigF;
};
dart.setStaticGetterSignature = function(f, sigF) {
  return f[dart._staticGetterSig] = sigF;
};
dart.setStaticSetterSignature = function(f, sigF) {
  return f[dart._staticSetterSig] = sigF;
};
dart._getMembers = function(type, kind) {
  let sig = type[kind];
  return typeof sig == "function" ? type[kind] = sig() : sig;
};
dart._hasMember = function(type, kind, name) {
  let sig = dart._getMembers(type, kind);
  return sig != null && name in sig;
};
dart.hasMethod = function(type, name) {
  return dart._hasMember(type, dart._methodSig, name);
};
dart.hasGetter = function(type, name) {
  return dart._hasMember(type, dart._getterSig, name);
};
dart.hasSetter = function(type, name) {
  return dart._hasMember(type, dart._setterSig, name);
};
dart.hasField = function(type, name) {
  return dart._hasMember(type, dart._fieldSig, name);
};
dart._installProperties = function(jsProto, dartType, installedParent) {
  if (dartType === core.Object) {
    dart._installPropertiesForObject(jsProto);
    return;
  }
  let dartSupertype = dartType.__proto__;
  if (dartSupertype !== installedParent) {
    dart._installProperties(jsProto, dartSupertype, installedParent);
  }
  let dartProto = dartType.prototype;
  dart.copyTheseProperties(jsProto, dartProto, dart.getOwnPropertySymbols(dartProto));
};
dart._installPropertiesForObject = function(jsProto) {
  let coreObjProto = core.Object.prototype;
  let names = dart.getOwnPropertyNames(coreObjProto);
  for (let i = 0, n = names.length; i < n; ++i) {
    let name = names[i];
    if (name === "constructor") continue;
    let desc = dart.getOwnPropertyDescriptor(coreObjProto, name);
    dart.defineProperty(jsProto, dart.dartx[name], desc);
  }
};
dart._installPropertiesForGlobalObject = function(jsProto) {
  dart._installPropertiesForObject(jsProto);
  jsProto[dartx.toString] = function() {
    return this.toString();
  };
  let t = dart.identityEquals;
  t == null ? dart.identityEquals = jsProto[dartx._equals] : t;
};
dart._applyExtension = function(jsType, dartExtType) {
  if (jsType == null) return;
  let jsProto = jsType.prototype;
  if (jsProto == null) return;
  if (dartExtType === core.Object) {
    dart._installPropertiesForGlobalObject(jsProto);
    return;
  }
  dart._installProperties(jsProto, dartExtType, jsProto[dart._extensionType]);
  if (dartExtType !== _interceptors.JSFunction) {
    jsProto[dart._extensionType] = dartExtType;
  }
  jsType[dart._methodSig] = dartExtType[dart._methodSig];
  jsType[dart._fieldSig] = dartExtType[dart._fieldSig];
  jsType[dart._getterSig] = dartExtType[dart._getterSig];
  jsType[dart._setterSig] = dartExtType[dart._setterSig];
};
dart.applyExtension = function(name, nativeObject) {
  let dartExtType = dart._extensionMap.get(name);
  let jsType = nativeObject.constructor;
  dart._applyExtension(jsType, dartExtType);
};
dart.applyAllExtensions = function(global) {
  dart._extensionMap.forEach((dartExtType, name) => dart._applyExtension(global[name], dartExtType));
};
dart.registerExtension = function(name, dartExtType) {
  dart._extensionMap.set(name, dartExtType);
  let jsType = dart.global[name];
  dart._applyExtension(jsType, dartExtType);
};
dart.defineExtensionMethods = function(type, memberNames) {
  let proto = type.prototype;
  for (let name of memberNames) {
    proto[dartx[name]] = proto[name];
  }
};
dart.defineExtensionAccessors = function(type, memberNames) {
  let proto = type.prototype;
  for (let name of memberNames) {
    let member = null;
    let p = proto;
    for (;; p = p.__proto__) {
      member = dart.getOwnPropertyDescriptor(p, name);
      if (member != null) break;
    }
    dart.defineProperty(proto, dartx[name], member);
  }
};
dart.definePrimitiveHashCode = function(proto) {
  dart.defineProperty(proto, dart.identityHashCode_, dart.getOwnPropertyDescriptor(proto, $hashCode));
};
dart.setBaseClass = function(derived, base) {
  derived.prototype.__proto__ = base.prototype;
  derived.__proto__ = base;
};
dart.setExtensionBaseClass = function(dartType, jsType) {
  let dartProto = dartType.prototype;
  dartProto[dart._extensionType] = dartType;
  dartProto.__proto__ = jsType.prototype;
};
dart.addTypeTests = function(ctor, isClass) {
  if (isClass == null) isClass = Symbol("_is_" + ctor.name);
  ctor.prototype[isClass] = true;
  ctor.is = function is_C(obj) {
    return obj != null && (obj[isClass] || dart.is(obj, this));
  };
  ctor.as = function as_C(obj) {
    if (obj == null || obj[isClass]) return obj;
    return dart.as(obj, this, false);
  };
  ctor._check = function check_C(obj) {
    if (obj == null || obj[isClass]) return obj;
    return dart.as(obj, this, true);
  };
};
dart.fn = function(closure, type) {
  closure[dart._runtimeType] = type;
  return closure;
};
dart.lazyFn = function(closure, computeType) {
  dart.defineAccessor(closure, dart._runtimeType, {
    get: () => dart.defineValue(closure, dart._runtimeType, computeType()),
    set: value => dart.defineValue(closure, dart._runtimeType, value),
    configurable: true
  });
  return closure;
};
dart.getFunctionType = function(obj) {
  let args = Array(obj.length).fill(dart.dynamic);
  return dart.fnType(dart.bottom, args, void 0);
};
dart.getReifiedType = function(obj) {
  switch (typeof obj) {
    case "object":
    {
      if (obj == null) return core.Null;
      if (obj instanceof core.Object) {
        return obj.constructor;
      }
      let result = obj[dart._extensionType];
      if (result == null) return dart.jsobject;
      return result;
    }
    case "function":
    {
      let result = obj[dart._runtimeType];
      if (result != null) return result;
      return dart.jsobject;
    }
    case "undefined":
    {
      return core.Null;
    }
    case "number":
    {
      return Math.floor(obj) == obj ? core.int : core.double;
    }
    case "boolean":
    {
      return core.bool;
    }
    case "string":
    {
      return core.String;
    }
    case "symbol":
    default:
    {
      return dart.jsobject;
    }
  }
};
dart.getModuleName = function(module) {
  return module[dart._moduleName];
};
dart.getModuleNames = function() {
  return JSArrayOfString().of(Array.from(dart._loadedModules.keys()));
};
dart.getSourceMap = function(moduleName) {
  return dart._loadedSourceMaps.get(moduleName);
};
dart.getModuleLibraries = function(name) {
  let module = dart._loadedModules.get(name);
  if (module == null) return null;
  module[dart._moduleName] = name;
  return module;
};
dart.getModulePartMap = function(name) {
  return dart._loadedPartMaps.get(name);
};
dart.trackLibraries = function(moduleName, libraries, parts, sourceMap) {
  if (typeof parts == 'string') {
    sourceMap = core.String.as(parts);
    parts = {};
  }
  dart._loadedSourceMaps.set(moduleName, sourceMap);
  dart._loadedModules.set(moduleName, libraries);
  dart._loadedPartMaps.set(moduleName, parts);
};
dart._computeLibraryMetadata = function() {
  dart._libraries = JSArrayOfString().of([]);
  dart._libraryObjects = new (IdentityMapOfString$Object()).new();
  dart._parts = new (IdentityMapOfString$ListOfString()).new();
  let modules = dart.getModuleNames();
  for (let name of modules) {
    let module = dart.getModuleLibraries(name);
    let libraries = IterableOfString()._check(dart.getOwnPropertyNames(module)[$cast](core.String));
    dart._libraries[$addAll](libraries);
    for (let library of libraries) {
      dart._libraryObjects[$_set](library, module[library]);
    }
    let partMap = dart.getModulePartMap(name);
    libraries = IterableOfString()._check(dart.getOwnPropertyNames(partMap)[$cast](core.String));
    for (let library of libraries) {
      dart._parts[$_set](library, ListOfString().from(partMap[library]));
    }
  }
};
dart.getLibrary = function(uri) {
  if (dart._libraryObjects == null) {
    dart._computeLibraryMetadata();
  }
  return dart._libraryObjects[$_get](uri);
};
dart.getLibraries = function() {
  if (dart._libraries == null) {
    dart._computeLibraryMetadata();
  }
  return dart._libraries;
};
dart.getParts = function(libraryUri) {
  if (dart._parts == null) {
    dart._computeLibraryMetadata();
  }
  let l = dart._parts[$_get](libraryUri);
  return l != null ? l : JSArrayOfString().of([]);
};
dart._isJsObject = function(obj) {
  return dart.getReifiedType(obj) === dart.jsobject;
};
dart._warn = function(arg) {
  console.warn(arg);
};
dart.lazyJSType = function(getJSTypeCallback, name) {
  let ret = dart._lazyJSTypes.get(name);
  if (ret == null) {
    ret = new dart.LazyJSType.new(getJSTypeCallback, name);
    dart._lazyJSTypes.set(name, ret);
  }
  return ret;
};
dart.anonymousJSType = function(name) {
  let ret = dart._anonymousJSTypes.get(name);
  if (ret == null) {
    ret = new dart.AnonymousJSType.new(name);
    dart._anonymousJSTypes.set(name, ret);
  }
  return ret;
};
dart.wrapType = function(type) {
  if (type.hasOwnProperty(dart._typeObject)) {
    return type[dart._typeObject];
  }
  let result = new dart._Type.new(type);
  type[dart._typeObject] = result;
  return result;
};
dart.unwrapType = function(obj) {
  return obj[_type];
};
dart._memoizeArray = function(map, arr, create) {
  let len = arr.length;
  map = dart._lookupNonTerminal(map, len);
  for (var i = 0; i < len - 1; ++i) {
    map = dart._lookupNonTerminal(map, arr[i]);
  }
  let result = map.get(arr[len - 1]);
  if (result !== void 0) return result;
  map.set(arr[len - 1], result = create());
  return result;
};
dart._canonicalizeArray = function(array, map) {
  return dart._memoizeArray(map, array, () => array);
};
dart._canonicalizeNamed = function(named, map) {
  let key = [];
  let names = dart.getOwnPropertyNames(named);
  for (var i = 0; i < names.length; ++i) {
    let name = names[i];
    let type = named[name];
    key.push(name);
    key.push(type);
  }
  return dart._memoizeArray(map, key, () => named);
};
dart._createSmall = function(returnType, required) {
  let count = required.length;
  let map = dart._fnTypeSmallMap[count];
  for (var i = 0; i < count; ++i) {
    map = dart._lookupNonTerminal(map, required[i]);
  }
  let result = map.get(returnType);
  if (result !== void 0) return result;
  result = new dart.FunctionType.new(returnType, required, [], {});
  map.set(returnType, result);
  return result;
};
dart._typeFormalsFromFunction = function(typeConstructor) {
  let str = typeConstructor.toString();
  let hasParens = str[$_get](0) === "(";
  let end = str[$indexOf](hasParens ? ")" : "=>");
  if (hasParens) {
    return IterableOfTypeVariable()._check(str[$substring](1, end)[$split](",")[$map](dart.TypeVariable, n => new dart.TypeVariable.new(n[$trim]())))[$toList]();
  } else {
    return JSArrayOfTypeVariable().of([new dart.TypeVariable.new(str[$substring](0, end)[$trim]())]);
  }
};
dart.fnType = function(returnType, args, extra) {
  return dart.FunctionType.create(returnType, args, extra);
};
dart.gFnType = function(instantiateFn, typeBounds) {
  return new dart.GenericFunctionType.new(instantiateFn, typeBounds);
};
dart.getFunctionTypeMirror = function(type) {
  if (dart.GenericFunctionType.is(type)) {
    let typeArgs = ListOfType().filled(type.formalCount, dart.wrapType(dart.dynamic));
    return type.instantiate(typeArgs);
  }
  return type;
};
dart.isType = function(obj) {
  return obj[dart._runtimeType] === core.Type;
};
dart.checkTypeBound = function(type, bound, name) {
  if (!dart.isSubtypeOf(type, bound)) {
    dart.throwTypeError("type `" + dart.str(type) + "` does not extend `" + dart.str(bound) + "` of `" + name + "`.");
  }
};
dart.typeName = function(type) {
  if (type === void 0) return "undefined type";
  if (type === null) return "null type";
  if (type instanceof dart.DartType) {
    return type.toString();
  }
  let tag = type[dart._runtimeType];
  if (tag === core.Type) {
    let name = type.name;
    let args = dart.getGenericArgs(type);
    if (args == null) return name;
    if (dart.getGenericClass(type) == _interceptors.JSArray$) name = 'List';
    let result = name;
    result += '<';
    for (let i = 0; i < args.length; ++i) {
      if (i > 0) result += ', ';
      result += dart.typeName(args[i]);
    }
    result += '>';
    return result;
  }
  if (tag) return "Not a type: " + tag.name;
  return "JSObject<" + type.name + ">";
};
dart._isFunctionSubtype = function(ft1, ft2, isCovariant) {
  let ret1 = ft1.returnType;
  let ret2 = ft2.returnType;
  let args1 = ft1.args;
  let args2 = ft2.args;
  if (args1.length > args2.length) {
    return isCovariant ? false : null;
  }
  for (let i = 0; i < args1.length; ++i) {
    if (!dart._isSubtype(args2[i], args1[i], !isCovariant)) {
      return null;
    }
  }
  let optionals1 = ft1.optionals;
  let optionals2 = ft2.optionals;
  if (args1.length + optionals1.length < args2.length + optionals2.length) {
    return isCovariant ? false : null;
  }
  let j = 0;
  for (let i = args1.length; i < args2.length; ++i, ++j) {
    if (!dart._isSubtype(args2[i], optionals1[j], !isCovariant)) {
      return null;
    }
  }
  for (let i = 0; i < optionals2.length; ++i, ++j) {
    if (!dart._isSubtype(optionals2[i], optionals1[j], !isCovariant)) {
      return null;
    }
  }
  let named1 = ft1.named;
  let named2 = ft2.named;
  let names = dart.getOwnPropertyNames(named2);
  for (let i = 0; i < names.length; ++i) {
    let name = names[i];
    let n1 = named1[name];
    let n2 = named2[name];
    if (n1 === void 0) {
      return isCovariant ? false : null;
    }
    if (!dart._isSubtype(n2, n1, !isCovariant)) {
      return null;
    }
  }
  if (ret1 === dart.void) return dart._isTop(ret2);
  if (!dart._isSubtype(ret1, ret2, isCovariant)) return null;
  return true;
};
dart.isSubtypeOf = function(t1, t2) {
  return !!dart._isSubtypeOrLegacySubtype(t1, t2);
};
dart._isSubtypeOrLegacySubtype = function(t1, t2) {
  let map = null;
  if (!t1.hasOwnProperty(dart._subtypeCache)) {
    t1[dart._subtypeCache] = map = new Map();
    dart._cacheMaps[$add](map);
  } else {
    map = t1[dart._subtypeCache];
    let result = map.get(t2);
    if (result !== void 0) return result;
  }
  let result = dart._isSubtype(t1, t2, true);
  map.set(t2, result);
  return result;
};
dart._isBottom = function(type) {
  return type == dart.bottom || type == core.Null;
};
dart._isTop = function(type) {
  if (dart._isFutureOr(type)) {
    return dart._isTop(dart.getGenericArgs(type)[0]);
  }
  return type == core.Object || type == dart.dynamic || type == dart.void;
};
dart._isFutureOr = function(type) {
  return core.identical(dart.getGenericClass(type), async.FutureOr$);
};
dart._isSubtype = function(t1, t2, isCovariant) {
  if (t1 === t2) return true;
  if (dart._isTop(t2) || dart._isBottom(t1)) {
    return true;
  }
  if (dart._isBottom(t2)) return null;
  if (dart._isTop(t1)) {
    if (t1 === dart.dynamic) return null;
    return false;
  }
  if (dart._isFutureOr(t1)) {
    let t1TypeArg = dart.getGenericArgs(t1)[0];
    if (dart._isFutureOr(t2)) {
      let t2TypeArg = dart.getGenericArgs(t2)[0];
      return dart._isSubtype(t1TypeArg, t2TypeArg, isCovariant);
    }
    let t1Future = async.Future$(t1TypeArg);
    return dart._isSubtype(t1Future, t2, isCovariant) && dart._isSubtype(t1TypeArg, t2, isCovariant);
  }
  if (dart._isFutureOr(t2)) {
    let t2TypeArg = dart.getGenericArgs(t2)[0];
    let t2Future = async.Future$(t2TypeArg);
    let s1 = dart._isSubtype(t1, t2Future, isCovariant);
    let s2 = dart._isSubtype(t1, t2TypeArg, isCovariant);
    if (s1 === true || s2 === true) return true;
    if (s1 === null || s2 === null) return null;
    return false;
  }
  if (!(t2 instanceof dart.AbstractFunctionType)) {
    if (t1 instanceof dart.AbstractFunctionType) {
      return t2 === core.Function;
    }
    if (t1 === dart.jsobject && t2 instanceof dart.AnonymousJSType) return true;
    return dart._isInterfaceSubtype(t1, t2, isCovariant);
  }
  if (!(t1 instanceof dart.AbstractFunctionType)) return false;
  if (t1 instanceof dart.GenericFunctionType) {
    if (!(t2 instanceof dart.GenericFunctionType)) return false;
    let formalCount = t1.formalCount;
    if (formalCount !== t2.formalCount) return false;
    let fresh = t2.typeFormals;
    let t1Bounds = t1.instantiateTypeBounds(fresh);
    let t2Bounds = t2.instantiateTypeBounds(fresh);
    for (let i = 0; i < formalCount; i++) {
      if (!dart._isSubtype(t2Bounds[i], t1Bounds[i], !isCovariant)) {
        return false;
      }
    }
    t1 = t1.instantiate(fresh);
    t2 = t2.instantiate(fresh);
  } else if (t2 instanceof dart.GenericFunctionType) {
    return false;
  }
  return dart._isFunctionSubtype(t1, t2, isCovariant);
};
dart._isInterfaceSubtype = function(t1, t2, isCovariant) {
  if (t1 instanceof dart.LazyJSType) t1 = t1.rawJSTypeForCheck();
  if (t2 instanceof dart.LazyJSType) t2 = t2.rawJSTypeForCheck();
  if (t1 === t2) return true;
  if (t1 === core.Object) return false;
  if (t1 === core.Function || t2 === core.Function) return false;
  if (t1 == null) return t2 == core.Object || t2 == dart.dynamic;
  let raw1 = dart.getGenericClass(t1);
  let raw2 = dart.getGenericClass(t2);
  if (raw1 != null && raw1 == raw2) {
    let typeArguments1 = dart.getGenericArgs(t1);
    let typeArguments2 = dart.getGenericArgs(t2);
    let length = typeArguments1.length;
    if (typeArguments2.length == 0) {
      return true;
    } else if (length == 0) {
      if (typeArguments2.every(dart._isTop)) return true;
      return null;
    }
    if (length != typeArguments2.length) dart.assertFailed();
    for (let i = 0; i < length; ++i) {
      let result = dart._isSubtype(typeArguments1[i], typeArguments2[i], isCovariant);
      if (!result) {
        return result;
      }
    }
    return true;
  }
  let indefinite = false;
  function definitive(t1, t2) {
    let result = dart._isInterfaceSubtype(t1, t2, isCovariant);
    if (result == null) {
      indefinite = true;
      return false;
    }
    return result;
  }
  if (definitive(t1.__proto__, t2)) return true;
  let m1 = dart.getMixin(t1);
  if (m1 != null) {
    if (definitive(m1, t2)) return true;
  }
  let getInterfaces = dart.getImplements(t1);
  if (getInterfaces) {
    for (let i1 of getInterfaces()) {
      if (definitive(i1, t2)) return true;
    }
  }
  if (indefinite) return null;
  return false;
};
dart.extractTypeArguments = function(T, instance, f) {
  if (instance == null) {
    dart.throw(new core.ArgumentError.new("Cannot extract type of null instance."));
  }
  let type = T;
  if (dart.AbstractFunctionType.is(type) || dart._isFutureOr(type)) {
    dart.throw(new core.ArgumentError.new("Cannot extract from non-class type (" + dart.str(type) + ")."));
  }
  let typeArguments = dart.getGenericArgs(type);
  if (dart.test(typeArguments[$isEmpty])) {
    dart.throw(new core.ArgumentError.new("Cannot extract from non-generic type (" + dart.str(type) + ")."));
  }
  let supertype = dart._getMatchingSupertype(dart.getReifiedType(instance), type);
  if (!(supertype != null)) dart.assertFailed(null, "dart:_runtime/types.dart", 1084, 10, "supertype != null");
  let typeArgs = dart.getGenericArgs(supertype);
  if (!(typeArgs != null && dart.test(typeArgs[$isNotEmpty]))) dart.assertFailed(null, "dart:_runtime/types.dart", 1086, 10, "typeArgs != null && typeArgs.isNotEmpty");
  return dart.dgcall(f, typeArgs, []);
};
dart._getMatchingSupertype = function(subtype, supertype) {
  if (core.identical(subtype, supertype)) return supertype;
  if (subtype == null || dart.equals(subtype, core.Object)) return null;
  let subclass = dart.getGenericClass(subtype);
  let superclass = dart.getGenericClass(supertype);
  if (subclass != null && core.identical(subclass, superclass)) {
    return subtype;
  }
  let result = dart._getMatchingSupertype(subtype.__proto__, supertype);
  if (result != null) return result;
  let mixin = dart.getMixin(subtype);
  if (mixin != null) {
    result = dart._getMatchingSupertype(mixin, supertype);
    if (result != null) return result;
  }
  let getInterfaces = dart.getImplements(subtype);
  if (getInterfaces != null) {
    for (let iface of getInterfaces()) {
      result = dart._getMatchingSupertype(iface, supertype);
      if (result != null) return result;
    }
  }
  return null;
};
dart.trapRuntimeErrors = function(flag) {
  dart.__trapRuntimeErrors = flag;
};
dart.ignoreWhitelistedErrors = function(flag) {
  dart.__ignoreWhitelistedErrors = flag;
};
dart.ignoreAllErrors = function(flag) {
  dart.__ignoreAllErrors = flag;
};
dart.argumentError = function(value) {
  if (dart.__trapRuntimeErrors) debugger;
  dart.throw(new core.ArgumentError.value(value));
};
dart.throwUnimplementedError = function(message) {
  if (dart.__trapRuntimeErrors) debugger;
  dart.throw(new core.UnimplementedError.new(message));
};
dart.assertFailed = function(message, fileUri, line, column, conditionSource) {
  if (fileUri === void 0) fileUri = null;
  if (line === void 0) line = null;
  if (column === void 0) column = null;
  if (conditionSource === void 0) conditionSource = null;
  if (dart.__trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.AssertionErrorImpl.new(message, fileUri, line, column, conditionSource));
};
dart.throwCyclicInitializationError = function(field) {
  if (field === void 0) field = null;
  if (dart.__trapRuntimeErrors) debugger;
  dart.throw(new core.CyclicInitializationError.new(core.String._check(field)));
};
dart.throwNullValueError = function() {
  if (dart.__trapRuntimeErrors) debugger;
  dart.throw(new core.NoSuchMethodError.new(null, core.Symbol.new("<Unexpected Null Value>"), null, null, null));
};
dart.castError = function(obj, expectedType, isImplicit) {
  if (isImplicit === void 0) isImplicit = false;
  let actualType = dart.getReifiedType(obj);
  let message = dart._castErrorMessage(actualType, expectedType);
  if (dart.__ignoreAllErrors) {
    console.error(message);
    return obj;
  }
  if (dart.__trapRuntimeErrors) debugger;
  let error = isImplicit ? new _js_helper.TypeErrorImpl.new(message) : new _js_helper.CastErrorImpl.new(message);
  dart.throw(error);
};
dart._castErrorMessage = function(from, to) {
  let fromClass = dart.getGenericClass(from);
  if (fromClass != null) {
    let fromTypeFormals = dart.getGenericTypeFormals(fromClass);
    let fromType = dart.instantiateClass(fromClass, fromTypeFormals);
    let inferrer = new dart._TypeInferrer.new(fromTypeFormals);
    if (dart.test(inferrer.trySubtypeMatch(fromType, to))) {
      let inferredTypes = inferrer.getInferredTypes();
      if (inferredTypes != null) {
        let inferred = dart.instantiateClass(fromClass, inferredTypes);
        return "Type '" + dart.typeName(from) + "' should be '" + dart.typeName(inferred) + "' " + ("to implement expected type '" + dart.typeName(to) + "'.");
      }
    }
  }
  return "Expected a value of type '" + dart.typeName(to) + "', " + ("but got one of type '" + dart.typeName(from) + "'");
};
dart.getThrown = function(error) {
  if (error != null) {
    let value = error[dart._thrownValue];
    if (value != null) return value;
  }
  return error;
};
dart.stackTrace = function(error) {
  if (!(error instanceof Error)) {
    return new dart._StackTrace.missing(error);
  }
  let trace = error[dart._stackTrace];
  if (trace != null) return trace;
  return error[dart._stackTrace] = new dart._StackTrace.new(error);
};
dart.stackTraceForError = function(error) {
  return dart.stackTrace(error[dart._jsError]);
};
dart.rethrow = function(error) {
  throw error;
};
dart.throw = function(exception) {
  throw new dart.DartError(exception);
};
dart.createErrorWithStack = function(exception, trace) {
  if (trace == null) {
    let error = exception[dart._jsError];
    return error != null ? error : new dart.DartError(exception);
  }
  if (dart._StackTrace.is(trace)) {
    let originalError = trace[_jsError];
    if (core.identical(exception, dart.getThrown(originalError))) {
      return originalError;
    }
  }
  return new dart.RethrownDartError(exception, trace);
};
dart.stackPrint = function(error) {
  console.log(error.stack ? error.stack : "No stack trace for: " + error);
};
dart.bind = function(obj, name, method) {
  if (obj == null) obj = _interceptors.jsNull;
  if (method == null) method = obj[name];
  let f = method.bind(obj);
  f._boundObject = obj;
  f._boundMethod = method;
  f[dart._runtimeType] = dart.getMethodType(dart.getType(obj), name);
  return f;
};
dart.bindCall = function(obj, name) {
  if (obj == null) return null;
  let ftype = dart.getMethodType(dart.getType(obj), name);
  if (ftype == null) return null;
  let method = obj[name];
  let f = method.bind(obj);
  f._boundObject = obj;
  f._boundMethod = method;
  f[dart._runtimeType] = ftype;
  return f;
};
dart.gbind = function(f, ...typeArgs) {
  let type = f[dart._runtimeType];
  type.checkBounds(typeArgs);
  let result = (...args) => f.apply(null, typeArgs.concat(args));
  return dart.fn(result, type.instantiate(typeArgs));
};
dart.dloadRepl = function(obj, field) {
  return dart.dload(obj, dart.replNameLookup(obj, field), false);
};
dart.dload = function(obj, field, mirrors) {
  if (typeof obj == "function" && field == "call") {
    return obj;
  }
  let f = dart._canonicalMember(obj, field);
  _debugger.trackCall(obj);
  if (f != null) {
    let type = dart.getType(obj);
    if (dart.test(dart.hasField(type, f)) || dart.test(dart.hasGetter(type, f))) return obj[f];
    if (dart.test(dart.hasMethod(type, f))) return dart.bind(obj, f, null);
    if (!mirrors && dart.test(dart.isJsInterop(obj))) {
      return obj[f];
    }
  }
  return dart.noSuchMethod(obj, new dart.InvocationImpl.new(field, [], {isGetter: true}));
};
dart.dloadMirror = function(obj, field) {
  return dart.dload(obj, field, true);
};
dart._stripGenericArguments = function(type) {
  let genericClass = dart.getGenericClass(type);
  if (genericClass != null) return genericClass();
  return type;
};
dart.dputMirror = function(obj, field, value) {
  return dart.dput(obj, field, value, true);
};
dart.dputRepl = function(obj, field, value) {
  return dart.dput(obj, dart.replNameLookup(obj, field), value, false);
};
dart.dput = function(obj, field, value, mirrors) {
  let f = dart._canonicalMember(obj, field);
  _debugger.trackCall(obj);
  if (f != null) {
    let setterType = dart.getSetterType(dart.getType(obj), f);
    if (setterType != null) {
      if (mirrors) setterType = dart._stripGenericArguments(setterType);
      return obj[f] = setterType._check(value);
    }
    if (!mirrors && dart.test(dart.isJsInterop(obj))) {
      return obj[f] = value;
    }
  }
  dart.noSuchMethod(obj, new dart.InvocationImpl.new(field, [value], {isSetter: true}));
  return value;
};
dart._argumentErrors = function(type, actuals, namedActuals) {
  let actualsCount = actuals.length;
  let required = type.args;
  let requiredCount = required.length;
  if (actualsCount < requiredCount) {
    return "Dynamic call with too few arguments. " + ("Expected: " + dart.str(requiredCount) + " Actual: " + dart.str(actualsCount));
  }
  let extras = actualsCount - requiredCount;
  let optionals = type.optionals;
  if (extras > optionals.length) {
    return "Dynamic call with too many arguments. " + ("Expected: " + dart.str(requiredCount) + " Actual: " + dart.str(actualsCount));
  }
  let names = null;
  let named = type.named;
  if (namedActuals != null) {
    names = dart.getOwnPropertyNames(namedActuals);
    for (let name of names) {
      if (!named.hasOwnProperty(name)) {
        return "Dynamic call with unexpected named argument '" + dart.str(name) + "'.";
      }
    }
  }
  for (let i = 0; i < requiredCount; ++i) {
    required[i]._check(actuals[i]);
  }
  for (let i = 0; i < extras; ++i) {
    optionals[i]._check(actuals[i + requiredCount]);
  }
  if (names != null) {
    for (let name of names) {
      named[name]._check(namedActuals[name]);
    }
  }
  return null;
};
dart._toSymbolName = function(symbol) {
  let str = symbol.toString();
  return str.substring(7, str.length - 1);
};
dart._toDisplayName = function(name) {
  if (name[0] === '_') {
    switch (name) {
      case '_get':
      {
        return '[]';
      }
      case '_set':
      {
        return '[]=';
      }
      case '_negate':
      {
        return 'unary-';
      }
      case '_constructor':
      case '_prototype':
      {
        return name.substring(1);
      }
    }
  }
  return name;
};
dart._dartSymbol = function(name) {
  return typeof name === "symbol" ? dart.const(new _js_helper.PrivateSymbol.new(dart._toSymbolName(name), name)) : dart.const(new _internal.Symbol.new(dart._toDisplayName(name)));
};
dart._setterSymbol = function(name) {
  return typeof name === "symbol" ? dart.const(new _js_helper.PrivateSymbol.new(dart._toSymbolName(name) + "=", name)) : dart.const(new _internal.Symbol.new(dart._toDisplayName(name) + "="));
};
dart._checkAndCall = function(f, ftype, obj, typeArgs, args, named, displayName) {
  _debugger.trackCall(obj);
  let originalTarget = obj === void 0 ? f : obj;
  function callNSM(errorMessage) {
    return dart.noSuchMethod(originalTarget, new dart.InvocationImpl.new(displayName, args, {namedArguments: named, typeArguments: typeArgs, isMethod: true, failureMessage: errorMessage}));
  }
  if (f == null) return callNSM('Dynamic call of null.');
  if (!(f instanceof Function)) {
    if (f != null) {
      originalTarget = f;
      f = dart.bindCall(f, dart._canonicalMember(f, "call"));
      ftype = null;
    }
    if (f == null) return callNSM("Dynamic call of object has no instance method 'call'.");
  }
  if (ftype == null) ftype = f[dart._runtimeType];
  if (ftype == null) {
    if (typeArgs != null) {
      dart.throwTypeError('call to JS object `' + obj + '` with type arguments <' + typeArgs + '> is not supported.');
    }
    if (named != null) args.push(named);
    return f.apply(obj, args);
  }
  if (ftype instanceof Array) ftype = ftype[0];
  if (ftype instanceof dart.GenericFunctionType) {
    let formalCount = ftype.formalCount;
    if (typeArgs == null) {
      typeArgs = ftype.instantiateDefaultBounds();
    } else if (typeArgs.length != formalCount) {
      return callNSM('Dynamic call with incorrect number of type arguments. ' + 'Expected: ' + formalCount + ' Actual: ' + typeArgs.length);
    } else {
      ftype.checkBounds(typeArgs);
    }
    ftype = ftype.instantiate(typeArgs);
  } else if (typeArgs != null) {
    return callNSM('Dynamic call with unexpected type arguments. ' + 'Expected: 0 Actual: ' + typeArgs.length);
  }
  let errorMessage = dart._argumentErrors(ftype, args, named);
  if (errorMessage == null) {
    if (typeArgs != null) args = typeArgs.concat(args);
    if (named != null) args.push(named);
    return f.apply(obj, args);
  }
  return callNSM(errorMessage);
};
dart.dcall = function(f, args, named) {
  return dart._checkAndCall(f, null, void 0, null, args, named, "call");
};
dart.dgcall = function(f, typeArgs, args, named) {
  return dart._checkAndCall(f, null, void 0, typeArgs, args, named, "call");
};
dart.replNameLookup = function(object, field) {
  let rawField = field;
  if (typeof field == 'symbol') {
    if (field in object) return field;
    field = field.toString();
    field = field.substring('Symbol('.length, field.length - 1);
  } else if (field.charAt(0) != '_') {
    return field;
  }
  if (field in object) return field;
  let proto = object;
  while (proto !== null) {
    let symbols = Object.getOwnPropertySymbols(proto);
    let target = 'Symbol(' + field + ')';
    for (let s = 0; s < symbols.length; s++) {
      let sym = symbols[s];
      if (target == sym.toString()) return sym;
    }
    proto = proto.__proto__;
  }
  return rawField;
};
dart._dhelperRepl = function(obj, field, callback) {
  return callback(dart.replNameLookup(obj, field));
};
dart.callMethod = function(obj, name, typeArgs, args, named, displayName) {
  if (typeof obj == "function" && name == "call") {
    return dart.dgcall(obj, typeArgs, args, named);
  }
  let symbol = dart._canonicalMember(obj, name);
  if (symbol == null) {
    return dart.noSuchMethod(obj, new dart.InvocationImpl.new(displayName, ListOfObject()._check(args), {isMethod: true}));
  }
  let f = obj != null ? obj[symbol] : null;
  let type = dart.getType(obj);
  let ftype = dart.getMethodType(type, symbol);
  return dart._checkAndCall(f, ftype, obj, typeArgs, args, named, displayName);
};
dart.dsend = function(obj, method, args, named) {
  return dart.callMethod(obj, method, null, args, named, method);
};
dart.dgsend = function(obj, typeArgs, method, args, named) {
  return dart.callMethod(obj, method, typeArgs, args, named, method);
};
dart.dsendRepl = function(obj, method, args, named) {
  return dart.callMethod(obj, dart.replNameLookup(obj, method), null, args, named, method);
};
dart.dgsendRepl = function(obj, typeArgs, method, args, named) {
  return dart.callMethod(obj, dart.replNameLookup(obj, method), typeArgs, args, named, method);
};
dart.dindex = function(obj, index) {
  return dart.callMethod(obj, "_get", null, [index], null, "[]");
};
dart.dsetindex = function(obj, index, value) {
  return dart.callMethod(obj, "_set", null, [index, value], null, "[]=");
};
dart._isSubtypeOrIgnorableCastFailure = function(t1, t2, isImplicit) {
  let result = dart._isSubtypeOrLegacySubtype(t1, t2);
  return result === true || result == null && isImplicit && dart.__ignoreWhitelistedErrors && dart._ignoreTypeFailure(t1, t2);
};
dart._ignoreTypeFailure = function(t1, t2) {
  let map = dart._ignoreSubtypeCache.get(t1);
  if (map != null) {
    let result = map.get(t2);
    if (result !== void 0) return result;
  } else {
    map = new Map();
    dart._ignoreSubtypeCache.set(t1, map);
  }
  let result = null;
  if (dart._isFutureOr(t2)) {
    let typeArg = dart.getGenericArgs(t2)[$_get](0);
    let typeFuture = async.Future$(typeArg);
    result = dart._ignoreTypeFailure(t1, typeFuture) || dart._ignoreTypeFailure(t1, typeArg);
  } else {
    result = dart.isSubtypeOf(t2, core.Iterable) && dart.isSubtypeOf(t1, core.Iterable);
    if (result) {
      dart._warn("Ignoring cast fail from " + dart.typeName(t1) + " to " + dart.typeName(t2));
    }
  }
  map.set(t2, result);
  return result;
};
dart.is = function(obj, type) {
  if (obj == null) {
    return core.identical(type, core.Null) || dart._isTop(type);
  }
  return dart.isSubtypeOf(dart.getReifiedType(obj), type);
};
dart.as = function(obj, type, isImplicit) {
  if (obj == null) return obj;
  let actual = dart.getReifiedType(obj);
  if (dart._isSubtypeOrIgnorableCastFailure(actual, type, isImplicit)) {
    return obj;
  }
  return dart.castError(obj, type, isImplicit);
};
dart.test = function(obj) {
  if (obj == null) dart._throwBooleanConversionError();
  return obj;
};
dart.dtest = function(obj) {
  if (!(typeof obj == 'boolean')) dart.booleanConversionFailed(obj);
  return core.bool._check(obj);
};
dart._throwBooleanConversionError = function() {
  return dart.throw(new _js_helper.BooleanConversionAssertionError.new());
};
dart.booleanConversionFailed = function(obj) {
  let actual = dart.typeName(dart.getReifiedType(dart.test(core.bool._check(obj))));
  dart.throw(new _js_helper.TypeErrorImpl.new("type '" + actual + "' is not a 'bool' in boolean expression"));
};
dart.asInt = function(obj) {
  if (obj == null) return null;
  if (Math.floor(obj) != obj) {
    dart.castError(obj, core.int, false);
  }
  return obj;
};
dart.notNull = function(x) {
  if (x == null) dart.throwNullValueError();
  return x;
};
dart._lookupNonTerminal = function(map, key) {
  let result = map.get(key);
  if (result != null) return result;
  map.set(key, result = new Map());
  return result;
};
dart.constMap = function(K, V, elements) {
  let count = elements[$length];
  let map = dart._lookupNonTerminal(dart.constantMaps, count);
  for (let i = 0; i < count; i++) {
    map = dart._lookupNonTerminal(map, elements[i]);
  }
  map = dart._lookupNonTerminal(map, dart.wrapType(K));
  let result = map.get(V);
  if (result != null) return core.Map$(K, V)._check(result);
  result = new (_js_helper.ImmutableMap$(K, V)).from(elements);
  map.set(V, result);
  return core.Map$(K, V)._check(result);
};
dart._createImmutableSet = function(E, elements) {
  let t = dart._immutableSetConstructor;
  t == null ? dart._immutableSetConstructor = dart.getLibrary("dart:collection")._ImmutableSet$ : t;
  return new (dart._immutableSetConstructor(E)).from(elements);
};
dart.constSet = function(E, elements) {
  let count = elements[$length];
  let map = dart._lookupNonTerminal(dart.constantSets, count);
  for (let i = 0; i < count; i++) {
    map = dart._lookupNonTerminal(map, elements[i]);
  }
  let result = map.get(E);
  if (result != null) return core.Set$(E)._check(result);
  result = dart._createImmutableSet(E, elements);
  map.set(E, result);
  return core.Set$(E)._check(result);
};
dart.dassert = function(value) {
  if (value != null && value[dart._runtimeType] instanceof dart.AbstractFunctionType) {
    value = dart.dcall(value, []);
  }
  return dart.dtest(value);
};
dart.multiKeyPutIfAbsent = function(map, keys, valueFn) {
  for (let k of keys) {
    let value = map.get(k);
    if (!value) {
      map.set(k, value = new Map());
    }
    map = value;
  }
  if (map.has(dart._value)) return map.get(dart._value);
  let value = valueFn();
  map.set(dart._value, value);
  return value;
};
dart.const = function(obj) {
  let names = dart.getOwnNamesAndSymbols(obj);
  let count = names.length;
  let map = dart._lookupNonTerminal(dart.constants, count);
  for (let i = 0; i < count; i++) {
    let name = names[i];
    map = dart._lookupNonTerminal(map, name);
    map = dart._lookupNonTerminal(map, obj[name]);
  }
  let type = dart.getReifiedType(obj);
  let value = map.get(type);
  if (value) return value;
  map.set(type, obj);
  return obj;
};
dart.constList = function(elements, elementType) {
  let count = elements.length;
  let map = dart._lookupNonTerminal(dart.constantLists, count);
  for (let i = 0; i < count; i++) {
    map = dart._lookupNonTerminal(map, elements[i]);
  }
  let value = map.get(elementType);
  if (value) return value;
  _interceptors.JSArray$(elementType).unmodifiable(elements);
  map.set(elementType, elements);
  return elements;
};
dart.constFn = function(x) {
  return () => x;
};
dart.extensionSymbol = function(name) {
  return dartx[name];
};
dart.equals = function(x, y) {
  return x == null ? y == null : x[$_equals](y);
};
dart.hashCode = function(obj) {
  return obj == null ? 0 : obj[$hashCode];
};
dart.toString = function(obj) {
  if (obj == null) return "null";
  if (typeof obj == 'string') return obj;
  return obj[$toString]();
};
dart.str = function(obj) {
  if (obj == null) return "null";
  if (typeof obj == 'string') return obj;
  return core.String._check(dart.notNull(obj[$toString]()));
};
dart.noSuchMethod = function(obj, invocation) {
  if (obj == null) dart.defaultNoSuchMethod(obj, invocation);
  return obj[$noSuchMethod](invocation);
};
dart.defaultNoSuchMethod = function(obj, i) {
  if (dart.__trapRuntimeErrors) debugger;
  dart.throw(new core.NoSuchMethodError.withInvocation(obj, i));
};
dart.runtimeType = function(obj) {
  return obj == null ? dart.wrapType(core.Null) : obj[dartx.runtimeType];
};
dart._canonicalMember = function(obj, name) {
  if (typeof name === "symbol") return name;
  if (obj != null && obj[dart._extensionType] != null) {
    return dartx[name];
  }
  if (name == "constructor" || name == "prototype") {
    name = "+" + name;
  }
  return name;
};
dart.loadLibrary = function() {
  return async.Future.value();
};
dart.defineLazy = function(to, from) {
  for (let name of dart.getOwnNamesAndSymbols(from)) {
    dart.defineLazyField(to, name, dart.getOwnPropertyDescriptor(from, name));
  }
};
dart._polyfilled = Symbol("_polyfilled");
dart.global = (function() {
  var globalState = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : null;
  if (!globalState) {
    globalState = new Function('return this;')();
  }
  dart.polyfill(globalState);
  if (globalState.Error) {
    globalState.Error.stackTraceLimit = Infinity;
  }
  let settings = 'ddcSettings' in globalState ? globalState.ddcSettings : {};
  dart.trapRuntimeErrors('trapRuntimeErrors' in settings ? settings.trapRuntimeErrors : false);
  dart.ignoreWhitelistedErrors('ignoreWhitelistedErrors' in settings ? settings.ignoreWhitelistedErrors : false);
  dart.ignoreAllErrors('ignoreAllErrors' in settings ? settings.ignoreAllErrors : false);
  dart.trackProfile('trackProfile' in settings ? settings.trackProfile : false);
  return globalState;
})();
dart.JsSymbol = Symbol;
dart.libraryPrototype = dart.library;
dart.startAsyncSynchronously = true;
dart._cacheMaps = [];
dart._resetFields = [];
dart.addAsyncCallback = function() {
};
dart.removeAsyncCallback = function() {
};
dart.defineProperty = Object.defineProperty;
dart.defineAccessor = Object.defineProperty;
dart.getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
dart.getOwnPropertyNames = Object.getOwnPropertyNames;
dart.getOwnPropertySymbols = Object.getOwnPropertySymbols;
dart.getPrototypeOf = Object.getPrototypeOf;
dart._mixin = Symbol("mixin");
dart.mixinOn = Symbol("mixinOn");
dart.implements = Symbol("implements");
dart._typeArguments = Symbol("typeArguments");
dart._originalDeclaration = Symbol("originalDeclaration");
dart.mixinNew = Symbol("dart.mixinNew");
dart._constructorSig = Symbol("sigCtor");
dart._methodSig = Symbol("sigMethod");
dart._fieldSig = Symbol("sigField");
dart._getterSig = Symbol("sigGetter");
dart._setterSig = Symbol("sigSetter");
dart._staticMethodSig = Symbol("sigStaticMethod");
dart._staticFieldSig = Symbol("sigStaticField");
dart._staticGetterSig = Symbol("sigStaticGetter");
dart._staticSetterSig = Symbol("sigStaticSetter");
dart._genericTypeCtor = Symbol("genericType");
dart._libraryUri = Symbol("libraryUri");
dart._extensionType = Symbol("extensionType");
dart.dartx = dartx;
dart._extensionMap = new Map();
dart.isFuture = Symbol("_is_Future");
dart.isIterable = Symbol("_is_Iterable");
dart.isList = Symbol("_is_List");
dart.isMap = Symbol("_is_Map");
dart.isStream = Symbol("_is_Stream");
dart.isStreamSubscription = Symbol("_is_StreamSubscription");
dart.identityEquals = null;
dart._runtimeType = Symbol("_runtimeType");
dart._moduleName = Symbol("_moduleName");
dart._loadedModules = new Map();
dart._loadedPartMaps = new Map();
dart._loadedSourceMaps = new Map();
dart._libraries = null;
dart._libraryObjects = null;
dart._parts = null;
dart.metadata = Symbol("metadata");
core.Object = class Object {
  constructor() {
    throw Error("use `new " + dart.typeName(dart.getReifiedType(this)) + ".new(...)` to create a Dart object");
  }
  _equals(other) {
    return this === other;
  }
  get hashCode() {
    return core.identityHashCode(this);
  }
  toString() {
    return "Instance of '" + dart.typeName(dart.getReifiedType(this)) + "'";
  }
  noSuchMethod(invocation) {
    return dart.defaultNoSuchMethod(this, invocation);
  }
  get runtimeType() {
    return dart.wrapType(dart.getReifiedType(this));
  }
};
(core.Object.new = function() {
}).prototype = core.Object.prototype;
core.Object.is = function is_Object(o) {
  return true;
};
core.Object.as = function as_Object(o) {
  return o;
};
core.Object._check = function check_Object(o) {
  return o;
};
dart.setMethodSignature(core.Object, () => ({
  __proto__: Object.create(null),
  _equals: dart.fnType(core.bool, [dart.dynamic]),
  [$_equals]: dart.fnType(core.bool, [dart.dynamic]),
  toString: dart.fnType(core.String, []),
  [$toString]: dart.fnType(core.String, []),
  noSuchMethod: dart.fnType(dart.dynamic, [core.Invocation]),
  [$noSuchMethod]: dart.fnType(dart.dynamic, [core.Invocation])
}));
dart.setGetterSignature(core.Object, () => ({
  __proto__: Object.create(null),
  hashCode: core.int,
  [$hashCode]: core.int,
  runtimeType: core.Type,
  [$runtimeType]: core.Type
}));
dart.setLibraryUri(core.Object, "dart:core");
dart.lazyFn(core.Object, () => core.Type);
dart.defineExtensionMethods(core.Object, ['_equals', 'toString', 'noSuchMethod']);
dart.defineExtensionAccessors(core.Object, ['hashCode', 'runtimeType']);
dart.registerExtension("Object", core.Object);
dart.DartType = class DartType extends core.Object {
  get name() {
    return this.toString();
  }
  is(object) {
    return dart.is(object, this);
  }
  as(object) {
    return dart.as(object, this, false);
  }
  _check(object) {
    return dart.as(object, this, true);
  }
};
(dart.DartType.new = function() {
}).prototype = dart.DartType.prototype;
dart.addTypeTests(dart.DartType);
dart.DartType[dart.implements] = () => [core.Type];
dart.setMethodSignature(dart.DartType, () => ({
  __proto__: dart.getMethods(dart.DartType.__proto__),
  is: dart.fnType(core.bool, [dart.dynamic]),
  as: dart.fnType(dart.dynamic, [dart.dynamic]),
  _check: dart.fnType(dart.dynamic, [dart.dynamic])
}));
dart.setGetterSignature(dart.DartType, () => ({
  __proto__: dart.getGetters(dart.DartType.__proto__),
  name: core.String
}));
dart.setLibraryUri(dart.DartType, "dart:_runtime");
dart.DynamicType = class DynamicType extends dart.DartType {
  toString() {
    return "dynamic";
  }
  is(object) {
    return true;
  }
  as(object) {
    return object;
  }
  _check(object) {
    return object;
  }
};
(dart.DynamicType.new = function() {
}).prototype = dart.DynamicType.prototype;
dart.addTypeTests(dart.DynamicType);
dart.setLibraryUri(dart.DynamicType, "dart:_runtime");
dart.defineExtensionMethods(dart.DynamicType, ['toString']);
const _getRawJSTypeFn = dart.privateName(dart, "_getRawJSTypeFn");
const _dartName = dart.privateName(dart, "_dartName");
const _rawJSType = dart.privateName(dart, "_rawJSType");
const _getRawJSType = dart.privateName(dart, "_getRawJSType");
dart.LazyJSType = class LazyJSType extends dart.DartType {
  toString() {
    let raw = this[_getRawJSType]();
    return raw != null ? dart.typeName(raw) : "JSObject<" + this[_dartName] + ">";
  }
  [_getRawJSType]() {
    let raw = this[_rawJSType];
    if (raw != null) return raw;
    try {
      raw = this[_getRawJSTypeFn]();
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    if (raw == null) {
      dart._warn("Cannot find native JavaScript type (" + this[_dartName] + ") for type check");
    } else {
      this[_rawJSType] = raw;
      this[_getRawJSTypeFn] = null;
    }
    return raw;
  }
  rawJSTypeForCheck() {
    let l = this[_getRawJSType]();
    return l != null ? l : dart.jsobject;
  }
  isRawJSType(obj) {
    let raw = this[_getRawJSType]();
    if (raw != null) return obj instanceof raw;
    return dart._isJsObject(obj);
  }
  is(obj) {
    return this.isRawJSType(obj) || dart.is(obj, this);
  }
  as(obj) {
    return obj == null || this.is(obj) ? obj : dart.castError(obj, this, false);
  }
  _check(obj) {
    return obj == null || this.is(obj) ? obj : dart.castError(obj, this, true);
  }
};
(dart.LazyJSType.new = function(getRawJSTypeFn, dartName) {
  this[_rawJSType] = null;
  this[_getRawJSTypeFn] = getRawJSTypeFn;
  this[_dartName] = dartName;
}).prototype = dart.LazyJSType.prototype;
dart.addTypeTests(dart.LazyJSType);
dart.setMethodSignature(dart.LazyJSType, () => ({
  __proto__: dart.getMethods(dart.LazyJSType.__proto__),
  [_getRawJSType]: dart.fnType(core.Object, []),
  rawJSTypeForCheck: dart.fnType(core.Object, []),
  isRawJSType: dart.fnType(core.bool, [dart.dynamic])
}));
dart.setLibraryUri(dart.LazyJSType, "dart:_runtime");
dart.setFieldSignature(dart.LazyJSType, () => ({
  __proto__: dart.getFields(dart.LazyJSType.__proto__),
  [_getRawJSTypeFn]: dart.fieldType(VoidTodynamic()),
  [_dartName]: dart.finalFieldType(core.String),
  [_rawJSType]: dart.fieldType(core.Object)
}));
dart.defineExtensionMethods(dart.LazyJSType, ['toString']);
dart.AnonymousJSType = class AnonymousJSType extends dart.DartType {
  toString() {
    return this[_dartName];
  }
  is(obj) {
    return dart._isJsObject(obj) || dart.is(obj, this);
  }
  as(obj) {
    return obj == null || dart._isJsObject(obj) ? obj : dart.as(obj, this, false);
  }
  _check(obj) {
    return obj == null || dart._isJsObject(obj) ? obj : dart.as(obj, this, true);
  }
};
(dart.AnonymousJSType.new = function(dartName) {
  this[_dartName] = dartName;
}).prototype = dart.AnonymousJSType.prototype;
dart.addTypeTests(dart.AnonymousJSType);
dart.setLibraryUri(dart.AnonymousJSType, "dart:_runtime");
dart.setFieldSignature(dart.AnonymousJSType, () => ({
  __proto__: dart.getFields(dart.AnonymousJSType.__proto__),
  [_dartName]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(dart.AnonymousJSType, ['toString']);
dart._lazyJSTypes = new Map();
dart._anonymousJSTypes = new Map();
dart.dynamic = new dart.DynamicType.new();
dart.VoidType = class VoidType extends dart.DartType {
  toString() {
    return "void";
  }
};
(dart.VoidType.new = function() {
}).prototype = dart.VoidType.prototype;
dart.addTypeTests(dart.VoidType);
dart.setLibraryUri(dart.VoidType, "dart:_runtime");
dart.defineExtensionMethods(dart.VoidType, ['toString']);
dart.void = new dart.VoidType.new();
dart.BottomType = class BottomType extends dart.DartType {
  toString() {
    return "bottom";
  }
};
(dart.BottomType.new = function() {
}).prototype = dart.BottomType.prototype;
dart.addTypeTests(dart.BottomType);
dart.setLibraryUri(dart.BottomType, "dart:_runtime");
dart.defineExtensionMethods(dart.BottomType, ['toString']);
dart.defineLazy(dart, {
  /*dart.bottom*/get bottom() {
    return core.Null;
  }
});
dart.JSObjectType = class JSObjectType extends dart.DartType {
  toString() {
    return "NativeJavaScriptObject";
  }
};
(dart.JSObjectType.new = function() {
}).prototype = dart.JSObjectType.prototype;
dart.addTypeTests(dart.JSObjectType);
dart.setLibraryUri(dart.JSObjectType, "dart:_runtime");
dart.defineExtensionMethods(dart.JSObjectType, ['toString']);
dart.jsobject = new dart.JSObjectType.new();
const _type = dart.privateName(dart, "_type");
core.Type = class Type extends core.Object {};
(core.Type.new = function() {
}).prototype = core.Type.prototype;
dart.addTypeTests(core.Type);
dart.setLibraryUri(core.Type, "dart:core");
dart._Type = class _Type extends core.Type {
  toString() {
    return dart.typeName(this[_type]);
  }
  get runtimeType() {
    return dart.wrapType(core.Type);
  }
};
(dart._Type.new = function(type) {
  this[_type] = type;
}).prototype = dart._Type.prototype;
dart.addTypeTests(dart._Type);
dart.setLibraryUri(dart._Type, "dart:_runtime");
dart.setFieldSignature(dart._Type, () => ({
  __proto__: dart.getFields(dart._Type.__proto__),
  [_type]: dart.finalFieldType(core.Object)
}));
dart.defineExtensionMethods(dart._Type, ['toString']);
dart.defineExtensionAccessors(dart._Type, ['runtimeType']);
dart._typeObject = Symbol("typeObject");
dart.AbstractFunctionType = class AbstractFunctionType extends dart.DartType {};
(dart.AbstractFunctionType.new = function() {
}).prototype = dart.AbstractFunctionType.prototype;
dart.addTypeTests(dart.AbstractFunctionType);
dart.setLibraryUri(dart.AbstractFunctionType, "dart:_runtime");
dart._fnTypeNamedArgMap = new Map();
dart._fnTypeArrayArgMap = new Map();
dart._fnTypeTypeMap = new Map();
dart._fnTypeSmallMap = [new Map(), new Map(), new Map()];
const _stringValue = dart.privateName(dart, "_stringValue");
const _process = dart.privateName(dart, "_process");
dart.FunctionType = class FunctionType extends dart.AbstractFunctionType {
  static create(returnType, args, extra) {
    if (extra == null && args.length < 3) {
      return dart._createSmall(returnType, args);
    }
    args = dart._canonicalizeArray(args, dart._fnTypeArrayArgMap);
    let keys = null;
    let create = null;
    if (extra == null) {
      keys = [returnType, args];
      create = () => new dart.FunctionType.new(returnType, args, [], {});
    } else if (extra instanceof Array) {
      let optionals = dart._canonicalizeArray(extra, dart._fnTypeArrayArgMap);
      keys = [returnType, args, optionals];
      create = () => new dart.FunctionType.new(returnType, args, optionals, {});
    } else {
      let named = dart._canonicalizeNamed(extra, dart._fnTypeNamedArgMap);
      keys = [returnType, args, named];
      create = () => new dart.FunctionType.new(returnType, args, [], named);
    }
    return dart._memoizeArray(dart._fnTypeTypeMap, keys, create);
  }
  [_process](array) {
    let result = [];
    for (let i = 0; i < array.length; ++i) {
      let arg = array[i];
      if (arg instanceof Array) {
        this.metadata.push(arg.slice(1));
        result.push(arg[0]);
      } else {
        this.metadata.push([]);
        result.push(arg);
      }
    }
    return result;
  }
  toString() {
    return this.name;
  }
  get requiredParameterCount() {
    return this.args[$length];
  }
  get positionalParameterCount() {
    return dart.notNull(this.args[$length]) + dart.notNull(this.optionals[$length]);
  }
  getPositionalParameter(i) {
    let n = this.args[$length];
    return dart.notNull(i) < dart.notNull(n) ? this.args[$_get](i) : this.optionals[$_get](dart.notNull(i) + dart.notNull(n));
  }
  getNamedParameters() {
    let result = new (IdentityMapOfString$Object()).new();
    let names = dart.getOwnPropertyNames(this.named);
    names.sort();
    for (let i = 0; i < names.length; ++i) {
      let name = names[i];
      result[$_set](name, this.named[name]);
    }
    return result;
  }
  get name() {
    if (this[_stringValue] != null) return this[_stringValue];
    let buffer = "(";
    for (let i = 0; i < this.args.length; ++i) {
      if (i > 0) {
        buffer = buffer + ", ";
      }
      buffer = buffer + dart.typeName(this.args[i]);
    }
    if (this.optionals.length > 0) {
      if (this.args.length > 0) {
        buffer = buffer + ", ";
      }
      buffer = buffer + "[";
      for (let i = 0; i < this.optionals.length; ++i) {
        if (i > 0) {
          buffer = buffer + ", ";
        }
        buffer = buffer + dart.typeName(this.optionals[i]);
      }
      buffer = buffer + "]";
    } else if (Object.keys(this.named).length > 0) {
      if (this.args.length > 0) {
        buffer = buffer + ", ";
      }
      buffer = buffer + "{";
      let names = dart.getOwnPropertyNames(this.named);
      names.sort();
      for (let i = 0; i < names.length; ++i) {
        if (i > 0) {
          buffer = buffer + ", ";
        }
        let typeNameString = dart.typeName(this.named[names[i]]);
        buffer = buffer + (typeNameString + " " + dart.str(names[i]));
      }
      buffer = buffer + "}";
    }
    let returnTypeName = dart.typeName(this.returnType);
    buffer = buffer + (") => " + returnTypeName);
    this[_stringValue] = buffer;
    return buffer;
  }
  is(obj) {
    if (typeof obj == "function") {
      let actual = obj[dart._runtimeType];
      return actual == null || dart.isSubtypeOf(actual, this);
    }
    return false;
  }
  as(obj, isImplicit) {
    if (isImplicit === void 0) isImplicit = false;
    if (obj == null) return obj;
    if (typeof obj == "function") {
      let actual = obj[dart._runtimeType];
      if (actual == null || dart._isSubtypeOrIgnorableCastFailure(actual, this, isImplicit)) {
        return obj;
      }
    }
    return dart.castError(obj, this, isImplicit);
  }
  _check(obj) {
    return this.as(obj, true);
  }
};
(dart.FunctionType.new = function(returnType, args, optionals, named) {
  this.metadata = [];
  this[_stringValue] = null;
  this.returnType = returnType;
  this.args = args;
  this.optionals = optionals;
  this.named = named;
  this.args = this[_process](this.args);
  this.optionals = this[_process](this.optionals);
}).prototype = dart.FunctionType.prototype;
dart.addTypeTests(dart.FunctionType);
dart.setMethodSignature(dart.FunctionType, () => ({
  __proto__: dart.getMethods(dart.FunctionType.__proto__),
  [_process]: dart.fnType(core.List, [core.List]),
  getPositionalParameter: dart.fnType(dart.dynamic, [core.int]),
  getNamedParameters: dart.fnType(core.Map$(core.String, core.Object), []),
  as: dart.fnType(dart.dynamic, [dart.dynamic], [core.bool])
}));
dart.setGetterSignature(dart.FunctionType, () => ({
  __proto__: dart.getGetters(dart.FunctionType.__proto__),
  requiredParameterCount: core.int,
  positionalParameterCount: core.int
}));
dart.setLibraryUri(dart.FunctionType, "dart:_runtime");
dart.setFieldSignature(dart.FunctionType, () => ({
  __proto__: dart.getFields(dart.FunctionType.__proto__),
  returnType: dart.finalFieldType(dart.dynamic),
  args: dart.fieldType(core.List),
  optionals: dart.fieldType(core.List),
  named: dart.finalFieldType(dart.dynamic),
  metadata: dart.fieldType(core.List),
  [_stringValue]: dart.fieldType(core.String)
}));
dart.defineExtensionMethods(dart.FunctionType, ['toString']);
dart.TypeVariable = class TypeVariable extends dart.DartType {
  get name() {
    return this[name$];
  }
  set name(value) {
    super.name = value;
  }
  toString() {
    return this.name;
  }
};
(dart.TypeVariable.new = function(name) {
  this[name$] = name;
}).prototype = dart.TypeVariable.prototype;
dart.addTypeTests(dart.TypeVariable);
const name$ = Symbol("TypeVariable.name");
dart.setLibraryUri(dart.TypeVariable, "dart:_runtime");
dart.setFieldSignature(dart.TypeVariable, () => ({
  __proto__: dart.getFields(dart.TypeVariable.__proto__),
  name: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(dart.TypeVariable, ['toString']);
const _instantiateTypeBounds = dart.privateName(dart, "_instantiateTypeBounds");
const _instantiateTypeParts = dart.privateName(dart, "_instantiateTypeParts");
const _typeFormals = dart.privateName(dart, "_typeFormals");
dart.GenericFunctionType = class GenericFunctionType extends dart.AbstractFunctionType {
  get typeFormals() {
    if (this[_typeFormals] != null) return this[_typeFormals];
    return this[_typeFormals] = dart._typeFormalsFromFunction(this[_instantiateTypeParts]);
  }
  checkBounds(typeArgs) {
    if (this[_instantiateTypeBounds] == null) return;
    let bounds = this.instantiateTypeBounds(typeArgs);
    let typeFormals = this.typeFormals;
    for (let i = 0; i < dart.notNull(typeArgs[$length]); i++) {
      dart.checkTypeBound(typeArgs[$_get](i), bounds[$_get](i), typeFormals[$_get](i).name);
    }
  }
  instantiate(typeArgs) {
    let parts = this[_instantiateTypeParts].apply(null, typeArgs);
    return dart.FunctionType.create(parts[0], parts[1], parts[2]);
  }
  instantiateTypeBounds(typeArgs) {
    let boundsFn = this[_instantiateTypeBounds];
    if (boundsFn == null) {
      return core.List.filled(this.formalCount, dart.dynamic);
    }
    return boundsFn.apply(null, typeArgs);
  }
  toString() {
    let s = "<";
    let typeFormals = this.typeFormals;
    let typeBounds = this.instantiateTypeBounds(typeFormals);
    for (let i = 0, n = typeFormals[$length]; i < dart.notNull(n); i++) {
      if (i !== 0) {
        s = s + ", ";
      }
      s = s + typeFormals[i].name;
      let bound = typeBounds[$_get](i);
      if (bound !== dart.dynamic && bound !== core.Object) {
        s = s + (" extends " + dart.str(bound));
      }
    }
    s = s + (">" + dart.notNull(dart.toString(this.instantiate(typeFormals))));
    return s;
  }
  instantiateDefaultBounds() {
    let typeFormals = this.typeFormals;
    let all = new (IdentityMapOfObject$int()).new();
    let defaults = ListOfObject().new(typeFormals[$length]);
    let partials = new (IdentityMapOfTypeVariable$Object()).new();
    let typeBounds = this.instantiateTypeBounds(typeFormals);
    for (let i = 0; i < dart.notNull(typeFormals[$length]); i++) {
      let typeFormal = typeFormals[$_get](i);
      let bound = typeBounds[$_get](i);
      all._set(typeFormal, i);
      if (core.identical(bound, dart.dynamic)) {
        defaults[$_set](i, bound);
      } else {
        defaults[$_set](i, typeFormal);
        partials[$_set](typeFormal, bound);
      }
    }
    function hasFreeFormal(t) {
      if (dart.test(partials[$containsKey](t))) return true;
      let typeArgs = dart.getGenericArgs(t);
      if (typeArgs != null) return typeArgs[$any](hasFreeFormal);
      if (dart.GenericFunctionType.is(t)) {
        return hasFreeFormal(t.instantiate(t.typeFormals));
      }
      if (dart.FunctionType.is(t)) {
        return dart.test(hasFreeFormal(t.returnType)) || dart.test(t.args[$any](hasFreeFormal));
      }
      return false;
    }
    let hasProgress = true;
    while (hasProgress) {
      hasProgress = false;
      for (let typeFormal of partials[$keys]) {
        let partialBound = partials[$_get](typeFormal);
        if (!dart.test(hasFreeFormal(partialBound))) {
          let index = all._get(typeFormal);
          defaults[$_set](index, this.instantiateTypeBounds(defaults)[$_get](index));
          partials[$remove](typeFormal);
          hasProgress = true;
          break;
        }
      }
    }
    if (dart.test(partials[$isNotEmpty])) {
      dart.throwTypeError("Instantiate to bounds failed for type with " + ("recursive generic bounds: " + dart.typeName(this) + ". ") + "Try passing explicit type arguments.");
    }
    return defaults;
  }
  is(obj) {
    if (typeof obj == "function") {
      let actual = obj[dart._runtimeType];
      return actual != null && dart.isSubtypeOf(actual, this);
    }
    return false;
  }
  as(obj) {
    if (obj == null || this.is(obj)) return obj;
    return dart.castError(obj, this, false);
  }
  _check(obj) {
    if (obj == null || this.is(obj)) return obj;
    return dart.castError(obj, this, true);
  }
};
(dart.GenericFunctionType.new = function(instantiateTypeParts, instantiateTypeBounds) {
  this[_typeFormals] = null;
  this[_instantiateTypeBounds] = instantiateTypeBounds;
  this[_instantiateTypeParts] = instantiateTypeParts;
  this.formalCount = instantiateTypeParts.length;
}).prototype = dart.GenericFunctionType.prototype;
dart.addTypeTests(dart.GenericFunctionType);
dart.setMethodSignature(dart.GenericFunctionType, () => ({
  __proto__: dart.getMethods(dart.GenericFunctionType.__proto__),
  checkBounds: dart.fnType(dart.void, [core.List]),
  instantiate: dart.fnType(dart.FunctionType, [dart.dynamic]),
  instantiateTypeBounds: dart.fnType(core.List, [core.List]),
  instantiateDefaultBounds: dart.fnType(core.List, [])
}));
dart.setGetterSignature(dart.GenericFunctionType, () => ({
  __proto__: dart.getGetters(dart.GenericFunctionType.__proto__),
  typeFormals: core.List$(dart.TypeVariable)
}));
dart.setLibraryUri(dart.GenericFunctionType, "dart:_runtime");
dart.setFieldSignature(dart.GenericFunctionType, () => ({
  __proto__: dart.getFields(dart.GenericFunctionType.__proto__),
  [_instantiateTypeParts]: dart.finalFieldType(dart.dynamic),
  formalCount: dart.finalFieldType(core.int),
  [_instantiateTypeBounds]: dart.finalFieldType(dart.dynamic),
  [_typeFormals]: dart.fieldType(ListOfTypeVariable())
}));
dart.defineExtensionMethods(dart.GenericFunctionType, ['toString']);
dart._subtypeCache = Symbol("_subtypeCache");
const _typeVariables = dart.privateName(dart, "_typeVariables");
const _isSubtypeMatch = dart.privateName(dart, "_isSubtypeMatch");
const _constrainLower = dart.privateName(dart, "_constrainLower");
const _constrainUpper = dart.privateName(dart, "_constrainUpper");
const _isFunctionSubtypeMatch = dart.privateName(dart, "_isFunctionSubtypeMatch");
const _isInterfaceSubtypeMatch = dart.privateName(dart, "_isInterfaceSubtypeMatch");
const _isNull = dart.privateName(dart, "_isNull");
const _isTop = dart.privateName(dart, "_isTop");
dart._TypeInferrer = class _TypeInferrer extends core.Object {
  getInferredTypes() {
    let result = JSArrayOfObject().of([]);
    for (let constraint of this[_typeVariables][$values]) {
      if (constraint.lower != null) {
        result[$add](constraint.lower);
      } else if (constraint.upper != null) {
        result[$add](constraint.upper);
      } else {
        return null;
      }
    }
    return result;
  }
  trySubtypeMatch(subtype, supertype) {
    return this[_isSubtypeMatch](subtype, supertype);
  }
  [_constrainLower](parameter, lower) {
    this[_typeVariables][$_get](parameter)[_constrainLower](lower);
  }
  [_constrainUpper](parameter, upper) {
    this[_typeVariables][$_get](parameter)[_constrainUpper](upper);
  }
  [_isFunctionSubtypeMatch](subtype, supertype) {
    if (dart.notNull(subtype.requiredParameterCount) > dart.notNull(supertype.requiredParameterCount)) {
      return false;
    }
    if (dart.notNull(subtype.positionalParameterCount) < dart.notNull(supertype.positionalParameterCount)) {
      return false;
    }
    if (!dart.VoidType.is(supertype.returnType) && !dart.test(this[_isSubtypeMatch](subtype.returnType, supertype.returnType))) {
      return false;
    }
    for (let i = 0, n = supertype.positionalParameterCount; i < dart.notNull(n); ++i) {
      if (!dart.test(this[_isSubtypeMatch](supertype.getPositionalParameter(i), subtype.getPositionalParameter(i)))) {
        return false;
      }
    }
    let supertypeNamed = supertype.getNamedParameters();
    let subtypeNamed = supertype.getNamedParameters();
    for (let name of supertypeNamed[$keys]) {
      let subtypeParamType = subtypeNamed[$_get](name);
      if (subtypeParamType == null) return false;
      if (!dart.test(this[_isSubtypeMatch](supertypeNamed[$_get](name), subtypeParamType))) {
        return false;
      }
    }
    return true;
  }
  [_isInterfaceSubtypeMatch](subtype, supertype) {
    let matchingSupertype = dart._getMatchingSupertype(subtype, supertype);
    if (matchingSupertype == null) return false;
    let matchingTypeArgs = dart.getGenericArgs(matchingSupertype);
    let supertypeTypeArgs = dart.getGenericArgs(supertype);
    for (let i = 0; i < dart.notNull(supertypeTypeArgs[$length]); i++) {
      if (!dart.test(this[_isSubtypeMatch](matchingTypeArgs[$_get](i), supertypeTypeArgs[$_get](i)))) {
        return false;
      }
    }
    return true;
  }
  [_isNull](type) {
    return core.identical(type, core.Null);
  }
  [_isSubtypeMatch](subtype, supertype) {
    if (dart.TypeVariable.is(subtype) && dart.test(this[_typeVariables][$containsKey](subtype))) {
      this[_constrainUpper](subtype, supertype);
      return true;
    }
    if (dart.TypeVariable.is(supertype) && dart.test(this[_typeVariables][$containsKey](supertype))) {
      this[_constrainLower](supertype, subtype);
      return true;
    }
    if (core.identical(subtype, supertype)) return true;
    if (dart.test(this[_isTop](supertype))) return true;
    if (dart.test(this[_isNull](subtype))) return true;
    if (dart._isFutureOr(subtype)) {
      let subtypeArg = dart.getGenericArgs(subtype)[$_get](0);
      if (dart._isFutureOr(supertype)) {
        let supertypeArg = dart.getGenericArgs(supertype)[$_get](0);
        return this[_isSubtypeMatch](subtypeArg, supertypeArg);
      }
      let subtypeFuture = async.Future$(subtypeArg);
      return dart.test(this[_isSubtypeMatch](subtypeFuture, supertype)) && dart.test(this[_isSubtypeMatch](subtypeArg, supertype));
    }
    if (dart._isFutureOr(supertype)) {
      let supertypeArg = dart.getGenericArgs(supertype)[$_get](0);
      let supertypeFuture = async.Future$(supertypeArg);
      return dart.test(this[_isSubtypeMatch](subtype, supertypeFuture)) || dart.test(this[_isSubtypeMatch](subtype, supertypeArg));
    }
    if (dart.TypeVariable.is(subtype)) {
      return dart.TypeVariable.is(supertype) && subtype == supertype;
    }
    if (dart.GenericFunctionType.is(subtype)) {
      if (dart.GenericFunctionType.is(supertype)) {
        let formalCount = subtype.formalCount;
        if (formalCount != supertype.formalCount) return false;
        let fresh = supertype.typeFormals;
        let t1Bounds = subtype.instantiateTypeBounds(fresh);
        let t2Bounds = supertype.instantiateTypeBounds(fresh);
        for (let i = 0; i < dart.notNull(formalCount); i++) {
          if (!dart.test(this[_isSubtypeMatch](t2Bounds[$_get](i), t1Bounds[$_get](i)))) {
            return false;
          }
        }
        return this[_isFunctionSubtypeMatch](subtype.instantiate(fresh), supertype.instantiate(fresh));
      } else {
        return false;
      }
    } else if (dart.GenericFunctionType.is(supertype)) {
      return false;
    }
    if (dart.FunctionType.is(subtype)) {
      if (!dart.FunctionType.is(supertype)) {
        if (core.identical(supertype, core.Function) || core.identical(supertype, core.Object)) {
          return true;
        } else {
          return false;
        }
      }
      if (dart.FunctionType.is(supertype)) {
        return this[_isFunctionSubtypeMatch](subtype, supertype);
      }
    }
    return this[_isInterfaceSubtypeMatch](subtype, supertype);
  }
  [_isTop](type) {
    return core.identical(type, dart.dynamic) || core.identical(type, dart.void) || core.identical(type, core.Object);
  }
};
(dart._TypeInferrer.new = function(typeVariables) {
  this[_typeVariables] = MapOfTypeVariable$TypeConstraint().fromIterables(typeVariables, IterableOfTypeConstraint()._check(typeVariables[$map](dart.TypeConstraint, _ => new dart.TypeConstraint.new())));
}).prototype = dart._TypeInferrer.prototype;
dart.addTypeTests(dart._TypeInferrer);
dart.setMethodSignature(dart._TypeInferrer, () => ({
  __proto__: dart.getMethods(dart._TypeInferrer.__proto__),
  getInferredTypes: dart.fnType(core.List$(core.Object), []),
  trySubtypeMatch: dart.fnType(core.bool, [core.Object, core.Object]),
  [_constrainLower]: dart.fnType(dart.void, [dart.TypeVariable, core.Object]),
  [_constrainUpper]: dart.fnType(dart.void, [dart.TypeVariable, core.Object]),
  [_isFunctionSubtypeMatch]: dart.fnType(core.bool, [dart.FunctionType, dart.FunctionType]),
  [_isInterfaceSubtypeMatch]: dart.fnType(core.bool, [core.Object, core.Object]),
  [_isNull]: dart.fnType(core.bool, [core.Object]),
  [_isSubtypeMatch]: dart.fnType(core.bool, [core.Object, core.Object]),
  [_isTop]: dart.fnType(core.bool, [core.Object])
}));
dart.setLibraryUri(dart._TypeInferrer, "dart:_runtime");
dart.setFieldSignature(dart._TypeInferrer, () => ({
  __proto__: dart.getFields(dart._TypeInferrer.__proto__),
  [_typeVariables]: dart.finalFieldType(MapOfTypeVariable$TypeConstraint())
}));
dart.TypeConstraint = class TypeConstraint extends core.Object {
  [_constrainLower](type) {
    if (this.lower != null) {
      if (dart.isSubtypeOf(this.lower, type)) {
        return;
      }
      if (!dart.isSubtypeOf(type, this.lower)) {
        type = core.Null;
      }
    }
    this.lower = type;
  }
  [_constrainUpper](type) {
    if (this.upper != null) {
      if (dart.isSubtypeOf(type, this.upper)) {
        return;
      }
      if (!dart.isSubtypeOf(this.upper, type)) {
        type = core.Object;
      }
    }
    this.upper = type;
  }
  toString() {
    return dart.typeName(this.lower) + " <: <type> <: " + dart.typeName(this.upper);
  }
};
(dart.TypeConstraint.new = function() {
  this.lower = null;
  this.upper = null;
}).prototype = dart.TypeConstraint.prototype;
dart.addTypeTests(dart.TypeConstraint);
dart.setMethodSignature(dart.TypeConstraint, () => ({
  __proto__: dart.getMethods(dart.TypeConstraint.__proto__),
  [_constrainLower]: dart.fnType(dart.void, [core.Object]),
  [_constrainUpper]: dart.fnType(dart.void, [core.Object])
}));
dart.setLibraryUri(dart.TypeConstraint, "dart:_runtime");
dart.setFieldSignature(dart.TypeConstraint, () => ({
  __proto__: dart.getFields(dart.TypeConstraint.__proto__),
  lower: dart.fieldType(core.Object),
  upper: dart.fieldType(core.Object)
}));
dart.defineExtensionMethods(dart.TypeConstraint, ['toString']);
dart._thrownValue = Symbol("_thrownValue");
dart._jsError = Symbol("_jsError");
dart._stackTrace = Symbol("_stackTrace");
dart.DartError = class DartError extends Error {
  constructor(error) {
    super();
    if (error == null) error = new core.NullThrownError.new();
    this[dart._thrownValue] = error;
    if (error != null && typeof error == "object" && error[dart._jsError] == null) {
      error[dart._jsError] = this;
    }
  }
  get message() {
    return dart.toString(this[dart._thrownValue]);
  }
};
dart.RethrownDartError = class RethrownDartError extends dart.DartError {
  constructor(error, stackTrace) {
    super(error);
    this[dart._stackTrace] = stackTrace;
  }
  get message() {
    return super.message + "\n    " + dart.toString(this[dart._stackTrace]) + "\n";
  }
};
const _jsError = dart.privateName(dart, "_jsError");
const _jsObjectMissingTrace = dart.privateName(dart, "_jsObjectMissingTrace");
const _trace = dart.privateName(dart, "_trace");
dart._StackTrace = class _StackTrace extends core.Object {
  toString() {
    if (this[_trace] != null) return this[_trace];
    let e = this[_jsError];
    let trace = "";
    if (e != null && typeof e === "object") {
      trace = _interceptors.NativeError.is(e) ? e[$dartStack]() : e.stack;
      if (trace != null && _debugger.stackTraceMapper != null) {
        trace = _debugger.stackTraceMapper(trace);
      }
    }
    if (trace[$isEmpty] || this[_jsObjectMissingTrace] != null) {
      let jsToString = null;
      try {
        jsToString = "" + this[_jsObjectMissingTrace];
      } catch (e$) {
        let _ = dart.getThrown(e$);
        jsToString = "<error converting JS object to string>";
      }
      trace = "Non-error `" + dart.str(jsToString) + "` thrown by JS does not have stack trace." + ("\nCaught in Dart at:\n\n" + dart.str(trace));
    }
    return this[_trace] = trace;
  }
};
(dart._StackTrace.new = function(jsError) {
  this[_trace] = null;
  this[_jsError] = jsError;
  this[_jsObjectMissingTrace] = null;
}).prototype = dart._StackTrace.prototype;
(dart._StackTrace.missing = function(caughtObj) {
  this[_trace] = null;
  this[_jsObjectMissingTrace] = caughtObj != null ? caughtObj : "null";
  this[_jsError] = Error();
}).prototype = dart._StackTrace.prototype;
dart.addTypeTests(dart._StackTrace);
dart._StackTrace[dart.implements] = () => [core.StackTrace];
dart.setLibraryUri(dart._StackTrace, "dart:_runtime");
dart.setFieldSignature(dart._StackTrace, () => ({
  __proto__: dart.getFields(dart._StackTrace.__proto__),
  [_jsError]: dart.finalFieldType(core.Object),
  [_jsObjectMissingTrace]: dart.finalFieldType(core.Object),
  [_trace]: dart.fieldType(core.String)
}));
dart.defineExtensionMethods(dart._StackTrace, ['toString']);
let const$;
let const$0;
let const$1;
core.Invocation = class Invocation extends core.Object {
  static method(memberName, positionalArguments, namedArguments) {
    if (namedArguments === void 0) namedArguments = null;
    return new core._Invocation.method(memberName, null, positionalArguments, namedArguments);
  }
  static genericMethod(memberName, typeArguments, positionalArguments, namedArguments) {
    if (namedArguments === void 0) namedArguments = null;
    return new core._Invocation.method(memberName, typeArguments, positionalArguments, namedArguments);
  }
  static getter(name) {
    return new core._Invocation.getter(name);
  }
  static setter(memberName, argument) {
    return new core._Invocation.setter(memberName, argument);
  }
  get typeArguments() {
    return const$1 || (const$1 = dart.constList([], core.Type));
  }
  get isAccessor() {
    return dart.test(this.isGetter) || dart.test(this.isSetter);
  }
};
(core.Invocation.new = function() {
}).prototype = core.Invocation.prototype;
dart.addTypeTests(core.Invocation);
dart.setGetterSignature(core.Invocation, () => ({
  __proto__: dart.getGetters(core.Invocation.__proto__),
  typeArguments: core.List$(core.Type),
  isAccessor: core.bool
}));
dart.setLibraryUri(core.Invocation, "dart:core");
dart.InvocationImpl = class InvocationImpl extends core.Invocation {
  get typeArguments() {
    return this[typeArguments$];
  }
  set typeArguments(value) {
    super.typeArguments = value;
  }
  static _namedArgsToSymbols(namedArgs) {
    if (namedArgs == null) return const$0 || (const$0 = dart.constMap(core.Symbol, dart.dynamic, []));
    return MapOfSymbol$dynamic().unmodifiable(core.Map.fromIterable(dart.getOwnPropertyNames(namedArgs), {
      key: dart._dartSymbol,
      value: k => namedArgs[k]
    }));
  }
};
(dart.InvocationImpl.new = function(memberName, positionalArguments, opts) {
  let namedArguments = opts && 'namedArguments' in opts ? opts.namedArguments : null;
  let typeArguments = opts && 'typeArguments' in opts ? opts.typeArguments : null;
  let isMethod = opts && 'isMethod' in opts ? opts.isMethod : false;
  let isGetter = opts && 'isGetter' in opts ? opts.isGetter : false;
  let isSetter = opts && 'isSetter' in opts ? opts.isSetter : false;
  let failureMessage = opts && 'failureMessage' in opts ? opts.failureMessage : "method not found";
  this.isMethod = isMethod;
  this.isGetter = isGetter;
  this.isSetter = isSetter;
  this.failureMessage = failureMessage;
  this.memberName = dart.test(isSetter) ? dart._setterSymbol(memberName) : dart._dartSymbol(memberName);
  this.positionalArguments = core.List.unmodifiable(positionalArguments);
  this.namedArguments = dart.InvocationImpl._namedArgsToSymbols(namedArguments);
  this[typeArguments$] = typeArguments == null ? const$ || (const$ = dart.constList([], core.Type)) : ListOfType().unmodifiable(typeArguments[$map](dart.dynamic, dart.wrapType));
  dart.InvocationImpl.__proto__.new.call(this);
}).prototype = dart.InvocationImpl.prototype;
dart.addTypeTests(dart.InvocationImpl);
const typeArguments$ = Symbol("InvocationImpl.typeArguments");
dart.setLibraryUri(dart.InvocationImpl, "dart:_runtime");
dart.setFieldSignature(dart.InvocationImpl, () => ({
  __proto__: dart.getFields(dart.InvocationImpl.__proto__),
  memberName: dart.finalFieldType(core.Symbol),
  positionalArguments: dart.finalFieldType(core.List),
  namedArguments: dart.finalFieldType(MapOfSymbol$dynamic()),
  typeArguments: dart.finalFieldType(ListOfType()),
  isMethod: dart.finalFieldType(core.bool),
  isGetter: dart.finalFieldType(core.bool),
  isSetter: dart.finalFieldType(core.bool),
  failureMessage: dart.finalFieldType(core.String)
}));
dart._ignoreSubtypeCache = new Map();
dart.constantMaps = new Map();
dart.constantSets = new Map();
dart._immutableSetConstructor = null;
dart._value = Symbol("_value");
dart.constants = new Map();
dart.constantLists = new Map();
dart.identityHashCode_ = Symbol("_identityHashCode");
dart.JsIterator = class JsIterator {
  constructor(dartIterator) {
    this.dartIterator = dartIterator;
  }
  next() {
    let i = this.dartIterator;
    let done = !i.moveNext();
    return {done: done, value: done ? void 0 : i.current};
  }
};
_debugger.JsonMLConfig = class JsonMLConfig extends core.Object {
  toString() {
    return "JsonMLConfig(" + dart.str(this.name) + ")";
  }
};
(_debugger.JsonMLConfig.new = function(name) {
  this.name = name;
}).prototype = _debugger.JsonMLConfig.prototype;
dart.addTypeTests(_debugger.JsonMLConfig);
dart.setLibraryUri(_debugger.JsonMLConfig, "dart:_debugger");
dart.setFieldSignature(_debugger.JsonMLConfig, () => ({
  __proto__: dart.getFields(_debugger.JsonMLConfig.__proto__),
  name: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_debugger.JsonMLConfig, ['toString']);
dart.defineLazy(_debugger.JsonMLConfig, {
  /*_debugger.JsonMLConfig.none*/get none() {
    return dart.const(new _debugger.JsonMLConfig.new("none"));
  },
  /*_debugger.JsonMLConfig.skipDart*/get skipDart() {
    return dart.const(new _debugger.JsonMLConfig.new("skipDart"));
  },
  /*_debugger.JsonMLConfig.keyToString*/get keyToString() {
    return dart.const(new _debugger.JsonMLConfig.new("keyToString"));
  },
  /*_debugger.JsonMLConfig.asClass*/get asClass() {
    return dart.const(new _debugger.JsonMLConfig.new("asClass"));
  },
  /*_debugger.JsonMLConfig.asObject*/get asObject() {
    return dart.const(new _debugger.JsonMLConfig.new("asObject"));
  },
  /*_debugger.JsonMLConfig.asMap*/get asMap() {
    return dart.const(new _debugger.JsonMLConfig.new("asMap"));
  }
});
dart.defineLazy(_debugger, {
  /*_debugger._maxSpanLength*/get _maxSpanLength() {
    return 100;
  },
  set _maxSpanLength(_) {},
  /*_debugger._devtoolsFormatter*/get _devtoolsFormatter() {
    return new _debugger.JsonMLFormatter.new(new _debugger.DartFormatter.new());
  },
  set _devtoolsFormatter(_) {},
  /*_debugger.maxFormatterStringLength*/get maxFormatterStringLength() {
    return 100;
  },
  set maxFormatterStringLength(_) {}
});
_debugger._typeof = function(object) {
  return typeof object;
};
_debugger.getOwnPropertyNames = function(object) {
  return JSArrayOfString().of(dart.getOwnPropertyNames(object));
};
_debugger.getOwnPropertySymbols = function(object) {
  return Object.getOwnPropertySymbols(object);
};
_debugger.JSNative = class JSNative extends core.Object {
  static getProperty(object, name) {
    return object[name];
  }
  static setProperty(object, name, value) {
    return object[name] = value;
  }
};
(_debugger.JSNative.new = function() {
}).prototype = _debugger.JSNative.prototype;
dart.addTypeTests(_debugger.JSNative);
dart.setLibraryUri(_debugger.JSNative, "dart:_debugger");
_debugger.addMetadataChildren = function(object, ret) {
  ret.add(new _debugger.NameValuePair.new({name: "[[class]]", value: dart.getReifiedType(object), config: _debugger.JsonMLConfig.asClass}));
};
_debugger.addPropertiesFromSignature = function(sig, properties, object, walkPrototypeChain, opts) {
  let tagTypes = opts && 'tagTypes' in opts ? opts.tagTypes : false;
  let skippedNames = new collection._HashSet.new();
  skippedNames.add("hashCode");
  let objectPrototype = Object.prototype;
  while (sig != null && !core.identical(sig, objectPrototype)) {
    for (let symbol of _debugger.getOwnPropertySymbols(sig)) {
      let dartName = _debugger.symbolName(symbol);
      let dartXPrefix = "dartx.";
      if (dartName[$startsWith](dartXPrefix)) {
        dartName = dartName[$substring](dartXPrefix.length);
      }
      if (dart.test(skippedNames.contains(dartName))) continue;
      let value = _debugger.safeGetProperty(object, symbol);
      if (dart.dtest(tagTypes) && _debugger._typeof(value) === "function") {
        dart.fn(value, sig[symbol]);
      }
      properties.add(new _debugger.NameValuePair.new({name: dartName, value: value}));
    }
    for (let name of _debugger.getOwnPropertyNames(sig)) {
      let value = _debugger.safeGetProperty(object, name);
      if (dart.test(skippedNames.contains(name))) continue;
      if (dart.dtest(tagTypes) && _debugger._typeof(value) === "function") {
        dart.fn(value, sig[name]);
      }
      properties.add(new _debugger.NameValuePair.new({name: name, value: value}));
    }
    if (!dart.test(walkPrototypeChain)) break;
    sig = dart.getPrototypeOf(sig);
  }
};
_debugger.sortProperties = function(properties) {
  let sortedProperties = properties[$toList]();
  sortedProperties[$sort](dart.fn((a, b) => {
    let aPrivate = a.name[$startsWith]("_");
    let bPrivate = b.name[$startsWith]("_");
    if (aPrivate !== bPrivate) return aPrivate ? 1 : -1;
    return a.name[$compareTo](b.name);
  }, NameValuePairAndNameValuePairToint()));
  return sortedProperties;
};
_debugger.getObjectTypeName = function(object) {
  let reifiedType = dart.getReifiedType(object);
  if (reifiedType == null) {
    if (_debugger._typeof(object) === "function") {
      return "[[Raw JavaScript Function]]";
    }
    return "<Error getting type name>";
  }
  return _debugger.getTypeName(reifiedType);
};
_debugger.getTypeName = function(type) {
  return dart.typeName(type);
};
const _simpleFormatter = dart.privateName(_debugger, "_simpleFormatter");
_debugger.safePreview = function(object, config) {
  try {
    let preview = _debugger._devtoolsFormatter[_simpleFormatter].preview(object, config);
    if (preview != null) return preview;
    return dart.toString(object);
  } catch (e$) {
    let e = dart.getThrown(e$);
    return "<Exception thrown> " + dart.str(e);
  }
};
_debugger.symbolName = function(symbol) {
  let name = dart.toString(symbol);
  if (!name[$startsWith]("Symbol(")) dart.assertFailed(null, "dart:_debugger", 158, 10, "name.startsWith('Symbol(')");
  return name[$substring]("Symbol(".length, name.length - 1);
};
_debugger.hasMethod = function(object, name) {
  try {
    return dart.hasMethod(object, name);
  } catch (e$) {
    let e = dart.getThrown(e$);
    return false;
  }
};
_debugger.NameValuePair = class NameValuePair extends core.Object {
  _equals(other) {
    if (!_debugger.NameValuePair.is(other)) return false;
    if (dart.test(this.hideName) || dart.dtest(dart.dload(other, 'hideName'))) return this === other;
    return dart.equals(dart.dload(other, 'name'), this.name);
  }
  get hashCode() {
    return dart.hashCode(this.name);
  }
  get displayName() {
    return dart.test(this.hideName) ? "" : this.name;
  }
};
(_debugger.NameValuePair.new = function(opts) {
  let name = opts && 'name' in opts ? opts.name : null;
  let value = opts && 'value' in opts ? opts.value : null;
  let config = opts && 'config' in opts ? opts.config : _debugger.JsonMLConfig.none;
  let hideName = opts && 'hideName' in opts ? opts.hideName : false;
  this.name = name;
  this.value = value;
  this.config = config;
  this.hideName = hideName;
}).prototype = _debugger.NameValuePair.prototype;
dart.addTypeTests(_debugger.NameValuePair);
dart.setGetterSignature(_debugger.NameValuePair, () => ({
  __proto__: dart.getGetters(_debugger.NameValuePair.__proto__),
  displayName: core.String
}));
dart.setLibraryUri(_debugger.NameValuePair, "dart:_debugger");
dart.setFieldSignature(_debugger.NameValuePair, () => ({
  __proto__: dart.getFields(_debugger.NameValuePair.__proto__),
  name: dart.finalFieldType(core.String),
  value: dart.finalFieldType(core.Object),
  config: dart.finalFieldType(_debugger.JsonMLConfig),
  hideName: dart.finalFieldType(core.bool)
}));
dart.defineExtensionMethods(_debugger.NameValuePair, ['_equals']);
dart.defineExtensionAccessors(_debugger.NameValuePair, ['hashCode']);
_debugger.MapEntry = class MapEntry extends core.Object {};
(_debugger.MapEntry.new = function(opts) {
  let key = opts && 'key' in opts ? opts.key : null;
  let value = opts && 'value' in opts ? opts.value : null;
  this.key = key;
  this.value = value;
}).prototype = _debugger.MapEntry.prototype;
dart.addTypeTests(_debugger.MapEntry);
dart.setLibraryUri(_debugger.MapEntry, "dart:_debugger");
dart.setFieldSignature(_debugger.MapEntry, () => ({
  __proto__: dart.getFields(_debugger.MapEntry.__proto__),
  key: dart.finalFieldType(core.Object),
  value: dart.finalFieldType(core.Object)
}));
_debugger.IterableSpan = class IterableSpan extends core.Object {
  get length() {
    return dart.notNull(this.end) - dart.notNull(this.start);
  }
  get maxPowerOfSubsetSize() {
    return (math.log(dart.notNull(this.length) - 0.5) / math.log(_debugger._maxSpanLength))[$truncate]();
  }
  get subsetSize() {
    return dart.asInt(math.pow(_debugger._maxSpanLength, this.maxPowerOfSubsetSize));
  }
  asMap() {
    return this.iterable[$skip](this.start)[$take](this.length)[$toList]()[$asMap]();
  }
  children() {
    let children = JSArrayOfNameValuePair().of([]);
    if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
      this.asMap()[$forEach](dart.fn((i, element) => {
        children[$add](new _debugger.NameValuePair.new({name: (dart.notNull(i) + dart.notNull(this.start))[$toString](), value: element}));
      }, intAnddynamicToNull()));
    } else {
      for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
        let subSpan = new _debugger.IterableSpan.new(i, math.min(core.int, this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
        if (subSpan.length === 1) {
          children[$add](new _debugger.NameValuePair.new({name: dart.toString(i), value: this.iterable[$elementAt](i)}));
        } else {
          children[$add](new _debugger.NameValuePair.new({name: "[" + dart.str(i) + "..." + dart.str(dart.notNull(subSpan.end) - 1) + "]", value: subSpan, hideName: true}));
        }
      }
    }
    return children;
  }
};
(_debugger.IterableSpan.new = function(start, end, iterable) {
  this.start = start;
  this.end = end;
  this.iterable = iterable;
}).prototype = _debugger.IterableSpan.prototype;
dart.addTypeTests(_debugger.IterableSpan);
dart.setMethodSignature(_debugger.IterableSpan, () => ({
  __proto__: dart.getMethods(_debugger.IterableSpan.__proto__),
  asMap: dart.fnType(core.Map$(core.int, dart.dynamic), []),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [])
}));
dart.setGetterSignature(_debugger.IterableSpan, () => ({
  __proto__: dart.getGetters(_debugger.IterableSpan.__proto__),
  length: core.int,
  maxPowerOfSubsetSize: core.int,
  subsetSize: core.int
}));
dart.setLibraryUri(_debugger.IterableSpan, "dart:_debugger");
dart.setFieldSignature(_debugger.IterableSpan, () => ({
  __proto__: dart.getFields(_debugger.IterableSpan.__proto__),
  start: dart.finalFieldType(core.int),
  end: dart.finalFieldType(core.int),
  iterable: dart.finalFieldType(core.Iterable)
}));
_debugger.Library = class Library extends core.Object {};
(_debugger.Library.new = function(name, object) {
  this.name = name;
  this.object = object;
}).prototype = _debugger.Library.prototype;
dart.addTypeTests(_debugger.Library);
dart.setLibraryUri(_debugger.Library, "dart:_debugger");
dart.setFieldSignature(_debugger.Library, () => ({
  __proto__: dart.getFields(_debugger.Library.__proto__),
  name: dart.finalFieldType(core.String),
  object: dart.finalFieldType(core.Object)
}));
_debugger.NamedConstructor = class NamedConstructor extends core.Object {};
(_debugger.NamedConstructor.new = function(object) {
  this.object = object;
}).prototype = _debugger.NamedConstructor.prototype;
dart.addTypeTests(_debugger.NamedConstructor);
dart.setLibraryUri(_debugger.NamedConstructor, "dart:_debugger");
dart.setFieldSignature(_debugger.NamedConstructor, () => ({
  __proto__: dart.getFields(_debugger.NamedConstructor.__proto__),
  object: dart.finalFieldType(core.Object)
}));
_debugger.HeritageClause = class HeritageClause extends core.Object {};
(_debugger.HeritageClause.new = function(name, types) {
  this.name = name;
  this.types = types;
}).prototype = _debugger.HeritageClause.prototype;
dart.addTypeTests(_debugger.HeritageClause);
dart.setLibraryUri(_debugger.HeritageClause, "dart:_debugger");
dart.setFieldSignature(_debugger.HeritageClause, () => ({
  __proto__: dart.getFields(_debugger.HeritageClause.__proto__),
  name: dart.finalFieldType(core.String),
  types: dart.finalFieldType(core.List)
}));
_debugger.safeGetProperty = function(protoChain, name) {
  try {
    return _debugger.JSNative.getProperty(protoChain, name);
  } catch (e$) {
    let e = dart.getThrown(e$);
    return "<Exception thrown> " + dart.str(e);
  }
};
_debugger.safeProperties = function(object) {
  return MapOfdynamic$Object().fromIterable(_debugger.getOwnPropertyNames(object)[$where](dart.fn(each => _debugger.safeGetProperty(object, each) != null, StringTobool())), {key: dart.fn(name => name, dynamicTodynamic()), value: dart.fn(name => _debugger.safeGetProperty(object, name), dynamicToObject())});
};
const _attributes = dart.privateName(_debugger, "_attributes");
const _jsonML = dart.privateName(_debugger, "_jsonML");
_debugger.JsonMLElement = class JsonMLElement extends core.Object {
  appendChild(element) {
    this[_jsonML][$add](dart.dsend(element, 'toJsonML', []));
  }
  createChild(tagName) {
    let c = new _debugger.JsonMLElement.new(tagName);
    this[_jsonML][$add](c.toJsonML());
    return c;
  }
  createObjectTag(object) {
    let _ = this.createChild("object");
    _.addAttribute("object", object);
    return _;
  }
  setStyle(style) {
    dart.dput(this[_attributes], 'style', style);
  }
  addStyle(style) {
    if (dart.dload(this[_attributes], 'style') == null) {
      dart.dput(this[_attributes], 'style', style);
    } else {
      let o = this[_attributes];
      dart.dput(o, 'style', dart.dsend(dart.dload(o, 'style'), '+', [style]));
    }
  }
  addAttribute(key, value) {
    _debugger.JSNative.setProperty(this[_attributes], key, value);
  }
  createTextChild(text) {
    this[_jsonML][$add](text);
  }
  toJsonML() {
    return this[_jsonML];
  }
};
(_debugger.JsonMLElement.new = function(tagName) {
  this[_attributes] = null;
  this[_jsonML] = null;
  this[_attributes] = {};
  this[_jsonML] = [tagName, this[_attributes]];
}).prototype = _debugger.JsonMLElement.prototype;
dart.addTypeTests(_debugger.JsonMLElement);
dart.setMethodSignature(_debugger.JsonMLElement, () => ({
  __proto__: dart.getMethods(_debugger.JsonMLElement.__proto__),
  appendChild: dart.fnType(dart.dynamic, [dart.dynamic]),
  createChild: dart.fnType(_debugger.JsonMLElement, [core.String]),
  createObjectTag: dart.fnType(_debugger.JsonMLElement, [dart.dynamic]),
  setStyle: dart.fnType(dart.void, [core.String]),
  addStyle: dart.fnType(dart.dynamic, [core.String]),
  addAttribute: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic]),
  createTextChild: dart.fnType(dart.dynamic, [core.String]),
  toJsonML: dart.fnType(dart.dynamic, [])
}));
dart.setLibraryUri(_debugger.JsonMLElement, "dart:_debugger");
dart.setFieldSignature(_debugger.JsonMLElement, () => ({
  __proto__: dart.getFields(_debugger.JsonMLElement.__proto__),
  [_attributes]: dart.fieldType(dart.dynamic),
  [_jsonML]: dart.fieldType(core.List)
}));
_debugger.isNativeJavaScriptObject = function(object) {
  let type = _debugger._typeof(object);
  if (type !== "object" && type !== "function") return true;
  if (dart.test(dart.isJsInterop(object)) && dart.getModuleName(object) == null) {
    return true;
  }
  return html$.Node.is(object);
};
_debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
  setMaxSpanLengthForTestingOnly(spanLength) {
    _debugger._maxSpanLength = spanLength;
  }
  header(object, config) {
    this.customFormattersOn = true;
    if (dart.equals(config, _debugger.JsonMLConfig.skipDart) || dart.test(_debugger.isNativeJavaScriptObject(object))) {
      return null;
    }
    let c = this[_simpleFormatter].preview(object, config);
    if (c == null) return null;
    if (dart.equals(config, _debugger.JsonMLConfig.keyToString)) {
      c = dart.toString(object);
    }
    let element = new _debugger.JsonMLElement.new("span");
    element.setStyle("background-color: #d9edf7;color: black");
    element.createTextChild(c);
    return element.toJsonML();
  }
  hasBody(object, config) {
    return this[_simpleFormatter].hasChildren(object, config);
  }
  body(object, config) {
    let body = new _debugger.JsonMLElement.new("ol");
    body.setStyle("list-style-type: none;" + "padding-left: 0px;" + "margin-top: 0px;" + "margin-bottom: 0px;" + "margin-left: 12px;");
    if (core.StackTrace.is(object)) {
      body.addStyle("background-color: thistle;color: rgb(196, 26, 22);");
    }
    let children = this[_simpleFormatter].children(object, config);
    if (children == null) return body.toJsonML();
    for (let child of children) {
      let li = body.createChild("li");
      li.setStyle("padding-left: 13px;");
      let nameSpan = null;
      let valueStyle = "";
      if (!dart.test(child.hideName)) {
        nameSpan = new _debugger.JsonMLElement.new("span");
        nameSpan.createTextChild(child.displayName[$isNotEmpty] ? dart.str(child.displayName) + ": " : "");
        nameSpan.setStyle("background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px");
        valueStyle = "margin-left: 13px";
      }
      if (_debugger._typeof(child.value) === "object" || _debugger._typeof(child.value) === "function") {
        let valueSpan = new _debugger.JsonMLElement.new("span");
        valueSpan.setStyle(valueStyle);
        valueSpan.createObjectTag(child.value).addAttribute("config", child.config);
        if (nameSpan != null) {
          li.appendChild(nameSpan);
        }
        li.appendChild(valueSpan);
      } else {
        let line = li.createChild("span");
        if (nameSpan != null) {
          line.appendChild(nameSpan);
        }
        line.appendChild((() => {
          let _ = new _debugger.JsonMLElement.new("span");
          _.createTextChild(_debugger.safePreview(child.value, child.config));
          _.setStyle(valueStyle);
          return _;
        })());
      }
    }
    return body.toJsonML();
  }
};
(_debugger.JsonMLFormatter.new = function(simpleFormatter) {
  this.customFormattersOn = false;
  this[_simpleFormatter] = simpleFormatter;
}).prototype = _debugger.JsonMLFormatter.prototype;
dart.addTypeTests(_debugger.JsonMLFormatter);
dart.setMethodSignature(_debugger.JsonMLFormatter, () => ({
  __proto__: dart.getMethods(_debugger.JsonMLFormatter.__proto__),
  setMaxSpanLengthForTestingOnly: dart.fnType(dart.void, [core.int]),
  header: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic]),
  hasBody: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  body: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic])
}));
dart.setLibraryUri(_debugger.JsonMLFormatter, "dart:_debugger");
dart.setFieldSignature(_debugger.JsonMLFormatter, () => ({
  __proto__: dart.getFields(_debugger.JsonMLFormatter.__proto__),
  [_simpleFormatter]: dart.fieldType(_debugger.DartFormatter),
  customFormattersOn: dart.fieldType(core.bool)
}));
_debugger.Formatter = class Formatter extends core.Object {};
(_debugger.Formatter.new = function() {
}).prototype = _debugger.Formatter.prototype;
dart.addTypeTests(_debugger.Formatter);
dart.setLibraryUri(_debugger.Formatter, "dart:_debugger");
const _formatters = dart.privateName(_debugger, "_formatters");
_debugger.DartFormatter = class DartFormatter extends core.Object {
  preview(object, config) {
    try {
      if (object == null || typeof object == 'number' || typeof object == 'string' || dart.test(_debugger.isNativeJavaScriptObject(object))) {
        return dart.toString(object);
      }
      for (let formatter of this[_formatters]) {
        if (dart.test(formatter.accept(object, config))) return formatter.preview(object);
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
      let trace = dart.stackTrace(e$);
      html$.window[$console].error("Caught exception " + dart.str(e) + "\n trace:\n" + dart.str(trace));
    }
    return null;
  }
  hasChildren(object, config) {
    if (object == null) return false;
    try {
      for (let formatter of this[_formatters]) {
        if (dart.test(formatter.accept(object, config))) return formatter.hasChildren(object);
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
      let trace = dart.stackTrace(e$);
      html$.window[$console].error("[hasChildren] Caught exception " + dart.str(e) + "\n trace:\n" + dart.str(trace));
    }
    return false;
  }
  children(object, config) {
    try {
      if (object != null) {
        for (let formatter of this[_formatters]) {
          if (dart.test(formatter.accept(object, config))) return formatter.children(object);
        }
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
      let trace = dart.stackTrace(e$);
      html$.window[$console].error("Caught exception " + dart.str(e) + "\n trace:\n" + dart.str(trace));
    }
    return JSArrayOfNameValuePair().of([]);
  }
};
(_debugger.DartFormatter.new = function() {
  this[_formatters] = null;
  this[_formatters] = JSArrayOfFormatter().of([new _debugger.ObjectInternalsFormatter.new(), new _debugger.ClassFormatter.new(), new _debugger.TypeFormatter.new(), new _debugger.NamedConstructorFormatter.new(), new _debugger.MapFormatter.new(), new _debugger.MapOverviewFormatter.new(), new _debugger.IterableFormatter.new(), new _debugger.IterableSpanFormatter.new(), new _debugger.MapEntryFormatter.new(), new _debugger.StackTraceFormatter.new(), new _debugger.ErrorAndExceptionFormatter.new(), new _debugger.FunctionFormatter.new(), new _debugger.HeritageClauseFormatter.new(), new _debugger.LibraryModuleFormatter.new(), new _debugger.LibraryFormatter.new(), new _debugger.ObjectFormatter.new()]);
}).prototype = _debugger.DartFormatter.prototype;
dart.addTypeTests(_debugger.DartFormatter);
dart.setMethodSignature(_debugger.DartFormatter, () => ({
  __proto__: dart.getMethods(_debugger.DartFormatter.__proto__),
  preview: dart.fnType(core.String, [dart.dynamic, dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic, dart.dynamic])
}));
dart.setLibraryUri(_debugger.DartFormatter, "dart:_debugger");
dart.setFieldSignature(_debugger.DartFormatter, () => ({
  __proto__: dart.getFields(_debugger.DartFormatter.__proto__),
  [_formatters]: dart.fieldType(ListOfFormatter())
}));
_debugger.ObjectFormatter = class ObjectFormatter extends _debugger.Formatter {
  accept(object, config) {
    return !dart.test(_debugger.isNativeJavaScriptObject(object));
  }
  preview(object) {
    let typeName = _debugger.getObjectTypeName(object);
    try {
      let toString = dart.str(object);
      if (toString.length > dart.notNull(_debugger.maxFormatterStringLength)) {
        toString = toString[$substring](0, dart.notNull(_debugger.maxFormatterStringLength) - 3) + "...";
      }
      if (toString[$contains](typeName)) {
        return toString;
      } else {
        return toString + " (" + dart.str(typeName) + ")";
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    return typeName;
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    let type = dart.getType(object);
    let ret = new (_HashSetOfNameValuePair()).new();
    let fields = new (_HashSetOfNameValuePair()).new();
    _debugger.addPropertiesFromSignature(dart.getFields(type), fields, object, true);
    let getters = new (_HashSetOfNameValuePair()).new();
    _debugger.addPropertiesFromSignature(dart.getGetters(type), getters, object, true);
    ret.addAll(_debugger.sortProperties(fields));
    ret.addAll(_debugger.sortProperties(getters));
    _debugger.addMetadataChildren(object, ret);
    return ret.toList();
  }
};
(_debugger.ObjectFormatter.new = function() {
}).prototype = _debugger.ObjectFormatter.prototype;
dart.addTypeTests(_debugger.ObjectFormatter);
dart.setMethodSignature(_debugger.ObjectFormatter, () => ({
  __proto__: dart.getMethods(_debugger.ObjectFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.ObjectFormatter, "dart:_debugger");
_debugger.ObjectInternalsFormatter = class ObjectInternalsFormatter extends _debugger.ObjectFormatter {
  accept(object, config) {
    return dart.test(super.accept(object, config)) && dart.equals(config, _debugger.JsonMLConfig.asObject);
  }
  preview(object) {
    return _debugger.getObjectTypeName(object);
  }
};
(_debugger.ObjectInternalsFormatter.new = function() {
}).prototype = _debugger.ObjectInternalsFormatter.prototype;
dart.addTypeTests(_debugger.ObjectInternalsFormatter);
dart.setLibraryUri(_debugger.ObjectInternalsFormatter, "dart:_debugger");
_debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
  accept(object, config) {
    return dart.getModuleName(object) != null;
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    let libraryNames = dart.getModuleName(object)[$split]("/");
    if (dart.notNull(libraryNames[$length]) > 1 && libraryNames[$last] == libraryNames[$_get](dart.notNull(libraryNames[$length]) - 2)) {
      libraryNames[$_set](dart.notNull(libraryNames[$length]) - 1, "");
    }
    return "Library Module: " + dart.str(libraryNames[$join]("/"));
  }
  children(object) {
    let children = new (_HashSetOfNameValuePair()).new();
    for (let name of _debugger.getOwnPropertyNames(object)) {
      let value = _debugger.safeGetProperty(object, name);
      children.add(new _debugger.NameValuePair.new({name: name, value: new _debugger.Library.new(name, value), hideName: true}));
    }
    return children.toList();
  }
};
(_debugger.LibraryModuleFormatter.new = function() {
}).prototype = _debugger.LibraryModuleFormatter.prototype;
dart.addTypeTests(_debugger.LibraryModuleFormatter);
_debugger.LibraryModuleFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.LibraryModuleFormatter, () => ({
  __proto__: dart.getMethods(_debugger.LibraryModuleFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.LibraryModuleFormatter, "dart:_debugger");
_debugger.LibraryFormatter = class LibraryFormatter extends core.Object {
  accept(object, config) {
    return _debugger.Library.is(object);
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    return core.String._check(dart.dload(object, 'name'));
  }
  children(object) {
    let children = new (_HashSetOfNameValuePair()).new();
    let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
    dart.dsend(objectProperties, 'forEach', [dart.fn((name, value) => {
        if (dart.getGenericTypeCtor(value) != null) return;
        children.add(_debugger.NameValuePair._check(dart.isType(value) ? this.classChild(core.String._check(name), value) : new _debugger.NameValuePair.new({name: core.String._check(name), value: value})));
      }, dynamicAnddynamicToNull())]);
    return children.toList();
  }
  classChild(name, child) {
    let typeName = _debugger.getTypeName(child);
    return new _debugger.NameValuePair.new({name: typeName, value: child, config: _debugger.JsonMLConfig.asClass});
  }
};
(_debugger.LibraryFormatter.new = function() {
  this.genericParameters = new (IdentityMapOfString$String()).new();
}).prototype = _debugger.LibraryFormatter.prototype;
dart.addTypeTests(_debugger.LibraryFormatter);
_debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.LibraryFormatter, () => ({
  __proto__: dart.getMethods(_debugger.LibraryFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
  classChild: dart.fnType(dart.dynamic, [core.String, core.Object])
}));
dart.setLibraryUri(_debugger.LibraryFormatter, "dart:_debugger");
dart.setFieldSignature(_debugger.LibraryFormatter, () => ({
  __proto__: dart.getFields(_debugger.LibraryFormatter.__proto__),
  genericParameters: dart.fieldType(HashMapOfString$String())
}));
_debugger.FunctionFormatter = class FunctionFormatter extends core.Object {
  accept(object, config) {
    if (_debugger._typeof(object) !== "function") return false;
    return dart.getReifiedType(object) != null;
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    try {
      return dart.typeName(dart.getReifiedType(object));
    } catch (e$) {
      let e = dart.getThrown(e$);
      return _debugger.safePreview(object, _debugger.JsonMLConfig.none);
    }
  }
  children(object) {
    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair.new({name: "signature", value: this.preview(object)}), new _debugger.NameValuePair.new({name: "JavaScript Function", value: object, config: _debugger.JsonMLConfig.skipDart})]);
  }
};
(_debugger.FunctionFormatter.new = function() {
}).prototype = _debugger.FunctionFormatter.prototype;
dart.addTypeTests(_debugger.FunctionFormatter);
_debugger.FunctionFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.FunctionFormatter, () => ({
  __proto__: dart.getMethods(_debugger.FunctionFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.FunctionFormatter, "dart:_debugger");
_debugger.MapOverviewFormatter = class MapOverviewFormatter extends core.Object {
  accept(object, config) {
    return core.Map.is(object);
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    let map = core.Map._check(object);
    try {
      return dart.str(_debugger.getObjectTypeName(map));
    } catch (e$) {
      let e = dart.getThrown(e$);
      return _debugger.safePreview(object, _debugger.JsonMLConfig.none);
    }
  }
  children(object) {
    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair.new({name: "[[instance view]]", value: object, config: _debugger.JsonMLConfig.asObject}), new _debugger.NameValuePair.new({name: "[[entries]]", value: object, config: _debugger.JsonMLConfig.asMap})]);
  }
};
(_debugger.MapOverviewFormatter.new = function() {
}).prototype = _debugger.MapOverviewFormatter.prototype;
dart.addTypeTests(_debugger.MapOverviewFormatter);
_debugger.MapOverviewFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.MapOverviewFormatter, () => ({
  __proto__: dart.getMethods(_debugger.MapOverviewFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.MapOverviewFormatter, "dart:_debugger");
_debugger.MapFormatter = class MapFormatter extends core.Object {
  accept(object, config) {
    return _js_helper.InternalMap.is(object) || dart.equals(config, _debugger.JsonMLConfig.asMap);
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    let map = core.Map._check(object);
    try {
      return dart.str(_debugger.getObjectTypeName(map)) + " length " + dart.str(map[$length]);
    } catch (e$) {
      let e = dart.getThrown(e$);
      return _debugger.safePreview(object, _debugger.JsonMLConfig.none);
    }
  }
  children(object) {
    let map = core.Map._check(object);
    let entries = new (_HashSetOfNameValuePair()).new();
    map[$forEach](dart.fn((key, value) => {
      let entryWrapper = new _debugger.MapEntry.new({key: key, value: value});
      entries.add(new _debugger.NameValuePair.new({name: dart.toString(entries.length), value: entryWrapper}));
    }, dynamicAnddynamicToNull()));
    _debugger.addMetadataChildren(object, entries);
    return entries.toList();
  }
};
(_debugger.MapFormatter.new = function() {
}).prototype = _debugger.MapFormatter.prototype;
dart.addTypeTests(_debugger.MapFormatter);
_debugger.MapFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.MapFormatter, () => ({
  __proto__: dart.getMethods(_debugger.MapFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.MapFormatter, "dart:_debugger");
_debugger.IterableFormatter = class IterableFormatter extends core.Object {
  accept(object, config) {
    return core.Iterable.is(object);
  }
  preview(object) {
    let iterable = core.Iterable._check(object);
    try {
      let length = iterable[$length];
      return dart.str(_debugger.getObjectTypeName(iterable)) + " length " + dart.str(length);
    } catch (e) {
      let _ = dart.getThrown(e);
      return dart.str(_debugger.getObjectTypeName(iterable));
    }
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    let children = new (_HashSetOfNameValuePair()).new();
    children.addAll(new _debugger.IterableSpan.new(0, core.int._check(dart.dload(object, 'length')), core.Iterable._check(object)).children());
    _debugger.addMetadataChildren(object, children);
    return children.toList();
  }
};
(_debugger.IterableFormatter.new = function() {
}).prototype = _debugger.IterableFormatter.prototype;
dart.addTypeTests(_debugger.IterableFormatter);
_debugger.IterableFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.IterableFormatter, () => ({
  __proto__: dart.getMethods(_debugger.IterableFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.IterableFormatter, "dart:_debugger");
_debugger.NamedConstructorFormatter = class NamedConstructorFormatter extends core.Object {
  accept(object, config) {
    return _debugger.NamedConstructor.is(object);
  }
  preview(object) {
    return "Named Constructor";
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair.new({name: "JavaScript Function", value: object, config: _debugger.JsonMLConfig.skipDart})]);
  }
};
(_debugger.NamedConstructorFormatter.new = function() {
}).prototype = _debugger.NamedConstructorFormatter.prototype;
dart.addTypeTests(_debugger.NamedConstructorFormatter);
_debugger.NamedConstructorFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.NamedConstructorFormatter, () => ({
  __proto__: dart.getMethods(_debugger.NamedConstructorFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.NamedConstructorFormatter, "dart:_debugger");
_debugger.MapEntryFormatter = class MapEntryFormatter extends core.Object {
  accept(object, config) {
    return _debugger.MapEntry.is(object);
  }
  preview(object) {
    let entry = _debugger.MapEntry._check(object);
    return dart.str(_debugger.safePreview(entry.key, _debugger.JsonMLConfig.none)) + " => " + dart.str(_debugger.safePreview(entry.value, _debugger.JsonMLConfig.none));
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair.new({name: "key", value: dart.dload(object, 'key'), config: _debugger.JsonMLConfig.keyToString}), new _debugger.NameValuePair.new({name: "value", value: dart.dload(object, 'value')})]);
  }
};
(_debugger.MapEntryFormatter.new = function() {
}).prototype = _debugger.MapEntryFormatter.prototype;
dart.addTypeTests(_debugger.MapEntryFormatter);
_debugger.MapEntryFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.MapEntryFormatter, () => ({
  __proto__: dart.getMethods(_debugger.MapEntryFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.MapEntryFormatter, "dart:_debugger");
_debugger.HeritageClauseFormatter = class HeritageClauseFormatter extends core.Object {
  accept(object, config) {
    return _debugger.HeritageClause.is(object);
  }
  preview(object) {
    let clause = _debugger.HeritageClause._check(object);
    let typeNames = IterableOfString()._check(clause.types[$map](core.String, dart.fn(_debugger.getTypeName, dynamicToString())));
    return dart.str(clause.name) + " " + dart.str(typeNames[$join](", "));
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    let clause = _debugger.HeritageClause._check(object);
    let children = JSArrayOfNameValuePair().of([]);
    for (let type of clause.types) {
      children[$add](new _debugger.NameValuePair.new({value: type, config: _debugger.JsonMLConfig.asClass}));
    }
    return children;
  }
};
(_debugger.HeritageClauseFormatter.new = function() {
}).prototype = _debugger.HeritageClauseFormatter.prototype;
dart.addTypeTests(_debugger.HeritageClauseFormatter);
_debugger.HeritageClauseFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.HeritageClauseFormatter, () => ({
  __proto__: dart.getMethods(_debugger.HeritageClauseFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.HeritageClauseFormatter, "dart:_debugger");
_debugger.IterableSpanFormatter = class IterableSpanFormatter extends core.Object {
  accept(object, config) {
    return _debugger.IterableSpan.is(object);
  }
  preview(object) {
    return "[" + dart.str(dart.dload(object, 'start')) + "..." + dart.str(dart.dsend(dart.dload(object, 'end'), '-', [1])) + "]";
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    return ListOfNameValuePair()._check(dart.dsend(object, 'children', []));
  }
};
(_debugger.IterableSpanFormatter.new = function() {
}).prototype = _debugger.IterableSpanFormatter.prototype;
dart.addTypeTests(_debugger.IterableSpanFormatter);
_debugger.IterableSpanFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.IterableSpanFormatter, () => ({
  __proto__: dart.getMethods(_debugger.IterableSpanFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.IterableSpanFormatter, "dart:_debugger");
_debugger.ErrorAndExceptionFormatter = class ErrorAndExceptionFormatter extends _debugger.ObjectFormatter {
  accept(object, config) {
    return core.Error.is(object) || core.Exception.is(object);
  }
  hasChildren(object) {
    return true;
  }
  preview(object) {
    let trace = dart.stackTrace(object);
    let line = dart.str(trace)[$split]("\n")[$firstWhere](dart.fn(l => l[$contains](_debugger.ErrorAndExceptionFormatter._pattern) && !l[$contains]("dart:sdk") && !l[$contains]("dart_sdk"), StringTobool()), {orElse: dart.fn(() => null, VoidToNull())});
    return line != null ? dart.str(object) + " at " + dart.str(line) : dart.str(object);
  }
  children(object) {
    let trace = dart.stackTrace(object);
    let entries = new (_HashSetOfNameValuePair()).new();
    entries.add(new _debugger.NameValuePair.new({name: "stackTrace", value: trace}));
    this.addInstanceMembers(object, entries);
    _debugger.addMetadataChildren(object, entries);
    return entries.toList();
  }
  addInstanceMembers(object, ret) {
    ret.add(new _debugger.NameValuePair.new({name: "[[instance members]]", value: object, config: _debugger.JsonMLConfig.asObject}));
  }
};
(_debugger.ErrorAndExceptionFormatter.new = function() {
}).prototype = _debugger.ErrorAndExceptionFormatter.prototype;
dart.addTypeTests(_debugger.ErrorAndExceptionFormatter);
dart.setMethodSignature(_debugger.ErrorAndExceptionFormatter, () => ({
  __proto__: dart.getMethods(_debugger.ErrorAndExceptionFormatter.__proto__),
  addInstanceMembers: dart.fnType(dart.void, [dart.dynamic, core.Set$(_debugger.NameValuePair)])
}));
dart.setLibraryUri(_debugger.ErrorAndExceptionFormatter, "dart:_debugger");
dart.defineLazy(_debugger.ErrorAndExceptionFormatter, {
  /*_debugger.ErrorAndExceptionFormatter._pattern*/get _pattern() {
    return core.RegExp.new("\\d+\\:\\d+");
  }
});
_debugger.StackTraceFormatter = class StackTraceFormatter extends core.Object {
  accept(object, config) {
    return core.StackTrace.is(object);
  }
  preview(object) {
    return "StackTrace";
  }
  hasChildren(object) {
    return true;
  }
  children(object) {
    return IterableOfNameValuePair()._check(dart.toString(object)[$split]("\n")[$map](_debugger.NameValuePair, dart.fn(line => new _debugger.NameValuePair.new({value: line[$replaceFirst](core.RegExp.new("^\\s+at\\s"), ""), hideName: true}), StringToNameValuePair())))[$toList]();
  }
};
(_debugger.StackTraceFormatter.new = function() {
}).prototype = _debugger.StackTraceFormatter.prototype;
dart.addTypeTests(_debugger.StackTraceFormatter);
_debugger.StackTraceFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.StackTraceFormatter, () => ({
  __proto__: dart.getMethods(_debugger.StackTraceFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.StackTraceFormatter, "dart:_debugger");
_debugger.ClassFormatter = class ClassFormatter extends core.Object {
  accept(object, config) {
    return dart.equals(config, _debugger.JsonMLConfig.asClass);
  }
  preview(type) {
    let implements$ = dart.getImplements(type);
    let typeName = _debugger.getTypeName(type);
    if (implements$ != null) {
      let typeNames = IterableOfString()._check(implements$()[$map](core.String, dart.fn(_debugger.getTypeName, dynamicToString())));
      return dart.str(typeName) + " implements " + dart.str(typeNames[$join](", "));
    } else {
      return typeName;
    }
  }
  hasChildren(object) {
    return true;
  }
  children(type) {
    let ret = new (_HashSetOfNameValuePair()).new();
    let staticProperties = new (_HashSetOfNameValuePair()).new();
    let staticMethods = new (_HashSetOfNameValuePair()).new();
    _debugger.addPropertiesFromSignature(dart.getStaticFields(type), staticProperties, type, false);
    _debugger.addPropertiesFromSignature(dart.getStaticGetters(type), staticProperties, type, false);
    _debugger.addPropertiesFromSignature(dart.getStaticMethods(type), staticMethods, type, false);
    if (dart.test(staticProperties.isNotEmpty) || dart.test(staticMethods.isNotEmpty)) {
      ret.add(new _debugger.NameValuePair.new({value: "[[Static members]]", hideName: true}));
      ret.addAll(_debugger.sortProperties(staticProperties));
      ret.addAll(_debugger.sortProperties(staticMethods));
    }
    let instanceMethods = new (_HashSetOfNameValuePair()).new();
    _debugger.addPropertiesFromSignature(dart.getMethods(type), instanceMethods, type.prototype, false, {tagTypes: true});
    if (dart.test(instanceMethods.isNotEmpty)) {
      ret.add(new _debugger.NameValuePair.new({value: "[[Instance Methods]]", hideName: true}));
      ret.addAll(_debugger.sortProperties(instanceMethods));
    }
    let mixin = dart.getMixin(type);
    if (mixin != null) {
      ret.add(new _debugger.NameValuePair.new({name: "[[Mixins]]", value: new _debugger.HeritageClause.new("mixins", [mixin])}));
    }
    let baseProto = type.__proto__;
    if (baseProto != null && !dart.test(dart.isJsInterop(baseProto))) {
      ret.add(new _debugger.NameValuePair.new({name: "[[base class]]", value: baseProto, config: _debugger.JsonMLConfig.asClass}));
    }
    return ret.toList();
  }
};
(_debugger.ClassFormatter.new = function() {
}).prototype = _debugger.ClassFormatter.prototype;
dart.addTypeTests(_debugger.ClassFormatter);
_debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.ClassFormatter, () => ({
  __proto__: dart.getMethods(_debugger.ClassFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.ClassFormatter, "dart:_debugger");
_debugger.TypeFormatter = class TypeFormatter extends core.Object {
  accept(object, config) {
    return core.Type.is(object);
  }
  preview(object) {
    return dart.toString(object);
  }
  hasChildren(object) {
    return false;
  }
  children(object) {
    return JSArrayOfNameValuePair().of([]);
  }
};
(_debugger.TypeFormatter.new = function() {
}).prototype = _debugger.TypeFormatter.prototype;
dart.addTypeTests(_debugger.TypeFormatter);
_debugger.TypeFormatter[dart.implements] = () => [_debugger.Formatter];
dart.setMethodSignature(_debugger.TypeFormatter, () => ({
  __proto__: dart.getMethods(_debugger.TypeFormatter.__proto__),
  accept: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  preview: dart.fnType(core.String, [dart.dynamic]),
  hasChildren: dart.fnType(core.bool, [dart.dynamic]),
  children: dart.fnType(core.List$(_debugger.NameValuePair), [dart.dynamic])
}));
dart.setLibraryUri(_debugger.TypeFormatter, "dart:_debugger");
dart.copyProperties(_debugger, {
  get stackTraceMapper() {
    let _util = dart.global.$dartStackTraceUtility;
    return _util != null ? _util.mapper : null;
  }
});
_debugger.registerDevtoolsFormatter = function() {
  dart.global.devtoolsFormatters = [_debugger._devtoolsFormatter];
};
_debugger.getModuleNames = function() {
  return dart.getModuleNames();
};
_debugger.getModuleLibraries = function(name) {
  return dart.getModuleLibraries(name);
};
_debugger._MethodStats = class _MethodStats extends core.Object {};
(_debugger._MethodStats.new = function(typeName, frame) {
  this.count = null;
  this.typeName = typeName;
  this.frame = frame;
  this.count = 0.0;
}).prototype = _debugger._MethodStats.prototype;
dart.addTypeTests(_debugger._MethodStats);
dart.setLibraryUri(_debugger._MethodStats, "dart:_debugger");
dart.setFieldSignature(_debugger._MethodStats, () => ({
  __proto__: dart.getFields(_debugger._MethodStats.__proto__),
  typeName: dart.finalFieldType(core.String),
  frame: dart.finalFieldType(core.String),
  count: dart.fieldType(core.double)
}));
_debugger._CallMethodRecord = class _CallMethodRecord extends core.Object {};
(_debugger._CallMethodRecord.new = function(jsError, type) {
  this.jsError = jsError;
  this.type = type;
}).prototype = _debugger._CallMethodRecord.prototype;
dart.addTypeTests(_debugger._CallMethodRecord);
dart.setLibraryUri(_debugger._CallMethodRecord, "dart:_debugger");
dart.setFieldSignature(_debugger._CallMethodRecord, () => ({
  __proto__: dart.getFields(_debugger._CallMethodRecord.__proto__),
  jsError: dart.fieldType(dart.dynamic),
  type: dart.fieldType(dart.dynamic)
}));
dart.defineLazy(_debugger, {
  /*_debugger._callRecordSampleSize*/get _callRecordSampleSize() {
    return 5000;
  },
  set _callRecordSampleSize(_) {},
  /*_debugger._callMethodRecords*/get _callMethodRecords() {
    return JSArrayOf_CallMethodRecord().of([]);
  },
  set _callMethodRecords(_) {},
  /*_debugger._totalCallRecords*/get _totalCallRecords() {
    return 0;
  },
  set _totalCallRecords(_) {},
  /*_debugger._minCount*/get _minCount() {
    return 2;
  },
  set _minCount(_) {},
  /*_debugger._frameMappingCache*/get _frameMappingCache() {
    return new (IdentityMapOfString$String()).new();
  },
  set _frameMappingCache(_) {}
});
_debugger.getDynamicStats = function() {
  let callMethodStats = new (IdentityMapOfString$_MethodStats()).new();
  if (dart.notNull(_debugger._callMethodRecords[$length]) > 0) {
    let recordRatio = dart.notNull(_debugger._totalCallRecords) / dart.notNull(_debugger._callMethodRecords[$length]);
    for (let record of _debugger._callMethodRecords) {
      let stackStr = record.jsError.stack;
      let frames = stackStr[$split]("\n");
      let src = IterableOfString()._check(frames[$skip](2)[$map](core.String, dart.fn(f => _debugger._frameMappingCache[$putIfAbsent](f, dart.fn(() => _debugger.stackTraceMapper("\n" + dart.str(f)), VoidToString())), StringToString())))[$firstWhere](dart.fn(f => !f[$startsWith]("dart:"), StringTobool()), {orElse: dart.fn(() => "", VoidToString())});
      let actualTypeName = dart.typeName(record.type);
      let o = callMethodStats[$putIfAbsent](actualTypeName + " <" + dart.str(src) + ">", dart.fn(() => new _debugger._MethodStats.new(actualTypeName, src), VoidTo_MethodStats()));
      o.count = dart.notNull(o.count) + recordRatio;
    }
    if (_debugger._totalCallRecords != _debugger._callMethodRecords[$length]) {
      for (let k of callMethodStats[$keys][$toList]()) {
        let stats = callMethodStats[$_get](k);
        let threshold = dart.notNull(_debugger._minCount) * recordRatio;
        if (dart.notNull(stats.count) + 0.001 < threshold) {
          callMethodStats[$remove](k);
        }
      }
    }
  }
  _debugger._callMethodRecords[$clear]();
  _debugger._totalCallRecords = 0;
  let keys = callMethodStats[$keys][$toList]();
  keys[$sort](dart.fn((a, b) => callMethodStats[$_get](b).count[$compareTo](callMethodStats[$_get](a).count), StringAndStringToint()));
  let ret = JSArrayOfListOfObject().of([]);
  for (let key of keys) {
    let stats = callMethodStats[$_get](key);
    ret[$add](JSArrayOfObject().of([stats.typeName, stats.frame, stats.count[$round]()]));
  }
  return ret;
};
_debugger.clearDynamicStats = function() {
  _debugger._callMethodRecords[$clear]();
};
dart.copyProperties(_debugger, {
  get _trackProfile() {
    return dart.__trackProfile;
  }
});
_debugger.trackCall = function(obj) {
  if (!_debugger._trackProfile) return;
  let index = -1;
  _debugger._totalCallRecords = dart.notNull(_debugger._totalCallRecords) + 1;
  if (_debugger._callMethodRecords[$length] == _debugger._callRecordSampleSize) {
    index = Math.floor(Math.random() * _debugger._totalCallRecords);
    if (index >= dart.notNull(_debugger._callMethodRecords[$length])) return;
  }
  let record = new _debugger._CallMethodRecord.new(new Error(), dart.getReifiedType(obj));
  if (index === -1) {
    _debugger._callMethodRecords[$add](record);
  } else {
    _debugger._callMethodRecords[$_set](index, record);
  }
};
_foreign_helper.JS = function(T, typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19) {
  if (arg0 === void 0) arg0 = null;
  if (arg1 === void 0) arg1 = null;
  if (arg2 === void 0) arg2 = null;
  if (arg3 === void 0) arg3 = null;
  if (arg4 === void 0) arg4 = null;
  if (arg5 === void 0) arg5 = null;
  if (arg6 === void 0) arg6 = null;
  if (arg7 === void 0) arg7 = null;
  if (arg8 === void 0) arg8 = null;
  if (arg9 === void 0) arg9 = null;
  if (arg10 === void 0) arg10 = null;
  if (arg11 === void 0) arg11 = null;
  if (arg12 === void 0) arg12 = null;
  if (arg13 === void 0) arg13 = null;
  if (arg14 === void 0) arg14 = null;
  if (arg15 === void 0) arg15 = null;
  if (arg16 === void 0) arg16 = null;
  if (arg17 === void 0) arg17 = null;
  if (arg18 === void 0) arg18 = null;
  if (arg19 === void 0) arg19 = null;
};
_foreign_helper.JSExportName = class JSExportName extends core.Object {};
(_foreign_helper.JSExportName.new = function(name) {
  this.name = name;
}).prototype = _foreign_helper.JSExportName.prototype;
dart.addTypeTests(_foreign_helper.JSExportName);
dart.setLibraryUri(_foreign_helper.JSExportName, "dart:_foreign_helper");
dart.setFieldSignature(_foreign_helper.JSExportName, () => ({
  __proto__: dart.getFields(_foreign_helper.JSExportName.__proto__),
  name: dart.finalFieldType(core.String)
}));
_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR = function() {
};
_foreign_helper.JS_INTERCEPTOR_CONSTANT = function(type) {
};
_foreign_helper.JS_OPERATOR_IS_PREFIX = function() {
};
_foreign_helper.JS_OPERATOR_AS_PREFIX = function() {
};
_foreign_helper.JS_OBJECT_CLASS_NAME = function() {
};
_foreign_helper.JS_NULL_CLASS_NAME = function() {
};
_foreign_helper.JS_FUNCTION_CLASS_NAME = function() {
};
_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME = function() {
};
_foreign_helper.JS_SIGNATURE_NAME = function() {
};
_foreign_helper.JS_TYPEDEF_TAG = function() {
};
_foreign_helper.JS_FUNCTION_TYPE_TAG = function() {
};
_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG = function() {
};
_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG = function() {
};
_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG = function() {
};
_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG = function() {
};
_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG = function() {
};
_foreign_helper.JS_GET_NAME = function(name) {
};
_foreign_helper.JS_GET_FLAG = function(name) {
};
_foreign_helper.JS_EFFECT = function(code) {
  dart.dcall(code, [null]);
};
_foreign_helper.JS_CONST = class JS_CONST extends core.Object {};
(_foreign_helper.JS_CONST.new = function(code) {
  this.code = code;
}).prototype = _foreign_helper.JS_CONST.prototype;
dart.addTypeTests(_foreign_helper.JS_CONST);
dart.setLibraryUri(_foreign_helper.JS_CONST, "dart:_foreign_helper");
dart.setFieldSignature(_foreign_helper.JS_CONST, () => ({
  __proto__: dart.getFields(_foreign_helper.JS_CONST.__proto__),
  code: dart.finalFieldType(core.String)
}));
_foreign_helper.JS_STRING_CONCAT = function(a, b) {
  return a + b;
};
_foreign_helper._Rest = class _Rest extends core.Object {};
(_foreign_helper._Rest.new = function() {
}).prototype = _foreign_helper._Rest.prototype;
dart.addTypeTests(_foreign_helper._Rest);
dart.setLibraryUri(_foreign_helper._Rest, "dart:_foreign_helper");
dart.defineLazy(_foreign_helper, {
  /*_foreign_helper.rest*/get rest() {
    return dart.const(new _foreign_helper._Rest.new());
  }
});
_foreign_helper.spread = function(args) {
  dart.throw(new core.StateError.new("The spread function cannot be called, " + "it should be compiled away."));
};
_interceptors.Interceptor = class Interceptor extends core.Object {
  toString() {
    return this.toString();
  }
};
(_interceptors.Interceptor.new = function() {
}).prototype = _interceptors.Interceptor.prototype;
dart.addTypeTests(_interceptors.Interceptor);
dart.setLibraryUri(_interceptors.Interceptor, "dart:_interceptors");
dart.defineExtensionMethods(_interceptors.Interceptor, ['toString']);
_interceptors.getInterceptor = function(obj) {
  return obj;
};
_interceptors.JSBool = class JSBool extends _interceptors.Interceptor {
  [$toString]() {
    return String(this);
  }
  get [$hashCode]() {
    return this ? 2 * 3 * 23 * 3761 : 269 * 811;
  }
  [$bitAnd](other) {
    if (other == null) dart.argumentError(other);
    return other && this;
  }
  [$bitOr](other) {
    if (other == null) dart.argumentError(other);
    return other || this;
  }
  [$bitXor](other) {
    if (other == null) dart.argumentError(other);
    return !(this === other);
  }
  get [$runtimeType]() {
    return dart.wrapType(core.bool);
  }
};
(_interceptors.JSBool.new = function() {
  _interceptors.JSBool.__proto__.new.call(this);
}).prototype = _interceptors.JSBool.prototype;
dart.addTypeTests(_interceptors.JSBool);
_interceptors.JSBool[dart.implements] = () => [core.bool];
dart.setMethodSignature(_interceptors.JSBool, () => ({
  __proto__: dart.getMethods(_interceptors.JSBool.__proto__),
  [$bitAnd]: dart.fnType(core.bool, [core.bool]),
  [$bitOr]: dart.fnType(core.bool, [core.bool]),
  [$bitXor]: dart.fnType(core.bool, [core.bool])
}));
dart.setLibraryUri(_interceptors.JSBool, "dart:_interceptors");
dart.definePrimitiveHashCode(_interceptors.JSBool.prototype);
dart.registerExtension("Boolean", _interceptors.JSBool);
const _is_JSIndexable_default = Symbol('_is_JSIndexable_default');
_interceptors.JSIndexable$ = dart.generic(E => {
  class JSIndexable extends core.Object {}
  (JSIndexable.new = function() {
  }).prototype = JSIndexable.prototype;
  dart.addTypeTests(JSIndexable);
  JSIndexable.prototype[_is_JSIndexable_default] = true;
  dart.setLibraryUri(JSIndexable, "dart:_interceptors");
  return JSIndexable;
});
_interceptors.JSIndexable = _interceptors.JSIndexable$();
dart.addTypeTests(_interceptors.JSIndexable, _is_JSIndexable_default);
_interceptors.JSObject = class JSObject extends core.Object {};
(_interceptors.JSObject.new = function() {
}).prototype = _interceptors.JSObject.prototype;
dart.addTypeTests(_interceptors.JSObject);
dart.setLibraryUri(_interceptors.JSObject, "dart:_interceptors");
_interceptors.JavaScriptObject = class JavaScriptObject extends _interceptors.Interceptor {
  get hashCode() {
    return 0;
  }
  get runtimeType() {
    return dart.wrapType(_interceptors.JSObject);
  }
};
(_interceptors.JavaScriptObject.new = function() {
  _interceptors.JavaScriptObject.__proto__.new.call(this);
}).prototype = _interceptors.JavaScriptObject.prototype;
dart.addTypeTests(_interceptors.JavaScriptObject);
_interceptors.JavaScriptObject[dart.implements] = () => [_interceptors.JSObject];
dart.setLibraryUri(_interceptors.JavaScriptObject, "dart:_interceptors");
dart.defineExtensionAccessors(_interceptors.JavaScriptObject, ['hashCode', 'runtimeType']);
_interceptors.PlainJavaScriptObject = class PlainJavaScriptObject extends _interceptors.JavaScriptObject {};
(_interceptors.PlainJavaScriptObject.new = function() {
  _interceptors.PlainJavaScriptObject.__proto__.new.call(this);
}).prototype = _interceptors.PlainJavaScriptObject.prototype;
dart.addTypeTests(_interceptors.PlainJavaScriptObject);
dart.setLibraryUri(_interceptors.PlainJavaScriptObject, "dart:_interceptors");
_interceptors.UnknownJavaScriptObject = class UnknownJavaScriptObject extends _interceptors.JavaScriptObject {
  toString() {
    return String(this);
  }
};
(_interceptors.UnknownJavaScriptObject.new = function() {
  _interceptors.UnknownJavaScriptObject.__proto__.new.call(this);
}).prototype = _interceptors.UnknownJavaScriptObject.prototype;
dart.addTypeTests(_interceptors.UnknownJavaScriptObject);
dart.setLibraryUri(_interceptors.UnknownJavaScriptObject, "dart:_interceptors");
dart.defineExtensionMethods(_interceptors.UnknownJavaScriptObject, ['toString']);
_interceptors.NativeError = class NativeError extends _interceptors.Interceptor {
  dartStack() {
    return this.stack;
  }
};
(_interceptors.NativeError.new = function() {
  _interceptors.NativeError.__proto__.new.call(this);
}).prototype = _interceptors.NativeError.prototype;
dart.addTypeTests(_interceptors.NativeError);
dart.setMethodSignature(_interceptors.NativeError, () => ({
  __proto__: dart.getMethods(_interceptors.NativeError.__proto__),
  dartStack: dart.fnType(core.String, []),
  [$dartStack]: dart.fnType(core.String, [])
}));
dart.setLibraryUri(_interceptors.NativeError, "dart:_interceptors");
dart.defineExtensionMethods(_interceptors.NativeError, ['dartStack']);
const _fieldName = dart.privateName(_interceptors, "_fieldName");
const _functionCallTarget = dart.privateName(_interceptors, "_functionCallTarget");
_interceptors.JSNoSuchMethodError = class JSNoSuchMethodError extends _interceptors.NativeError {
  [_fieldName](message) {
    let match = _interceptors.JSNoSuchMethodError._nullError.firstMatch(message);
    if (match == null) return null;
    let name = match._get(1);
    let l = _interceptors.JSNoSuchMethodError._extensionName.firstMatch(name);
    match = l != null ? l : _interceptors.JSNoSuchMethodError._privateName.firstMatch(name);
    return match != null ? match._get(1) : name;
  }
  [_functionCallTarget](message) {
    let match = _interceptors.JSNoSuchMethodError._notAFunction.firstMatch(message);
    return match != null ? match._get(1) : null;
  }
  [$dartStack]() {
    let stack = super[$dartStack]();
    stack = dart.notNull(this[$toString]()) + "\n" + dart.notNull(stack[$split]("\n")[$sublist](1)[$join]("\n"));
    return stack;
  }
  get [$stackTrace]() {
    return dart.stackTrace(this);
  }
  [$toString]() {
    let message = this.message;
    let callTarget = this[_functionCallTarget](message);
    if (callTarget != null) {
      return "NoSuchMethodError: tried to call a non-function, such as null: " + ("'" + dart.str(callTarget) + "'");
    }
    let name = this[_fieldName](message);
    if (name == null) {
      return this.toString();
    }
    return "NoSuchMethodError: invalid member on null: '" + dart.str(name) + "'";
  }
};
(_interceptors.JSNoSuchMethodError.new = function() {
  _interceptors.JSNoSuchMethodError.__proto__.new.call(this);
}).prototype = _interceptors.JSNoSuchMethodError.prototype;
dart.addTypeTests(_interceptors.JSNoSuchMethodError);
_interceptors.JSNoSuchMethodError[dart.implements] = () => [core.NoSuchMethodError];
dart.setMethodSignature(_interceptors.JSNoSuchMethodError, () => ({
  __proto__: dart.getMethods(_interceptors.JSNoSuchMethodError.__proto__),
  [_fieldName]: dart.fnType(core.String, [core.String]),
  [_functionCallTarget]: dart.fnType(core.String, [core.String])
}));
dart.setGetterSignature(_interceptors.JSNoSuchMethodError, () => ({
  __proto__: dart.getGetters(_interceptors.JSNoSuchMethodError.__proto__),
  [$stackTrace]: core.StackTrace
}));
dart.setLibraryUri(_interceptors.JSNoSuchMethodError, "dart:_interceptors");
dart.defineLazy(_interceptors.JSNoSuchMethodError, {
  /*_interceptors.JSNoSuchMethodError._nullError*/get _nullError() {
    return core.RegExp.new("^Cannot read property '(.+)' of null$");
  },
  /*_interceptors.JSNoSuchMethodError._notAFunction*/get _notAFunction() {
    return core.RegExp.new("^(.+) is not a function$");
  },
  /*_interceptors.JSNoSuchMethodError._extensionName*/get _extensionName() {
    return core.RegExp.new("^Symbol\\(dartx\\.(.+)\\)$");
  },
  /*_interceptors.JSNoSuchMethodError._privateName*/get _privateName() {
    return core.RegExp.new("^Symbol\\((_.+)\\)$");
  }
});
dart.registerExtension("TypeError", _interceptors.JSNoSuchMethodError);
_interceptors.JSFunction = class JSFunction extends _interceptors.Interceptor {
  [$toString]() {
    if (dart.isType(this)) return dart.typeName(this);
    return "Closure: " + dart.typeName(dart.getReifiedType(this)) + " from: " + this;
  }
  [$_equals](other) {
    if (other == null) return false;
    let boundObj = this._boundObject;
    if (boundObj == null) return this === other;
    return boundObj === other._boundObject && this._boundMethod === other._boundMethod;
  }
  get [$hashCode]() {
    let boundObj = this._boundObject;
    if (boundObj == null) return core.identityHashCode(this);
    let boundMethod = this._boundMethod;
    let hash = 17 * 31 + dart.notNull(dart.hashCode(boundObj)) & 536870911;
    return hash * 31 + dart.notNull(core.identityHashCode(boundMethod)) & 536870911;
  }
  get [$runtimeType]() {
    return dart.wrapType(dart.getReifiedType(this));
  }
};
(_interceptors.JSFunction.new = function() {
  _interceptors.JSFunction.__proto__.new.call(this);
}).prototype = _interceptors.JSFunction.prototype;
dart.addTypeTests(_interceptors.JSFunction);
dart.setLibraryUri(_interceptors.JSFunction, "dart:_interceptors");
dart.registerExtension("Function", _interceptors.JSFunction);
_interceptors.JSNull = class JSNull extends core.Object {
  toString() {
    return "null";
  }
  noSuchMethod(i) {
    return dart.defaultNoSuchMethod(null, i);
  }
};
(_interceptors.JSNull.new = function() {
}).prototype = _interceptors.JSNull.prototype;
dart.addTypeTests(_interceptors.JSNull);
dart.setLibraryUri(_interceptors.JSNull, "dart:_interceptors");
dart.defineExtensionMethods(_interceptors.JSNull, ['toString', 'noSuchMethod']);
dart.defineLazy(_interceptors, {
  /*_interceptors.jsNull*/get jsNull() {
    return new _interceptors.JSNull.new();
  }
});
_interceptors.JSRangeError = class JSRangeError extends _interceptors.Interceptor {
  get [$stackTrace]() {
    return dart.stackTrace(this);
  }
  get [$invalidValue]() {
    return null;
  }
  get [$name]() {
    return null;
  }
  get [$message]() {
    return this.message;
  }
  [$toString]() {
    return "Invalid argument: " + dart.str(this[$message]);
  }
};
(_interceptors.JSRangeError.new = function() {
  _interceptors.JSRangeError.__proto__.new.call(this);
}).prototype = _interceptors.JSRangeError.prototype;
dart.addTypeTests(_interceptors.JSRangeError);
_interceptors.JSRangeError[dart.implements] = () => [core.ArgumentError];
dart.setGetterSignature(_interceptors.JSRangeError, () => ({
  __proto__: dart.getGetters(_interceptors.JSRangeError.__proto__),
  [$stackTrace]: core.StackTrace,
  [$invalidValue]: dart.dynamic,
  [$name]: core.String,
  [$message]: dart.dynamic
}));
dart.setLibraryUri(_interceptors.JSRangeError, "dart:_interceptors");
dart.registerExtension("RangeError", _interceptors.JSRangeError);
_interceptors.findInterceptorConstructorForType = function(type) {
};
_interceptors.findConstructorForNativeSubclassType = function(type, name) {
};
_interceptors.getNativeInterceptor = function(object) {
};
_interceptors.setDispatchProperty = function(object, value) {
};
const _removeWhere = dart.privateName(_interceptors, "_removeWhere");
const _is_JSArray_default = Symbol('_is_JSArray_default');
_interceptors.JSArray$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.fnType(E, [E, E])))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.fnType(E, [])))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let ArrayIteratorOfE = () => (ArrayIteratorOfE = dart.constFn(_interceptors.ArrayIterator$(E)))();
  let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
  let FollowedByIterableOfE = () => (FollowedByIterableOfE = dart.constFn(_internal.FollowedByIterable$(E)))();
  let JSIndexableOfE = () => (JSIndexableOfE = dart.constFn(_interceptors.JSIndexable$(E)))();
  class JSArray extends core.Object {
    constructor() {
      return [];
    }
    static of(list) {
      list.__proto__ = JSArray.prototype;
      return list;
    }
    static fixed(list) {
      list.__proto__ = JSArray.prototype;
      list.fixed$length = Array;
      return list;
    }
    static unmodifiable(list) {
      list.__proto__ = JSArray.prototype;
      list.fixed$length = Array;
      list.immutable$list = Array;
      return list;
    }
    static markFixedList(list) {
      list.fixed$length = Array;
    }
    static markUnmodifiableList(list) {
      list.fixed$length = Array;
      list.immutable$list = Array;
    }
    [$checkMutable](reason) {
      if (this.immutable$list) {
        dart.throw(new core.UnsupportedError.new(core.String._check(reason)));
      }
    }
    [$checkGrowable](reason) {
      if (this.fixed$length) {
        dart.throw(new core.UnsupportedError.new(core.String._check(reason)));
      }
    }
    [$cast](R) {
      return core.List.castFrom(E, R, this);
    }
    [$add](value) {
      E._check(value);
      this[$checkGrowable]("add");
      this.push(value);
    }
    [$removeAt](index) {
      if (index == null) dart.argumentError(index);
      this[$checkGrowable]("removeAt");
      if (index < 0 || index >= this[$length]) {
        dart.throw(new core.RangeError.value(index));
      }
      return this.splice(index, 1)[0];
    }
    [$insert](index, value) {
      if (index == null) dart.argumentError(index);
      E._check(value);
      this[$checkGrowable]("insert");
      if (index < 0 || index > this[$length]) {
        dart.throw(new core.RangeError.value(index));
      }
      this.splice(index, 0, value);
    }
    [$insertAll](index, iterable) {
      if (index == null) dart.argumentError(index);
      IterableOfE()._check(iterable);
      this[$checkGrowable]("insertAll");
      core.RangeError.checkValueInInterval(index, 0, this[$length], "index");
      if (!_internal.EfficientLengthIterable.is(iterable)) {
        iterable = iterable[$toList]();
      }
      let insertionLength = dart.notNull(iterable[$length]);
      this[$length] = dart.notNull(this[$length]) + insertionLength;
      let end = index + insertionLength;
      this[$setRange](end, this[$length], this, index);
      this[$setRange](index, end, iterable);
    }
    [$setAll](index, iterable) {
      if (index == null) dart.argumentError(index);
      IterableOfE()._check(iterable);
      this[$checkMutable]("setAll");
      core.RangeError.checkValueInInterval(index, 0, this[$length], "index");
      for (let element of iterable) {
        this[$_set](index++, element);
      }
    }
    [$removeLast]() {
      this[$checkGrowable]("removeLast");
      if (this[$length] === 0) dart.throw(_js_helper.diagnoseIndexError(this, -1));
      return this.pop();
    }
    [$remove](element) {
      this[$checkGrowable]("remove");
      let length = this[$length];
      for (let i = 0; i < length; i++) {
        if (dart.equals(this[$_get](i), element)) {
          this.splice(i, 1);
          return true;
        }
      }
      return false;
    }
    [$removeWhere](test) {
      this[$checkGrowable]("removeWhere");
      this[_removeWhere](test, true);
    }
    [$retainWhere](test) {
      this[$checkGrowable]("retainWhere");
      this[_removeWhere](test, false);
    }
    [_removeWhere](test, removeMatching) {
      let retained = [];
      let end = this[$length];
      for (let i = 0; i < end; i++) {
        let element = this[i];
        if (!dart.test(test(element)) === removeMatching) {
          retained[$add](element);
        }
        if (this[$length] !== end) dart.throw(new core.ConcurrentModificationError.new(this));
      }
      if (retained[$length] === end) return;
      this[$length] = retained[$length];
      let length = dart.notNull(retained[$length]);
      for (let i = 0; i < length; i++) {
        this[i] = retained[i];
      }
    }
    [$where](f) {
      return new (WhereIterableOfE()).new(this, f);
    }
    [$expand](T, f) {
      return new (_internal.ExpandIterable$(E, T)).new(this, f);
    }
    [$addAll](collection) {
      IterableOfE()._check(collection);
      let i = this[$length];
      this[$checkGrowable]("addAll");
      for (let e of collection) {
        if (!(i === this[$length] || dart.test(dart.throw(new core.ConcurrentModificationError.new(this))))) dart.assertFailed(null, "dart:_interceptors/js_array.dart", 187, 14, "i == this.length || (throw ConcurrentModificationError(this))");
        i++;
        this.push(e);
      }
    }
    [$clear]() {
      this[$length] = 0;
    }
    [$forEach](f) {
      let end = this[$length];
      for (let i = 0; i < end; i++) {
        let element = this[i];
        f(E._check(element));
        if (this[$length] !== end) dart.throw(new core.ConcurrentModificationError.new(this));
      }
    }
    [$map](T, f) {
      return new (_internal.MappedListIterable$(E, T)).new(this, f);
    }
    [$join](separator) {
      if (separator === void 0) separator = "";
      let length = this[$length];
      let list = core.List.new(length);
      for (let i = 0; i < length; i++) {
        list[$_set](i, dart.str(this[$_get](i)));
      }
      return list.join(separator);
    }
    [$take](n) {
      return new (SubListIterableOfE()).new(this, 0, n);
    }
    [$takeWhile](test) {
      return new (TakeWhileIterableOfE()).new(this, test);
    }
    [$skip](n) {
      return new (SubListIterableOfE()).new(this, n, null);
    }
    [$skipWhile](test) {
      return new (SkipWhileIterableOfE()).new(this, test);
    }
    [$reduce](combine) {
      EAndEToE()._check(combine);
      let length = this[$length];
      if (length === 0) dart.throw(_internal.IterableElementError.noElement());
      let value = this[$_get](0);
      for (let i = 1; i < length; i++) {
        let element = this[i];
        value = combine(value, E._check(element));
        if (length !== this[$length]) dart.throw(new core.ConcurrentModificationError.new(this));
      }
      return value;
    }
    [$fold](T, initialValue, combine) {
      let value = initialValue;
      let length = this[$length];
      for (let i = 0; i < length; i++) {
        let element = this[i];
        value = combine(value, E._check(element));
        if (this[$length] !== length) dart.throw(new core.ConcurrentModificationError.new(this));
      }
      return value;
    }
    [$firstWhere](test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let end = this[$length];
      for (let i = 0; i < end; ++i) {
        let element = this[i];
        if (dart.test(test(E._check(element)))) return E._check(element);
        if (this[$length] !== end) dart.throw(new core.ConcurrentModificationError.new(this));
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    [$lastWhere](test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this[$length];
      for (let i = length - 1; i >= 0; i--) {
        let element = this[i];
        if (dart.test(test(E._check(element)))) return E._check(element);
        if (length !== this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    [$singleWhere](test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this[$length];
      let match = null;
      let matchFound = false;
      for (let i = 0; i < length; i++) {
        let element = this[i];
        if (dart.test(test(element))) {
          if (matchFound) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          matchFound = true;
          match = element;
        }
        if (length !== this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (matchFound) return match;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    [$elementAt](index) {
      return this[$_get](index);
    }
    [$sublist](start, end) {
      if (start == null) dart.argumentError(start);
      if (end === void 0) end = null;
      if (start < 0 || start > this[$length]) {
        dart.throw(new core.RangeError.range(start, 0, this[$length], "start"));
      }
      if (end == null) {
        end = this[$length];
      } else {
        let _end = end;
        if (_end < start || _end > this[$length]) {
          dart.throw(new core.RangeError.range(end, start, this[$length], "end"));
        }
      }
      if (start === end) return JSArrayOfE().of([]);
      return JSArrayOfE().of(this.slice(start, end));
    }
    [$getRange](start, end) {
      core.RangeError.checkValidRange(start, end, this[$length]);
      return new (SubListIterableOfE()).new(this, start, end);
    }
    get [$first]() {
      if (this[$length] > 0) return this[$_get](0);
      dart.throw(_internal.IterableElementError.noElement());
    }
    get [$last]() {
      if (this[$length] > 0) return this[$_get](this[$length] - 1);
      dart.throw(_internal.IterableElementError.noElement());
    }
    get [$single]() {
      if (this[$length] === 1) return this[$_get](0);
      if (this[$length] === 0) dart.throw(_internal.IterableElementError.noElement());
      dart.throw(_internal.IterableElementError.tooMany());
    }
    [$removeRange](start, end) {
      if (start == null) dart.argumentError(start);
      if (end == null) dart.argumentError(end);
      this[$checkGrowable]("removeRange");
      core.RangeError.checkValidRange(start, end, this[$length]);
      let deleteCount = end - start;
      this.splice(start, deleteCount);
    }
    [$setRange](start, end, iterable, skipCount) {
      if (start == null) dart.argumentError(start);
      if (end == null) dart.argumentError(end);
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      if (skipCount == null) dart.argumentError(skipCount);
      this[$checkMutable]("set range");
      core.RangeError.checkValidRange(start, end, this[$length]);
      let length = end - start;
      if (length === 0) return;
      core.RangeError.checkNotNegative(skipCount, "skipCount");
      let otherList = null;
      let otherStart = 0;
      if (ListOfE().is(iterable)) {
        otherList = iterable;
        otherStart = skipCount;
      } else {
        otherList = iterable[$skip](skipCount)[$toList]({growable: false});
        otherStart = 0;
      }
      if (otherStart + length > dart.notNull(otherList[$length])) {
        dart.throw(_internal.IterableElementError.tooFew());
      }
      if (otherStart < start) {
        for (let i = length - 1; i >= 0; i--) {
          let element = otherList[$_get](otherStart + i);
          this[start + i] = element;
        }
      } else {
        for (let i = 0; i < length; i++) {
          let element = otherList[$_get](otherStart + i);
          this[start + i] = element;
        }
      }
    }
    [$fillRange](start, end, fillValue) {
      if (start == null) dart.argumentError(start);
      if (end == null) dart.argumentError(end);
      if (fillValue === void 0) fillValue = null;
      E._check(fillValue);
      this[$checkMutable]("fill range");
      core.RangeError.checkValidRange(start, end, this[$length]);
      for (let i = start; i < end; i++) {
        this[i] = fillValue;
      }
    }
    [$replaceRange](start, end, replacement) {
      if (start == null) dart.argumentError(start);
      if (end == null) dart.argumentError(end);
      IterableOfE()._check(replacement);
      this[$checkGrowable]("replace range");
      core.RangeError.checkValidRange(start, end, this[$length]);
      if (!_internal.EfficientLengthIterable.is(replacement)) {
        replacement = replacement[$toList]();
      }
      let removeLength = end - start;
      let insertLength = dart.notNull(replacement[$length]);
      if (removeLength >= insertLength) {
        let delta = removeLength - insertLength;
        let insertEnd = start + insertLength;
        let newLength = this[$length] - delta;
        this[$setRange](start, insertEnd, replacement);
        if (delta !== 0) {
          this[$setRange](insertEnd, newLength, this, end);
          this[$length] = newLength;
        }
      } else {
        let delta = insertLength - removeLength;
        let newLength = this[$length] + delta;
        let insertEnd = start + insertLength;
        this[$length] = newLength;
        this[$setRange](insertEnd, newLength, this, end);
        this[$setRange](start, insertEnd, replacement);
      }
    }
    [$any](test) {
      let end = this[$length];
      for (let i = 0; i < end; i++) {
        let element = this[i];
        if (dart.test(test(E._check(element)))) return true;
        if (this[$length] !== end) dart.throw(new core.ConcurrentModificationError.new(this));
      }
      return false;
    }
    [$every](test) {
      let end = this[$length];
      for (let i = 0; i < end; i++) {
        let element = this[i];
        if (!dart.test(test(element))) return false;
        if (this[$length] !== end) dart.throw(new core.ConcurrentModificationError.new(this));
      }
      return true;
    }
    get [$reversed]() {
      return new (ReversedListIterableOfE()).new(this);
    }
    [$sort](compare) {
      if (compare === void 0) compare = null;
      this[$checkMutable]("sort");
      if (compare == null) {
        _internal.Sort.sort(E, this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
      } else {
        _internal.Sort.sort(E, this, compare);
      }
    }
    [$shuffle](random) {
      if (random === void 0) random = null;
      this[$checkMutable]("shuffle");
      if (random == null) random = math.Random.new();
      let length = this[$length];
      while (length > 1) {
        let pos = random.nextInt(length);
        length = length - 1;
        let tmp = this[$_get](length);
        this[$_set](length, this[$_get](pos));
        this[$_set](pos, tmp);
      }
    }
    [$indexOf](element, start) {
      if (start === void 0) start = 0;
      if (start == null) dart.argumentError(start);
      let length = this[$length];
      if (start >= length) {
        return -1;
      }
      if (start < 0) {
        start = 0;
      }
      for (let i = start; i < length; i++) {
        if (dart.equals(this[$_get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    [$lastIndexOf](element, _startIndex) {
      if (_startIndex === void 0) _startIndex = null;
      let startIndex = _startIndex != null ? _startIndex : this[$length] - 1;
      if (startIndex >= this[$length]) {
        startIndex = this[$length] - 1;
      } else if (startIndex < 0) {
        return -1;
      }
      for (let i = startIndex; i >= 0; i--) {
        if (dart.equals(this[$_get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    [$contains](other) {
      let length = this[$length];
      for (let i = 0; i < length; i++) {
        let element = this[i];
        if (dart.equals(element, other)) return true;
      }
      return false;
    }
    get [$isEmpty]() {
      return this[$length] === 0;
    }
    get [$isNotEmpty]() {
      return !this[$isEmpty];
    }
    [$toString]() {
      return collection.ListBase.listToString(this);
    }
    [$toList](opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      if (growable == null) dart.argumentError(growable);
      let list = this.slice();
      if (!growable) _interceptors.JSArray.markFixedList(list);
      return JSArrayOfE().of(list);
    }
    [$toSet]() {
      return SetOfE().from(this);
    }
    get [$iterator]() {
      return new (ArrayIteratorOfE()).new(this);
    }
    get [$hashCode]() {
      return core.identityHashCode(this);
    }
    [$_equals](other) {
      return this === other;
    }
    get [$length]() {
      return this.length;
    }
    set [$length](newLength) {
      if (newLength == null) dart.argumentError(newLength);
      this[$checkGrowable]("set length");
      if (newLength < 0) {
        dart.throw(new core.RangeError.range(newLength, 0, null, "newLength"));
      }
      this.length = newLength;
    }
    [$_get](index) {
      if (index == null || index >= this.length || index < 0) {
        dart.throw(_js_helper.diagnoseIndexError(this, index));
      }
      return this[index];
    }
    [$_set](index, value) {
      E._check(value);
      this[$checkMutable]("indexed set");
      if (index == null || index >= this.length || index < 0) {
        dart.throw(_js_helper.diagnoseIndexError(this, index));
      }
      this[index] = value;
      return value;
    }
    [$asMap]() {
      return new (ListMapViewOfE()).new(this);
    }
    get [$runtimeType]() {
      return dart.wrapType(core.List$(E));
    }
    [$followedBy](other) {
      IterableOfE()._check(other);
      return FollowedByIterableOfE().firstEfficient(this, other);
    }
    [$whereType](T) {
      return new (_internal.WhereTypeIterable$(T)).new(this);
    }
    [$plus](other) {
      ListOfE()._check(other);
      let totalLength = this[$length] + dart.notNull(other[$length]);
      let _ = JSArrayOfE().of([]);
      _[$length] = totalLength;
      _[$setRange](0, this[$length], this);
      _[$setRange](this[$length], totalLength, other);
      return _;
    }
    [$indexWhere](test, start) {
      if (start === void 0) start = 0;
      if (dart.notNull(start) >= this[$length]) return -1;
      if (dart.notNull(start) < 0) start = 0;
      for (let i = start; dart.notNull(i) < this[$length]; i = dart.notNull(i) + 1) {
        if (dart.test(test(this[$_get](i)))) return i;
      }
      return -1;
    }
    [$lastIndexWhere](test, start) {
      if (start === void 0) start = null;
      if (start == null) start = this[$length] - 1;
      if (dart.notNull(start) < 0) return -1;
      for (let i = start; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.test(test(this[$_get](i)))) return i;
      }
      return -1;
    }
    set [$first](element) {
      E._check(element);
      if (this[$isEmpty]) dart.throw(core.RangeError.index(0, this));
      this[$_set](0, element);
    }
    set [$last](element) {
      E._check(element);
      if (this[$isEmpty]) dart.throw(core.RangeError.index(0, this));
      this[$_set](this[$length] - 1, element);
    }
  }
  (JSArray.new = function() {
  }).prototype = JSArray.prototype;
  dart.setExtensionBaseClass(JSArray, dart.global.Array);
  JSArray.prototype[dart.isList] = true;
  dart.addTypeTests(JSArray);
  JSArray.prototype[_is_JSArray_default] = true;
  JSArray[dart.implements] = () => [ListOfE(), JSIndexableOfE()];
  dart.setMethodSignature(JSArray, () => ({
    __proto__: dart.getMethods(JSArray.__proto__),
    [$checkMutable]: dart.fnType(dart.dynamic, [dart.dynamic]),
    [$checkGrowable]: dart.fnType(dart.dynamic, [dart.dynamic]),
    [$cast]: dart.gFnType(R => [core.List$(R), []]),
    [$add]: dart.fnType(dart.void, [core.Object]),
    [$removeAt]: dart.fnType(E, [core.int]),
    [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
    [$insertAll]: dart.fnType(dart.void, [core.int, core.Object]),
    [$setAll]: dart.fnType(dart.void, [core.int, core.Object]),
    [$removeLast]: dart.fnType(E, []),
    [$remove]: dart.fnType(core.bool, [core.Object]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$retainWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [_removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E]), core.bool]),
    [$where]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$expand]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    [$clear]: dart.fnType(dart.void, []),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    [$map]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    [$join]: dart.fnType(core.String, [], [core.String]),
    [$take]: dart.fnType(core.Iterable$(E), [core.int]),
    [$takeWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$skip]: dart.fnType(core.Iterable$(E), [core.int]),
    [$skipWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$reduce]: dart.fnType(E, [core.Object]),
    [$fold]: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    [$firstWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$singleWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$elementAt]: dart.fnType(E, [core.int]),
    [$sublist]: dart.fnType(core.List$(E), [core.int], [core.int]),
    [$getRange]: dart.fnType(core.Iterable$(E), [core.int, core.int]),
    [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
    [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
    [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    [$any]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$every]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$sort]: dart.fnType(dart.void, [], [dart.fnType(core.int, [E, E])]),
    [$shuffle]: dart.fnType(dart.void, [], [math.Random]),
    [$indexOf]: dart.fnType(core.int, [core.Object], [core.int]),
    [$lastIndexOf]: dart.fnType(core.int, [core.Object], [core.int]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    [$toString]: dart.fnType(core.String, []),
    [$toList]: dart.fnType(core.List$(E), [], {growable: core.bool}),
    [$toSet]: dart.fnType(core.Set$(E), []),
    [$_equals]: dart.fnType(core.bool, [dart.dynamic]),
    [$_get]: dart.fnType(E, [core.int]),
    [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
    [$asMap]: dart.fnType(core.Map$(core.int, E), []),
    [$followedBy]: dart.fnType(core.Iterable$(E), [core.Object]),
    [$whereType]: dart.gFnType(T => [core.Iterable$(T), []]),
    [$plus]: dart.fnType(core.List$(E), [core.Object]),
    [$indexWhere]: dart.fnType(core.int, [dart.fnType(core.bool, [E])], [core.int]),
    [$lastIndexWhere]: dart.fnType(core.int, [dart.fnType(core.bool, [E])], [core.int])
  }));
  dart.setGetterSignature(JSArray, () => ({
    __proto__: dart.getGetters(JSArray.__proto__),
    [$first]: E,
    [$last]: E,
    [$single]: E,
    [$reversed]: core.Iterable$(E),
    [$isEmpty]: core.bool,
    [$isNotEmpty]: core.bool,
    [$iterator]: core.Iterator$(E),
    [$hashCode]: core.int,
    [$length]: core.int,
    [$runtimeType]: core.Type
  }));
  dart.setSetterSignature(JSArray, () => ({
    __proto__: dart.getSetters(JSArray.__proto__),
    [$length]: core.int,
    [$first]: E,
    [$last]: E
  }));
  dart.setLibraryUri(JSArray, "dart:_interceptors");
  return JSArray;
});
_interceptors.JSArray = _interceptors.JSArray$();
dart.addTypeTests(_interceptors.JSArray, _is_JSArray_default);
dart.registerExtension("Array", _interceptors.JSArray);
const _is_JSMutableArray_default = Symbol('_is_JSMutableArray_default');
_interceptors.JSMutableArray$ = dart.generic(E => {
  class JSMutableArray extends _interceptors.JSArray$(E) {}
  (JSMutableArray.new = function() {
    JSMutableArray.__proto__.new.call(this);
  }).prototype = JSMutableArray.prototype;
  dart.addTypeTests(JSMutableArray);
  JSMutableArray.prototype[_is_JSMutableArray_default] = true;
  dart.setLibraryUri(JSMutableArray, "dart:_interceptors");
  return JSMutableArray;
});
_interceptors.JSMutableArray = _interceptors.JSMutableArray$();
dart.addTypeTests(_interceptors.JSMutableArray, _is_JSMutableArray_default);
const _is_JSFixedArray_default = Symbol('_is_JSFixedArray_default');
_interceptors.JSFixedArray$ = dart.generic(E => {
  class JSFixedArray extends _interceptors.JSMutableArray$(E) {}
  (JSFixedArray.new = function() {
    JSFixedArray.__proto__.new.call(this);
  }).prototype = JSFixedArray.prototype;
  dart.addTypeTests(JSFixedArray);
  JSFixedArray.prototype[_is_JSFixedArray_default] = true;
  dart.setLibraryUri(JSFixedArray, "dart:_interceptors");
  return JSFixedArray;
});
_interceptors.JSFixedArray = _interceptors.JSFixedArray$();
dart.addTypeTests(_interceptors.JSFixedArray, _is_JSFixedArray_default);
const _is_JSExtendableArray_default = Symbol('_is_JSExtendableArray_default');
_interceptors.JSExtendableArray$ = dart.generic(E => {
  class JSExtendableArray extends _interceptors.JSMutableArray$(E) {}
  (JSExtendableArray.new = function() {
    JSExtendableArray.__proto__.new.call(this);
  }).prototype = JSExtendableArray.prototype;
  dart.addTypeTests(JSExtendableArray);
  JSExtendableArray.prototype[_is_JSExtendableArray_default] = true;
  dart.setLibraryUri(JSExtendableArray, "dart:_interceptors");
  return JSExtendableArray;
});
_interceptors.JSExtendableArray = _interceptors.JSExtendableArray$();
dart.addTypeTests(_interceptors.JSExtendableArray, _is_JSExtendableArray_default);
const _is_JSUnmodifiableArray_default = Symbol('_is_JSUnmodifiableArray_default');
_interceptors.JSUnmodifiableArray$ = dart.generic(E => {
  class JSUnmodifiableArray extends _interceptors.JSArray$(E) {}
  (JSUnmodifiableArray.new = function() {
    JSUnmodifiableArray.__proto__.new.call(this);
  }).prototype = JSUnmodifiableArray.prototype;
  dart.addTypeTests(JSUnmodifiableArray);
  JSUnmodifiableArray.prototype[_is_JSUnmodifiableArray_default] = true;
  dart.setLibraryUri(JSUnmodifiableArray, "dart:_interceptors");
  return JSUnmodifiableArray;
});
_interceptors.JSUnmodifiableArray = _interceptors.JSUnmodifiableArray$();
dart.addTypeTests(_interceptors.JSUnmodifiableArray, _is_JSUnmodifiableArray_default);
const _iterable = dart.privateName(_interceptors, "_iterable");
const _length = dart.privateName(_interceptors, "_length");
const _index = dart.privateName(_interceptors, "_index");
const _current = dart.privateName(_interceptors, "_current");
const _is_ArrayIterator_default = Symbol('_is_ArrayIterator_default');
_interceptors.ArrayIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  class ArrayIterator extends core.Object {
    get current() {
      return this[_current];
    }
    moveNext() {
      let length = this[_iterable][$length];
      if (this[_length] !== length) {
        dart.throw(_js_helper.throwConcurrentModificationError(this[_iterable]));
      }
      if (this[_index] >= length) {
        this[_current] = null;
        return false;
      }
      this[_current] = this[_iterable][$_get](this[_index]);
      this[_index]++;
      return true;
    }
  }
  (ArrayIterator.new = function(iterable) {
    this[_current] = null;
    this[_iterable] = iterable;
    this[_length] = iterable[$length];
    this[_index] = 0;
  }).prototype = ArrayIterator.prototype;
  dart.addTypeTests(ArrayIterator);
  ArrayIterator.prototype[_is_ArrayIterator_default] = true;
  ArrayIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(ArrayIterator, () => ({
    __proto__: dart.getMethods(ArrayIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(ArrayIterator, () => ({
    __proto__: dart.getGetters(ArrayIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(ArrayIterator, "dart:_interceptors");
  dart.setFieldSignature(ArrayIterator, () => ({
    __proto__: dart.getFields(ArrayIterator.__proto__),
    [_iterable]: dart.finalFieldType(JSArrayOfE()),
    [_length]: dart.finalFieldType(core.int),
    [_index]: dart.fieldType(core.int),
    [_current]: dart.fieldType(E)
  }));
  return ArrayIterator;
});
_interceptors.ArrayIterator = _interceptors.ArrayIterator$();
dart.addTypeTests(_interceptors.ArrayIterator, _is_ArrayIterator_default);
const _isInt32 = dart.privateName(_interceptors, "_isInt32");
const _tdivSlow = dart.privateName(_interceptors, "_tdivSlow");
const _shlPositive = dart.privateName(_interceptors, "_shlPositive");
const _shrOtherPositive = dart.privateName(_interceptors, "_shrOtherPositive");
const _shrBothPositive = dart.privateName(_interceptors, "_shrBothPositive");
_interceptors.JSNumber = class JSNumber extends _interceptors.Interceptor {
  [$compareTo](b) {
    core.num._check(b);
    if (b == null) dart.argumentError(b);
    if (this < b) {
      return -1;
    } else if (this > b) {
      return 1;
    } else if (this === b) {
      if (this === 0) {
        let bIsNegative = b[$isNegative];
        if (this[$isNegative] === bIsNegative) return 0;
        if (this[$isNegative]) return -1;
        return 1;
      }
      return 0;
    } else if (this[$isNaN]) {
      if (b[$isNaN]) {
        return 0;
      }
      return 1;
    } else {
      return -1;
    }
  }
  get [$isNegative]() {
    return this === 0 ? 1 / this < 0 : this < 0;
  }
  get [$isNaN]() {
    return isNaN(this);
  }
  get [$isInfinite]() {
    return this == 1 / 0 || this == -1 / 0;
  }
  get [$isFinite]() {
    return isFinite(this);
  }
  [$remainder](b) {
    if (b == null) dart.argumentError(b);
    return this % b;
  }
  [$abs]() {
    return Math.abs(this);
  }
  get [$sign]() {
    return this > 0 ? 1 : this < 0 ? -1 : this;
  }
  [$toInt]() {
    if (this >= -2147483648 && this <= 2147483647) {
      return this | 0;
    }
    if (isFinite(this)) {
      return this[$truncateToDouble]() + 0;
    }
    dart.throw(new core.UnsupportedError.new("" + this));
  }
  [$truncate]() {
    return this[$toInt]();
  }
  [$ceil]() {
    return this[$ceilToDouble]()[$toInt]();
  }
  [$floor]() {
    return this[$floorToDouble]()[$toInt]();
  }
  [$round]() {
    if (this > 0) {
      if (this !== 1 / 0) {
        return Math.round(this);
      }
    } else if (this > -1 / 0) {
      return 0 - Math.round(0 - this);
    }
    dart.throw(new core.UnsupportedError.new("" + this));
  }
  [$ceilToDouble]() {
    return Math.ceil(this);
  }
  [$floorToDouble]() {
    return Math.floor(this);
  }
  [$roundToDouble]() {
    if (this < 0) {
      return -Math.round(-this);
    } else {
      return Math.round(this);
    }
  }
  [$truncateToDouble]() {
    return this < 0 ? this[$ceilToDouble]() : this[$floorToDouble]();
  }
  [$clamp](lowerLimit, upperLimit) {
    if (lowerLimit == null) dart.argumentError(lowerLimit);
    if (upperLimit == null) dart.argumentError(upperLimit);
    if (lowerLimit[$compareTo](upperLimit) > 0) {
      dart.throw(_js_helper.argumentErrorValue(lowerLimit));
    }
    if (this[$compareTo](lowerLimit) < 0) return lowerLimit;
    if (this[$compareTo](upperLimit) > 0) return upperLimit;
    return this;
  }
  [$toDouble]() {
    return this;
  }
  [$toStringAsFixed](fractionDigits) {
    if (fractionDigits < 0 || fractionDigits > 20) {
      dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
    }
    let result = this.toFixed(fractionDigits);
    if (this === 0 && this[$isNegative]) return "-" + result;
    return result;
  }
  [$toStringAsExponential](fractionDigits) {
    if (fractionDigits === void 0) fractionDigits = null;
    let result = null;
    if (fractionDigits != null) {
      let _fractionDigits = fractionDigits;
      if (_fractionDigits < 0 || _fractionDigits > 20) {
        dart.throw(new core.RangeError.range(_fractionDigits, 0, 20, "fractionDigits"));
      }
      result = this.toExponential(_fractionDigits);
    } else {
      result = this.toExponential();
    }
    if (this === 0 && this[$isNegative]) return "-" + dart.str(result);
    return result;
  }
  [$toStringAsPrecision](precision) {
    if (precision == null) dart.argumentError(precision);
    if (precision < 1 || precision > 21) {
      dart.throw(new core.RangeError.range(precision, 1, 21, "precision"));
    }
    let result = this.toPrecision(precision);
    if (this === 0 && this[$isNegative]) return "-" + result;
    return result;
  }
  [$toRadixString](radix) {
    if (radix == null) dart.argumentError(radix);
    if (radix < 2 || radix > 36) {
      dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
    }
    let result = this.toString(radix);
    let rightParenCode = 41;
    if (result[$codeUnitAt](result.length - 1) !== rightParenCode) {
      return result;
    }
    return _interceptors.JSNumber._handleIEtoString(result);
  }
  static _handleIEtoString(result) {
    let match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
    if (match == null) {
      dart.throw(new core.UnsupportedError.new("Unexpected toString result: " + dart.str(result)));
    }
    result = match[$_get](1);
    let exponent = +match[$_get](3);
    if (match[$_get](2) != null) {
      result = result + match[$_get](2);
      exponent = exponent - match[$_get](2).length;
    }
    return dart.notNull(result) + "0"[$times](exponent);
  }
  [$toString]() {
    if (this === 0 && 1 / this < 0) {
      return "-0.0";
    } else {
      return "" + this;
    }
  }
  get [$hashCode]() {
    let intValue = this | 0;
    if (this === intValue) return 536870911 & intValue;
    let absolute = Math.abs(this);
    let lnAbsolute = Math.log(absolute);
    let log2 = lnAbsolute / 0.6931471805599453;
    let floorLog2 = log2 | 0;
    let factor = Math.pow(2, floorLog2);
    let scaled = absolute < 1 ? absolute / factor : factor / absolute;
    let rescaled1 = scaled * 9007199254740992;
    let rescaled2 = scaled * 3542243181176521;
    let d1 = rescaled1 | 0;
    let d2 = rescaled2 | 0;
    let d3 = floorLog2;
    let h = 536870911 & (d1 + d2) * (601 * 997) + d3 * 1259;
    return h;
  }
  [$_negate]() {
    return -this;
  }
  [$plus](other) {
    if (other == null) dart.argumentError(other);
    return this + other;
  }
  [$minus](other) {
    if (other == null) dart.argumentError(other);
    return this - other;
  }
  [$divide](other) {
    if (other == null) dart.argumentError(other);
    return this / other;
  }
  [$times](other) {
    if (other == null) dart.argumentError(other);
    return this * other;
  }
  [$modulo](other) {
    if (other == null) dart.argumentError(other);
    let result = this % other;
    if (result === 0) return 0;
    if (result > 0) return result;
    if (other < 0) {
      return result - other;
    } else {
      return result + other;
    }
  }
  [_isInt32](value) {
    return (value | 0) === value;
  }
  [$floorDivide](other) {
    if (other == null) dart.argumentError(other);
    if (this[_isInt32](this) && this[_isInt32](other) && 0 !== other && -1 !== other) {
      return this / other | 0;
    } else {
      return this[_tdivSlow](other);
    }
  }
  [_tdivSlow](other) {
    return (this / other)[$toInt]();
  }
  [$leftShift](other) {
    if (other == null) dart.argumentError(other);
    if (other < 0) _js_helper.throwArgumentErrorValue(other);
    return this[_shlPositive](other);
  }
  [_shlPositive](other) {
    return other > 31 ? 0 : this << other >>> 0;
  }
  [$rightShift](other) {
    if (other == null) dart.argumentError(other);
    if (other < 0) _js_helper.throwArgumentErrorValue(other);
    return this[_shrOtherPositive](other);
  }
  [_shrOtherPositive](other) {
    return this > 0 ? this[_shrBothPositive](other) : this >> (other > 31 ? 31 : other) >>> 0;
  }
  [_shrBothPositive](other) {
    return other > 31 ? 0 : this >>> other;
  }
  [$bitAnd](other) {
    if (other == null) dart.argumentError(other);
    return (this & other) >>> 0;
  }
  [$bitOr](other) {
    if (other == null) dart.argumentError(other);
    return (this | other) >>> 0;
  }
  [$bitXor](other) {
    if (other == null) dart.argumentError(other);
    return (this ^ other) >>> 0;
  }
  [$lessThan](other) {
    if (other == null) dart.argumentError(other);
    return this < other;
  }
  [$greaterThan](other) {
    if (other == null) dart.argumentError(other);
    return this > other;
  }
  [$lessOrEquals](other) {
    if (other == null) dart.argumentError(other);
    return this <= other;
  }
  [$greaterOrEquals](other) {
    if (other == null) dart.argumentError(other);
    return this >= other;
  }
  get [$isEven]() {
    return (this & 1) === 0;
  }
  get [$isOdd]() {
    return (this & 1) === 1;
  }
  [$toUnsigned](width) {
    if (width == null) dart.argumentError(width);
    return (this & (1)[$leftShift](width) - 1) >>> 0;
  }
  [$toSigned](width) {
    if (width == null) dart.argumentError(width);
    let signMask = (1)[$leftShift](width - 1);
    return ((this & signMask - 1) >>> 0) - ((this & signMask) >>> 0);
  }
  get [$bitLength]() {
    let nonneg = this < 0 ? -this - 1 : this;
    let wordBits = 32;
    while (nonneg >= 4294967296) {
      nonneg = (nonneg / 4294967296)[$truncate]();
      wordBits = wordBits + 32;
    }
    return wordBits - _interceptors.JSNumber._clz32(nonneg);
  }
  static _clz32(uint32) {
    return 32 - _interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(uint32));
  }
  [$modPow](e, m) {
    if (e == null) dart.argumentError(e);
    if (m == null) dart.argumentError(m);
    if (e < 0) dart.throw(new core.RangeError.range(e, 0, null, "exponent"));
    if (m <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
    if (e === 0) return 1;
    let b = this;
    if (b < 0 || b > m) {
      b = b[$modulo](m);
    }
    let r = 1;
    while (e > 0) {
      if (e[$isOdd]) {
        r = (r * b)[$modulo](m);
      }
      e = (e / 2)[$truncate]();
      b = (b * b)[$modulo](m);
    }
    return r;
  }
  static _binaryGcd(x, y, inv) {
    let s = 1;
    if (!inv) {
      while (x[$isEven] && y[$isEven]) {
        x = (x / 2)[$truncate]();
        y = (y / 2)[$truncate]();
        s = s * 2;
      }
      if (y[$isOdd]) {
        let t = x;
        x = y;
        y = t;
      }
    }
    let ac = x[$isEven];
    let u = x;
    let v = y;
    let a = 1, b = 0, c = 0, d = 1;
    do {
      while (u[$isEven]) {
        u = (u / 2)[$truncate]();
        if (ac) {
          if (!a[$isEven] || !b[$isEven]) {
            a = a + y;
            b = b - x;
          }
          a = (a / 2)[$truncate]();
        } else if (!b[$isEven]) {
          b = b - x;
        }
        b = (b / 2)[$truncate]();
      }
      while (v[$isEven]) {
        v = (v / 2)[$truncate]();
        if (ac) {
          if (!c[$isEven] || !d[$isEven]) {
            c = c + y;
            d = d - x;
          }
          c = (c / 2)[$truncate]();
        } else if (!d[$isEven]) {
          d = d - x;
        }
        d = (d / 2)[$truncate]();
      }
      if (u >= v) {
        u = u - v;
        if (ac) {
          a = a - c;
        }
        b = b - d;
      } else {
        v = v - u;
        if (ac) {
          c = c - a;
        }
        d = d - b;
      }
    } while (u !== 0);
    if (!inv) return s * v;
    if (v !== 1) dart.throw(core.Exception.new("Not coprime"));
    if (d < 0) {
      d = d + x;
      if (d < 0) {
        d = d + x;
      }
    } else if (d > x) {
      d = d - x;
      if (d > x) {
        d = d - x;
      }
    }
    return d;
  }
  [$modInverse](m) {
    if (m == null) dart.argumentError(m);
    if (m <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
    if (m === 1) return 0;
    let t = this;
    if (t < 0 || t >= m) {
      t = t[$modulo](m);
    }
    if (t === 1) return 1;
    if (t === 0 || t[$isEven] && m[$isEven]) {
      dart.throw(core.Exception.new("Not coprime"));
    }
    return _interceptors.JSNumber._binaryGcd(m, t, true);
  }
  [$gcd](other) {
    if (other == null) dart.argumentError(other);
    let x = this[$abs]();
    let y = other[$abs]();
    if (x === 0) return y;
    if (y === 0) return x;
    if (x === 1 || y === 1) return 1;
    return _interceptors.JSNumber._binaryGcd(x, y, false);
  }
  static _bitCount(i) {
    i = _interceptors.JSNumber._shru(i, 0) - (_interceptors.JSNumber._shru(i, 1) & 1431655765);
    i = (i & 858993459) + (_interceptors.JSNumber._shru(i, 2) & 858993459);
    i = 252645135 & i + _interceptors.JSNumber._shru(i, 4);
    i = i + _interceptors.JSNumber._shru(i, 8);
    i = i + _interceptors.JSNumber._shru(i, 16);
    return i & 63;
  }
  static _shru(value, shift) {
    return value >>> shift;
  }
  static _shrs(value, shift) {
    return value >> shift;
  }
  static _ors(a, b) {
    return a | b;
  }
  static _spread(i) {
    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 1));
    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 2));
    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 4));
    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 8));
    i = _interceptors.JSNumber._shru(_interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 16)), 0);
    return i;
  }
  [$bitNot]() {
    return ~this >>> 0;
  }
};
(_interceptors.JSNumber.new = function() {
  _interceptors.JSNumber.__proto__.new.call(this);
}).prototype = _interceptors.JSNumber.prototype;
dart.addTypeTests(_interceptors.JSNumber);
_interceptors.JSNumber[dart.implements] = () => [core.int, core.double];
dart.setMethodSignature(_interceptors.JSNumber, () => ({
  __proto__: dart.getMethods(_interceptors.JSNumber.__proto__),
  [$compareTo]: dart.fnType(core.int, [core.Object]),
  [$remainder]: dart.fnType(_interceptors.JSNumber, [core.num]),
  [$abs]: dart.fnType(_interceptors.JSNumber, []),
  [$toInt]: dart.fnType(core.int, []),
  [$truncate]: dart.fnType(core.int, []),
  [$ceil]: dart.fnType(core.int, []),
  [$floor]: dart.fnType(core.int, []),
  [$round]: dart.fnType(core.int, []),
  [$ceilToDouble]: dart.fnType(core.double, []),
  [$floorToDouble]: dart.fnType(core.double, []),
  [$roundToDouble]: dart.fnType(core.double, []),
  [$truncateToDouble]: dart.fnType(core.double, []),
  [$clamp]: dart.fnType(core.num, [core.num, core.num]),
  [$toDouble]: dart.fnType(core.double, []),
  [$toStringAsFixed]: dart.fnType(core.String, [core.int]),
  [$toStringAsExponential]: dart.fnType(core.String, [], [core.int]),
  [$toStringAsPrecision]: dart.fnType(core.String, [core.int]),
  [$toRadixString]: dart.fnType(core.String, [core.int]),
  [$_negate]: dart.fnType(_interceptors.JSNumber, []),
  [$plus]: dart.fnType(_interceptors.JSNumber, [core.num]),
  [$minus]: dart.fnType(_interceptors.JSNumber, [core.num]),
  [$divide]: dart.fnType(core.double, [core.num]),
  [$times]: dart.fnType(_interceptors.JSNumber, [core.num]),
  [$modulo]: dart.fnType(_interceptors.JSNumber, [core.num]),
  [_isInt32]: dart.fnType(core.bool, [core.num]),
  [$floorDivide]: dart.fnType(core.int, [core.num]),
  [_tdivSlow]: dart.fnType(core.int, [core.num]),
  [$leftShift]: dart.fnType(core.int, [core.num]),
  [_shlPositive]: dart.fnType(core.int, [core.num]),
  [$rightShift]: dart.fnType(core.int, [core.num]),
  [_shrOtherPositive]: dart.fnType(core.int, [core.num]),
  [_shrBothPositive]: dart.fnType(core.int, [core.num]),
  [$bitAnd]: dart.fnType(core.int, [core.num]),
  [$bitOr]: dart.fnType(core.int, [core.num]),
  [$bitXor]: dart.fnType(core.int, [core.num]),
  [$lessThan]: dart.fnType(core.bool, [core.num]),
  [$greaterThan]: dart.fnType(core.bool, [core.num]),
  [$lessOrEquals]: dart.fnType(core.bool, [core.num]),
  [$greaterOrEquals]: dart.fnType(core.bool, [core.num]),
  [$toUnsigned]: dart.fnType(core.int, [core.int]),
  [$toSigned]: dart.fnType(core.int, [core.int]),
  [$modPow]: dart.fnType(core.int, [core.int, core.int]),
  [$modInverse]: dart.fnType(core.int, [core.int]),
  [$gcd]: dart.fnType(core.int, [core.int]),
  [$bitNot]: dart.fnType(core.int, [])
}));
dart.setGetterSignature(_interceptors.JSNumber, () => ({
  __proto__: dart.getGetters(_interceptors.JSNumber.__proto__),
  [$isNegative]: core.bool,
  [$isNaN]: core.bool,
  [$isInfinite]: core.bool,
  [$isFinite]: core.bool,
  [$sign]: _interceptors.JSNumber,
  [$isEven]: core.bool,
  [$isOdd]: core.bool,
  [$bitLength]: core.int
}));
dart.setLibraryUri(_interceptors.JSNumber, "dart:_interceptors");
dart.defineLazy(_interceptors.JSNumber, {
  /*_interceptors.JSNumber._MIN_INT32*/get _MIN_INT32() {
    return -2147483648;
  },
  /*_interceptors.JSNumber._MAX_INT32*/get _MAX_INT32() {
    return 2147483647;
  }
});
dart.definePrimitiveHashCode(_interceptors.JSNumber.prototype);
dart.registerExtension("Number", _interceptors.JSNumber);
const _defaultSplit = dart.privateName(_interceptors, "_defaultSplit");
let const$2;
_interceptors.JSString = class JSString extends _interceptors.Interceptor {
  [$codeUnitAt](index) {
    if (index == null) dart.argumentError(index);
    let len = this.length;
    if (index < 0 || index >= len) {
      dart.throw(core.RangeError.index(index, this, "index", null, len));
    }
    return this.charCodeAt(index);
  }
  [$allMatches](string, start) {
    if (string == null) dart.argumentError(string);
    if (start === void 0) start = 0;
    if (start == null) dart.argumentError(start);
    let len = string.length;
    if (0 > start || start > len) {
      dart.throw(new core.RangeError.range(start, 0, len));
    }
    return _js_helper.allMatchesInStringUnchecked(this, string, start);
  }
  [$matchAsPrefix](string, start) {
    if (string == null) dart.argumentError(string);
    if (start === void 0) start = 0;
    if (start == null) dart.argumentError(start);
    let stringLength = string.length;
    if (start < 0 || start > stringLength) {
      dart.throw(new core.RangeError.range(start, 0, stringLength));
    }
    let thisLength = this.length;
    if (start + thisLength > stringLength) return null;
    for (let i = 0; i < thisLength; i++) {
      if (string[$codeUnitAt](start + i) !== this[$codeUnitAt](i)) {
        return null;
      }
    }
    return new _js_helper.StringMatch.new(start, string, this);
  }
  [$plus](other) {
    if (other == null) dart.argumentError(other);
    return this + other;
  }
  [$endsWith](other) {
    if (other == null) dart.argumentError(other);
    let otherLength = other.length;
    let thisLength = this.length;
    if (otherLength > thisLength) return false;
    return other === this[$substring](thisLength - otherLength);
  }
  [$replaceAll](from, to) {
    if (to == null) dart.argumentError(to);
    return _js_helper.stringReplaceAllUnchecked(this, from, to);
  }
  [$replaceAllMapped](from, convert) {
    return this[$splitMapJoin](from, {onMatch: convert});
  }
  [$splitMapJoin](from, opts) {
    let onMatch = opts && 'onMatch' in opts ? opts.onMatch : null;
    let onNonMatch = opts && 'onNonMatch' in opts ? opts.onNonMatch : null;
    return _js_helper.stringReplaceAllFuncUnchecked(this, from, onMatch, onNonMatch);
  }
  [$replaceFirst](from, to, startIndex) {
    if (to == null) dart.argumentError(to);
    if (startIndex === void 0) startIndex = 0;
    if (startIndex == null) dart.argumentError(startIndex);
    core.RangeError.checkValueInInterval(startIndex, 0, this.length, "startIndex");
    return _js_helper.stringReplaceFirstUnchecked(this, from, to, startIndex);
  }
  [$replaceFirstMapped](from, replace, startIndex) {
    if (replace == null) dart.argumentError(replace);
    if (startIndex === void 0) startIndex = 0;
    if (startIndex == null) dart.argumentError(startIndex);
    core.RangeError.checkValueInInterval(startIndex, 0, this.length, "startIndex");
    return _js_helper.stringReplaceFirstMappedUnchecked(this, from, replace, startIndex);
  }
  [$split](pattern) {
    if (pattern == null) dart.argumentError(pattern);
    if (typeof pattern == 'string') {
      return JSArrayOfString().of(this.split(pattern));
    } else if (_js_helper.JSSyntaxRegExp.is(pattern) && _js_helper.regExpCaptureCount(pattern) === 0) {
      let re = _js_helper.regExpGetNative(pattern);
      return JSArrayOfString().of(this.split(re));
    } else {
      return this[_defaultSplit](pattern);
    }
  }
  [$replaceRange](start, end, replacement) {
    if (start == null) dart.argumentError(start);
    if (replacement == null) dart.argumentError(replacement);
    end = core.RangeError.checkValidRange(start, end, this.length);
    return _js_helper.stringReplaceRangeUnchecked(this, start, end, replacement);
  }
  [_defaultSplit](pattern) {
    let result = JSArrayOfString().of([]);
    let start = 0;
    let length = 1;
    for (let match of pattern[$allMatches](this)) {
      let matchStart = match.start;
      let matchEnd = match.end;
      length = matchEnd - matchStart;
      if (length === 0 && start === matchStart) {
        continue;
      }
      let end = matchStart;
      result[$add](this[$substring](start, end));
      start = matchEnd;
    }
    if (start < this.length || length > 0) {
      result[$add](this[$substring](start));
    }
    return result;
  }
  [$startsWith](pattern, index) {
    if (index === void 0) index = 0;
    if (index == null) dart.argumentError(index);
    let length = this.length;
    if (index < 0 || index > length) {
      dart.throw(new core.RangeError.range(index, 0, this.length));
    }
    if (typeof pattern == 'string') {
      let other = pattern;
      let otherLength = other.length;
      let endIndex = index + otherLength;
      if (endIndex > length) return false;
      return other === this.substring(index, endIndex);
    }
    return pattern[$matchAsPrefix](this, index) != null;
  }
  [$substring](startIndex, _endIndex) {
    if (startIndex == null) dart.argumentError(startIndex);
    if (_endIndex === void 0) _endIndex = null;
    let length = this.length;
    let endIndex = _endIndex != null ? _endIndex : length;
    if (startIndex < 0) dart.throw(new core.RangeError.value(startIndex));
    if (startIndex > endIndex) dart.throw(new core.RangeError.value(startIndex));
    if (endIndex > length) dart.throw(new core.RangeError.value(endIndex));
    return this.substring(startIndex, endIndex);
  }
  [$toLowerCase]() {
    return this.toLowerCase();
  }
  [$toUpperCase]() {
    return this.toUpperCase();
  }
  static _isWhitespace(codeUnit) {
    if (codeUnit < 256) {
      switch (codeUnit) {
        case 9:
        case 10:
        case 11:
        case 12:
        case 13:
        case 32:
        case 133:
        case 160:
        {
          return true;
        }
        default:
        {
          return false;
        }
      }
    }
    switch (codeUnit) {
      case 5760:
      case 8192:
      case 8193:
      case 8194:
      case 8195:
      case 8196:
      case 8197:
      case 8198:
      case 8199:
      case 8200:
      case 8201:
      case 8202:
      case 8232:
      case 8233:
      case 8239:
      case 8287:
      case 12288:
      case 65279:
      {
        return true;
      }
      default:
      {
        return false;
      }
    }
  }
  static _skipLeadingWhitespace(string, index) {
    if (index == null) dart.argumentError(index);
    let SPACE = 32;
    let CARRIAGE_RETURN = 13;
    let stringLength = string.length;
    while (index < stringLength) {
      let codeUnit = string[$codeUnitAt](index);
      if (codeUnit !== SPACE && codeUnit !== CARRIAGE_RETURN && !_interceptors.JSString._isWhitespace(codeUnit)) {
        break;
      }
      index++;
    }
    return index;
  }
  static _skipTrailingWhitespace(string, index) {
    if (index == null) dart.argumentError(index);
    let SPACE = 32;
    let CARRIAGE_RETURN = 13;
    while (index > 0) {
      let codeUnit = string[$codeUnitAt](index - 1);
      if (codeUnit !== SPACE && codeUnit !== CARRIAGE_RETURN && !_interceptors.JSString._isWhitespace(codeUnit)) {
        break;
      }
      index--;
    }
    return index;
  }
  [$trim]() {
    let NEL = 133;
    let result = this.trim();
    let length = result.length;
    if (length === 0) return result;
    let firstCode = result[$codeUnitAt](0);
    let startIndex = 0;
    if (firstCode === NEL) {
      startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
      if (startIndex === length) return "";
    }
    let endIndex = length;
    let lastCode = result[$codeUnitAt](endIndex - 1);
    if (lastCode === NEL) {
      endIndex = _interceptors.JSString._skipTrailingWhitespace(result, endIndex - 1);
    }
    if (startIndex === 0 && endIndex === length) return result;
    return result.substring(startIndex, endIndex);
  }
  [$trimLeft]() {
    let NEL = 133;
    let result = null;
    let startIndex = 0;
    if (typeof this.trimLeft != "undefined") {
      result = this.trimLeft();
      if (result.length === 0) return result;
      let firstCode = result[$codeUnitAt](0);
      if (firstCode === NEL) {
        startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
      }
    } else {
      result = this;
      startIndex = _interceptors.JSString._skipLeadingWhitespace(this, 0);
    }
    if (startIndex === 0) return result;
    if (startIndex === result.length) return "";
    return result.substring(startIndex);
  }
  [$trimRight]() {
    let NEL = 133;
    let result = null;
    let endIndex = 0;
    if (typeof this.trimRight != "undefined") {
      result = this.trimRight();
      endIndex = result.length;
      if (endIndex === 0) return result;
      let lastCode = result[$codeUnitAt](endIndex - 1);
      if (lastCode === NEL) {
        endIndex = _interceptors.JSString._skipTrailingWhitespace(result, endIndex - 1);
      }
    } else {
      result = this;
      endIndex = _interceptors.JSString._skipTrailingWhitespace(this, this.length);
    }
    if (endIndex === result.length) return result;
    if (endIndex === 0) return "";
    return result.substring(0, endIndex);
  }
  [$times](times) {
    if (times == null) dart.argumentError(times);
    if (0 >= times) return "";
    if (times === 1 || this.length === 0) return this;
    if (times !== times >>> 0) {
      dart.throw(const$2 || (const$2 = dart.const(new core.OutOfMemoryError.new())));
    }
    let result = "";
    let s = this;
    while (true) {
      if ((times & 1) === 1) result = s + result;
      times = times >>> 1;
      if (times === 0) break;
      s = s + s;
    }
    return result;
  }
  [$padLeft](width, padding) {
    if (width == null) dart.argumentError(width);
    if (padding === void 0) padding = " ";
    let delta = width - this.length;
    if (delta <= 0) return this;
    return padding[$times](delta) + this;
  }
  [$padRight](width, padding) {
    if (width == null) dart.argumentError(width);
    if (padding === void 0) padding = " ";
    let delta = width - this.length;
    if (delta <= 0) return this;
    return this[$plus](padding[$times](delta));
  }
  get [$codeUnits]() {
    return new _internal.CodeUnits.new(this);
  }
  get [$runes]() {
    return new core.Runes.new(this);
  }
  [$indexOf](pattern, start) {
    if (pattern == null) dart.argumentError(pattern);
    if (start === void 0) start = 0;
    if (start == null) dart.argumentError(start);
    if (start < 0 || start > this.length) {
      dart.throw(new core.RangeError.range(start, 0, this.length));
    }
    if (typeof pattern == 'string') {
      return _js_helper.stringIndexOfStringUnchecked(this, pattern, start);
    }
    if (_js_helper.JSSyntaxRegExp.is(pattern)) {
      let re = pattern;
      let match = _js_helper.firstMatchAfter(re, this, start);
      return match == null ? -1 : match.start;
    }
    let length = this.length;
    for (let i = start; i <= length; i++) {
      if (pattern[$matchAsPrefix](this, i) != null) return i;
    }
    return -1;
  }
  [$lastIndexOf](pattern, _start) {
    if (pattern == null) dart.argumentError(pattern);
    if (_start === void 0) _start = null;
    let length = this.length;
    let start = _start != null ? _start : length;
    if (start < 0 || start > length) {
      dart.throw(new core.RangeError.range(start, 0, length));
    }
    if (typeof pattern == 'string') {
      let other = pattern;
      if (start + other.length > length) {
        start = length - other.length;
      }
      return _js_helper.stringLastIndexOfUnchecked(this, other, start);
    }
    for (let i = start; i >= 0; i--) {
      if (pattern[$matchAsPrefix](this, i) != null) return i;
    }
    return -1;
  }
  [$contains](other, startIndex) {
    if (other == null) dart.argumentError(other);
    if (startIndex === void 0) startIndex = 0;
    if (startIndex == null) dart.argumentError(startIndex);
    if (startIndex < 0 || startIndex > this.length) {
      dart.throw(new core.RangeError.range(startIndex, 0, this.length));
    }
    return _js_helper.stringContainsUnchecked(this, other, startIndex);
  }
  get [$isEmpty]() {
    return this.length === 0;
  }
  get [$isNotEmpty]() {
    return !this[$isEmpty];
  }
  [$compareTo](other) {
    core.String._check(other);
    if (other == null) dart.argumentError(other);
    return this === other ? 0 : this < other ? -1 : 1;
  }
  [$toString]() {
    return this;
  }
  get [$hashCode]() {
    let hash = 0;
    let length = this.length;
    for (let i = 0; i < length; i++) {
      hash = 536870911 & hash + this.charCodeAt(i);
      hash = 536870911 & hash + ((524287 & hash) << 10);
      hash = hash ^ hash >> 6;
    }
    hash = 536870911 & hash + ((67108863 & hash) << 3);
    hash = hash ^ hash >> 11;
    return 536870911 & hash + ((16383 & hash) << 15);
  }
  get [$runtimeType]() {
    return dart.wrapType(core.String);
  }
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index == null) dart.argumentError(index);
    if (index >= this.length || index < 0) {
      dart.throw(_js_helper.diagnoseIndexError(this, index));
    }
    return this[index];
  }
};
(_interceptors.JSString.new = function() {
  this[$length] = null;
  _interceptors.JSString.__proto__.new.call(this);
}).prototype = _interceptors.JSString.prototype;
dart.addTypeTests(_interceptors.JSString);
_interceptors.JSString[dart.implements] = () => [core.String, JSIndexableOfString()];
dart.setMethodSignature(_interceptors.JSString, () => ({
  __proto__: dart.getMethods(_interceptors.JSString.__proto__),
  [$codeUnitAt]: dart.fnType(core.int, [core.int]),
  [$allMatches]: dart.fnType(core.Iterable$(core.Match), [core.String], [core.int]),
  [$matchAsPrefix]: dart.fnType(core.Match, [core.String], [core.int]),
  [$plus]: dart.fnType(core.String, [core.String]),
  [$endsWith]: dart.fnType(core.bool, [core.String]),
  [$replaceAll]: dart.fnType(core.String, [core.Pattern, core.String]),
  [$replaceAllMapped]: dart.fnType(core.String, [core.Pattern, dart.fnType(core.String, [core.Match])]),
  [$splitMapJoin]: dart.fnType(core.String, [core.Pattern], {onMatch: dart.fnType(core.String, [core.Match]), onNonMatch: dart.fnType(core.String, [core.String])}),
  [$replaceFirst]: dart.fnType(core.String, [core.Pattern, core.String], [core.int]),
  [$replaceFirstMapped]: dart.fnType(core.String, [core.Pattern, dart.fnType(core.String, [core.Match])], [core.int]),
  [$split]: dart.fnType(core.List$(core.String), [core.Pattern]),
  [$replaceRange]: dart.fnType(core.String, [core.int, core.int, core.String]),
  [_defaultSplit]: dart.fnType(core.List$(core.String), [core.Pattern]),
  [$startsWith]: dart.fnType(core.bool, [core.Pattern], [core.int]),
  [$substring]: dart.fnType(core.String, [core.int], [core.int]),
  [$toLowerCase]: dart.fnType(core.String, []),
  [$toUpperCase]: dart.fnType(core.String, []),
  [$trim]: dart.fnType(core.String, []),
  [$trimLeft]: dart.fnType(core.String, []),
  [$trimRight]: dart.fnType(core.String, []),
  [$times]: dart.fnType(core.String, [core.int]),
  [$padLeft]: dart.fnType(core.String, [core.int], [core.String]),
  [$padRight]: dart.fnType(core.String, [core.int], [core.String]),
  [$indexOf]: dart.fnType(core.int, [core.Pattern], [core.int]),
  [$lastIndexOf]: dart.fnType(core.int, [core.Pattern], [core.int]),
  [$contains]: dart.fnType(core.bool, [core.Pattern], [core.int]),
  [$compareTo]: dart.fnType(core.int, [core.Object]),
  [$_get]: dart.fnType(core.String, [core.int])
}));
dart.setGetterSignature(_interceptors.JSString, () => ({
  __proto__: dart.getGetters(_interceptors.JSString.__proto__),
  [$codeUnits]: core.List$(core.int),
  [$runes]: core.Runes,
  [$isEmpty]: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setLibraryUri(_interceptors.JSString, "dart:_interceptors");
dart.setFieldSignature(_interceptors.JSString, () => ({
  __proto__: dart.getFields(_interceptors.JSString.__proto__),
  [$length]: dart.finalFieldType(core.int)
}));
dart.definePrimitiveHashCode(_interceptors.JSString.prototype);
dart.registerExtension("String", _interceptors.JSString);
dart.defineLazy(_internal, {
  /*_internal.POWERS_OF_TEN*/get POWERS_OF_TEN() {
    return dart.constList([1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0, 1e+21, 1e+22], core.double);
  }
});
const _string = dart.privateName(_internal, "_string");
const _closeGap = dart.privateName(collection, "_closeGap");
const _filter = dart.privateName(collection, "_filter");
const _is_ListMixin_default = Symbol('_is_ListMixin_default');
collection.ListMixin$ = dart.generic(E => {
  let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let FollowedByIterableOfE = () => (FollowedByIterableOfE = dart.constFn(_internal.FollowedByIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.fnType(E, [])))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.fnType(E, [E, E])))();
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
  let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
  class ListMixin extends core.Object {
    get iterator() {
      return new (ListIteratorOfE()).new(this);
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this[$iterator]);
    }
    elementAt(index) {
      return this[$_get](index);
    }
    followedBy(other) {
      IterableOfE()._check(other);
      return FollowedByIterableOfE().firstEfficient(this, other);
    }
    forEach(action) {
      let length = this[$length];
      for (let i = 0; i < dart.notNull(length); i++) {
        action(this[$_get](i));
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
    }
    get isEmpty() {
      return this[$length] === 0;
    }
    get isNotEmpty() {
      return !dart.test(this[$isEmpty]);
    }
    get first() {
      if (this[$length] === 0) dart.throw(_internal.IterableElementError.noElement());
      return this[$_get](0);
    }
    set first(value) {
      E._check(value);
      if (this[$length] === 0) dart.throw(_internal.IterableElementError.noElement());
      this[$_set](0, value);
    }
    get last() {
      if (this[$length] === 0) dart.throw(_internal.IterableElementError.noElement());
      return this[$_get](dart.notNull(this[$length]) - 1);
    }
    set last(value) {
      E._check(value);
      if (this[$length] === 0) dart.throw(_internal.IterableElementError.noElement());
      this[$_set](dart.notNull(this[$length]) - 1, value);
    }
    get single() {
      if (this[$length] === 0) dart.throw(_internal.IterableElementError.noElement());
      if (dart.notNull(this[$length]) > 1) dart.throw(_internal.IterableElementError.tooMany());
      return this[$_get](0);
    }
    contains(element) {
      let length = this[$length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.equals(this[$_get](i), element)) return true;
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return false;
    }
    every(test) {
      let length = this[$length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (!dart.test(test(this[$_get](i)))) return false;
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return true;
    }
    any(test) {
      let length = this[$length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.test(test(this[$_get](i)))) return true;
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return false;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this[$length];
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this[$_get](i);
        if (dart.test(test(element))) return element;
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this[$length];
      for (let i = dart.notNull(length) - 1; i >= 0; i--) {
        let element = this[$_get](i);
        if (dart.test(test(element))) return element;
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this[$length];
      let match = null;
      let matchFound = false;
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this[$_get](i);
        if (dart.test(test(element))) {
          if (matchFound) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          matchFound = true;
          match = element;
        }
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (matchFound) return match;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    join(separator) {
      if (separator === void 0) separator = "";
      if (this[$length] === 0) return "";
      let buffer = new core.StringBuffer.new();
      buffer.writeAll(this, separator);
      return buffer.toString();
    }
    where(test) {
      return new (WhereIterableOfE()).new(this, test);
    }
    whereType(T) {
      return new (_internal.WhereTypeIterable$(T)).new(this);
    }
    map(T, f) {
      return new (_internal.MappedListIterable$(E, T)).new(this, f);
    }
    expand(T, f) {
      return new (_internal.ExpandIterable$(E, T)).new(this, f);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let length = this[$length];
      if (length === 0) dart.throw(_internal.IterableElementError.noElement());
      let value = this[$_get](0);
      for (let i = 1; i < dart.notNull(length); i++) {
        value = combine(value, this[$_get](i));
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return value;
    }
    fold(T, initialValue, combine) {
      let value = initialValue;
      let length = this[$length];
      for (let i = 0; i < dart.notNull(length); i++) {
        value = combine(value, this[$_get](i));
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return value;
    }
    skip(count) {
      return new (SubListIterableOfE()).new(this, count, null);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE()).new(this, test);
    }
    take(count) {
      return new (SubListIterableOfE()).new(this, 0, count);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE()).new(this, test);
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = null;
      if (dart.test(growable)) {
        result = JSArrayOfE().of([]);
        result[$length] = this[$length];
      } else {
        result = ListOfE().new(this[$length]);
      }
      for (let i = 0; i < dart.notNull(this[$length]); i++) {
        result[$_set](i, this[$_get](i));
      }
      return result;
    }
    toSet() {
      let result = new (_HashSetOfE()).new();
      for (let i = 0; i < dart.notNull(this[$length]); i++) {
        result.add(this[$_get](i));
      }
      return result;
    }
    add(element) {
      E._check(element);
      this[$_set]((() => {
        let x = this[$length];
        this[$length] = dart.notNull(x) + 1;
        return x;
      })(), element);
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      let i = this[$length];
      for (let element of iterable) {
        if (!(this[$length] == i || dart.test(dart.throw(new core.ConcurrentModificationError.new(this))))) dart.assertFailed(null, "dart:collection/list.dart", 262, 14, "this.length == i || (throw ConcurrentModificationError(this))");
        this[$length] = dart.notNull(i) + 1;
        this[$_set](i, element);
        i = dart.notNull(i) + 1;
      }
    }
    remove(element) {
      for (let i = 0; i < dart.notNull(this[$length]); i++) {
        if (dart.equals(this[$_get](i), element)) {
          this[_closeGap](i, i + 1);
          return true;
        }
      }
      return false;
    }
    [_closeGap](start, end) {
      let length = this[$length];
      if (!(0 <= dart.notNull(start))) dart.assertFailed(null, "dart:collection/list.dart", 283, 12, "0 <= start");
      if (!(dart.notNull(start) < dart.notNull(end))) dart.assertFailed(null, "dart:collection/list.dart", 284, 12, "start < end");
      if (!(dart.notNull(end) <= dart.notNull(length))) dart.assertFailed(null, "dart:collection/list.dart", 285, 12, "end <= length");
      let size = dart.notNull(end) - dart.notNull(start);
      for (let i = end; dart.notNull(i) < dart.notNull(length); i = dart.notNull(i) + 1) {
        this[$_set](dart.notNull(i) - size, this[$_get](i));
      }
      this[$length] = dart.notNull(length) - size;
    }
    removeWhere(test) {
      this[_filter](test, false);
    }
    retainWhere(test) {
      this[_filter](test, true);
    }
    [_filter](test, retainMatching) {
      let retained = JSArrayOfE().of([]);
      let length = this[$length];
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this[$_get](i);
        if (test(element) == retainMatching) {
          retained[$add](element);
        }
        if (length != this[$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (retained[$length] != this[$length]) {
        this[$setRange](0, retained[$length], retained);
        this[$length] = retained[$length];
      }
    }
    clear() {
      this[$length] = 0;
    }
    cast(R) {
      return core.List.castFrom(E, R, this);
    }
    removeLast() {
      if (this[$length] === 0) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = this[$_get](dart.notNull(this[$length]) - 1);
      this[$length] = dart.notNull(this[$length]) - 1;
      return result;
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      _internal.Sort.sort(E, this, compare != null ? compare : dart.fn(collection.ListMixin._compareAny, dynamicAnddynamicToint()));
    }
    static _compareAny(a, b) {
      return core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      let t = random;
      t == null ? random = math.Random.new() : t;
      let length = this[$length];
      while (dart.notNull(length) > 1) {
        let pos = random.nextInt(length);
        length = dart.notNull(length) - 1;
        let tmp = this[$_get](length);
        this[$_set](length, this[$_get](pos));
        this[$_set](pos, tmp);
      }
    }
    asMap() {
      return new (ListMapViewOfE()).new(this);
    }
    ['+'](other) {
      ListOfE()._check(other);
      let result = JSArrayOfE().of([]);
      result[$length] = dart.notNull(this[$length]) + dart.notNull(other[$length]);
      result[$setRange](0, this[$length], this);
      result[$setRange](this[$length], result[$length], other);
      return result;
    }
    sublist(start, end) {
      if (end === void 0) end = null;
      let listLength = this[$length];
      let t = end;
      t == null ? end = listLength : t;
      core.RangeError.checkValidRange(start, end, listLength);
      let length = dart.notNull(end) - dart.notNull(start);
      let result = JSArrayOfE().of([]);
      result[$length] = length;
      for (let i = 0; i < length; i++) {
        result[$_set](i, this[$_get](dart.notNull(start) + i));
      }
      return result;
    }
    getRange(start, end) {
      core.RangeError.checkValidRange(start, end, this[$length]);
      return new (SubListIterableOfE()).new(this, start, end);
    }
    removeRange(start, end) {
      core.RangeError.checkValidRange(start, end, this[$length]);
      if (dart.notNull(end) > dart.notNull(start)) {
        this[_closeGap](start, end);
      }
    }
    fillRange(start, end, fill) {
      if (fill === void 0) fill = null;
      E._check(fill);
      core.RangeError.checkValidRange(start, end, this[$length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        this[$_set](i, fill);
      }
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      core.RangeError.checkValidRange(start, end, this[$length]);
      let length = dart.notNull(end) - dart.notNull(start);
      if (length === 0) return;
      core.RangeError.checkNotNegative(skipCount, "skipCount");
      let otherList = null;
      let otherStart = null;
      if (ListOfE().is(iterable)) {
        otherList = iterable;
        otherStart = skipCount;
      } else {
        otherList = iterable[$skip](skipCount)[$toList]({growable: false});
        otherStart = 0;
      }
      if (dart.notNull(otherStart) + length > dart.notNull(otherList[$length])) {
        dart.throw(_internal.IterableElementError.tooFew());
      }
      if (dart.notNull(otherStart) < dart.notNull(start)) {
        for (let i = length - 1; i >= 0; i--) {
          this[$_set](dart.notNull(start) + i, otherList[$_get](dart.notNull(otherStart) + i));
        }
      } else {
        for (let i = 0; i < length; i++) {
          this[$_set](dart.notNull(start) + i, otherList[$_get](dart.notNull(otherStart) + i));
        }
      }
    }
    replaceRange(start, end, newContents) {
      IterableOfE()._check(newContents);
      core.RangeError.checkValidRange(start, end, this[$length]);
      if (!_internal.EfficientLengthIterable.is(newContents)) {
        newContents = newContents[$toList]();
      }
      let removeLength = dart.notNull(end) - dart.notNull(start);
      let insertLength = newContents[$length];
      if (removeLength >= dart.notNull(insertLength)) {
        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
        this[$setRange](start, insertEnd, newContents);
        if (removeLength > dart.notNull(insertLength)) {
          this[_closeGap](insertEnd, end);
        }
      } else {
        let delta = dart.notNull(insertLength) - removeLength;
        let newLength = dart.notNull(this[$length]) + delta;
        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
        this[$length] = newLength;
        this[$setRange](insertEnd, newLength, this, end);
        this[$setRange](start, insertEnd, newContents);
      }
    }
    indexOf(element, start) {
      if (start === void 0) start = 0;
      if (dart.notNull(start) < 0) start = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(this[$length]); i = dart.notNull(i) + 1) {
        if (dart.equals(this[$_get](i), element)) return i;
      }
      return -1;
    }
    indexWhere(test, start) {
      if (start === void 0) start = 0;
      if (dart.notNull(start) < 0) start = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(this[$length]); i = dart.notNull(i) + 1) {
        if (dart.test(test(this[$_get](i)))) return i;
      }
      return -1;
    }
    lastIndexOf(element, start) {
      if (start === void 0) start = null;
      if (start == null || dart.notNull(start) >= dart.notNull(this[$length])) start = dart.notNull(this[$length]) - 1;
      for (let i = start; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.equals(this[$_get](i), element)) return i;
      }
      return -1;
    }
    lastIndexWhere(test, start) {
      if (start === void 0) start = null;
      if (start == null || dart.notNull(start) >= dart.notNull(this[$length])) start = dart.notNull(this[$length]) - 1;
      for (let i = start; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.test(test(this[$_get](i)))) return i;
      }
      return -1;
    }
    insert(index, element) {
      E._check(element);
      core.ArgumentError.checkNotNull(index, "index");
      core.RangeError.checkValueInInterval(index, 0, this[$length], "index");
      if (index == this[$length]) {
        this[$add](element);
        return;
      }
      this[$length] = dart.notNull(this[$length]) + 1;
      this[$setRange](dart.notNull(index) + 1, this[$length], this, index);
      this[$_set](index, element);
    }
    removeAt(index) {
      let result = this[$_get](index);
      this[_closeGap](index, dart.notNull(index) + 1);
      return result;
    }
    insertAll(index, iterable) {
      IterableOfE()._check(iterable);
      core.RangeError.checkValueInInterval(index, 0, this[$length], "index");
      if (!_internal.EfficientLengthIterable.is(iterable) || iterable === this) {
        iterable = iterable[$toList]();
      }
      let insertionLength = iterable[$length];
      this[$length] = dart.notNull(this[$length]) + dart.notNull(insertionLength);
      if (iterable[$length] != insertionLength) {
        this[$length] = dart.notNull(this[$length]) - dart.notNull(insertionLength);
        dart.throw(new core.ConcurrentModificationError.new(iterable));
      }
      this[$setRange](dart.notNull(index) + dart.notNull(insertionLength), this[$length], this, index);
      this[$setAll](index, iterable);
    }
    setAll(index, iterable) {
      IterableOfE()._check(iterable);
      if (core.List.is(iterable)) {
        this[$setRange](index, dart.notNull(index) + dart.notNull(iterable[$length]), iterable);
      } else {
        for (let element of iterable) {
          this[$_set]((() => {
            let x = index;
            index = dart.notNull(x) + 1;
            return x;
          })(), element);
        }
      }
    }
    get reversed() {
      return new (ReversedListIterableOfE()).new(this);
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, "[", "]");
    }
  }
  (ListMixin.new = function() {
  }).prototype = ListMixin.prototype;
  ListMixin.prototype[dart.isList] = true;
  dart.addTypeTests(ListMixin);
  ListMixin.prototype[_is_ListMixin_default] = true;
  ListMixin[dart.implements] = () => [ListOfE()];
  dart.setMethodSignature(ListMixin, () => ({
    __proto__: dart.getMethods(ListMixin.__proto__),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int]),
    followedBy: dart.fnType(core.Iterable$(E), [core.Object]),
    [$followedBy]: dart.fnType(core.Iterable$(E), [core.Object]),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    every: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$every]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    any: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$any]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    firstWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$firstWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    lastWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    singleWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$singleWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    join: dart.fnType(core.String, [], [core.String]),
    [$join]: dart.fnType(core.String, [], [core.String]),
    where: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$where]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    whereType: dart.gFnType(T => [core.Iterable$(T), []]),
    [$whereType]: dart.gFnType(T => [core.Iterable$(T), []]),
    map: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    [$map]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    expand: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    [$expand]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    reduce: dart.fnType(E, [core.Object]),
    [$reduce]: dart.fnType(E, [core.Object]),
    fold: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    [$fold]: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    skip: dart.fnType(core.Iterable$(E), [core.int]),
    [$skip]: dart.fnType(core.Iterable$(E), [core.int]),
    skipWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$skipWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    take: dart.fnType(core.Iterable$(E), [core.int]),
    [$take]: dart.fnType(core.Iterable$(E), [core.int]),
    takeWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$takeWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    toList: dart.fnType(core.List$(E), [], {growable: core.bool}),
    [$toList]: dart.fnType(core.List$(E), [], {growable: core.bool}),
    toSet: dart.fnType(core.Set$(E), []),
    [$toSet]: dart.fnType(core.Set$(E), []),
    add: dart.fnType(dart.void, [core.Object]),
    [$add]: dart.fnType(dart.void, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    [$remove]: dart.fnType(core.bool, [core.Object]),
    [_closeGap]: dart.fnType(dart.void, [core.int, core.int]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$retainWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [_filter]: dart.fnType(dart.void, [dart.fnType(core.bool, [E]), core.bool]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, []),
    cast: dart.gFnType(R => [core.List$(R), []]),
    [$cast]: dart.gFnType(R => [core.List$(R), []]),
    removeLast: dart.fnType(E, []),
    [$removeLast]: dart.fnType(E, []),
    sort: dart.fnType(dart.void, [], [dart.fnType(core.int, [E, E])]),
    [$sort]: dart.fnType(dart.void, [], [dart.fnType(core.int, [E, E])]),
    shuffle: dart.fnType(dart.void, [], [math.Random]),
    [$shuffle]: dart.fnType(dart.void, [], [math.Random]),
    asMap: dart.fnType(core.Map$(core.int, E), []),
    [$asMap]: dart.fnType(core.Map$(core.int, E), []),
    '+': dart.fnType(core.List$(E), [core.Object]),
    [$plus]: dart.fnType(core.List$(E), [core.Object]),
    sublist: dart.fnType(core.List$(E), [core.int], [core.int]),
    [$sublist]: dart.fnType(core.List$(E), [core.int], [core.int]),
    getRange: dart.fnType(core.Iterable$(E), [core.int, core.int]),
    [$getRange]: dart.fnType(core.Iterable$(E), [core.int, core.int]),
    removeRange: dart.fnType(dart.void, [core.int, core.int]),
    [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
    fillRange: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
    [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
    setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    replaceRange: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    indexOf: dart.fnType(core.int, [core.Object], [core.int]),
    [$indexOf]: dart.fnType(core.int, [core.Object], [core.int]),
    indexWhere: dart.fnType(core.int, [dart.fnType(core.bool, [E])], [core.int]),
    [$indexWhere]: dart.fnType(core.int, [dart.fnType(core.bool, [E])], [core.int]),
    lastIndexOf: dart.fnType(core.int, [core.Object], [core.int]),
    [$lastIndexOf]: dart.fnType(core.int, [core.Object], [core.int]),
    lastIndexWhere: dart.fnType(core.int, [dart.fnType(core.bool, [E])], [core.int]),
    [$lastIndexWhere]: dart.fnType(core.int, [dart.fnType(core.bool, [E])], [core.int]),
    insert: dart.fnType(dart.void, [core.int, core.Object]),
    [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
    removeAt: dart.fnType(E, [core.int]),
    [$removeAt]: dart.fnType(E, [core.int]),
    insertAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$insertAll]: dart.fnType(dart.void, [core.int, core.Object]),
    setAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$setAll]: dart.fnType(dart.void, [core.int, core.Object]),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, [])
  }));
  dart.setGetterSignature(ListMixin, () => ({
    __proto__: dart.getGetters(ListMixin.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E),
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    first: E,
    [$first]: E,
    last: E,
    [$last]: E,
    single: E,
    [$single]: E,
    reversed: core.Iterable$(E),
    [$reversed]: core.Iterable$(E)
  }));
  dart.setSetterSignature(ListMixin, () => ({
    __proto__: dart.getSetters(ListMixin.__proto__),
    first: E,
    [$first]: E,
    last: E,
    [$last]: E
  }));
  dart.setLibraryUri(ListMixin, "dart:collection");
  dart.defineExtensionMethods(ListMixin, [
    'elementAt',
    'followedBy',
    'forEach',
    'contains',
    'every',
    'any',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'join',
    'where',
    'whereType',
    'map',
    'expand',
    'reduce',
    'fold',
    'skip',
    'skipWhile',
    'take',
    'takeWhile',
    'toList',
    'toSet',
    'add',
    'addAll',
    'remove',
    'removeWhere',
    'retainWhere',
    'clear',
    'cast',
    'removeLast',
    'sort',
    'shuffle',
    'asMap',
    '+',
    'sublist',
    'getRange',
    'removeRange',
    'fillRange',
    'setRange',
    'replaceRange',
    'indexOf',
    'indexWhere',
    'lastIndexOf',
    'lastIndexWhere',
    'insert',
    'removeAt',
    'insertAll',
    'setAll',
    'toString'
  ]);
  dart.defineExtensionAccessors(ListMixin, [
    'iterator',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single',
    'reversed'
  ]);
  return ListMixin;
});
collection.ListMixin = collection.ListMixin$();
dart.addTypeTests(collection.ListMixin, _is_ListMixin_default);
const _is_ListBase_default = Symbol('_is_ListBase_default');
collection.ListBase$ = dart.generic(E => {
  const Object_ListMixin$ = class Object_ListMixin extends core.Object {};
  (Object_ListMixin$.new = function() {
  }).prototype = Object_ListMixin$.prototype;
  dart.applyMixin(Object_ListMixin$, collection.ListMixin$(E));
  class ListBase extends Object_ListMixin$ {
    static listToString(list) {
      return collection.IterableBase.iterableToFullString(list, "[", "]");
    }
  }
  (ListBase.new = function() {
  }).prototype = ListBase.prototype;
  dart.addTypeTests(ListBase);
  ListBase.prototype[_is_ListBase_default] = true;
  dart.setLibraryUri(ListBase, "dart:collection");
  return ListBase;
});
collection.ListBase = collection.ListBase$();
dart.addTypeTests(collection.ListBase, _is_ListBase_default);
const _is_UnmodifiableListMixin_default = Symbol('_is_UnmodifiableListMixin_default');
_internal.UnmodifiableListMixin$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  class UnmodifiableListMixin extends core.Object {
    _set(index, value) {
      E._check(value);
      dart.throw(new core.UnsupportedError.new("Cannot modify an unmodifiable list"));
      return value;
    }
    set length(newLength) {
      dart.throw(new core.UnsupportedError.new("Cannot change the length of an unmodifiable list"));
    }
    set first(element) {
      E._check(element);
      dart.throw(new core.UnsupportedError.new("Cannot modify an unmodifiable list"));
    }
    set last(element) {
      E._check(element);
      dart.throw(new core.UnsupportedError.new("Cannot modify an unmodifiable list"));
    }
    setAll(at, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot modify an unmodifiable list"));
    }
    add(value) {
      E._check(value);
      dart.throw(new core.UnsupportedError.new("Cannot add to an unmodifiable list"));
    }
    insert(index, element) {
      E._check(element);
      dart.throw(new core.UnsupportedError.new("Cannot add to an unmodifiable list"));
    }
    insertAll(at, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot add to an unmodifiable list"));
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot add to an unmodifiable list"));
    }
    remove(element) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from an unmodifiable list"));
    }
    removeWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from an unmodifiable list"));
    }
    retainWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from an unmodifiable list"));
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError.new("Cannot modify an unmodifiable list"));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError.new("Cannot modify an unmodifiable list"));
    }
    clear() {
      dart.throw(new core.UnsupportedError.new("Cannot clear an unmodifiable list"));
    }
    removeAt(index) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from an unmodifiable list"));
    }
    removeLast() {
      dart.throw(new core.UnsupportedError.new("Cannot remove from an unmodifiable list"));
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnsupportedError.new("Cannot modify an unmodifiable list"));
    }
    removeRange(start, end) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from an unmodifiable list"));
    }
    replaceRange(start, end, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot remove from an unmodifiable list"));
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      E._check(fillValue);
      dart.throw(new core.UnsupportedError.new("Cannot modify an unmodifiable list"));
    }
  }
  (UnmodifiableListMixin.new = function() {
  }).prototype = UnmodifiableListMixin.prototype;
  UnmodifiableListMixin.prototype[dart.isList] = true;
  dart.addTypeTests(UnmodifiableListMixin);
  UnmodifiableListMixin.prototype[_is_UnmodifiableListMixin_default] = true;
  UnmodifiableListMixin[dart.implements] = () => [ListOfE()];
  dart.setMethodSignature(UnmodifiableListMixin, () => ({
    __proto__: dart.getMethods(UnmodifiableListMixin.__proto__),
    _set: dart.fnType(dart.void, [core.int, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
    setAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$setAll]: dart.fnType(dart.void, [core.int, core.Object]),
    add: dart.fnType(dart.void, [core.Object]),
    [$add]: dart.fnType(dart.void, [core.Object]),
    insert: dart.fnType(dart.void, [core.int, core.Object]),
    [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
    insertAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$insertAll]: dart.fnType(dart.void, [core.int, core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    [$remove]: dart.fnType(core.bool, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$retainWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    sort: dart.fnType(dart.void, [], [dart.fnType(core.int, [E, E])]),
    [$sort]: dart.fnType(dart.void, [], [dart.fnType(core.int, [E, E])]),
    shuffle: dart.fnType(dart.void, [], [math.Random]),
    [$shuffle]: dart.fnType(dart.void, [], [math.Random]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, []),
    removeAt: dart.fnType(E, [core.int]),
    [$removeAt]: dart.fnType(E, [core.int]),
    removeLast: dart.fnType(E, []),
    [$removeLast]: dart.fnType(E, []),
    setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    removeRange: dart.fnType(dart.void, [core.int, core.int]),
    [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
    replaceRange: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    fillRange: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
    [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object])
  }));
  dart.setSetterSignature(UnmodifiableListMixin, () => ({
    __proto__: dart.getSetters(UnmodifiableListMixin.__proto__),
    length: core.int,
    [$length]: core.int,
    first: E,
    [$first]: E,
    last: E,
    [$last]: E
  }));
  dart.setLibraryUri(UnmodifiableListMixin, "dart:_internal");
  dart.defineExtensionMethods(UnmodifiableListMixin, [
    '_set',
    'setAll',
    'add',
    'insert',
    'insertAll',
    'addAll',
    'remove',
    'removeWhere',
    'retainWhere',
    'sort',
    'shuffle',
    'clear',
    'removeAt',
    'removeLast',
    'setRange',
    'removeRange',
    'replaceRange',
    'fillRange'
  ]);
  dart.defineExtensionAccessors(UnmodifiableListMixin, ['length', 'first', 'last']);
  return UnmodifiableListMixin;
});
_internal.UnmodifiableListMixin = _internal.UnmodifiableListMixin$();
dart.addTypeTests(_internal.UnmodifiableListMixin, _is_UnmodifiableListMixin_default);
const _is_UnmodifiableListBase_default = Symbol('_is_UnmodifiableListBase_default');
_internal.UnmodifiableListBase$ = dart.generic(E => {
  const ListBase_UnmodifiableListMixin$ = class ListBase_UnmodifiableListMixin extends collection.ListBase$(E) {};
  (ListBase_UnmodifiableListMixin$.new = function() {
  }).prototype = ListBase_UnmodifiableListMixin$.prototype;
  dart.applyMixin(ListBase_UnmodifiableListMixin$, _internal.UnmodifiableListMixin$(E));
  class UnmodifiableListBase extends ListBase_UnmodifiableListMixin$ {}
  (UnmodifiableListBase.new = function() {
  }).prototype = UnmodifiableListBase.prototype;
  dart.addTypeTests(UnmodifiableListBase);
  UnmodifiableListBase.prototype[_is_UnmodifiableListBase_default] = true;
  dart.setLibraryUri(UnmodifiableListBase, "dart:_internal");
  return UnmodifiableListBase;
});
_internal.UnmodifiableListBase = _internal.UnmodifiableListBase$();
dart.addTypeTests(_internal.UnmodifiableListBase, _is_UnmodifiableListBase_default);
core.num = class num extends core.Object {
  static parse(input, onError) {
    if (onError === void 0) onError = null;
    let result = core.num.tryParse(input);
    if (result != null) return result;
    if (onError == null) dart.throw(new core.FormatException.new(input));
    return onError(input);
  }
  static tryParse(input) {
    let source = input[$trim]();
    let l = core.int.tryParse(source);
    return l != null ? l : core.double.tryParse(source);
  }
  static _returnIntNull(_) {
    return null;
  }
  static _returnDoubleNull(_) {
    return null;
  }
};
(core.num.new = function() {
}).prototype = core.num.prototype;
core.num.is = function is_num(o) {
  return typeof o == "number";
};
core.num.as = function as_num(o) {
  if (typeof o == "number" || o == null) return o;
  return dart.as(o, core.num, false);
};
core.num._check = function check_num(o) {
  if (typeof o == "number" || o == null) return o;
  return dart.as(o, core.num, true);
};
core.num[dart.implements] = () => [ComparableOfnum()];
dart.setLibraryUri(core.num, "dart:core");
core.int = class int extends core.num {
  static fromEnvironment(name, opts) {
    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
    dart.throw(new core.UnsupportedError.new("int.fromEnvironment can only be used as a const constructor"));
  }
  static parse(source, opts) {
    let radix = opts && 'radix' in opts ? opts.radix : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    return _js_helper.Primitives.parseInt(source, radix, onError);
  }
  static tryParse(source, opts) {
    let radix = opts && 'radix' in opts ? opts.radix : null;
    return _js_helper.Primitives.parseInt(source, radix, dart.fn(core._kNull, dynamicToNull()));
  }
};
core.int.is = function is_int(o) {
  return typeof o == "number" && Math.floor(o) == o;
};
core.int.as = function as_int(o) {
  if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
  return dart.as(o, core.int, false);
};
core.int._check = function check_int(o) {
  if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
  return dart.as(o, core.int, true);
};
dart.setLibraryUri(core.int, "dart:core");
_internal.CodeUnits = class CodeUnits extends _internal.UnmodifiableListBase$(core.int) {
  get length() {
    return this[_string].length;
  }
  set length(value) {
    super.length = value;
  }
  _get(i) {
    return this[_string][$codeUnitAt](i);
  }
  static stringOf(u) {
    return u[_string];
  }
};
(_internal.CodeUnits.new = function(string) {
  this[_string] = string;
}).prototype = _internal.CodeUnits.prototype;
dart.addTypeTests(_internal.CodeUnits);
dart.setMethodSignature(_internal.CodeUnits, () => ({
  __proto__: dart.getMethods(_internal.CodeUnits.__proto__),
  _get: dart.fnType(core.int, [core.int]),
  [$_get]: dart.fnType(core.int, [core.int])
}));
dart.setGetterSignature(_internal.CodeUnits, () => ({
  __proto__: dart.getGetters(_internal.CodeUnits.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(_internal.CodeUnits, "dart:_internal");
dart.setFieldSignature(_internal.CodeUnits, () => ({
  __proto__: dart.getFields(_internal.CodeUnits.__proto__),
  [_string]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_internal.CodeUnits, ['_get']);
dart.defineExtensionAccessors(_internal.CodeUnits, ['length']);
_internal.ExternalName = class ExternalName extends core.Object {};
(_internal.ExternalName.new = function(name) {
  this.name = name;
}).prototype = _internal.ExternalName.prototype;
dart.addTypeTests(_internal.ExternalName);
dart.setLibraryUri(_internal.ExternalName, "dart:_internal");
dart.setFieldSignature(_internal.ExternalName, () => ({
  __proto__: dart.getFields(_internal.ExternalName.__proto__),
  name: dart.finalFieldType(core.String)
}));
_internal.hexDigitValue = function(char) {
  if (!(dart.notNull(char) >= 0 && dart.notNull(char) <= 65535)) dart.assertFailed(null, "dart:_internal", 101, 10, "char >= 0 && char <= 0xFFFF");
  let digit0 = 48;
  let a = 97;
  let f = 102;
  let digit = (dart.notNull(char) ^ digit0) >>> 0;
  if (digit <= 9) return digit;
  let letter = (dart.notNull(char) | 32) >>> 0;
  if (a <= letter && letter <= f) return letter - (a - 10);
  return -1;
};
_internal.parseHexByte = function(source, index) {
  if (!(dart.notNull(index) + 2 <= source.length)) dart.assertFailed(null, "dart:_internal", 116, 10, "index + 2 <= source.length");
  let digit1 = _internal.hexDigitValue(source[$codeUnitAt](index));
  let digit2 = _internal.hexDigitValue(source[$codeUnitAt](dart.notNull(index) + 1));
  return dart.notNull(digit1) * 16 + dart.notNull(digit2) - (dart.notNull(digit2) & 256);
};
_internal.extractTypeArguments = function(T, instance, extract) {
  return dart.extractTypeArguments(T, instance, extract);
};
_internal.Since = class Since extends core.Object {};
(_internal.Since.new = function(version) {
  this.version = version;
}).prototype = _internal.Since.prototype;
dart.addTypeTests(_internal.Since);
dart.setLibraryUri(_internal.Since, "dart:_internal");
dart.setFieldSignature(_internal.Since, () => ({
  __proto__: dart.getFields(_internal.Since.__proto__),
  version: dart.finalFieldType(core.String)
}));
_internal.HttpStatus = class HttpStatus extends core.Object {};
(_internal.HttpStatus.new = function() {
}).prototype = _internal.HttpStatus.prototype;
dart.addTypeTests(_internal.HttpStatus);
dart.setLibraryUri(_internal.HttpStatus, "dart:_internal");
dart.defineLazy(_internal.HttpStatus, {
  /*_internal.HttpStatus.continue__*/get continue__() {
    return 100;
  },
  /*_internal.HttpStatus.switchingProtocols*/get switchingProtocols() {
    return 101;
  },
  /*_internal.HttpStatus.processing*/get processing() {
    return 102;
  },
  /*_internal.HttpStatus.ok*/get ok() {
    return 200;
  },
  /*_internal.HttpStatus.created*/get created() {
    return 201;
  },
  /*_internal.HttpStatus.accepted*/get accepted() {
    return 202;
  },
  /*_internal.HttpStatus.nonAuthoritativeInformation*/get nonAuthoritativeInformation() {
    return 203;
  },
  /*_internal.HttpStatus.noContent*/get noContent() {
    return 204;
  },
  /*_internal.HttpStatus.resetContent*/get resetContent() {
    return 205;
  },
  /*_internal.HttpStatus.partialContent*/get partialContent() {
    return 206;
  },
  /*_internal.HttpStatus.multiStatus*/get multiStatus() {
    return 207;
  },
  /*_internal.HttpStatus.alreadyReported*/get alreadyReported() {
    return 208;
  },
  /*_internal.HttpStatus.imUsed*/get imUsed() {
    return 226;
  },
  /*_internal.HttpStatus.multipleChoices*/get multipleChoices() {
    return 300;
  },
  /*_internal.HttpStatus.movedPermanently*/get movedPermanently() {
    return 301;
  },
  /*_internal.HttpStatus.found*/get found() {
    return 302;
  },
  /*_internal.HttpStatus.movedTemporarily*/get movedTemporarily() {
    return 302;
  },
  /*_internal.HttpStatus.seeOther*/get seeOther() {
    return 303;
  },
  /*_internal.HttpStatus.notModified*/get notModified() {
    return 304;
  },
  /*_internal.HttpStatus.useProxy*/get useProxy() {
    return 305;
  },
  /*_internal.HttpStatus.temporaryRedirect*/get temporaryRedirect() {
    return 307;
  },
  /*_internal.HttpStatus.permanentRedirect*/get permanentRedirect() {
    return 308;
  },
  /*_internal.HttpStatus.badRequest*/get badRequest() {
    return 400;
  },
  /*_internal.HttpStatus.unauthorized*/get unauthorized() {
    return 401;
  },
  /*_internal.HttpStatus.paymentRequired*/get paymentRequired() {
    return 402;
  },
  /*_internal.HttpStatus.forbidden*/get forbidden() {
    return 403;
  },
  /*_internal.HttpStatus.notFound*/get notFound() {
    return 404;
  },
  /*_internal.HttpStatus.methodNotAllowed*/get methodNotAllowed() {
    return 405;
  },
  /*_internal.HttpStatus.notAcceptable*/get notAcceptable() {
    return 406;
  },
  /*_internal.HttpStatus.proxyAuthenticationRequired*/get proxyAuthenticationRequired() {
    return 407;
  },
  /*_internal.HttpStatus.requestTimeout*/get requestTimeout() {
    return 408;
  },
  /*_internal.HttpStatus.conflict*/get conflict() {
    return 409;
  },
  /*_internal.HttpStatus.gone*/get gone() {
    return 410;
  },
  /*_internal.HttpStatus.lengthRequired*/get lengthRequired() {
    return 411;
  },
  /*_internal.HttpStatus.preconditionFailed*/get preconditionFailed() {
    return 412;
  },
  /*_internal.HttpStatus.requestEntityTooLarge*/get requestEntityTooLarge() {
    return 413;
  },
  /*_internal.HttpStatus.requestUriTooLong*/get requestUriTooLong() {
    return 414;
  },
  /*_internal.HttpStatus.unsupportedMediaType*/get unsupportedMediaType() {
    return 415;
  },
  /*_internal.HttpStatus.requestedRangeNotSatisfiable*/get requestedRangeNotSatisfiable() {
    return 416;
  },
  /*_internal.HttpStatus.expectationFailed*/get expectationFailed() {
    return 417;
  },
  /*_internal.HttpStatus.misdirectedRequest*/get misdirectedRequest() {
    return 421;
  },
  /*_internal.HttpStatus.unprocessableEntity*/get unprocessableEntity() {
    return 422;
  },
  /*_internal.HttpStatus.locked*/get locked() {
    return 423;
  },
  /*_internal.HttpStatus.failedDependency*/get failedDependency() {
    return 424;
  },
  /*_internal.HttpStatus.upgradeRequired*/get upgradeRequired() {
    return 426;
  },
  /*_internal.HttpStatus.preconditionRequired*/get preconditionRequired() {
    return 428;
  },
  /*_internal.HttpStatus.tooManyRequests*/get tooManyRequests() {
    return 429;
  },
  /*_internal.HttpStatus.requestHeaderFieldsTooLarge*/get requestHeaderFieldsTooLarge() {
    return 431;
  },
  /*_internal.HttpStatus.connectionClosedWithoutResponse*/get connectionClosedWithoutResponse() {
    return 444;
  },
  /*_internal.HttpStatus.unavailableForLegalReasons*/get unavailableForLegalReasons() {
    return 451;
  },
  /*_internal.HttpStatus.clientClosedRequest*/get clientClosedRequest() {
    return 499;
  },
  /*_internal.HttpStatus.internalServerError*/get internalServerError() {
    return 500;
  },
  /*_internal.HttpStatus.notImplemented*/get notImplemented() {
    return 501;
  },
  /*_internal.HttpStatus.badGateway*/get badGateway() {
    return 502;
  },
  /*_internal.HttpStatus.serviceUnavailable*/get serviceUnavailable() {
    return 503;
  },
  /*_internal.HttpStatus.gatewayTimeout*/get gatewayTimeout() {
    return 504;
  },
  /*_internal.HttpStatus.httpVersionNotSupported*/get httpVersionNotSupported() {
    return 505;
  },
  /*_internal.HttpStatus.variantAlsoNegotiates*/get variantAlsoNegotiates() {
    return 506;
  },
  /*_internal.HttpStatus.insufficientStorage*/get insufficientStorage() {
    return 507;
  },
  /*_internal.HttpStatus.loopDetected*/get loopDetected() {
    return 508;
  },
  /*_internal.HttpStatus.notExtended*/get notExtended() {
    return 510;
  },
  /*_internal.HttpStatus.networkAuthenticationRequired*/get networkAuthenticationRequired() {
    return 511;
  },
  /*_internal.HttpStatus.networkConnectTimeoutError*/get networkConnectTimeoutError() {
    return 599;
  },
  /*_internal.HttpStatus.CONTINUE*/get CONTINUE() {
    return 100;
  },
  /*_internal.HttpStatus.SWITCHING_PROTOCOLS*/get SWITCHING_PROTOCOLS() {
    return 101;
  },
  /*_internal.HttpStatus.OK*/get OK() {
    return 200;
  },
  /*_internal.HttpStatus.CREATED*/get CREATED() {
    return 201;
  },
  /*_internal.HttpStatus.ACCEPTED*/get ACCEPTED() {
    return 202;
  },
  /*_internal.HttpStatus.NON_AUTHORITATIVE_INFORMATION*/get NON_AUTHORITATIVE_INFORMATION() {
    return 203;
  },
  /*_internal.HttpStatus.NO_CONTENT*/get NO_CONTENT() {
    return 204;
  },
  /*_internal.HttpStatus.RESET_CONTENT*/get RESET_CONTENT() {
    return 205;
  },
  /*_internal.HttpStatus.PARTIAL_CONTENT*/get PARTIAL_CONTENT() {
    return 206;
  },
  /*_internal.HttpStatus.MULTIPLE_CHOICES*/get MULTIPLE_CHOICES() {
    return 300;
  },
  /*_internal.HttpStatus.MOVED_PERMANENTLY*/get MOVED_PERMANENTLY() {
    return 301;
  },
  /*_internal.HttpStatus.FOUND*/get FOUND() {
    return 302;
  },
  /*_internal.HttpStatus.MOVED_TEMPORARILY*/get MOVED_TEMPORARILY() {
    return 302;
  },
  /*_internal.HttpStatus.SEE_OTHER*/get SEE_OTHER() {
    return 303;
  },
  /*_internal.HttpStatus.NOT_MODIFIED*/get NOT_MODIFIED() {
    return 304;
  },
  /*_internal.HttpStatus.USE_PROXY*/get USE_PROXY() {
    return 305;
  },
  /*_internal.HttpStatus.TEMPORARY_REDIRECT*/get TEMPORARY_REDIRECT() {
    return 307;
  },
  /*_internal.HttpStatus.BAD_REQUEST*/get BAD_REQUEST() {
    return 400;
  },
  /*_internal.HttpStatus.UNAUTHORIZED*/get UNAUTHORIZED() {
    return 401;
  },
  /*_internal.HttpStatus.PAYMENT_REQUIRED*/get PAYMENT_REQUIRED() {
    return 402;
  },
  /*_internal.HttpStatus.FORBIDDEN*/get FORBIDDEN() {
    return 403;
  },
  /*_internal.HttpStatus.NOT_FOUND*/get NOT_FOUND() {
    return 404;
  },
  /*_internal.HttpStatus.METHOD_NOT_ALLOWED*/get METHOD_NOT_ALLOWED() {
    return 405;
  },
  /*_internal.HttpStatus.NOT_ACCEPTABLE*/get NOT_ACCEPTABLE() {
    return 406;
  },
  /*_internal.HttpStatus.PROXY_AUTHENTICATION_REQUIRED*/get PROXY_AUTHENTICATION_REQUIRED() {
    return 407;
  },
  /*_internal.HttpStatus.REQUEST_TIMEOUT*/get REQUEST_TIMEOUT() {
    return 408;
  },
  /*_internal.HttpStatus.CONFLICT*/get CONFLICT() {
    return 409;
  },
  /*_internal.HttpStatus.GONE*/get GONE() {
    return 410;
  },
  /*_internal.HttpStatus.LENGTH_REQUIRED*/get LENGTH_REQUIRED() {
    return 411;
  },
  /*_internal.HttpStatus.PRECONDITION_FAILED*/get PRECONDITION_FAILED() {
    return 412;
  },
  /*_internal.HttpStatus.REQUEST_ENTITY_TOO_LARGE*/get REQUEST_ENTITY_TOO_LARGE() {
    return 413;
  },
  /*_internal.HttpStatus.REQUEST_URI_TOO_LONG*/get REQUEST_URI_TOO_LONG() {
    return 414;
  },
  /*_internal.HttpStatus.UNSUPPORTED_MEDIA_TYPE*/get UNSUPPORTED_MEDIA_TYPE() {
    return 415;
  },
  /*_internal.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE*/get REQUESTED_RANGE_NOT_SATISFIABLE() {
    return 416;
  },
  /*_internal.HttpStatus.EXPECTATION_FAILED*/get EXPECTATION_FAILED() {
    return 417;
  },
  /*_internal.HttpStatus.UPGRADE_REQUIRED*/get UPGRADE_REQUIRED() {
    return 426;
  },
  /*_internal.HttpStatus.INTERNAL_SERVER_ERROR*/get INTERNAL_SERVER_ERROR() {
    return 500;
  },
  /*_internal.HttpStatus.NOT_IMPLEMENTED*/get NOT_IMPLEMENTED() {
    return 501;
  },
  /*_internal.HttpStatus.BAD_GATEWAY*/get BAD_GATEWAY() {
    return 502;
  },
  /*_internal.HttpStatus.SERVICE_UNAVAILABLE*/get SERVICE_UNAVAILABLE() {
    return 503;
  },
  /*_internal.HttpStatus.GATEWAY_TIMEOUT*/get GATEWAY_TIMEOUT() {
    return 504;
  },
  /*_internal.HttpStatus.HTTP_VERSION_NOT_SUPPORTED*/get HTTP_VERSION_NOT_SUPPORTED() {
    return 505;
  },
  /*_internal.HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR*/get NETWORK_CONNECT_TIMEOUT_ERROR() {
    return 599;
  }
});
const _source = dart.privateName(_internal, "_source");
const _add = dart.privateName(async, "_add");
const _closeUnchecked = dart.privateName(async, "_closeUnchecked");
const _addError = dart.privateName(async, "_addError");
const _completeError = dart.privateName(async, "_completeError");
const _complete = dart.privateName(async, "_complete");
const _sink = dart.privateName(async, "_sink");
async.Stream$ = dart.generic(T => {
  let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
  let TToNull = () => (TToNull = dart.constFn(dart.fnType(core.Null, [T])))();
  let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
  let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.fnType(_IterablePendingEventsOfT(), [])))();
  let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
  let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
  let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
  let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
  let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
  let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
  let TAndTToT = () => (TAndTToT = dart.constFn(dart.fnType(T, [T, T])))();
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  let VoidToT = () => (VoidToT = dart.constFn(dart.fnType(T, [])))();
  let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  let _FutureOfListOfT = () => (_FutureOfListOfT = dart.constFn(async._Future$(ListOfT())))();
  let _HashSetOfT = () => (_HashSetOfT = dart.constFn(collection._HashSet$(T)))();
  let SetOfT = () => (SetOfT = dart.constFn(core.Set$(T)))();
  let _FutureOfSetOfT = () => (_FutureOfSetOfT = dart.constFn(async._Future$(SetOfT())))();
  let _TakeStreamOfT = () => (_TakeStreamOfT = dart.constFn(async._TakeStream$(T)))();
  let _TakeWhileStreamOfT = () => (_TakeWhileStreamOfT = dart.constFn(async._TakeWhileStream$(T)))();
  let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
  let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
  let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.fnType(dart.void, [T])))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  let _ControllerEventSinkWrapperOfT = () => (_ControllerEventSinkWrapperOfT = dart.constFn(async._ControllerEventSinkWrapper$(T)))();
  let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
  let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
  class Stream extends core.Object {
    static empty() {
      return new (_EmptyStreamOfT()).new();
    }
    static fromFuture(future) {
      let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
      FutureOfNull()._check(future.then(core.Null, dart.fn(value => {
        controller[_add](value);
        controller[_closeUnchecked]();
      }, TToNull()), {onError: dart.fn((error, stackTrace) => {
          controller[_addError](error, core.StackTrace._check(stackTrace));
          controller[_closeUnchecked]();
        }, dynamicAnddynamicToNull())}));
      return controller.stream;
    }
    static fromFutures(futures) {
      let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
      let count = 0;
      let onValue = value => {
        if (!dart.test(controller.isClosed)) {
          controller[_add](value);
          if (--count === 0) controller[_closeUnchecked]();
        }
      };
      dart.fn(onValue, TToNull());
      let onError = (error, stack) => {
        if (!dart.test(controller.isClosed)) {
          controller[_addError](error, stack);
          if (--count === 0) controller[_closeUnchecked]();
        }
      };
      dart.fn(onError, dynamicAndStackTraceToNull());
      for (let future of futures) {
        count++;
        FutureOfNull()._check(future.then(core.Null, onValue, {onError: onError}));
      }
      if (count === 0) async.scheduleMicrotask(dart.bind(controller, 'close'));
      return controller.stream;
    }
    static fromIterable(elements) {
      return new (_GeneratedStreamImplOfT()).new(dart.fn(() => new (_IterablePendingEventsOfT()).new(elements), VoidTo_IterablePendingEventsOfT()));
    }
    static periodic(period, computation) {
      if (computation === void 0) computation = null;
      let timer = null;
      let computationCount = 0;
      let controller = null;
      let watch = new core.Stopwatch.new();
      function sendEvent() {
        watch.reset();
        let data = null;
        if (computation != null) {
          try {
            data = computation(computationCount++);
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            controller.addError(e, s);
            return;
          }
        }
        controller.add(data);
      }
      dart.fn(sendEvent, VoidTovoid());
      function startPeriodicTimer() {
        if (!(timer == null)) dart.assertFailed(null, "dart:async/stream.dart", 218, 14, "timer == null");
        timer = async.Timer.periodic(period, dart.fn(timer => {
          sendEvent();
        }, TimerToNull()));
      }
      dart.fn(startPeriodicTimer, VoidTovoid());
      controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
          watch.start();
          startPeriodicTimer();
        }, VoidToNull()), onPause: dart.fn(() => {
          timer.cancel();
          timer = null;
          watch.stop();
        }, VoidToNull()), onResume: dart.fn(() => {
          if (!(timer == null)) dart.assertFailed(null, "dart:async/stream.dart", 236, 18, "timer == null");
          let elapsed = watch.elapsed;
          watch.start();
          timer = async.Timer.new(period['-'](elapsed), dart.fn(() => {
            timer = null;
            startPeriodicTimer();
            sendEvent();
          }, VoidToNull()));
        }, VoidToNull()), onCancel: dart.fn(() => {
          if (timer != null) timer.cancel();
          timer = null;
          return async.Future._nullFuture;
        }, VoidTo_FutureOfNull())});
      return controller.stream;
    }
    static eventTransformed(source, mapSink) {
      return new (_BoundSinkStreamOfdynamic$T()).new(source, mapSink);
    }
    static castFrom(S, T, source) {
      return new (_internal.CastStream$(S, T)).new(source);
    }
    get isBroadcast() {
      return false;
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return new (_AsBroadcastStreamOfT()).new(this, onListen, onCancel);
    }
    where(test) {
      return new (_WhereStreamOfT()).new(this, test);
    }
    map(S, convert) {
      return new (async._MapStream$(T, S)).new(this, convert);
    }
    asyncMap(E, convert) {
      let controller = null;
      let subscription = null;
      const onListen = () => {
        let add = dart.bind(controller, 'add');
        if (!(async._StreamController$(E).is(controller) || async._BroadcastStreamController.is(controller))) dart.assertFailed(null, "dart:async/stream.dart", 442, 14, "controller is _StreamController<E> || controller is _BroadcastStreamController");
        let addError = dart.bind(controller, _addError);
        subscription = this.listen(dart.fn(event => {
          let newValue = null;
          try {
            newValue = convert(event);
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            controller.addError(e, s);
            return;
          }
          if (async.Future$(E).is(newValue)) {
            subscription.pause();
            newValue.then(dart.void, add, {onError: addError}).whenComplete(dart.bind(subscription, 'resume'));
          } else {
            controller.add(E._check(newValue));
          }
        }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
      };
      dart.fn(onListen, VoidTovoid());
      if (dart.test(this.isBroadcast)) {
        controller = async._StreamControllerBase$(E)._check(async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
            subscription.cancel();
          }, VoidToNull()), sync: true}));
      } else {
        controller = async._StreamControllerBase$(E)._check(async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
            subscription.pause();
          }, VoidToNull()), onResume: dart.fn(() => {
            subscription.resume();
          }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true}));
      }
      return controller.stream;
    }
    asyncExpand(E, convert) {
      let controller = null;
      let subscription = null;
      const onListen = () => {
        if (!(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller))) dart.assertFailed(null, "dart:async/stream.dart", 508, 14, "controller is _StreamController || controller is _BroadcastStreamController");
        subscription = this.listen(dart.fn(event => {
          let newStream = null;
          try {
            newStream = convert(event);
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            controller.addError(e, s);
            return;
          }
          if (newStream != null) {
            subscription.pause();
            controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
          }
        }, TToNull()), {onError: dart.bind(controller, _addError), onDone: dart.bind(controller, 'close')});
      };
      dart.fn(onListen, VoidTovoid());
      if (dart.test(this.isBroadcast)) {
        controller = async._StreamControllerBase$(E)._check(async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
            subscription.cancel();
          }, VoidToNull()), sync: true}));
      } else {
        controller = async._StreamControllerBase$(E)._check(async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
            subscription.pause();
          }, VoidToNull()), onResume: dart.fn(() => {
            subscription.resume();
          }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true}));
      }
      return controller.stream;
    }
    handleError(onError, opts) {
      let test = opts && 'test' in opts ? opts.test : null;
      return new (_HandleErrorStreamOfT()).new(this, onError, test);
    }
    expand(S, convert) {
      return new (async._ExpandStream$(T, S)).new(this, convert);
    }
    pipe(streamConsumer) {
      StreamConsumerOfT()._check(streamConsumer);
      return streamConsumer.addStream(this).then(dart.dynamic, dart.fn(_ => streamConsumer.close(), dynamicToFuture()));
    }
    transform(S, streamTransformer) {
      async.StreamTransformer$(T, S)._check(streamTransformer);
      return streamTransformer.bind(this);
    }
    reduce(combine) {
      TAndTToT()._check(combine);
      let result = new (_FutureOfT()).new();
      let seenFirst = false;
      let value = null;
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        if (seenFirst) {
          async._runUserCode(T, dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
            value = newValue;
          }, TToNull()), async._cancelAndErrorClosure(subscription, result));
        } else {
          value = element;
          seenFirst = true;
        }
      }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
          if (!seenFirst) {
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e$) {
              let e = dart.getThrown(e$);
              let s = dart.stackTrace(e$);
              async._completeWithErrorCallback(result, e, s);
            }
          } else {
            result[_complete](value);
          }
        }, VoidToNull()), cancelOnError: true});
      return result;
    }
    fold(S, initialValue, combine) {
      let result = new (async._Future$(S)).new();
      let value = initialValue;
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(S, dart.fn(() => combine(value, element), dart.fnType(S, [])), dart.fn(newValue => {
          value = newValue;
        }, dart.fnType(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
      }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
          result[_complete](value);
        }, VoidToNull()), cancelOnError: true});
      return result;
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let result = new (_FutureOfString()).new();
      let buffer = new core.StringBuffer.new();
      let subscription = null;
      let first = true;
      subscription = this.listen(dart.fn(element => {
        if (!first) {
          buffer.write(separator);
        }
        first = false;
        try {
          buffer.write(element);
        } catch (e$) {
          let e = dart.getThrown(e$);
          let s = dart.stackTrace(e$);
          async._cancelAndErrorWithReplacement(subscription, result, e, s);
        }
      }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
          result[_complete](buffer.toString());
        }, VoidToNull()), cancelOnError: true});
      return result;
    }
    contains(needle) {
      let future = new (_FutureOfbool()).new();
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(core.bool, dart.fn(() => dart.equals(element, needle), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            async._cancelAndValue(subscription, future, true);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](false);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    forEach(action) {
      let future = new async._Future.new();
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(dart.dynamic, dart.fn(() => action(element), VoidTovoid()), dart.fn(_ => {
        }, dynamicToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](null);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    every(test) {
      let future = new (_FutureOfbool()).new();
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(core.bool, dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
          if (!dart.test(isMatch)) {
            async._cancelAndValue(subscription, future, false);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](true);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    any(test) {
      let future = new (_FutureOfbool()).new();
      let subscription = null;
      subscription = this.listen(dart.fn(element => {
        async._runUserCode(core.bool, dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            async._cancelAndValue(subscription, future, true);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](false);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get length() {
      let future = new (_FutureOfint()).new();
      let count = 0;
      this.listen(dart.fn(_ => {
        count++;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](count);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get isEmpty() {
      let future = new (_FutureOfbool()).new();
      let subscription = null;
      subscription = this.listen(dart.fn(_ => {
        async._cancelAndValue(subscription, future, false);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](true);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    cast(R) {
      return async.Stream.castFrom(T, R, this);
    }
    toList() {
      let result = JSArrayOfT().of([]);
      let future = new (_FutureOfListOfT()).new();
      this.listen(dart.fn(data => {
        result[$add](data);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](result);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    toSet() {
      let result = new (_HashSetOfT()).new();
      let future = new (_FutureOfSetOfT()).new();
      this.listen(dart.fn(data => {
        result.add(data);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](result);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    drain(E, futureValue) {
      if (futureValue === void 0) futureValue = null;
      return async.Future$(E)._check(this.listen(null, {cancelOnError: true}).asFuture(E, futureValue));
    }
    take(count) {
      return new (_TakeStreamOfT()).new(this, count);
    }
    takeWhile(test) {
      return new (_TakeWhileStreamOfT()).new(this, test);
    }
    skip(count) {
      return new (_SkipStreamOfT()).new(this, count);
    }
    skipWhile(test) {
      return new (_SkipWhileStreamOfT()).new(this, test);
    }
    distinct(equals) {
      if (equals === void 0) equals = null;
      return new (_DistinctStreamOfT()).new(this, equals);
    }
    get first() {
      let future = new (_FutureOfT()).new();
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        async._cancelAndValue(subscription, future, value);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            async._completeWithErrorCallback(future, e, s);
          }
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get last() {
      let future = new (_FutureOfT()).new();
      let result = null;
      let foundResult = false;
      this.listen(dart.fn(value => {
        foundResult = true;
        result = value;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (foundResult) {
            future[_complete](result);
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            async._completeWithErrorCallback(future, e, s);
          }
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get single() {
      let future = new (_FutureOfT()).new();
      let result = null;
      let foundResult = false;
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        if (foundResult) {
          try {
            dart.throw(_internal.IterableElementError.tooMany());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            async._cancelAndErrorWithReplacement(subscription, future, e, s);
          }
          return;
        }
        foundResult = true;
        result = value;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (foundResult) {
            future[_complete](result);
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            async._completeWithErrorCallback(future, e, s);
          }
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToT()._check(orElse);
      let future = new (_FutureOfT()).new();
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        async._runUserCode(core.bool, dart.fn(() => test(value), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            async._cancelAndValue(subscription, future, value);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (orElse != null) {
            async._runUserCode(T, orElse, dart.bind(future, _complete), dart.bind(future, _completeError));
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            async._completeWithErrorCallback(future, e, s);
          }
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToT()._check(orElse);
      let future = new (_FutureOfT()).new();
      let result = null;
      let foundResult = false;
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        async._runUserCode(core.bool, dart.fn(() => true === test(value), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            foundResult = true;
            result = value;
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (foundResult) {
            future[_complete](result);
            return;
          }
          if (orElse != null) {
            async._runUserCode(T, orElse, dart.bind(future, _complete), dart.bind(future, _completeError));
            return;
          }
          try {
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            async._completeWithErrorCallback(future, e, s);
          }
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToT()._check(orElse);
      let future = new (_FutureOfT()).new();
      let result = null;
      let foundResult = false;
      let subscription = null;
      subscription = this.listen(dart.fn(value => {
        async._runUserCode(core.bool, dart.fn(() => true === test(value), VoidTobool()), dart.fn(isMatch => {
          if (dart.test(isMatch)) {
            if (foundResult) {
              try {
                dart.throw(_internal.IterableElementError.tooMany());
              } catch (e$) {
                let e = dart.getThrown(e$);
                let s = dart.stackTrace(e$);
                async._cancelAndErrorWithReplacement(subscription, future, e, s);
              }
              return;
            }
            foundResult = true;
            result = value;
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          if (foundResult) {
            future[_complete](result);
            return;
          }
          try {
            if (orElse != null) {
              async._runUserCode(T, orElse, dart.bind(future, _complete), dart.bind(future, _completeError));
              return;
            }
            dart.throw(_internal.IterableElementError.noElement());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            async._completeWithErrorCallback(future, e, s);
          }
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    elementAt(index) {
      core.ArgumentError.checkNotNull(index, "index");
      core.RangeError.checkNotNegative(index, "index");
      let future = new (_FutureOfT()).new();
      let subscription = null;
      let elementIndex = 0;
      subscription = this.listen(dart.fn(value => {
        if (index === elementIndex) {
          async._cancelAndValue(subscription, future, value);
          return;
        }
        elementIndex = elementIndex + 1;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    timeout(timeLimit, opts) {
      let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
      let controller = null;
      let subscription = null;
      let timer = null;
      let zone = null;
      let timeout = null;
      function onData(event) {
        timer.cancel();
        controller.add(event);
        timer = zone.createTimer(timeLimit, timeout);
      }
      dart.fn(onData, TTovoid());
      function onError(error, stackTrace) {
        timer.cancel();
        if (!(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller))) dart.assertFailed(null, "dart:async/stream.dart", 1511, 14, "controller is _StreamController || controller is _BroadcastStreamController");
        controller[_addError](error, stackTrace);
        timer = zone.createTimer(timeLimit, timeout);
      }
      dart.fn(onError, dynamicAndStackTraceTovoid());
      function onDone() {
        timer.cancel();
        controller.close();
      }
      dart.fn(onDone, VoidTovoid());
      const onListen = () => {
        zone = async.Zone.current;
        if (onTimeout == null) {
          timeout = dart.fn(() => {
            controller.addError(new async.TimeoutException.new("No stream event", timeLimit), null);
          }, VoidToNull());
        } else {
          let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT(), onTimeout);
          let wrapper = new (_ControllerEventSinkWrapperOfT()).new(null);
          timeout = dart.fn(() => {
            wrapper[_sink] = controller;
            zone.runUnaryGuarded(_ControllerEventSinkWrapperOfT(), registeredOnTimeout, wrapper);
            wrapper[_sink] = null;
          }, VoidToNull());
        }
        subscription = this.listen(onData, {onError: onError, onDone: onDone});
        timer = zone.createTimer(timeLimit, timeout);
      };
      dart.fn(onListen, VoidTovoid());
      function onCancel() {
        timer.cancel();
        let result = subscription.cancel();
        subscription = null;
        return result;
      }
      dart.fn(onCancel, VoidToFuture());
      controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT()).new(onListen, onCancel) : new (_SyncStreamControllerOfT()).new(onListen, dart.fn(() => {
        timer.cancel();
        subscription.pause();
      }, VoidToNull()), dart.fn(() => {
        subscription.resume();
        timer = zone.createTimer(timeLimit, timeout);
      }, VoidToNull()), onCancel);
      return controller.stream;
    }
  }
  (Stream.new = function() {
  }).prototype = Stream.prototype;
  (Stream._internal = function() {
  }).prototype = Stream.prototype;
  dart.addTypeTests(Stream);
  Stream.prototype[dart.isStream] = true;
  dart.setMethodSignature(Stream, () => ({
    __proto__: dart.getMethods(Stream.__proto__),
    asBroadcastStream: dart.fnType(async.Stream$(T), [], {onListen: dart.fnType(dart.void, [async.StreamSubscription$(T)]), onCancel: dart.fnType(dart.void, [async.StreamSubscription$(T)])}),
    where: dart.fnType(async.Stream$(T), [dart.fnType(core.bool, [T])]),
    map: dart.gFnType(S => [async.Stream$(S), [dart.fnType(S, [T])]]),
    asyncMap: dart.gFnType(E => [async.Stream$(E), [dart.fnType(async.FutureOr$(E), [T])]]),
    asyncExpand: dart.gFnType(E => [async.Stream$(E), [dart.fnType(async.Stream$(E), [T])]]),
    handleError: dart.fnType(async.Stream$(T), [core.Function], {test: dart.fnType(core.bool, [dart.dynamic])}),
    expand: dart.gFnType(S => [async.Stream$(S), [dart.fnType(core.Iterable$(S), [T])]]),
    pipe: dart.fnType(async.Future, [core.Object]),
    transform: dart.gFnType(S => [async.Stream$(S), [core.Object]]),
    reduce: dart.fnType(async.Future$(T), [core.Object]),
    fold: dart.gFnType(S => [async.Future$(S), [S, dart.fnType(S, [S, T])]]),
    join: dart.fnType(async.Future$(core.String), [], [core.String]),
    contains: dart.fnType(async.Future$(core.bool), [core.Object]),
    forEach: dart.fnType(async.Future, [dart.fnType(dart.void, [T])]),
    every: dart.fnType(async.Future$(core.bool), [dart.fnType(core.bool, [T])]),
    any: dart.fnType(async.Future$(core.bool), [dart.fnType(core.bool, [T])]),
    cast: dart.gFnType(R => [async.Stream$(R), []]),
    toList: dart.fnType(async.Future$(core.List$(T)), []),
    toSet: dart.fnType(async.Future$(core.Set$(T)), []),
    drain: dart.gFnType(E => [async.Future$(E), [], [E]]),
    take: dart.fnType(async.Stream$(T), [core.int]),
    takeWhile: dart.fnType(async.Stream$(T), [dart.fnType(core.bool, [T])]),
    skip: dart.fnType(async.Stream$(T), [core.int]),
    skipWhile: dart.fnType(async.Stream$(T), [dart.fnType(core.bool, [T])]),
    distinct: dart.fnType(async.Stream$(T), [], [dart.fnType(core.bool, [T, T])]),
    firstWhere: dart.fnType(async.Future$(T), [dart.fnType(core.bool, [T])], {orElse: core.Object}),
    lastWhere: dart.fnType(async.Future$(T), [dart.fnType(core.bool, [T])], {orElse: core.Object}),
    singleWhere: dart.fnType(async.Future$(T), [dart.fnType(core.bool, [T])], {orElse: core.Object}),
    elementAt: dart.fnType(async.Future$(T), [core.int]),
    timeout: dart.fnType(async.Stream$(T), [core.Duration], {onTimeout: dart.fnType(dart.void, [async.EventSink$(T)])})
  }));
  dart.setGetterSignature(Stream, () => ({
    __proto__: dart.getGetters(Stream.__proto__),
    isBroadcast: core.bool,
    length: async.Future$(core.int),
    isEmpty: async.Future$(core.bool),
    first: async.Future$(T),
    last: async.Future$(T),
    single: async.Future$(T)
  }));
  dart.setLibraryUri(Stream, "dart:async");
  return Stream;
});
async.Stream = async.Stream$();
dart.addTypeTests(async.Stream, dart.isStream);
const _is_CastStream_default = Symbol('_is_CastStream_default');
_internal.CastStream$ = dart.generic((S, T) => {
  let CastStreamSubscriptionOfS$T = () => (CastStreamSubscriptionOfS$T = dart.constFn(_internal.CastStreamSubscription$(S, T)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  class CastStream extends async.Stream$(T) {
    get isBroadcast() {
      return this[_source].isBroadcast;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      let _ = new (CastStreamSubscriptionOfS$T()).new(this[_source].listen(null, {onDone: onDone, cancelOnError: cancelOnError}));
      _.onData(onData);
      _.onError(onError);
      return _;
    }
    cast(R) {
      return new (_internal.CastStream$(S, R)).new(this[_source]);
    }
  }
  (CastStream.new = function(source) {
    this[_source] = source;
    CastStream.__proto__.new.call(this);
  }).prototype = CastStream.prototype;
  dart.addTypeTests(CastStream);
  CastStream.prototype[_is_CastStream_default] = true;
  dart.setMethodSignature(CastStream, () => ({
    __proto__: dart.getMethods(CastStream.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
    cast: dart.gFnType(R => [async.Stream$(R), []])
  }));
  dart.setGetterSignature(CastStream, () => ({
    __proto__: dart.getGetters(CastStream.__proto__),
    isBroadcast: core.bool
  }));
  dart.setLibraryUri(CastStream, "dart:_internal");
  dart.setFieldSignature(CastStream, () => ({
    __proto__: dart.getFields(CastStream.__proto__),
    [_source]: dart.finalFieldType(StreamOfS())
  }));
  return CastStream;
});
_internal.CastStream = _internal.CastStream$();
dart.addTypeTests(_internal.CastStream, _is_CastStream_default);
const _zone = dart.privateName(_internal, "_zone");
const _handleData = dart.privateName(_internal, "_handleData");
const _handleError = dart.privateName(_internal, "_handleError");
const _onData = dart.privateName(_internal, "_onData");
const _is_CastStreamSubscription_default = Symbol('_is_CastStreamSubscription_default');
_internal.CastStreamSubscription$ = dart.generic((S, T) => {
  let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.fnType(dart.void, [T])))();
  class CastStreamSubscription extends core.Object {
    cancel() {
      return this[_source].cancel();
    }
    onData(handleData) {
      this[_handleData] = handleData == null ? null : this[_zone].registerUnaryCallback(dart.dynamic, T, handleData);
    }
    onError(handleError) {
      this[_source].onError(handleError);
      if (handleError == null) {
        this[_handleError] = null;
      } else if (NullAndNullTodynamic().is(handleError)) {
        this[_handleError] = this[_zone].registerBinaryCallback(dart.dynamic, core.Object, core.StackTrace, ObjectAndStackTraceTodynamic()._check(handleError));
      } else {
        this[_handleError] = this[_zone].registerUnaryCallback(dart.dynamic, core.Object, ObjectTodynamic()._check(handleError));
      }
    }
    onDone(handleDone) {
      this[_source].onDone(handleDone);
    }
    [_onData](data) {
      S._check(data);
      if (this[_handleData] == null) return;
      let targetData = null;
      try {
        targetData = T.as(data);
      } catch (e) {
        let error = dart.getThrown(e);
        let stack = dart.stackTrace(e);
        if (this[_handleError] == null) {
          this[_zone].handleUncaughtError(error, stack);
        } else if (NullAndNullTodynamic().is(this[_handleError])) {
          this[_zone].runBinaryGuarded(dart.dynamic, core.StackTrace, dynamicAndStackTraceTovoid()._check(this[_handleError]), error, stack);
        } else {
          this[_zone].runUnaryGuarded(dart.dynamic, dynamicTovoid()._check(this[_handleError]), error);
        }
        return;
      }
      this[_zone].runUnaryGuarded(T, this[_handleData], targetData);
    }
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      this[_source].pause(resumeSignal);
    }
    resume() {
      this[_source].resume();
    }
    get isPaused() {
      return this[_source].isPaused;
    }
    asFuture(E, futureValue) {
      if (futureValue === void 0) futureValue = null;
      return async.Future$(E)._check(this[_source].asFuture(E, futureValue));
    }
  }
  (CastStreamSubscription.new = function(source) {
    this[_zone] = async.Zone.current;
    this[_handleData] = null;
    this[_handleError] = null;
    this[_source] = source;
    this[_source].onData(dart.bind(this, _onData));
  }).prototype = CastStreamSubscription.prototype;
  CastStreamSubscription.prototype[dart.isStreamSubscription] = true;
  dart.addTypeTests(CastStreamSubscription);
  CastStreamSubscription.prototype[_is_CastStreamSubscription_default] = true;
  CastStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
  dart.setMethodSignature(CastStreamSubscription, () => ({
    __proto__: dart.getMethods(CastStreamSubscription.__proto__),
    cancel: dart.fnType(async.Future, []),
    onData: dart.fnType(dart.void, [dart.fnType(dart.void, [T])]),
    onError: dart.fnType(dart.void, [core.Function]),
    onDone: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
    [_onData]: dart.fnType(dart.void, [core.Object]),
    pause: dart.fnType(dart.void, [], [async.Future]),
    resume: dart.fnType(dart.void, []),
    asFuture: dart.gFnType(E => [async.Future$(E), [], [E]])
  }));
  dart.setGetterSignature(CastStreamSubscription, () => ({
    __proto__: dart.getGetters(CastStreamSubscription.__proto__),
    isPaused: core.bool
  }));
  dart.setLibraryUri(CastStreamSubscription, "dart:_internal");
  dart.setFieldSignature(CastStreamSubscription, () => ({
    __proto__: dart.getFields(CastStreamSubscription.__proto__),
    [_source]: dart.finalFieldType(StreamSubscriptionOfS()),
    [_zone]: dart.finalFieldType(async.Zone),
    [_handleData]: dart.fieldType(TTovoid()),
    [_handleError]: dart.fieldType(core.Function)
  }));
  return CastStreamSubscription;
});
_internal.CastStreamSubscription = _internal.CastStreamSubscription$();
dart.addTypeTests(_internal.CastStreamSubscription, _is_CastStreamSubscription_default);
const _is_StreamTransformerBase_default = Symbol('_is_StreamTransformerBase_default');
async.StreamTransformerBase$ = dart.generic((S, T) => {
  let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
  class StreamTransformerBase extends core.Object {
    cast(RS, RT) {
      return async.StreamTransformer.castFrom(S, T, RS, RT, this);
    }
  }
  (StreamTransformerBase.new = function() {
  }).prototype = StreamTransformerBase.prototype;
  dart.addTypeTests(StreamTransformerBase);
  StreamTransformerBase.prototype[_is_StreamTransformerBase_default] = true;
  StreamTransformerBase[dart.implements] = () => [StreamTransformerOfS$T()];
  dart.setMethodSignature(StreamTransformerBase, () => ({
    __proto__: dart.getMethods(StreamTransformerBase.__proto__),
    cast: dart.gFnType((RS, RT) => [async.StreamTransformer$(RS, RT), []])
  }));
  dart.setLibraryUri(StreamTransformerBase, "dart:async");
  return StreamTransformerBase;
});
async.StreamTransformerBase = async.StreamTransformerBase$();
dart.addTypeTests(async.StreamTransformerBase, _is_StreamTransformerBase_default);
const _is_CastStreamTransformer_default = Symbol('_is_CastStreamTransformer_default');
_internal.CastStreamTransformer$ = dart.generic((SS, ST, TS, TT) => {
  let StreamOfSS = () => (StreamOfSS = dart.constFn(async.Stream$(SS)))();
  let StreamTransformerOfSS$ST = () => (StreamTransformerOfSS$ST = dart.constFn(async.StreamTransformer$(SS, ST)))();
  let StreamOfTS = () => (StreamOfTS = dart.constFn(async.Stream$(TS)))();
  let StreamOfTT = () => (StreamOfTT = dart.constFn(async.Stream$(TT)))();
  class CastStreamTransformer extends async.StreamTransformerBase$(TS, TT) {
    cast(RS, RT) {
      return new (_internal.CastStreamTransformer$(SS, ST, RS, RT)).new(this[_source]);
    }
    bind(stream) {
      StreamOfTS()._check(stream);
      return StreamOfTT()._check(this[_source].bind(StreamOfSS()._check(stream.cast(SS))).cast(TT));
    }
  }
  (CastStreamTransformer.new = function(source) {
    this[_source] = source;
    CastStreamTransformer.__proto__.new.call(this);
  }).prototype = CastStreamTransformer.prototype;
  dart.addTypeTests(CastStreamTransformer);
  CastStreamTransformer.prototype[_is_CastStreamTransformer_default] = true;
  dart.setMethodSignature(CastStreamTransformer, () => ({
    __proto__: dart.getMethods(CastStreamTransformer.__proto__),
    cast: dart.gFnType((RS, RT) => [async.StreamTransformer$(RS, RT), []]),
    bind: dart.fnType(async.Stream$(TT), [core.Object])
  }));
  dart.setLibraryUri(CastStreamTransformer, "dart:_internal");
  dart.setFieldSignature(CastStreamTransformer, () => ({
    __proto__: dart.getFields(CastStreamTransformer.__proto__),
    [_source]: dart.finalFieldType(StreamTransformerOfSS$ST())
  }));
  return CastStreamTransformer;
});
_internal.CastStreamTransformer = _internal.CastStreamTransformer$();
dart.addTypeTests(_internal.CastStreamTransformer, _is_CastStreamTransformer_default);
const _is_Converter_default = Symbol('_is_Converter_default');
convert.Converter$ = dart.generic((S, T) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class Converter extends async.StreamTransformerBase$(S, T) {
    static castFrom(SS, ST, TS, TT, source) {
      return new (_internal.CastConverter$(SS, ST, TS, TT)).new(source);
    }
    fuse(TT, other) {
      convert.Converter$(T, TT)._check(other);
      return new (convert._FusedConverter$(S, T, TT)).new(this, other);
    }
    startChunkedConversion(sink) {
      SinkOfT()._check(sink);
      dart.throw(new core.UnsupportedError.new("This converter does not support chunked conversions: " + dart.str(this)));
    }
    bind(stream) {
      StreamOfS()._check(stream);
      return StreamOfT().eventTransformed(stream, dart.fn(sink => new convert._ConverterStreamEventSink.new(this, sink), EventSinkTo_ConverterStreamEventSink()));
    }
    cast(RS, RT) {
      return convert.Converter.castFrom(S, T, RS, RT, this);
    }
  }
  (Converter.new = function() {
    Converter.__proto__.new.call(this);
  }).prototype = Converter.prototype;
  dart.addTypeTests(Converter);
  Converter.prototype[_is_Converter_default] = true;
  dart.setMethodSignature(Converter, () => ({
    __proto__: dart.getMethods(Converter.__proto__),
    fuse: dart.gFnType(TT => [convert.Converter$(S, TT), [core.Object]]),
    startChunkedConversion: dart.fnType(core.Sink$(S), [core.Object]),
    bind: dart.fnType(async.Stream$(T), [core.Object]),
    cast: dart.gFnType((RS, RT) => [convert.Converter$(RS, RT), []])
  }));
  dart.setLibraryUri(Converter, "dart:convert");
  return Converter;
});
convert.Converter = convert.Converter$();
dart.addTypeTests(convert.Converter, _is_Converter_default);
const _is_CastConverter_default = Symbol('_is_CastConverter_default');
_internal.CastConverter$ = dart.generic((SS, ST, TS, TT) => {
  let StreamOfSS = () => (StreamOfSS = dart.constFn(async.Stream$(SS)))();
  let ConverterOfSS$ST = () => (ConverterOfSS$ST = dart.constFn(convert.Converter$(SS, ST)))();
  let StreamOfTS = () => (StreamOfTS = dart.constFn(async.Stream$(TS)))();
  let StreamOfTT = () => (StreamOfTT = dart.constFn(async.Stream$(TT)))();
  class CastConverter extends convert.Converter$(TS, TT) {
    convert(input) {
      TS._check(input);
      return TT.as(this[_source].convert(SS.as(input)));
    }
    bind(stream) {
      StreamOfTS()._check(stream);
      return StreamOfTT()._check(this[_source].bind(StreamOfSS()._check(stream.cast(SS))).cast(TT));
    }
    cast(RS, RT) {
      return new (_internal.CastConverter$(SS, ST, RS, RT)).new(this[_source]);
    }
  }
  (CastConverter.new = function(source) {
    this[_source] = source;
    CastConverter.__proto__.new.call(this);
  }).prototype = CastConverter.prototype;
  dart.addTypeTests(CastConverter);
  CastConverter.prototype[_is_CastConverter_default] = true;
  dart.setMethodSignature(CastConverter, () => ({
    __proto__: dart.getMethods(CastConverter.__proto__),
    convert: dart.fnType(TT, [core.Object]),
    bind: dart.fnType(async.Stream$(TT), [core.Object]),
    cast: dart.gFnType((RS, RT) => [convert.Converter$(RS, RT), []])
  }));
  dart.setLibraryUri(CastConverter, "dart:_internal");
  dart.setFieldSignature(CastConverter, () => ({
    __proto__: dart.getFields(CastConverter.__proto__),
    [_source]: dart.finalFieldType(ConverterOfSS$ST())
  }));
  return CastConverter;
});
_internal.CastConverter = _internal.CastConverter$();
dart.addTypeTests(_internal.CastConverter, _is_CastConverter_default);
core.Iterable$ = dart.generic(E => {
  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
  let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
  let FollowedByIterableOfE = () => (FollowedByIterableOfE = dart.constFn(_internal.FollowedByIterable$(E)))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.fnType(E, [E, E])))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.fnType(E, [])))();
  class Iterable extends core.Object {
    static generate(count, generator) {
      if (generator === void 0) generator = null;
      if (dart.notNull(count) <= 0) return new (EmptyIterableOfE()).new();
      return new (_GeneratorIterableOfE()).new(count, generator);
    }
    static empty() {
      return new (EmptyIterableOfE()).new();
    }
    static castFrom(S, T, source) {
      return _internal.CastIterable$(S, T).new(source);
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this[$iterator]);
    }
    cast(R) {
      return core.Iterable.castFrom(E, R, this);
    }
    followedBy(other) {
      IterableOfE()._check(other);
      if (EfficientLengthIterableOfE().is(this)) {
        return FollowedByIterableOfE().firstEfficient(EfficientLengthIterableOfE()._check(this), other);
      }
      return new (FollowedByIterableOfE()).new(this, other);
    }
    map(T, f) {
      return _internal.MappedIterable$(E, T).new(this, f);
    }
    where(test) {
      return new (WhereIterableOfE()).new(this, test);
    }
    whereType(T) {
      return new (_internal.WhereTypeIterable$(T)).new(this);
    }
    expand(T, f) {
      return new (_internal.ExpandIterable$(E, T)).new(this, f);
    }
    contains(element) {
      for (let e of this) {
        if (dart.equals(e, element)) return true;
      }
      return false;
    }
    forEach(f) {
      for (let element of this)
        f(element);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let iterator = this[$iterator];
      if (!dart.test(iterator.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let value = iterator.current;
      while (dart.test(iterator.moveNext())) {
        value = combine(value, iterator.current);
      }
      return value;
    }
    fold(T, initialValue, combine) {
      let value = initialValue;
      for (let element of this)
        value = combine(value, element);
      return value;
    }
    every(test) {
      for (let element of this) {
        if (!dart.test(test(element))) return false;
      }
      return true;
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let iterator = this[$iterator];
      if (!dart.test(iterator.moveNext())) return "";
      let buffer = new core.StringBuffer.new();
      if (separator == null || separator === "") {
        do {
          buffer.write(dart.str(iterator.current));
        } while (dart.test(iterator.moveNext()));
      } else {
        buffer.write(dart.str(iterator.current));
        while (dart.test(iterator.moveNext())) {
          buffer.write(separator);
          buffer.write(dart.str(iterator.current));
        }
      }
      return buffer.toString();
    }
    any(test) {
      for (let element of this) {
        if (dart.test(test(element))) return true;
      }
      return false;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return ListOfE().from(this, {growable: growable});
    }
    toSet() {
      return SetOfE().from(this);
    }
    get length() {
      if (!!_internal.EfficientLengthIterable.is(this)) dart.assertFailed(null, "dart:core/iterable.dart", 420, 12, "this is! EfficientLengthIterable");
      let count = 0;
      let it = this[$iterator];
      while (dart.test(it.moveNext())) {
        count++;
      }
      return count;
    }
    get isEmpty() {
      return !dart.test(this[$iterator].moveNext());
    }
    get isNotEmpty() {
      return !dart.test(this[$isEmpty]);
    }
    take(count) {
      return TakeIterableOfE().new(this, count);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE()).new(this, test);
    }
    skip(count) {
      return SkipIterableOfE().new(this, count);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE()).new(this, test);
    }
    get first() {
      let it = this[$iterator];
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      return it.current;
    }
    get last() {
      let it = this[$iterator];
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = null;
      do {
        result = it.current;
      } while (dart.test(it.moveNext()));
      return result;
    }
    get single() {
      let it = this[$iterator];
      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
      let result = it.current;
      if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
      return result;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      for (let element of this) {
        if (dart.test(test(element))) return element;
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          if (foundMatching) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      core.ArgumentError.checkNotNull(index, "index");
      core.RangeError.checkNotNegative(index, "index");
      let elementIndex = 0;
      for (let element of this) {
        if (index === elementIndex) return element;
        elementIndex++;
      }
      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
    }
    toString() {
      return collection.IterableBase.iterableToShortString(this, "(", ")");
    }
  }
  (Iterable.new = function() {
  }).prototype = Iterable.prototype;
  dart.addTypeTests(Iterable);
  Iterable.prototype[dart.isIterable] = true;
  dart.setMethodSignature(Iterable, () => ({
    __proto__: dart.getMethods(Iterable.__proto__),
    cast: dart.gFnType(R => [core.Iterable$(R), []]),
    [$cast]: dart.gFnType(R => [core.Iterable$(R), []]),
    followedBy: dart.fnType(core.Iterable$(E), [core.Object]),
    [$followedBy]: dart.fnType(core.Iterable$(E), [core.Object]),
    map: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    [$map]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    where: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$where]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    whereType: dart.gFnType(T => [core.Iterable$(T), []]),
    [$whereType]: dart.gFnType(T => [core.Iterable$(T), []]),
    expand: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    [$expand]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    reduce: dart.fnType(E, [core.Object]),
    [$reduce]: dart.fnType(E, [core.Object]),
    fold: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    [$fold]: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    every: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$every]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    join: dart.fnType(core.String, [], [core.String]),
    [$join]: dart.fnType(core.String, [], [core.String]),
    any: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$any]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    toList: dart.fnType(core.List$(E), [], {growable: core.bool}),
    [$toList]: dart.fnType(core.List$(E), [], {growable: core.bool}),
    toSet: dart.fnType(core.Set$(E), []),
    [$toSet]: dart.fnType(core.Set$(E), []),
    take: dart.fnType(core.Iterable$(E), [core.int]),
    [$take]: dart.fnType(core.Iterable$(E), [core.int]),
    takeWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$takeWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    skip: dart.fnType(core.Iterable$(E), [core.int]),
    [$skip]: dart.fnType(core.Iterable$(E), [core.int]),
    skipWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$skipWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    firstWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$firstWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    lastWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    singleWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$singleWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int]),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, [])
  }));
  dart.setGetterSignature(Iterable, () => ({
    __proto__: dart.getGetters(Iterable.__proto__),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    first: E,
    [$first]: E,
    last: E,
    [$last]: E,
    single: E,
    [$single]: E
  }));
  dart.setLibraryUri(Iterable, "dart:core");
  dart.defineExtensionMethods(Iterable, [
    'cast',
    'followedBy',
    'map',
    'where',
    'whereType',
    'expand',
    'contains',
    'forEach',
    'reduce',
    'fold',
    'every',
    'join',
    'any',
    'toList',
    'toSet',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'toString'
  ]);
  dart.defineExtensionAccessors(Iterable, [
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single'
  ]);
  return Iterable;
});
core.Iterable = core.Iterable$();
dart.addTypeTests(core.Iterable, dart.isIterable);
const _is__CastIterableBase_default = Symbol('_is__CastIterableBase_default');
_internal._CastIterableBase$ = dart.generic((S, T) => {
  let CastIteratorOfS$T = () => (CastIteratorOfS$T = dart.constFn(_internal.CastIterator$(S, T)))();
  let CastIterableOfS$T = () => (CastIterableOfS$T = dart.constFn(_internal.CastIterable$(S, T)))();
  let STobool = () => (STobool = dart.constFn(dart.fnType(core.bool, [S])))();
  let VoidToS = () => (VoidToS = dart.constFn(dart.fnType(S, [])))();
  let VoidToT = () => (VoidToT = dart.constFn(dart.fnType(T, [])))();
  class _CastIterableBase extends core.Iterable$(T) {
    get iterator() {
      return new (CastIteratorOfS$T()).new(this[_source][$iterator]);
    }
    get length() {
      return this[_source][$length];
    }
    get isEmpty() {
      return this[_source][$isEmpty];
    }
    get isNotEmpty() {
      return this[_source][$isNotEmpty];
    }
    skip(count) {
      return CastIterableOfS$T().new(this[_source][$skip](count));
    }
    take(count) {
      return CastIterableOfS$T().new(this[_source][$take](count));
    }
    elementAt(index) {
      return T.as(this[_source][$elementAt](index));
    }
    get first() {
      return T.as(this[_source][$first]);
    }
    get last() {
      return T.as(this[_source][$last]);
    }
    get single() {
      return T.as(this[_source][$single]);
    }
    contains(other) {
      return this[_source][$contains](other);
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToT()._check(orElse);
      return T.as(this[_source][$lastWhere](dart.fn(element => test(T.as(element)), STobool()), {orElse: orElse == null ? null : dart.fn(() => S.as(orElse()), VoidToS())}));
    }
    toString() {
      return dart.toString(this[_source]);
    }
  }
  (_CastIterableBase.new = function() {
    _CastIterableBase.__proto__.new.call(this);
  }).prototype = _CastIterableBase.prototype;
  dart.addTypeTests(_CastIterableBase);
  _CastIterableBase.prototype[_is__CastIterableBase_default] = true;
  dart.setMethodSignature(_CastIterableBase, () => ({
    __proto__: dart.getMethods(_CastIterableBase.__proto__),
    skip: dart.fnType(core.Iterable$(T), [core.int]),
    [$skip]: dart.fnType(core.Iterable$(T), [core.int]),
    take: dart.fnType(core.Iterable$(T), [core.int]),
    [$take]: dart.fnType(core.Iterable$(T), [core.int]),
    elementAt: dart.fnType(T, [core.int]),
    [$elementAt]: dart.fnType(T, [core.int]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    lastWhere: dart.fnType(T, [dart.fnType(core.bool, [T])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(T, [dart.fnType(core.bool, [T])], {orElse: core.Object}),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, [])
  }));
  dart.setGetterSignature(_CastIterableBase, () => ({
    __proto__: dart.getGetters(_CastIterableBase.__proto__),
    iterator: core.Iterator$(T),
    [$iterator]: core.Iterator$(T),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    first: T,
    [$first]: T,
    last: T,
    [$last]: T,
    single: T,
    [$single]: T
  }));
  dart.setLibraryUri(_CastIterableBase, "dart:_internal");
  dart.defineExtensionMethods(_CastIterableBase, [
    'skip',
    'take',
    'elementAt',
    'contains',
    'lastWhere',
    'toString'
  ]);
  dart.defineExtensionAccessors(_CastIterableBase, [
    'iterator',
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single'
  ]);
  return _CastIterableBase;
});
_internal._CastIterableBase = _internal._CastIterableBase$();
dart.addTypeTests(_internal._CastIterableBase, _is__CastIterableBase_default);
const _is_CastIterator_default = Symbol('_is_CastIterator_default');
_internal.CastIterator$ = dart.generic((S, T) => {
  let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  class CastIterator extends core.Object {
    moveNext() {
      return this[_source].moveNext();
    }
    get current() {
      return T.as(this[_source].current);
    }
  }
  (CastIterator.new = function(source) {
    this[_source] = source;
  }).prototype = CastIterator.prototype;
  dart.addTypeTests(CastIterator);
  CastIterator.prototype[_is_CastIterator_default] = true;
  CastIterator[dart.implements] = () => [IteratorOfT()];
  dart.setMethodSignature(CastIterator, () => ({
    __proto__: dart.getMethods(CastIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(CastIterator, () => ({
    __proto__: dart.getGetters(CastIterator.__proto__),
    current: T
  }));
  dart.setLibraryUri(CastIterator, "dart:_internal");
  dart.setFieldSignature(CastIterator, () => ({
    __proto__: dart.getFields(CastIterator.__proto__),
    [_source]: dart.fieldType(IteratorOfS())
  }));
  return CastIterator;
});
_internal.CastIterator = _internal.CastIterator$();
dart.addTypeTests(_internal.CastIterator, _is_CastIterator_default);
const _is_CastIterable_default = Symbol('_is_CastIterable_default');
_internal.CastIterable$ = dart.generic((S, T) => {
  let EfficientLengthIterableOfS = () => (EfficientLengthIterableOfS = dart.constFn(_internal.EfficientLengthIterable$(S)))();
  let _EfficientLengthCastIterableOfS$T = () => (_EfficientLengthCastIterableOfS$T = dart.constFn(_internal._EfficientLengthCastIterable$(S, T)))();
  let CastIterableOfS$T = () => (CastIterableOfS$T = dart.constFn(_internal.CastIterable$(S, T)))();
  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
  class CastIterable extends _internal._CastIterableBase$(S, T) {
    static new(source) {
      if (EfficientLengthIterableOfS().is(source)) {
        return new (_EfficientLengthCastIterableOfS$T()).new(source);
      }
      return new (CastIterableOfS$T()).__(source);
    }
    cast(R) {
      return _internal.CastIterable$(S, R).new(this[_source]);
    }
  }
  (CastIterable.__ = function(source) {
    this[_source] = source;
    CastIterable.__proto__.new.call(this);
  }).prototype = CastIterable.prototype;
  dart.addTypeTests(CastIterable);
  CastIterable.prototype[_is_CastIterable_default] = true;
  dart.setMethodSignature(CastIterable, () => ({
    __proto__: dart.getMethods(CastIterable.__proto__),
    cast: dart.gFnType(R => [core.Iterable$(R), []]),
    [$cast]: dart.gFnType(R => [core.Iterable$(R), []])
  }));
  dart.setLibraryUri(CastIterable, "dart:_internal");
  dart.setFieldSignature(CastIterable, () => ({
    __proto__: dart.getFields(CastIterable.__proto__),
    [_source]: dart.finalFieldType(IterableOfS())
  }));
  dart.defineExtensionMethods(CastIterable, ['cast']);
  return CastIterable;
});
_internal.CastIterable = _internal.CastIterable$();
dart.addTypeTests(_internal.CastIterable, _is_CastIterable_default);
const _is__EfficientLengthCastIterable_default = Symbol('_is__EfficientLengthCastIterable_default');
_internal._EfficientLengthCastIterable$ = dart.generic((S, T) => {
  let EfficientLengthIterableOfT = () => (EfficientLengthIterableOfT = dart.constFn(_internal.EfficientLengthIterable$(T)))();
  class _EfficientLengthCastIterable extends _internal.CastIterable$(S, T) {}
  (_EfficientLengthCastIterable.new = function(source) {
    _EfficientLengthCastIterable.__proto__.__.call(this, source);
  }).prototype = _EfficientLengthCastIterable.prototype;
  dart.addTypeTests(_EfficientLengthCastIterable);
  _EfficientLengthCastIterable.prototype[_is__EfficientLengthCastIterable_default] = true;
  _EfficientLengthCastIterable[dart.implements] = () => [EfficientLengthIterableOfT()];
  dart.setLibraryUri(_EfficientLengthCastIterable, "dart:_internal");
  return _EfficientLengthCastIterable;
});
_internal._EfficientLengthCastIterable = _internal._EfficientLengthCastIterable$();
dart.addTypeTests(_internal._EfficientLengthCastIterable, _is__EfficientLengthCastIterable_default);
const _is__CastListBase_default = Symbol('_is__CastListBase_default');
_internal._CastListBase$ = dart.generic((S, T) => {
  let CastIterableOfT$S = () => (CastIterableOfT$S = dart.constFn(_internal.CastIterable$(T, S)))();
  let SAndSToint = () => (SAndSToint = dart.constFn(dart.fnType(core.int, [S, S])))();
  let STobool = () => (STobool = dart.constFn(dart.fnType(core.bool, [S])))();
  let CastIterableOfS$T = () => (CastIterableOfS$T = dart.constFn(_internal.CastIterable$(S, T)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  const _CastIterableBase_ListMixin$ = class _CastIterableBase_ListMixin extends _internal._CastIterableBase$(S, T) {};
  (_CastIterableBase_ListMixin$.new = function() {
    _CastIterableBase_ListMixin$.__proto__.new.call(this);
  }).prototype = _CastIterableBase_ListMixin$.prototype;
  dart.applyMixin(_CastIterableBase_ListMixin$, collection.ListMixin$(T));
  class _CastListBase extends _CastIterableBase_ListMixin$ {
    _get(index) {
      return T.as(this[_source][$_get](index));
    }
    _set(index, value) {
      T._check(value);
      this[_source][$_set](index, S.as(value));
      return value;
    }
    set length(length) {
      this[_source][$length] = length;
    }
    get length() {
      return super.length;
    }
    add(value) {
      T._check(value);
      this[_source][$add](S.as(value));
    }
    addAll(values) {
      IterableOfT()._check(values);
      this[_source][$addAll](CastIterableOfT$S().new(values));
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      this[_source][$sort](compare == null ? null : dart.fn((v1, v2) => compare(T.as(v1), T.as(v2)), SAndSToint()));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      this[_source][$shuffle](random);
    }
    insert(index, element) {
      T._check(element);
      this[_source][$insert](index, S.as(element));
    }
    insertAll(index, elements) {
      IterableOfT()._check(elements);
      this[_source][$insertAll](index, CastIterableOfT$S().new(elements));
    }
    setAll(index, elements) {
      IterableOfT()._check(elements);
      this[_source][$setAll](index, CastIterableOfT$S().new(elements));
    }
    remove(value) {
      return this[_source][$remove](value);
    }
    removeAt(index) {
      return T.as(this[_source][$removeAt](index));
    }
    removeLast() {
      return T.as(this[_source][$removeLast]());
    }
    removeWhere(test) {
      this[_source][$removeWhere](dart.fn(element => test(T.as(element)), STobool()));
    }
    retainWhere(test) {
      this[_source][$retainWhere](dart.fn(element => test(T.as(element)), STobool()));
    }
    getRange(start, end) {
      return CastIterableOfS$T().new(this[_source][$getRange](start, end));
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfT()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      this[_source][$setRange](start, end, CastIterableOfT$S().new(iterable), skipCount);
    }
    removeRange(start, end) {
      this[_source][$removeRange](start, end);
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      T._check(fillValue);
      this[_source][$fillRange](start, end, S.as(fillValue));
    }
    replaceRange(start, end, replacement) {
      IterableOfT()._check(replacement);
      this[_source][$replaceRange](start, end, CastIterableOfT$S().new(replacement));
    }
  }
  (_CastListBase.new = function() {
    _CastListBase.__proto__.new.call(this);
  }).prototype = _CastListBase.prototype;
  dart.addTypeTests(_CastListBase);
  _CastListBase.prototype[_is__CastListBase_default] = true;
  dart.setMethodSignature(_CastListBase, () => ({
    __proto__: dart.getMethods(_CastListBase.__proto__),
    _get: dart.fnType(T, [core.int]),
    [$_get]: dart.fnType(T, [core.int]),
    _set: dart.fnType(dart.void, [core.int, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
    add: dart.fnType(dart.void, [core.Object]),
    [$add]: dart.fnType(dart.void, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    sort: dart.fnType(dart.void, [], [dart.fnType(core.int, [T, T])]),
    [$sort]: dart.fnType(dart.void, [], [dart.fnType(core.int, [T, T])]),
    shuffle: dart.fnType(dart.void, [], [math.Random]),
    [$shuffle]: dart.fnType(dart.void, [], [math.Random]),
    insert: dart.fnType(dart.void, [core.int, core.Object]),
    [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
    insertAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$insertAll]: dart.fnType(dart.void, [core.int, core.Object]),
    setAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$setAll]: dart.fnType(dart.void, [core.int, core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    [$remove]: dart.fnType(core.bool, [core.Object]),
    removeAt: dart.fnType(T, [core.int]),
    [$removeAt]: dart.fnType(T, [core.int]),
    removeLast: dart.fnType(T, []),
    [$removeLast]: dart.fnType(T, []),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [T])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [T])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [T])]),
    [$retainWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [T])]),
    getRange: dart.fnType(core.Iterable$(T), [core.int, core.int]),
    [$getRange]: dart.fnType(core.Iterable$(T), [core.int, core.int]),
    setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    removeRange: dart.fnType(dart.void, [core.int, core.int]),
    [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
    fillRange: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
    [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
    replaceRange: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object])
  }));
  dart.setSetterSignature(_CastListBase, () => ({
    __proto__: dart.getSetters(_CastListBase.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(_CastListBase, "dart:_internal");
  dart.defineExtensionMethods(_CastListBase, [
    '_get',
    '_set',
    'add',
    'addAll',
    'sort',
    'shuffle',
    'insert',
    'insertAll',
    'setAll',
    'remove',
    'removeAt',
    'removeLast',
    'removeWhere',
    'retainWhere',
    'getRange',
    'setRange',
    'removeRange',
    'fillRange',
    'replaceRange'
  ]);
  dart.defineExtensionAccessors(_CastListBase, ['length']);
  return _CastListBase;
});
_internal._CastListBase = _internal._CastListBase$();
dart.addTypeTests(_internal._CastListBase, _is__CastListBase_default);
const _is_CastList_default = Symbol('_is_CastList_default');
_internal.CastList$ = dart.generic((S, T) => {
  let ListOfS = () => (ListOfS = dart.constFn(core.List$(S)))();
  class CastList extends _internal._CastListBase$(S, T) {
    cast(R) {
      return new (_internal.CastList$(S, R)).new(this[_source]);
    }
  }
  (CastList.new = function(source) {
    this[_source] = source;
    CastList.__proto__.new.call(this);
  }).prototype = CastList.prototype;
  dart.addTypeTests(CastList);
  CastList.prototype[_is_CastList_default] = true;
  dart.setMethodSignature(CastList, () => ({
    __proto__: dart.getMethods(CastList.__proto__),
    cast: dart.gFnType(R => [core.List$(R), []]),
    [$cast]: dart.gFnType(R => [core.List$(R), []])
  }));
  dart.setLibraryUri(CastList, "dart:_internal");
  dart.setFieldSignature(CastList, () => ({
    __proto__: dart.getFields(CastList.__proto__),
    [_source]: dart.finalFieldType(ListOfS())
  }));
  dart.defineExtensionMethods(CastList, ['cast']);
  return CastList;
});
_internal.CastList = _internal.CastList$();
dart.addTypeTests(_internal.CastList, _is_CastList_default);
const _emptySet = dart.privateName(_internal, "_emptySet");
const _conditionalAdd = dart.privateName(_internal, "_conditionalAdd");
const _clone = dart.privateName(_internal, "_clone");
const _is_CastSet_default = Symbol('_is_CastSet_default');
_internal.CastSet$ = dart.generic((S, T) => {
  let CastIterableOfT$S = () => (CastIterableOfT$S = dart.constFn(_internal.CastIterable$(T, S)))();
  let STobool = () => (STobool = dart.constFn(dart.fnType(core.bool, [S])))();
  let CastSetOfS$T = () => (CastSetOfS$T = dart.constFn(_internal.CastSet$(S, T)))();
  let SetOfS = () => (SetOfS = dart.constFn(core.Set$(S)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  let _HashSetOfT = () => (_HashSetOfT = dart.constFn(collection._HashSet$(T)))();
  let SetOfT = () => (SetOfT = dart.constFn(core.Set$(T)))();
  class CastSet extends _internal._CastIterableBase$(S, T) {
    static _defaultEmptySet(R) {
      return new (collection._HashSet$(R)).new();
    }
    cast(R) {
      return new (_internal.CastSet$(S, R)).new(this[_source], this[_emptySet]);
    }
    add(value) {
      T._check(value);
      return this[_source].add(S.as(value));
    }
    addAll(elements) {
      IterableOfT()._check(elements);
      this[_source].addAll(CastIterableOfT$S().new(elements));
    }
    remove(object) {
      return this[_source].remove(object);
    }
    removeAll(objects) {
      this[_source].removeAll(objects);
    }
    retainAll(objects) {
      this[_source].retainAll(objects);
    }
    removeWhere(test) {
      this[_source].removeWhere(dart.fn(element => test(T.as(element)), STobool()));
    }
    retainWhere(test) {
      this[_source].retainWhere(dart.fn(element => test(T.as(element)), STobool()));
    }
    containsAll(objects) {
      return this[_source].containsAll(objects);
    }
    intersection(other) {
      if (this[_emptySet] != null) return this[_conditionalAdd](other, true);
      return new (CastSetOfS$T()).new(this[_source].intersection(other), null);
    }
    difference(other) {
      if (this[_emptySet] != null) return this[_conditionalAdd](other, false);
      return new (CastSetOfS$T()).new(this[_source].difference(other), null);
    }
    [_conditionalAdd](other, otherContains) {
      let result = this[_emptySet] == null ? new (_HashSetOfT()).new() : this[_emptySet](T);
      for (let element of this[_source]) {
        let castElement = T.as(element);
        if (otherContains == other.contains(castElement)) result.add(castElement);
      }
      return result;
    }
    union(other) {
      SetOfT()._check(other);
      let _ = this[_clone]();
      _.addAll(other);
      return _;
    }
    clear() {
      this[_source].clear();
    }
    [_clone]() {
      let result = this[_emptySet] == null ? new (_HashSetOfT()).new() : this[_emptySet](T);
      result.addAll(this);
      return result;
    }
    toSet() {
      return this[_clone]();
    }
    lookup(key) {
      return T.as(this[_source].lookup(key));
    }
  }
  (CastSet.new = function(source, emptySet) {
    this[_source] = source;
    this[_emptySet] = emptySet;
    CastSet.__proto__.new.call(this);
  }).prototype = CastSet.prototype;
  dart.addTypeTests(CastSet);
  CastSet.prototype[_is_CastSet_default] = true;
  CastSet[dart.implements] = () => [SetOfT()];
  dart.setMethodSignature(CastSet, () => ({
    __proto__: dart.getMethods(CastSet.__proto__),
    cast: dart.gFnType(R => [core.Set$(R), []]),
    [$cast]: dart.gFnType(R => [core.Set$(R), []]),
    add: dart.fnType(core.bool, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    removeAll: dart.fnType(dart.void, [core.Iterable$(core.Object)]),
    retainAll: dart.fnType(dart.void, [core.Iterable$(core.Object)]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [T])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [T])]),
    containsAll: dart.fnType(core.bool, [core.Iterable$(core.Object)]),
    intersection: dart.fnType(core.Set$(T), [core.Set$(core.Object)]),
    difference: dart.fnType(core.Set$(T), [core.Set$(core.Object)]),
    [_conditionalAdd]: dart.fnType(core.Set$(T), [core.Set$(core.Object), core.bool]),
    union: dart.fnType(core.Set$(T), [core.Object]),
    clear: dart.fnType(dart.void, []),
    [_clone]: dart.fnType(core.Set$(T), []),
    toSet: dart.fnType(core.Set$(T), []),
    [$toSet]: dart.fnType(core.Set$(T), []),
    lookup: dart.fnType(T, [core.Object])
  }));
  dart.setLibraryUri(CastSet, "dart:_internal");
  dart.setFieldSignature(CastSet, () => ({
    __proto__: dart.getFields(CastSet.__proto__),
    [_source]: dart.finalFieldType(SetOfS()),
    [_emptySet]: dart.finalFieldType(VoidToSetOfR())
  }));
  dart.defineExtensionMethods(CastSet, ['cast', 'toSet']);
  return CastSet;
});
_internal.CastSet = _internal.CastSet$();
dart.addTypeTests(_internal.CastSet, _is_CastSet_default);
const _is_MapMixin_default = Symbol('_is_MapMixin_default');
collection.MapMixin$ = dart.generic((K, V) => {
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let KAndVToV = () => (KAndVToV = dart.constFn(dart.fnType(V, [K, V])))();
  let MapEntryOfK$V = () => (MapEntryOfK$V = dart.constFn(core.MapEntry$(K, V)))();
  let KToMapEntryOfK$V = () => (KToMapEntryOfK$V = dart.constFn(dart.fnType(MapEntryOfK$V(), [K])))();
  let IterableOfMapEntryOfK$V = () => (IterableOfMapEntryOfK$V = dart.constFn(core.Iterable$(MapEntryOfK$V())))();
  let JSArrayOfK = () => (JSArrayOfK = dart.constFn(_interceptors.JSArray$(K)))();
  let _MapBaseValueIterableOfK$V = () => (_MapBaseValueIterableOfK$V = dart.constFn(collection._MapBaseValueIterable$(K, V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  let VToV = () => (VToV = dart.constFn(dart.fnType(V, [V])))();
  class MapMixin extends core.Object {
    cast(RK, RV) {
      return core.Map.castFrom(K, V, RK, RV, this);
    }
    forEach(action) {
      for (let key of this[$keys]) {
        action(key, this[$_get](key));
      }
    }
    addAll(other) {
      MapOfK$V()._check(other);
      for (let key of other[$keys]) {
        this[$_set](key, other[$_get](key));
      }
    }
    containsValue(value) {
      for (let key of this[$keys]) {
        if (dart.equals(this[$_get](key), value)) return true;
      }
      return false;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      if (dart.test(this[$containsKey](key))) {
        return this[$_get](key);
      }
      return this[$_set](key, ifAbsent());
    }
    update(key, update, opts) {
      K._check(key);
      VToV()._check(update);
      let ifAbsent = opts && 'ifAbsent' in opts ? opts.ifAbsent : null;
      VoidToV()._check(ifAbsent);
      if (dart.test(this[$containsKey](key))) {
        return this[$_set](key, update(this[$_get](key)));
      }
      if (ifAbsent != null) {
        return this[$_set](key, ifAbsent());
      }
      dart.throw(new core.ArgumentError.value(key, "key", "Key not in map."));
    }
    updateAll(update) {
      KAndVToV()._check(update);
      for (let key of this[$keys]) {
        this[$_set](key, update(key, this[$_get](key)));
      }
    }
    get entries() {
      return IterableOfMapEntryOfK$V()._check(this[$keys][$map](MapEntryOfK$V(), dart.fn(key => MapEntryOfK$V().new(key, this[$_get](key)), KToMapEntryOfK$V())));
    }
    map(K2, V2, transform) {
      let result = new (_js_helper.LinkedMap$(K2, V2)).new();
      for (let key of this[$keys]) {
        let entry = transform(key, this[$_get](key));
        result[$_set](entry.key, entry.value);
      }
      return result;
    }
    addEntries(newEntries) {
      IterableOfMapEntryOfK$V()._check(newEntries);
      for (let entry of newEntries) {
        this[$_set](entry.key, entry.value);
      }
    }
    removeWhere(test) {
      let keysToRemove = JSArrayOfK().of([]);
      for (let key of this[$keys]) {
        if (dart.test(test(key, this[$_get](key)))) keysToRemove[$add](key);
      }
      for (let key of keysToRemove) {
        this[$remove](key);
      }
    }
    containsKey(key) {
      return this[$keys][$contains](key);
    }
    get length() {
      return this[$keys][$length];
    }
    get isEmpty() {
      return this[$keys][$isEmpty];
    }
    get isNotEmpty() {
      return this[$keys][$isNotEmpty];
    }
    get values() {
      return new (_MapBaseValueIterableOfK$V()).new(this);
    }
    toString() {
      return collection.MapBase.mapToString(this);
    }
  }
  (MapMixin.new = function() {
  }).prototype = MapMixin.prototype;
  MapMixin.prototype[dart.isMap] = true;
  dart.addTypeTests(MapMixin);
  MapMixin.prototype[_is_MapMixin_default] = true;
  MapMixin[dart.implements] = () => [MapOfK$V()];
  dart.setMethodSignature(MapMixin, () => ({
    __proto__: dart.getMethods(MapMixin.__proto__),
    cast: dart.gFnType((RK, RV) => [core.Map$(RK, RV), []]),
    [$cast]: dart.gFnType((RK, RV) => [core.Map$(RK, RV), []]),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [K, V])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [K, V])]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    containsValue: dart.fnType(core.bool, [core.Object]),
    [$containsValue]: dart.fnType(core.bool, [core.Object]),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    update: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    [$update]: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    updateAll: dart.fnType(dart.void, [core.Object]),
    [$updateAll]: dart.fnType(dart.void, [core.Object]),
    map: dart.gFnType((K2, V2) => [core.Map$(K2, V2), [dart.fnType(core.MapEntry$(K2, V2), [K, V])]]),
    [$map]: dart.gFnType((K2, V2) => [core.Map$(K2, V2), [dart.fnType(core.MapEntry$(K2, V2), [K, V])]]),
    addEntries: dart.fnType(dart.void, [core.Object]),
    [$addEntries]: dart.fnType(dart.void, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [K, V])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [K, V])]),
    containsKey: dart.fnType(core.bool, [core.Object]),
    [$containsKey]: dart.fnType(core.bool, [core.Object]),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, [])
  }));
  dart.setGetterSignature(MapMixin, () => ({
    __proto__: dart.getGetters(MapMixin.__proto__),
    entries: core.Iterable$(core.MapEntry$(K, V)),
    [$entries]: core.Iterable$(core.MapEntry$(K, V)),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    values: core.Iterable$(V),
    [$values]: core.Iterable$(V)
  }));
  dart.setLibraryUri(MapMixin, "dart:collection");
  dart.defineExtensionMethods(MapMixin, [
    'cast',
    'forEach',
    'addAll',
    'containsValue',
    'putIfAbsent',
    'update',
    'updateAll',
    'map',
    'addEntries',
    'removeWhere',
    'containsKey',
    'toString'
  ]);
  dart.defineExtensionAccessors(MapMixin, [
    'entries',
    'length',
    'isEmpty',
    'isNotEmpty',
    'values'
  ]);
  return MapMixin;
});
collection.MapMixin = collection.MapMixin$();
dart.addTypeTests(collection.MapMixin, _is_MapMixin_default);
const _is_MapBase_default = Symbol('_is_MapBase_default');
collection.MapBase$ = dart.generic((K, V) => {
  class MapBase extends collection.MapMixin$(K, V) {
    static mapToString(m) {
      if (dart.test(collection._isToStringVisiting(m))) {
        return "{...}";
      }
      let result = new core.StringBuffer.new();
      try {
        collection._toStringVisiting[$add](m);
        result.write("{");
        let first = true;
        m[$forEach](dart.fn((k, v) => {
          if (!first) {
            result.write(", ");
          }
          first = false;
          result.write(k);
          result.write(": ");
          result.write(v);
        }, dynamicAnddynamicToNull()));
        result.write("}");
      } finally {
        if (!core.identical(collection._toStringVisiting[$last], m)) dart.assertFailed(null, "dart:collection/maps.dart", 44, 14, "identical(_toStringVisiting.last, m)");
        collection._toStringVisiting[$removeLast]();
      }
      return result.toString();
    }
    static _id(x) {
      return x;
    }
    static _fillMapWithMappedIterable(map, iterable, key, value) {
      let t = key;
      t == null ? key = dart.fn(collection.MapBase._id, dynamicTodynamic()) : t;
      let t$ = value;
      t$ == null ? value = dart.fn(collection.MapBase._id, dynamicTodynamic()) : t$;
      for (let element of iterable) {
        map[$_set](key(element), value(element));
      }
    }
    static _fillMapWithIterables(map, keys, values) {
      let keyIterator = keys[$iterator];
      let valueIterator = values[$iterator];
      let hasNextKey = keyIterator.moveNext();
      let hasNextValue = valueIterator.moveNext();
      while (dart.test(hasNextKey) && dart.test(hasNextValue)) {
        map[$_set](keyIterator.current, valueIterator.current);
        hasNextKey = keyIterator.moveNext();
        hasNextValue = valueIterator.moveNext();
      }
      if (dart.test(hasNextKey) || dart.test(hasNextValue)) {
        dart.throw(new core.ArgumentError.new("Iterables do not have same length."));
      }
    }
  }
  (MapBase.new = function() {
  }).prototype = MapBase.prototype;
  dart.addTypeTests(MapBase);
  MapBase.prototype[_is_MapBase_default] = true;
  dart.setLibraryUri(MapBase, "dart:collection");
  return MapBase;
});
collection.MapBase = collection.MapBase$();
dart.addTypeTests(collection.MapBase, _is_MapBase_default);
const _is_CastMap_default = Symbol('_is_CastMap_default');
_internal.CastMap$ = dart.generic((SK, SV, K, V) => {
  let CastMapOfK$V$SK$SV = () => (CastMapOfK$V$SK$SV = dart.constFn(_internal.CastMap$(K, V, SK, SV)))();
  let SKAndSVToNull = () => (SKAndSVToNull = dart.constFn(dart.fnType(core.Null, [SK, SV])))();
  let CastIterableOfSK$K = () => (CastIterableOfSK$K = dart.constFn(_internal.CastIterable$(SK, K)))();
  let SKAndSVToSV = () => (SKAndSVToSV = dart.constFn(dart.fnType(SV, [SK, SV])))();
  let MapEntryOfSK$SV = () => (MapEntryOfSK$SV = dart.constFn(core.MapEntry$(SK, SV)))();
  let MapEntryOfSK$SVToMapEntryOfK$V = () => (MapEntryOfSK$SVToMapEntryOfK$V = dart.constFn(dart.fnType(MapEntryOfK$V(), [MapEntryOfSK$SV()])))();
  let SKAndSVTobool = () => (SKAndSVTobool = dart.constFn(dart.fnType(core.bool, [SK, SV])))();
  let MapOfSK$SV = () => (MapOfSK$SV = dart.constFn(core.Map$(SK, SV)))();
  let VoidToSV = () => (VoidToSV = dart.constFn(dart.fnType(SV, [])))();
  let CastIterableOfSV$V = () => (CastIterableOfSV$V = dart.constFn(_internal.CastIterable$(SV, V)))();
  let SVToSV = () => (SVToSV = dart.constFn(dart.fnType(SV, [SV])))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let KAndVToV = () => (KAndVToV = dart.constFn(dart.fnType(V, [K, V])))();
  let MapEntryOfK$V = () => (MapEntryOfK$V = dart.constFn(core.MapEntry$(K, V)))();
  let IterableOfMapEntryOfK$V = () => (IterableOfMapEntryOfK$V = dart.constFn(core.Iterable$(MapEntryOfK$V())))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  let VToV = () => (VToV = dart.constFn(dart.fnType(V, [V])))();
  class CastMap extends collection.MapBase$(K, V) {
    cast(RK, RV) {
      return new (_internal.CastMap$(SK, SV, RK, RV)).new(this[_source]);
    }
    containsValue(value) {
      return this[_source][$containsValue](value);
    }
    containsKey(key) {
      return this[_source][$containsKey](key);
    }
    _get(key) {
      return V.as(this[_source][$_get](key));
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      this[_source][$_set](SK.as(key), SV.as(value));
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      return V.as(this[_source][$putIfAbsent](SK.as(key), ifAbsent == null ? null : dart.fn(() => SV.as(ifAbsent()), VoidToSV())));
    }
    addAll(other) {
      MapOfK$V()._check(other);
      this[_source][$addAll](new (CastMapOfK$V$SK$SV()).new(other));
    }
    remove(key) {
      return V.as(this[_source][$remove](key));
    }
    clear() {
      this[_source][$clear]();
    }
    forEach(f) {
      this[_source][$forEach](dart.fn((key, value) => {
        f(K.as(key), V.as(value));
      }, SKAndSVToNull()));
    }
    get keys() {
      return CastIterableOfSK$K().new(this[_source][$keys]);
    }
    get values() {
      return CastIterableOfSV$V().new(this[_source][$values]);
    }
    get length() {
      return this[_source][$length];
    }
    get isEmpty() {
      return this[_source][$isEmpty];
    }
    get isNotEmpty() {
      return this[_source][$isNotEmpty];
    }
    update(key, update, opts) {
      K._check(key);
      VToV()._check(update);
      let ifAbsent = opts && 'ifAbsent' in opts ? opts.ifAbsent : null;
      VoidToV()._check(ifAbsent);
      return V.as(this[_source][$update](SK.as(key), dart.fn(value => SV.as(update(V.as(value))), SVToSV()), {ifAbsent: ifAbsent == null ? null : dart.fn(() => SV.as(ifAbsent()), VoidToSV())}));
    }
    updateAll(update) {
      KAndVToV()._check(update);
      this[_source][$updateAll](dart.fn((key, value) => SV.as(update(K.as(key), V.as(value))), SKAndSVToSV()));
    }
    get entries() {
      return IterableOfMapEntryOfK$V()._check(this[_source][$entries][$map](MapEntryOfK$V(), dart.fn(e => MapEntryOfK$V().new(K.as(e.key), V.as(e.value)), MapEntryOfSK$SVToMapEntryOfK$V())));
    }
    addEntries(entries) {
      IterableOfMapEntryOfK$V()._check(entries);
      for (let entry of entries) {
        this[_source][$_set](SK.as(entry.key), SV.as(entry.value));
      }
    }
    removeWhere(test) {
      this[_source][$removeWhere](dart.fn((key, value) => test(K.as(key), V.as(value)), SKAndSVTobool()));
    }
  }
  (CastMap.new = function(source) {
    this[_source] = source;
  }).prototype = CastMap.prototype;
  dart.addTypeTests(CastMap);
  CastMap.prototype[_is_CastMap_default] = true;
  dart.setMethodSignature(CastMap, () => ({
    __proto__: dart.getMethods(CastMap.__proto__),
    cast: dart.gFnType((RK, RV) => [core.Map$(RK, RV), []]),
    [$cast]: dart.gFnType((RK, RV) => [core.Map$(RK, RV), []]),
    containsValue: dart.fnType(core.bool, [core.Object]),
    [$containsValue]: dart.fnType(core.bool, [core.Object]),
    containsKey: dart.fnType(core.bool, [core.Object]),
    [$containsKey]: dart.fnType(core.bool, [core.Object]),
    _get: dart.fnType(V, [core.Object]),
    [$_get]: dart.fnType(V, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(V, [core.Object]),
    [$remove]: dart.fnType(V, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, []),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [K, V])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [K, V])]),
    update: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    [$update]: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    updateAll: dart.fnType(dart.void, [core.Object]),
    [$updateAll]: dart.fnType(dart.void, [core.Object]),
    addEntries: dart.fnType(dart.void, [core.Object]),
    [$addEntries]: dart.fnType(dart.void, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [K, V])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [K, V])])
  }));
  dart.setGetterSignature(CastMap, () => ({
    __proto__: dart.getGetters(CastMap.__proto__),
    keys: core.Iterable$(K),
    [$keys]: core.Iterable$(K),
    values: core.Iterable$(V),
    [$values]: core.Iterable$(V),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    entries: core.Iterable$(core.MapEntry$(K, V)),
    [$entries]: core.Iterable$(core.MapEntry$(K, V))
  }));
  dart.setLibraryUri(CastMap, "dart:_internal");
  dart.setFieldSignature(CastMap, () => ({
    __proto__: dart.getFields(CastMap.__proto__),
    [_source]: dart.finalFieldType(MapOfSK$SV())
  }));
  dart.defineExtensionMethods(CastMap, [
    'cast',
    'containsValue',
    'containsKey',
    '_get',
    '_set',
    'putIfAbsent',
    'addAll',
    'remove',
    'clear',
    'forEach',
    'update',
    'updateAll',
    'addEntries',
    'removeWhere'
  ]);
  dart.defineExtensionAccessors(CastMap, [
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty',
    'entries'
  ]);
  return CastMap;
});
_internal.CastMap = _internal.CastMap$();
dart.addTypeTests(_internal.CastMap, _is_CastMap_default);
const _is_CastQueue_default = Symbol('_is_CastQueue_default');
_internal.CastQueue$ = dart.generic((S, T) => {
  let CastIterableOfT$S = () => (CastIterableOfT$S = dart.constFn(_internal.CastIterable$(T, S)))();
  let STobool = () => (STobool = dart.constFn(dart.fnType(core.bool, [S])))();
  let QueueOfS = () => (QueueOfS = dart.constFn(collection.Queue$(S)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  let QueueOfT = () => (QueueOfT = dart.constFn(collection.Queue$(T)))();
  class CastQueue extends _internal._CastIterableBase$(S, T) {
    cast(R) {
      return new (_internal.CastQueue$(S, R)).new(this[_source]);
    }
    removeFirst() {
      return T.as(this[_source].removeFirst());
    }
    removeLast() {
      return T.as(this[_source].removeLast());
    }
    add(value) {
      T._check(value);
      this[_source].add(S.as(value));
    }
    addFirst(value) {
      T._check(value);
      this[_source].addFirst(S.as(value));
    }
    addLast(value) {
      T._check(value);
      this[_source].addLast(S.as(value));
    }
    remove(other) {
      return this[_source].remove(other);
    }
    addAll(elements) {
      IterableOfT()._check(elements);
      this[_source].addAll(CastIterableOfT$S().new(elements));
    }
    removeWhere(test) {
      this[_source].removeWhere(dart.fn(element => test(T.as(element)), STobool()));
    }
    retainWhere(test) {
      this[_source].retainWhere(dart.fn(element => test(T.as(element)), STobool()));
    }
    clear() {
      this[_source].clear();
    }
  }
  (CastQueue.new = function(source) {
    this[_source] = source;
    CastQueue.__proto__.new.call(this);
  }).prototype = CastQueue.prototype;
  dart.addTypeTests(CastQueue);
  CastQueue.prototype[_is_CastQueue_default] = true;
  CastQueue[dart.implements] = () => [QueueOfT()];
  dart.setMethodSignature(CastQueue, () => ({
    __proto__: dart.getMethods(CastQueue.__proto__),
    cast: dart.gFnType(R => [collection.Queue$(R), []]),
    [$cast]: dart.gFnType(R => [collection.Queue$(R), []]),
    removeFirst: dart.fnType(T, []),
    removeLast: dart.fnType(T, []),
    add: dart.fnType(dart.void, [core.Object]),
    addFirst: dart.fnType(dart.void, [core.Object]),
    addLast: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [T])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [T])]),
    clear: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(CastQueue, "dart:_internal");
  dart.setFieldSignature(CastQueue, () => ({
    __proto__: dart.getFields(CastQueue.__proto__),
    [_source]: dart.finalFieldType(QueueOfS())
  }));
  dart.defineExtensionMethods(CastQueue, ['cast']);
  return CastQueue;
});
_internal.CastQueue = _internal.CastQueue$();
dart.addTypeTests(_internal.CastQueue, _is_CastQueue_default);
const _is_EfficientLengthIterable_default = Symbol('_is_EfficientLengthIterable_default');
_internal.EfficientLengthIterable$ = dart.generic(T => {
  class EfficientLengthIterable extends core.Iterable$(T) {}
  (EfficientLengthIterable.new = function() {
    EfficientLengthIterable.__proto__.new.call(this);
  }).prototype = EfficientLengthIterable.prototype;
  dart.addTypeTests(EfficientLengthIterable);
  EfficientLengthIterable.prototype[_is_EfficientLengthIterable_default] = true;
  dart.setLibraryUri(EfficientLengthIterable, "dart:_internal");
  return EfficientLengthIterable;
});
_internal.EfficientLengthIterable = _internal.EfficientLengthIterable$();
dart.addTypeTests(_internal.EfficientLengthIterable, _is_EfficientLengthIterable_default);
const _is_ListIterable_default = Symbol('_is_ListIterable_default');
_internal.ListIterable$ = dart.generic(E => {
  let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.fnType(E, [])))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.fnType(E, [E, E])))();
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  class ListIterable extends _internal.EfficientLengthIterable$(E) {
    get iterator() {
      return new (ListIteratorOfE()).new(this);
    }
    forEach(action) {
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        action(this.elementAt(i));
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
    }
    get isEmpty() {
      return this.length === 0;
    }
    get first() {
      if (this.length === 0) dart.throw(_internal.IterableElementError.noElement());
      return this.elementAt(0);
    }
    get last() {
      if (this.length === 0) dart.throw(_internal.IterableElementError.noElement());
      return this.elementAt(dart.notNull(this.length) - 1);
    }
    get single() {
      if (this.length === 0) dart.throw(_internal.IterableElementError.noElement());
      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
      return this.elementAt(0);
    }
    contains(element) {
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.equals(this.elementAt(i), element)) return true;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return false;
    }
    every(test) {
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        if (!dart.test(test(this.elementAt(i)))) return false;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return true;
    }
    any(test) {
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.test(test(this.elementAt(i)))) return true;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return false;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this.elementAt(i);
        if (dart.test(test(element))) return element;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this.length;
      for (let i = dart.notNull(length) - 1; i >= 0; i--) {
        let element = this.elementAt(i);
        if (dart.test(test(element))) return element;
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let length = this.length;
      let match = null;
      let matchFound = false;
      for (let i = 0; i < dart.notNull(length); i++) {
        let element = this.elementAt(i);
        if (dart.test(test(element))) {
          if (matchFound) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          matchFound = true;
          match = element;
        }
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      if (matchFound) return match;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let length = this.length;
      if (!separator[$isEmpty]) {
        if (length === 0) return "";
        let first = dart.str(this.elementAt(0));
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
        let buffer = new core.StringBuffer.new(first);
        for (let i = 1; i < dart.notNull(length); i++) {
          buffer.write(separator);
          buffer.write(this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError.new(this));
          }
        }
        return buffer.toString();
      } else {
        let buffer = new core.StringBuffer.new();
        for (let i = 0; i < dart.notNull(length); i++) {
          buffer.write(this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError.new(this));
          }
        }
        return buffer.toString();
      }
    }
    where(test) {
      return super.where(test);
    }
    map(T, f) {
      return new (_internal.MappedListIterable$(E, T)).new(this, f);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let length = this.length;
      if (length === 0) dart.throw(_internal.IterableElementError.noElement());
      let value = this.elementAt(0);
      for (let i = 1; i < dart.notNull(length); i++) {
        value = combine(value, this.elementAt(i));
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return value;
    }
    fold(T, initialValue, combine) {
      let value = initialValue;
      let length = this.length;
      for (let i = 0; i < dart.notNull(length); i++) {
        value = combine(value, this.elementAt(i));
        if (length != this.length) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
      return value;
    }
    skip(count) {
      return new (SubListIterableOfE()).new(this, count, null);
    }
    skipWhile(test) {
      return super.skipWhile(test);
    }
    take(count) {
      return new (SubListIterableOfE()).new(this, 0, count);
    }
    takeWhile(test) {
      return super.takeWhile(test);
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = null;
      if (dart.test(growable)) {
        result = JSArrayOfE().of([]);
        result[$length] = this.length;
      } else {
        result = ListOfE().new(this.length);
      }
      for (let i = 0; i < dart.notNull(this.length); i++) {
        result[$_set](i, this.elementAt(i));
      }
      return result;
    }
    toSet() {
      let result = new (_HashSetOfE()).new();
      for (let i = 0; i < dart.notNull(this.length); i++) {
        result.add(this.elementAt(i));
      }
      return result;
    }
  }
  (ListIterable.new = function() {
    ListIterable.__proto__.new.call(this);
  }).prototype = ListIterable.prototype;
  dart.addTypeTests(ListIterable);
  ListIterable.prototype[_is_ListIterable_default] = true;
  dart.setMethodSignature(ListIterable, () => ({
    __proto__: dart.getMethods(ListIterable.__proto__),
    firstWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$firstWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    lastWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    singleWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$singleWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    reduce: dart.fnType(E, [core.Object]),
    [$reduce]: dart.fnType(E, [core.Object])
  }));
  dart.setGetterSignature(ListIterable, () => ({
    __proto__: dart.getGetters(ListIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(ListIterable, "dart:_internal");
  dart.defineExtensionMethods(ListIterable, [
    'forEach',
    'contains',
    'every',
    'any',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'join',
    'where',
    'map',
    'reduce',
    'fold',
    'skip',
    'skipWhile',
    'take',
    'takeWhile',
    'toList',
    'toSet'
  ]);
  dart.defineExtensionAccessors(ListIterable, [
    'iterator',
    'isEmpty',
    'first',
    'last',
    'single'
  ]);
  return ListIterable;
});
_internal.ListIterable = _internal.ListIterable$();
dart.addTypeTests(_internal.ListIterable, _is_ListIterable_default);
const _iterable$ = dart.privateName(_internal, "_iterable");
const _start = dart.privateName(_internal, "_start");
const _endOrLength = dart.privateName(_internal, "_endOrLength");
const _endIndex = dart.privateName(_internal, "_endIndex");
const _startIndex = dart.privateName(_internal, "_startIndex");
const _is_SubListIterable_default = Symbol('_is_SubListIterable_default');
_internal.SubListIterable$ = dart.generic(E => {
  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class SubListIterable extends _internal.ListIterable$(E) {
    get [_endIndex]() {
      let length = this[_iterable$][$length];
      if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) > dart.notNull(length)) return length;
      return this[_endOrLength];
    }
    get [_startIndex]() {
      let length = this[_iterable$][$length];
      if (dart.notNull(this[_start]) > dart.notNull(length)) return length;
      return this[_start];
    }
    get length() {
      let length = this[_iterable$][$length];
      if (dart.notNull(this[_start]) >= dart.notNull(length)) return 0;
      if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) >= dart.notNull(length)) {
        return dart.notNull(length) - dart.notNull(this[_start]);
      }
      return dart.notNull(this[_endOrLength]) - dart.notNull(this[_start]);
    }
    elementAt(index) {
      let realIndex = dart.notNull(this[_startIndex]) + dart.notNull(index);
      if (dart.notNull(index) < 0 || realIndex >= dart.notNull(this[_endIndex])) {
        dart.throw(core.RangeError.index(index, this, "index"));
      }
      return this[_iterable$][$elementAt](realIndex);
    }
    skip(count) {
      core.RangeError.checkNotNegative(count, "count");
      let newStart = dart.notNull(this[_start]) + dart.notNull(count);
      if (this[_endOrLength] != null && newStart >= dart.notNull(this[_endOrLength])) {
        return new (EmptyIterableOfE()).new();
      }
      return new (SubListIterableOfE()).new(this[_iterable$], newStart, this[_endOrLength]);
    }
    take(count) {
      core.RangeError.checkNotNegative(count, "count");
      if (this[_endOrLength] == null) {
        return new (SubListIterableOfE()).new(this[_iterable$], this[_start], dart.notNull(this[_start]) + dart.notNull(count));
      } else {
        let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
        if (dart.notNull(this[_endOrLength]) < newEnd) return this;
        return new (SubListIterableOfE()).new(this[_iterable$], this[_start], newEnd);
      }
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let start = this[_start];
      let end = this[_iterable$][$length];
      if (this[_endOrLength] != null && dart.notNull(this[_endOrLength]) < dart.notNull(end)) end = this[_endOrLength];
      let length = dart.notNull(end) - dart.notNull(start);
      if (length < 0) length = 0;
      let result = dart.test(growable) ? (() => {
        let _ = JSArrayOfE().of([]);
        _[$length] = length;
        return _;
      })() : ListOfE().new(length);
      for (let i = 0; i < length; i++) {
        result[$_set](i, this[_iterable$][$elementAt](dart.notNull(start) + i));
        if (dart.notNull(this[_iterable$][$length]) < dart.notNull(end)) dart.throw(new core.ConcurrentModificationError.new(this));
      }
      return result;
    }
  }
  (SubListIterable.new = function(iterable, start, endOrLength) {
    this[_iterable$] = iterable;
    this[_start] = start;
    this[_endOrLength] = endOrLength;
    SubListIterable.__proto__.new.call(this);
    core.RangeError.checkNotNegative(this[_start], "start");
    if (this[_endOrLength] != null) {
      core.RangeError.checkNotNegative(this[_endOrLength], "end");
      if (dart.notNull(this[_start]) > dart.notNull(this[_endOrLength])) {
        dart.throw(new core.RangeError.range(this[_start], 0, this[_endOrLength], "start"));
      }
    }
  }).prototype = SubListIterable.prototype;
  dart.addTypeTests(SubListIterable);
  SubListIterable.prototype[_is_SubListIterable_default] = true;
  dart.setMethodSignature(SubListIterable, () => ({
    __proto__: dart.getMethods(SubListIterable.__proto__),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int])
  }));
  dart.setGetterSignature(SubListIterable, () => ({
    __proto__: dart.getGetters(SubListIterable.__proto__),
    [_endIndex]: core.int,
    [_startIndex]: core.int,
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(SubListIterable, "dart:_internal");
  dart.setFieldSignature(SubListIterable, () => ({
    __proto__: dart.getFields(SubListIterable.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfE()),
    [_start]: dart.finalFieldType(core.int),
    [_endOrLength]: dart.finalFieldType(core.int)
  }));
  dart.defineExtensionMethods(SubListIterable, ['elementAt', 'skip', 'take', 'toList']);
  dart.defineExtensionAccessors(SubListIterable, ['length']);
  return SubListIterable;
});
_internal.SubListIterable = _internal.SubListIterable$();
dart.addTypeTests(_internal.SubListIterable, _is_SubListIterable_default);
const _length$ = dart.privateName(_internal, "_length");
const _index$ = dart.privateName(_internal, "_index");
const _current$ = dart.privateName(_internal, "_current");
const _is_ListIterator_default = Symbol('_is_ListIterator_default');
_internal.ListIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class ListIterator extends core.Object {
    get current() {
      return this[_current$];
    }
    moveNext() {
      let length = this[_iterable$][$length];
      if (this[_length$] != length) {
        dart.throw(new core.ConcurrentModificationError.new(this[_iterable$]));
      }
      if (dart.notNull(this[_index$]) >= dart.notNull(length)) {
        this[_current$] = null;
        return false;
      }
      this[_current$] = this[_iterable$][$elementAt](this[_index$]);
      this[_index$] = dart.notNull(this[_index$]) + 1;
      return true;
    }
  }
  (ListIterator.new = function(iterable) {
    this[_current$] = null;
    this[_iterable$] = iterable;
    this[_length$] = iterable[$length];
    this[_index$] = 0;
  }).prototype = ListIterator.prototype;
  dart.addTypeTests(ListIterator);
  ListIterator.prototype[_is_ListIterator_default] = true;
  ListIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(ListIterator, () => ({
    __proto__: dart.getMethods(ListIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(ListIterator, () => ({
    __proto__: dart.getGetters(ListIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(ListIterator, "dart:_internal");
  dart.setFieldSignature(ListIterator, () => ({
    __proto__: dart.getFields(ListIterator.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfE()),
    [_length$]: dart.finalFieldType(core.int),
    [_index$]: dart.fieldType(core.int),
    [_current$]: dart.fieldType(E)
  }));
  return ListIterator;
});
_internal.ListIterator = _internal.ListIterator$();
dart.addTypeTests(_internal.ListIterator, _is_ListIterator_default);
const _f = dart.privateName(_internal, "_f");
const _is_MappedIterable_default = Symbol('_is_MappedIterable_default');
_internal.MappedIterable$ = dart.generic((S, T) => {
  let EfficientLengthMappedIterableOfS$T = () => (EfficientLengthMappedIterableOfS$T = dart.constFn(_internal.EfficientLengthMappedIterable$(S, T)))();
  let MappedIterableOfS$T = () => (MappedIterableOfS$T = dart.constFn(_internal.MappedIterable$(S, T)))();
  let MappedIteratorOfS$T = () => (MappedIteratorOfS$T = dart.constFn(_internal.MappedIterator$(S, T)))();
  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
  let SToT = () => (SToT = dart.constFn(dart.fnType(T, [S])))();
  class MappedIterable extends core.Iterable$(T) {
    static new(iterable, func) {
      if (_internal.EfficientLengthIterable.is(iterable)) {
        return new (EfficientLengthMappedIterableOfS$T()).new(iterable, func);
      }
      return new (MappedIterableOfS$T()).__(iterable, func);
    }
    get iterator() {
      return new (MappedIteratorOfS$T()).new(this[_iterable$][$iterator], this[_f]);
    }
    get length() {
      return this[_iterable$][$length];
    }
    get isEmpty() {
      return this[_iterable$][$isEmpty];
    }
    get first() {
      return this[_f](this[_iterable$][$first]);
    }
    get last() {
      return this[_f](this[_iterable$][$last]);
    }
    get single() {
      return this[_f](this[_iterable$][$single]);
    }
    elementAt(index) {
      return this[_f](this[_iterable$][$elementAt](index));
    }
  }
  (MappedIterable.__ = function(iterable, f) {
    this[_iterable$] = iterable;
    this[_f] = f;
    MappedIterable.__proto__.new.call(this);
  }).prototype = MappedIterable.prototype;
  dart.addTypeTests(MappedIterable);
  MappedIterable.prototype[_is_MappedIterable_default] = true;
  dart.setMethodSignature(MappedIterable, () => ({
    __proto__: dart.getMethods(MappedIterable.__proto__),
    elementAt: dart.fnType(T, [core.int]),
    [$elementAt]: dart.fnType(T, [core.int])
  }));
  dart.setGetterSignature(MappedIterable, () => ({
    __proto__: dart.getGetters(MappedIterable.__proto__),
    iterator: core.Iterator$(T),
    [$iterator]: core.Iterator$(T),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    first: T,
    [$first]: T,
    last: T,
    [$last]: T,
    single: T,
    [$single]: T
  }));
  dart.setLibraryUri(MappedIterable, "dart:_internal");
  dart.setFieldSignature(MappedIterable, () => ({
    __proto__: dart.getFields(MappedIterable.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfS()),
    [_f]: dart.finalFieldType(SToT())
  }));
  dart.defineExtensionMethods(MappedIterable, ['elementAt']);
  dart.defineExtensionAccessors(MappedIterable, [
    'iterator',
    'length',
    'isEmpty',
    'first',
    'last',
    'single'
  ]);
  return MappedIterable;
});
_internal.MappedIterable = _internal.MappedIterable$();
dart.addTypeTests(_internal.MappedIterable, _is_MappedIterable_default);
const _is_EfficientLengthMappedIterable_default = Symbol('_is_EfficientLengthMappedIterable_default');
_internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
  let EfficientLengthIterableOfT = () => (EfficientLengthIterableOfT = dart.constFn(_internal.EfficientLengthIterable$(T)))();
  class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {}
  (EfficientLengthMappedIterable.new = function(iterable, func) {
    EfficientLengthMappedIterable.__proto__.__.call(this, iterable, func);
  }).prototype = EfficientLengthMappedIterable.prototype;
  dart.addTypeTests(EfficientLengthMappedIterable);
  EfficientLengthMappedIterable.prototype[_is_EfficientLengthMappedIterable_default] = true;
  EfficientLengthMappedIterable[dart.implements] = () => [EfficientLengthIterableOfT()];
  dart.setLibraryUri(EfficientLengthMappedIterable, "dart:_internal");
  return EfficientLengthMappedIterable;
});
_internal.EfficientLengthMappedIterable = _internal.EfficientLengthMappedIterable$();
dart.addTypeTests(_internal.EfficientLengthMappedIterable, _is_EfficientLengthMappedIterable_default);
const _iterator = dart.privateName(_internal, "_iterator");
const _is_Iterator_default = Symbol('_is_Iterator_default');
core.Iterator$ = dart.generic(E => {
  class Iterator extends core.Object {}
  (Iterator.new = function() {
  }).prototype = Iterator.prototype;
  dart.addTypeTests(Iterator);
  Iterator.prototype[_is_Iterator_default] = true;
  dart.setLibraryUri(Iterator, "dart:core");
  return Iterator;
});
core.Iterator = core.Iterator$();
dart.addTypeTests(core.Iterator, _is_Iterator_default);
const _is_MappedIterator_default = Symbol('_is_MappedIterator_default');
_internal.MappedIterator$ = dart.generic((S, T) => {
  let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
  let SToT = () => (SToT = dart.constFn(dart.fnType(T, [S])))();
  class MappedIterator extends core.Iterator$(T) {
    moveNext() {
      if (dart.test(this[_iterator].moveNext())) {
        this[_current$] = this[_f](this[_iterator].current);
        return true;
      }
      this[_current$] = null;
      return false;
    }
    get current() {
      return this[_current$];
    }
  }
  (MappedIterator.new = function(iterator, f) {
    this[_current$] = null;
    this[_iterator] = iterator;
    this[_f] = f;
  }).prototype = MappedIterator.prototype;
  dart.addTypeTests(MappedIterator);
  MappedIterator.prototype[_is_MappedIterator_default] = true;
  dart.setMethodSignature(MappedIterator, () => ({
    __proto__: dart.getMethods(MappedIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(MappedIterator, () => ({
    __proto__: dart.getGetters(MappedIterator.__proto__),
    current: T
  }));
  dart.setLibraryUri(MappedIterator, "dart:_internal");
  dart.setFieldSignature(MappedIterator, () => ({
    __proto__: dart.getFields(MappedIterator.__proto__),
    [_current$]: dart.fieldType(T),
    [_iterator]: dart.finalFieldType(IteratorOfS()),
    [_f]: dart.finalFieldType(SToT())
  }));
  return MappedIterator;
});
_internal.MappedIterator = _internal.MappedIterator$();
dart.addTypeTests(_internal.MappedIterator, _is_MappedIterator_default);
const _is_MappedListIterable_default = Symbol('_is_MappedListIterable_default');
_internal.MappedListIterable$ = dart.generic((S, T) => {
  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
  let SToT = () => (SToT = dart.constFn(dart.fnType(T, [S])))();
  class MappedListIterable extends _internal.ListIterable$(T) {
    get length() {
      return this[_source][$length];
    }
    elementAt(index) {
      return this[_f](this[_source][$elementAt](index));
    }
  }
  (MappedListIterable.new = function(source, f) {
    this[_source] = source;
    this[_f] = f;
    MappedListIterable.__proto__.new.call(this);
  }).prototype = MappedListIterable.prototype;
  dart.addTypeTests(MappedListIterable);
  MappedListIterable.prototype[_is_MappedListIterable_default] = true;
  dart.setMethodSignature(MappedListIterable, () => ({
    __proto__: dart.getMethods(MappedListIterable.__proto__),
    elementAt: dart.fnType(T, [core.int]),
    [$elementAt]: dart.fnType(T, [core.int])
  }));
  dart.setGetterSignature(MappedListIterable, () => ({
    __proto__: dart.getGetters(MappedListIterable.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(MappedListIterable, "dart:_internal");
  dart.setFieldSignature(MappedListIterable, () => ({
    __proto__: dart.getFields(MappedListIterable.__proto__),
    [_source]: dart.finalFieldType(IterableOfS()),
    [_f]: dart.finalFieldType(SToT())
  }));
  dart.defineExtensionMethods(MappedListIterable, ['elementAt']);
  dart.defineExtensionAccessors(MappedListIterable, ['length']);
  return MappedListIterable;
});
_internal.MappedListIterable = _internal.MappedListIterable$();
dart.addTypeTests(_internal.MappedListIterable, _is_MappedListIterable_default);
const _is_WhereIterable_default = Symbol('_is_WhereIterable_default');
_internal.WhereIterable$ = dart.generic(E => {
  let WhereIteratorOfE = () => (WhereIteratorOfE = dart.constFn(_internal.WhereIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.fnType(core.bool, [E])))();
  class WhereIterable extends core.Iterable$(E) {
    get iterator() {
      return new (WhereIteratorOfE()).new(this[_iterable$][$iterator], this[_f]);
    }
    map(T, f) {
      return new (_internal.MappedIterable$(E, T)).__(this, f);
    }
  }
  (WhereIterable.new = function(iterable, f) {
    this[_iterable$] = iterable;
    this[_f] = f;
    WhereIterable.__proto__.new.call(this);
  }).prototype = WhereIterable.prototype;
  dart.addTypeTests(WhereIterable);
  WhereIterable.prototype[_is_WhereIterable_default] = true;
  dart.setGetterSignature(WhereIterable, () => ({
    __proto__: dart.getGetters(WhereIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(WhereIterable, "dart:_internal");
  dart.setFieldSignature(WhereIterable, () => ({
    __proto__: dart.getFields(WhereIterable.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfE()),
    [_f]: dart.finalFieldType(ETobool())
  }));
  dart.defineExtensionMethods(WhereIterable, ['map']);
  dart.defineExtensionAccessors(WhereIterable, ['iterator']);
  return WhereIterable;
});
_internal.WhereIterable = _internal.WhereIterable$();
dart.addTypeTests(_internal.WhereIterable, _is_WhereIterable_default);
const _is_WhereIterator_default = Symbol('_is_WhereIterator_default');
_internal.WhereIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.fnType(core.bool, [E])))();
  class WhereIterator extends core.Iterator$(E) {
    moveNext() {
      while (dart.test(this[_iterator].moveNext())) {
        if (dart.test(this[_f](this[_iterator].current))) {
          return true;
        }
      }
      return false;
    }
    get current() {
      return this[_iterator].current;
    }
  }
  (WhereIterator.new = function(iterator, f) {
    this[_iterator] = iterator;
    this[_f] = f;
  }).prototype = WhereIterator.prototype;
  dart.addTypeTests(WhereIterator);
  WhereIterator.prototype[_is_WhereIterator_default] = true;
  dart.setMethodSignature(WhereIterator, () => ({
    __proto__: dart.getMethods(WhereIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(WhereIterator, () => ({
    __proto__: dart.getGetters(WhereIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(WhereIterator, "dart:_internal");
  dart.setFieldSignature(WhereIterator, () => ({
    __proto__: dart.getFields(WhereIterator.__proto__),
    [_iterator]: dart.finalFieldType(IteratorOfE()),
    [_f]: dart.finalFieldType(ETobool())
  }));
  return WhereIterator;
});
_internal.WhereIterator = _internal.WhereIterator$();
dart.addTypeTests(_internal.WhereIterator, _is_WhereIterator_default);
const _is_ExpandIterable_default = Symbol('_is_ExpandIterable_default');
_internal.ExpandIterable$ = dart.generic((S, T) => {
  let ExpandIteratorOfS$T = () => (ExpandIteratorOfS$T = dart.constFn(_internal.ExpandIterator$(S, T)))();
  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
  let SToIterableOfT = () => (SToIterableOfT = dart.constFn(dart.fnType(IterableOfT(), [S])))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  class ExpandIterable extends core.Iterable$(T) {
    get iterator() {
      return new (ExpandIteratorOfS$T()).new(this[_iterable$][$iterator], this[_f]);
    }
  }
  (ExpandIterable.new = function(iterable, f) {
    this[_iterable$] = iterable;
    this[_f] = f;
    ExpandIterable.__proto__.new.call(this);
  }).prototype = ExpandIterable.prototype;
  dart.addTypeTests(ExpandIterable);
  ExpandIterable.prototype[_is_ExpandIterable_default] = true;
  dart.setGetterSignature(ExpandIterable, () => ({
    __proto__: dart.getGetters(ExpandIterable.__proto__),
    iterator: core.Iterator$(T),
    [$iterator]: core.Iterator$(T)
  }));
  dart.setLibraryUri(ExpandIterable, "dart:_internal");
  dart.setFieldSignature(ExpandIterable, () => ({
    __proto__: dart.getFields(ExpandIterable.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfS()),
    [_f]: dart.finalFieldType(SToIterableOfT())
  }));
  dart.defineExtensionAccessors(ExpandIterable, ['iterator']);
  return ExpandIterable;
});
_internal.ExpandIterable = _internal.ExpandIterable$();
dart.addTypeTests(_internal.ExpandIterable, _is_ExpandIterable_default);
const _currentExpansion = dart.privateName(_internal, "_currentExpansion");
let const$3;
const _is_ExpandIterator_default = Symbol('_is_ExpandIterator_default');
_internal.ExpandIterator$ = dart.generic((S, T) => {
  let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
  let SToIterableOfT = () => (SToIterableOfT = dart.constFn(dart.fnType(IterableOfT(), [S])))();
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  class ExpandIterator extends core.Object {
    get current() {
      return this[_current$];
    }
    moveNext() {
      if (this[_currentExpansion] == null) return false;
      while (!dart.test(this[_currentExpansion].moveNext())) {
        this[_current$] = null;
        if (dart.test(this[_iterator].moveNext())) {
          this[_currentExpansion] = null;
          this[_currentExpansion] = this[_f](this[_iterator].current)[$iterator];
        } else {
          return false;
        }
      }
      this[_current$] = this[_currentExpansion].current;
      return true;
    }
  }
  (ExpandIterator.new = function(iterator, f) {
    this[_currentExpansion] = const$3 || (const$3 = dart.const(new (EmptyIteratorOfNull()).new()));
    this[_current$] = null;
    this[_iterator] = iterator;
    this[_f] = f;
  }).prototype = ExpandIterator.prototype;
  dart.addTypeTests(ExpandIterator);
  ExpandIterator.prototype[_is_ExpandIterator_default] = true;
  ExpandIterator[dart.implements] = () => [IteratorOfT()];
  dart.setMethodSignature(ExpandIterator, () => ({
    __proto__: dart.getMethods(ExpandIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(ExpandIterator, () => ({
    __proto__: dart.getGetters(ExpandIterator.__proto__),
    current: T
  }));
  dart.setLibraryUri(ExpandIterator, "dart:_internal");
  dart.setFieldSignature(ExpandIterator, () => ({
    __proto__: dart.getFields(ExpandIterator.__proto__),
    [_iterator]: dart.finalFieldType(IteratorOfS()),
    [_f]: dart.finalFieldType(SToIterableOfT()),
    [_currentExpansion]: dart.fieldType(IteratorOfT()),
    [_current$]: dart.fieldType(T)
  }));
  return ExpandIterator;
});
_internal.ExpandIterator = _internal.ExpandIterator$();
dart.addTypeTests(_internal.ExpandIterator, _is_ExpandIterator_default);
const _takeCount = dart.privateName(_internal, "_takeCount");
const _is_TakeIterable_default = Symbol('_is_TakeIterable_default');
_internal.TakeIterable$ = dart.generic(E => {
  let EfficientLengthTakeIterableOfE = () => (EfficientLengthTakeIterableOfE = dart.constFn(_internal.EfficientLengthTakeIterable$(E)))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeIteratorOfE = () => (TakeIteratorOfE = dart.constFn(_internal.TakeIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class TakeIterable extends core.Iterable$(E) {
    static new(iterable, takeCount) {
      core.ArgumentError.checkNotNull(takeCount, "takeCount");
      core.RangeError.checkNotNegative(takeCount, "takeCount");
      if (_internal.EfficientLengthIterable.is(iterable)) {
        return new (EfficientLengthTakeIterableOfE()).new(iterable, takeCount);
      }
      return new (TakeIterableOfE()).__(iterable, takeCount);
    }
    get iterator() {
      return new (TakeIteratorOfE()).new(this[_iterable$][$iterator], this[_takeCount]);
    }
  }
  (TakeIterable.__ = function(iterable, takeCount) {
    this[_iterable$] = iterable;
    this[_takeCount] = takeCount;
    TakeIterable.__proto__.new.call(this);
  }).prototype = TakeIterable.prototype;
  dart.addTypeTests(TakeIterable);
  TakeIterable.prototype[_is_TakeIterable_default] = true;
  dart.setGetterSignature(TakeIterable, () => ({
    __proto__: dart.getGetters(TakeIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(TakeIterable, "dart:_internal");
  dart.setFieldSignature(TakeIterable, () => ({
    __proto__: dart.getFields(TakeIterable.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfE()),
    [_takeCount]: dart.finalFieldType(core.int)
  }));
  dart.defineExtensionAccessors(TakeIterable, ['iterator']);
  return TakeIterable;
});
_internal.TakeIterable = _internal.TakeIterable$();
dart.addTypeTests(_internal.TakeIterable, _is_TakeIterable_default);
const _is_EfficientLengthTakeIterable_default = Symbol('_is_EfficientLengthTakeIterable_default');
_internal.EfficientLengthTakeIterable$ = dart.generic(E => {
  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
  class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
    get length() {
      let iterableLength = this[_iterable$][$length];
      if (dart.notNull(iterableLength) > dart.notNull(this[_takeCount])) return this[_takeCount];
      return iterableLength;
    }
  }
  (EfficientLengthTakeIterable.new = function(iterable, takeCount) {
    EfficientLengthTakeIterable.__proto__.__.call(this, iterable, takeCount);
  }).prototype = EfficientLengthTakeIterable.prototype;
  dart.addTypeTests(EfficientLengthTakeIterable);
  EfficientLengthTakeIterable.prototype[_is_EfficientLengthTakeIterable_default] = true;
  EfficientLengthTakeIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
  dart.setLibraryUri(EfficientLengthTakeIterable, "dart:_internal");
  dart.defineExtensionAccessors(EfficientLengthTakeIterable, ['length']);
  return EfficientLengthTakeIterable;
});
_internal.EfficientLengthTakeIterable = _internal.EfficientLengthTakeIterable$();
dart.addTypeTests(_internal.EfficientLengthTakeIterable, _is_EfficientLengthTakeIterable_default);
const _remaining = dart.privateName(_internal, "_remaining");
const _is_TakeIterator_default = Symbol('_is_TakeIterator_default');
_internal.TakeIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class TakeIterator extends core.Iterator$(E) {
    moveNext() {
      this[_remaining] = dart.notNull(this[_remaining]) - 1;
      if (dart.notNull(this[_remaining]) >= 0) {
        return this[_iterator].moveNext();
      }
      this[_remaining] = -1;
      return false;
    }
    get current() {
      if (dart.notNull(this[_remaining]) < 0) return null;
      return this[_iterator].current;
    }
  }
  (TakeIterator.new = function(iterator, remaining) {
    this[_iterator] = iterator;
    this[_remaining] = remaining;
    if (!(dart.notNull(this[_remaining]) >= 0)) dart.assertFailed(null, "dart:_internal/iterable.dart", 528, 12, "_remaining >= 0");
  }).prototype = TakeIterator.prototype;
  dart.addTypeTests(TakeIterator);
  TakeIterator.prototype[_is_TakeIterator_default] = true;
  dart.setMethodSignature(TakeIterator, () => ({
    __proto__: dart.getMethods(TakeIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(TakeIterator, () => ({
    __proto__: dart.getGetters(TakeIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(TakeIterator, "dart:_internal");
  dart.setFieldSignature(TakeIterator, () => ({
    __proto__: dart.getFields(TakeIterator.__proto__),
    [_iterator]: dart.finalFieldType(IteratorOfE()),
    [_remaining]: dart.fieldType(core.int)
  }));
  return TakeIterator;
});
_internal.TakeIterator = _internal.TakeIterator$();
dart.addTypeTests(_internal.TakeIterator, _is_TakeIterator_default);
const _is_TakeWhileIterable_default = Symbol('_is_TakeWhileIterable_default');
_internal.TakeWhileIterable$ = dart.generic(E => {
  let TakeWhileIteratorOfE = () => (TakeWhileIteratorOfE = dart.constFn(_internal.TakeWhileIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.fnType(core.bool, [E])))();
  class TakeWhileIterable extends core.Iterable$(E) {
    get iterator() {
      return new (TakeWhileIteratorOfE()).new(this[_iterable$][$iterator], this[_f]);
    }
  }
  (TakeWhileIterable.new = function(iterable, f) {
    this[_iterable$] = iterable;
    this[_f] = f;
    TakeWhileIterable.__proto__.new.call(this);
  }).prototype = TakeWhileIterable.prototype;
  dart.addTypeTests(TakeWhileIterable);
  TakeWhileIterable.prototype[_is_TakeWhileIterable_default] = true;
  dart.setGetterSignature(TakeWhileIterable, () => ({
    __proto__: dart.getGetters(TakeWhileIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(TakeWhileIterable, "dart:_internal");
  dart.setFieldSignature(TakeWhileIterable, () => ({
    __proto__: dart.getFields(TakeWhileIterable.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfE()),
    [_f]: dart.finalFieldType(ETobool())
  }));
  dart.defineExtensionAccessors(TakeWhileIterable, ['iterator']);
  return TakeWhileIterable;
});
_internal.TakeWhileIterable = _internal.TakeWhileIterable$();
dart.addTypeTests(_internal.TakeWhileIterable, _is_TakeWhileIterable_default);
const _isFinished = dart.privateName(_internal, "_isFinished");
const _is_TakeWhileIterator_default = Symbol('_is_TakeWhileIterator_default');
_internal.TakeWhileIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.fnType(core.bool, [E])))();
  class TakeWhileIterator extends core.Iterator$(E) {
    moveNext() {
      if (dart.test(this[_isFinished])) return false;
      if (!dart.test(this[_iterator].moveNext()) || !dart.test(this[_f](this[_iterator].current))) {
        this[_isFinished] = true;
        return false;
      }
      return true;
    }
    get current() {
      if (dart.test(this[_isFinished])) return null;
      return this[_iterator].current;
    }
  }
  (TakeWhileIterator.new = function(iterator, f) {
    this[_isFinished] = false;
    this[_iterator] = iterator;
    this[_f] = f;
  }).prototype = TakeWhileIterator.prototype;
  dart.addTypeTests(TakeWhileIterator);
  TakeWhileIterator.prototype[_is_TakeWhileIterator_default] = true;
  dart.setMethodSignature(TakeWhileIterator, () => ({
    __proto__: dart.getMethods(TakeWhileIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(TakeWhileIterator, () => ({
    __proto__: dart.getGetters(TakeWhileIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(TakeWhileIterator, "dart:_internal");
  dart.setFieldSignature(TakeWhileIterator, () => ({
    __proto__: dart.getFields(TakeWhileIterator.__proto__),
    [_iterator]: dart.finalFieldType(IteratorOfE()),
    [_f]: dart.finalFieldType(ETobool()),
    [_isFinished]: dart.fieldType(core.bool)
  }));
  return TakeWhileIterator;
});
_internal.TakeWhileIterator = _internal.TakeWhileIterator$();
dart.addTypeTests(_internal.TakeWhileIterator, _is_TakeWhileIterator_default);
const _skipCount = dart.privateName(_internal, "_skipCount");
const _is_SkipIterable_default = Symbol('_is_SkipIterable_default');
_internal.SkipIterable$ = dart.generic(E => {
  let EfficientLengthSkipIterableOfE = () => (EfficientLengthSkipIterableOfE = dart.constFn(_internal.EfficientLengthSkipIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipIteratorOfE = () => (SkipIteratorOfE = dart.constFn(_internal.SkipIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class SkipIterable extends core.Iterable$(E) {
    static new(iterable, count) {
      if (_internal.EfficientLengthIterable.is(iterable)) {
        return EfficientLengthSkipIterableOfE().new(iterable, count);
      }
      return new (SkipIterableOfE()).__(iterable, _internal._checkCount(count));
    }
    skip(count) {
      return new (SkipIterableOfE()).__(this[_iterable$], dart.notNull(this[_skipCount]) + dart.notNull(_internal._checkCount(count)));
    }
    get iterator() {
      return new (SkipIteratorOfE()).new(this[_iterable$][$iterator], this[_skipCount]);
    }
  }
  (SkipIterable.__ = function(iterable, skipCount) {
    this[_iterable$] = iterable;
    this[_skipCount] = skipCount;
    SkipIterable.__proto__.new.call(this);
  }).prototype = SkipIterable.prototype;
  dart.addTypeTests(SkipIterable);
  SkipIterable.prototype[_is_SkipIterable_default] = true;
  dart.setGetterSignature(SkipIterable, () => ({
    __proto__: dart.getGetters(SkipIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(SkipIterable, "dart:_internal");
  dart.setFieldSignature(SkipIterable, () => ({
    __proto__: dart.getFields(SkipIterable.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfE()),
    [_skipCount]: dart.finalFieldType(core.int)
  }));
  dart.defineExtensionMethods(SkipIterable, ['skip']);
  dart.defineExtensionAccessors(SkipIterable, ['iterator']);
  return SkipIterable;
});
_internal.SkipIterable = _internal.SkipIterable$();
dart.addTypeTests(_internal.SkipIterable, _is_SkipIterable_default);
const _is_EfficientLengthSkipIterable_default = Symbol('_is_EfficientLengthSkipIterable_default');
_internal.EfficientLengthSkipIterable$ = dart.generic(E => {
  let EfficientLengthSkipIterableOfE = () => (EfficientLengthSkipIterableOfE = dart.constFn(_internal.EfficientLengthSkipIterable$(E)))();
  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
  class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
    static new(iterable, count) {
      return new (EfficientLengthSkipIterableOfE()).__(iterable, _internal._checkCount(count));
    }
    get length() {
      let length = dart.notNull(this[_iterable$][$length]) - dart.notNull(this[_skipCount]);
      if (length >= 0) return length;
      return 0;
    }
    skip(count) {
      return new (EfficientLengthSkipIterableOfE()).__(this[_iterable$], dart.notNull(this[_skipCount]) + dart.notNull(_internal._checkCount(count)));
    }
  }
  (EfficientLengthSkipIterable.__ = function(iterable, count) {
    EfficientLengthSkipIterable.__proto__.__.call(this, iterable, count);
  }).prototype = EfficientLengthSkipIterable.prototype;
  dart.addTypeTests(EfficientLengthSkipIterable);
  EfficientLengthSkipIterable.prototype[_is_EfficientLengthSkipIterable_default] = true;
  EfficientLengthSkipIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
  dart.setLibraryUri(EfficientLengthSkipIterable, "dart:_internal");
  dart.defineExtensionMethods(EfficientLengthSkipIterable, ['skip']);
  dart.defineExtensionAccessors(EfficientLengthSkipIterable, ['length']);
  return EfficientLengthSkipIterable;
});
_internal.EfficientLengthSkipIterable = _internal.EfficientLengthSkipIterable$();
dart.addTypeTests(_internal.EfficientLengthSkipIterable, _is_EfficientLengthSkipIterable_default);
_internal._checkCount = function(count) {
  core.ArgumentError.checkNotNull(count, "count");
  core.RangeError.checkNotNegative(count, "count");
  return count;
};
const _is_SkipIterator_default = Symbol('_is_SkipIterator_default');
_internal.SkipIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class SkipIterator extends core.Iterator$(E) {
    moveNext() {
      for (let i = 0; i < dart.notNull(this[_skipCount]); i++)
        this[_iterator].moveNext();
      this[_skipCount] = 0;
      return this[_iterator].moveNext();
    }
    get current() {
      return this[_iterator].current;
    }
  }
  (SkipIterator.new = function(iterator, skipCount) {
    this[_iterator] = iterator;
    this[_skipCount] = skipCount;
    if (!(dart.notNull(this[_skipCount]) >= 0)) dart.assertFailed(null, "dart:_internal/iterable.dart", 633, 12, "_skipCount >= 0");
  }).prototype = SkipIterator.prototype;
  dart.addTypeTests(SkipIterator);
  SkipIterator.prototype[_is_SkipIterator_default] = true;
  dart.setMethodSignature(SkipIterator, () => ({
    __proto__: dart.getMethods(SkipIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(SkipIterator, () => ({
    __proto__: dart.getGetters(SkipIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(SkipIterator, "dart:_internal");
  dart.setFieldSignature(SkipIterator, () => ({
    __proto__: dart.getFields(SkipIterator.__proto__),
    [_iterator]: dart.finalFieldType(IteratorOfE()),
    [_skipCount]: dart.fieldType(core.int)
  }));
  return SkipIterator;
});
_internal.SkipIterator = _internal.SkipIterator$();
dart.addTypeTests(_internal.SkipIterator, _is_SkipIterator_default);
const _is_SkipWhileIterable_default = Symbol('_is_SkipWhileIterable_default');
_internal.SkipWhileIterable$ = dart.generic(E => {
  let SkipWhileIteratorOfE = () => (SkipWhileIteratorOfE = dart.constFn(_internal.SkipWhileIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.fnType(core.bool, [E])))();
  class SkipWhileIterable extends core.Iterable$(E) {
    get iterator() {
      return new (SkipWhileIteratorOfE()).new(this[_iterable$][$iterator], this[_f]);
    }
  }
  (SkipWhileIterable.new = function(iterable, f) {
    this[_iterable$] = iterable;
    this[_f] = f;
    SkipWhileIterable.__proto__.new.call(this);
  }).prototype = SkipWhileIterable.prototype;
  dart.addTypeTests(SkipWhileIterable);
  SkipWhileIterable.prototype[_is_SkipWhileIterable_default] = true;
  dart.setGetterSignature(SkipWhileIterable, () => ({
    __proto__: dart.getGetters(SkipWhileIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(SkipWhileIterable, "dart:_internal");
  dart.setFieldSignature(SkipWhileIterable, () => ({
    __proto__: dart.getFields(SkipWhileIterable.__proto__),
    [_iterable$]: dart.finalFieldType(IterableOfE()),
    [_f]: dart.finalFieldType(ETobool())
  }));
  dart.defineExtensionAccessors(SkipWhileIterable, ['iterator']);
  return SkipWhileIterable;
});
_internal.SkipWhileIterable = _internal.SkipWhileIterable$();
dart.addTypeTests(_internal.SkipWhileIterable, _is_SkipWhileIterable_default);
const _hasSkipped = dart.privateName(_internal, "_hasSkipped");
const _is_SkipWhileIterator_default = Symbol('_is_SkipWhileIterator_default');
_internal.SkipWhileIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let ETobool = () => (ETobool = dart.constFn(dart.fnType(core.bool, [E])))();
  class SkipWhileIterator extends core.Iterator$(E) {
    moveNext() {
      if (!dart.test(this[_hasSkipped])) {
        this[_hasSkipped] = true;
        while (dart.test(this[_iterator].moveNext())) {
          if (!dart.test(this[_f](this[_iterator].current))) return true;
        }
      }
      return this[_iterator].moveNext();
    }
    get current() {
      return this[_iterator].current;
    }
  }
  (SkipWhileIterator.new = function(iterator, f) {
    this[_hasSkipped] = false;
    this[_iterator] = iterator;
    this[_f] = f;
  }).prototype = SkipWhileIterator.prototype;
  dart.addTypeTests(SkipWhileIterator);
  SkipWhileIterator.prototype[_is_SkipWhileIterator_default] = true;
  dart.setMethodSignature(SkipWhileIterator, () => ({
    __proto__: dart.getMethods(SkipWhileIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(SkipWhileIterator, () => ({
    __proto__: dart.getGetters(SkipWhileIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(SkipWhileIterator, "dart:_internal");
  dart.setFieldSignature(SkipWhileIterator, () => ({
    __proto__: dart.getFields(SkipWhileIterator.__proto__),
    [_iterator]: dart.finalFieldType(IteratorOfE()),
    [_f]: dart.finalFieldType(ETobool()),
    [_hasSkipped]: dart.fieldType(core.bool)
  }));
  return SkipWhileIterator;
});
_internal.SkipWhileIterator = _internal.SkipWhileIterator$();
dart.addTypeTests(_internal.SkipWhileIterator, _is_SkipWhileIterator_default);
let const$4;
const _is_EmptyIterable_default = Symbol('_is_EmptyIterable_default');
_internal.EmptyIterable$ = dart.generic(E => {
  let VoidToE = () => (VoidToE = dart.constFn(dart.fnType(E, [])))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.fnType(E, [E, E])))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  class EmptyIterable extends _internal.EfficientLengthIterable$(E) {
    get iterator() {
      return const$4 || (const$4 = dart.const(new (EmptyIteratorOfNull()).new()));
    }
    forEach(action) {}
    get isEmpty() {
      return true;
    }
    get length() {
      return 0;
    }
    get first() {
      dart.throw(_internal.IterableElementError.noElement());
    }
    get last() {
      dart.throw(_internal.IterableElementError.noElement());
    }
    get single() {
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      dart.throw(new core.RangeError.range(index, 0, 0, "index"));
    }
    contains(element) {
      return false;
    }
    every(test) {
      return true;
    }
    any(test) {
      return false;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    join(separator) {
      if (separator === void 0) separator = "";
      return "";
    }
    where(test) {
      return this;
    }
    map(T, f) {
      return new (_internal.EmptyIterable$(T)).new();
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      dart.throw(_internal.IterableElementError.noElement());
    }
    fold(T, initialValue, combine) {
      return initialValue;
    }
    skip(count) {
      core.RangeError.checkNotNegative(count, "count");
      return this;
    }
    skipWhile(test) {
      return this;
    }
    take(count) {
      core.RangeError.checkNotNegative(count, "count");
      return this;
    }
    takeWhile(test) {
      return this;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return dart.test(growable) ? JSArrayOfE().of([]) : ListOfE().new(0);
    }
    toSet() {
      return new (_HashSetOfE()).new();
    }
  }
  (EmptyIterable.new = function() {
    EmptyIterable.__proto__.new.call(this);
  }).prototype = EmptyIterable.prototype;
  dart.addTypeTests(EmptyIterable);
  EmptyIterable.prototype[_is_EmptyIterable_default] = true;
  dart.setMethodSignature(EmptyIterable, () => ({
    __proto__: dart.getMethods(EmptyIterable.__proto__),
    firstWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$firstWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    lastWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    singleWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$singleWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    reduce: dart.fnType(E, [core.Object]),
    [$reduce]: dart.fnType(E, [core.Object])
  }));
  dart.setGetterSignature(EmptyIterable, () => ({
    __proto__: dart.getGetters(EmptyIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(EmptyIterable, "dart:_internal");
  dart.defineExtensionMethods(EmptyIterable, [
    'forEach',
    'elementAt',
    'contains',
    'every',
    'any',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'join',
    'where',
    'map',
    'reduce',
    'fold',
    'skip',
    'skipWhile',
    'take',
    'takeWhile',
    'toList',
    'toSet'
  ]);
  dart.defineExtensionAccessors(EmptyIterable, [
    'iterator',
    'isEmpty',
    'length',
    'first',
    'last',
    'single'
  ]);
  return EmptyIterable;
});
_internal.EmptyIterable = _internal.EmptyIterable$();
dart.addTypeTests(_internal.EmptyIterable, _is_EmptyIterable_default);
const _is_EmptyIterator_default = Symbol('_is_EmptyIterator_default');
_internal.EmptyIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class EmptyIterator extends core.Object {
    moveNext() {
      return false;
    }
    get current() {
      return null;
    }
  }
  (EmptyIterator.new = function() {
  }).prototype = EmptyIterator.prototype;
  dart.addTypeTests(EmptyIterator);
  EmptyIterator.prototype[_is_EmptyIterator_default] = true;
  EmptyIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(EmptyIterator, () => ({
    __proto__: dart.getMethods(EmptyIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(EmptyIterator, () => ({
    __proto__: dart.getGetters(EmptyIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(EmptyIterator, "dart:_internal");
  return EmptyIterator;
});
_internal.EmptyIterator = _internal.EmptyIterator$();
dart.addTypeTests(_internal.EmptyIterator, _is_EmptyIterator_default);
const _first = dart.privateName(_internal, "_first");
const _second = dart.privateName(_internal, "_second");
const _is_FollowedByIterable_default = Symbol('_is_FollowedByIterable_default');
_internal.FollowedByIterable$ = dart.generic(E => {
  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
  let EfficientLengthFollowedByIterableOfE = () => (EfficientLengthFollowedByIterableOfE = dart.constFn(_internal.EfficientLengthFollowedByIterable$(E)))();
  let FollowedByIterableOfE = () => (FollowedByIterableOfE = dart.constFn(_internal.FollowedByIterable$(E)))();
  let FollowedByIteratorOfE = () => (FollowedByIteratorOfE = dart.constFn(_internal.FollowedByIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class FollowedByIterable extends core.Iterable$(E) {
    static firstEfficient(first, second) {
      if (EfficientLengthIterableOfE().is(second)) {
        return new (EfficientLengthFollowedByIterableOfE()).new(first, second);
      }
      return new (FollowedByIterableOfE()).new(first, second);
    }
    get iterator() {
      return new (FollowedByIteratorOfE()).new(this[_first], this[_second]);
    }
    get length() {
      return dart.notNull(this[_first][$length]) + dart.notNull(this[_second][$length]);
    }
    get isEmpty() {
      return dart.test(this[_first][$isEmpty]) && dart.test(this[_second][$isEmpty]);
    }
    get isNotEmpty() {
      return dart.test(this[_first][$isNotEmpty]) || dart.test(this[_second][$isNotEmpty]);
    }
    contains(value) {
      return dart.test(this[_first][$contains](value)) || dart.test(this[_second][$contains](value));
    }
    get first() {
      let iterator = this[_first][$iterator];
      if (dart.test(iterator.moveNext())) return iterator.current;
      return this[_second][$first];
    }
    get last() {
      let iterator = this[_second][$iterator];
      if (dart.test(iterator.moveNext())) {
        let last = iterator.current;
        while (dart.test(iterator.moveNext()))
          last = iterator.current;
        return last;
      }
      return this[_first][$last];
    }
  }
  (FollowedByIterable.new = function(first, second) {
    this[_first] = first;
    this[_second] = second;
    FollowedByIterable.__proto__.new.call(this);
  }).prototype = FollowedByIterable.prototype;
  dart.addTypeTests(FollowedByIterable);
  FollowedByIterable.prototype[_is_FollowedByIterable_default] = true;
  dart.setGetterSignature(FollowedByIterable, () => ({
    __proto__: dart.getGetters(FollowedByIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(FollowedByIterable, "dart:_internal");
  dart.setFieldSignature(FollowedByIterable, () => ({
    __proto__: dart.getFields(FollowedByIterable.__proto__),
    [_first]: dart.finalFieldType(IterableOfE()),
    [_second]: dart.finalFieldType(IterableOfE())
  }));
  dart.defineExtensionMethods(FollowedByIterable, ['contains']);
  dart.defineExtensionAccessors(FollowedByIterable, [
    'iterator',
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last'
  ]);
  return FollowedByIterable;
});
_internal.FollowedByIterable = _internal.FollowedByIterable$();
dart.addTypeTests(_internal.FollowedByIterable, _is_FollowedByIterable_default);
const _is_EfficientLengthFollowedByIterable_default = Symbol('_is_EfficientLengthFollowedByIterable_default');
_internal.EfficientLengthFollowedByIterable$ = dart.generic(E => {
  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
  let EfficientLengthFollowedByIterableOfE = () => (EfficientLengthFollowedByIterableOfE = dart.constFn(_internal.EfficientLengthFollowedByIterable$(E)))();
  class EfficientLengthFollowedByIterable extends _internal.FollowedByIterable$(E) {
    skip(count) {
      let firstLength = this[_first][$length];
      if (dart.notNull(count) >= dart.notNull(firstLength)) return this[_second][$skip](dart.notNull(count) - dart.notNull(firstLength));
      return new (EfficientLengthFollowedByIterableOfE()).new(EfficientLengthIterableOfE()._check(this[_first][$skip](count)), EfficientLengthIterableOfE()._check(this[_second]));
    }
    take(count) {
      let firstLength = this[_first][$length];
      if (dart.notNull(count) <= dart.notNull(firstLength)) return this[_first][$take](count);
      return new (EfficientLengthFollowedByIterableOfE()).new(EfficientLengthIterableOfE()._check(this[_first]), EfficientLengthIterableOfE()._check(this[_second][$take](dart.notNull(count) - dart.notNull(firstLength))));
    }
    elementAt(index) {
      let firstLength = this[_first][$length];
      if (dart.notNull(index) < dart.notNull(firstLength)) return this[_first][$elementAt](index);
      return this[_second][$elementAt](dart.notNull(index) - dart.notNull(firstLength));
    }
    get first() {
      if (dart.test(this[_first][$isNotEmpty])) return this[_first][$first];
      return this[_second][$first];
    }
    get last() {
      if (dart.test(this[_second][$isNotEmpty])) return this[_second][$last];
      return this[_first][$last];
    }
  }
  (EfficientLengthFollowedByIterable.new = function(first, second) {
    EfficientLengthFollowedByIterable.__proto__.new.call(this, first, second);
  }).prototype = EfficientLengthFollowedByIterable.prototype;
  dart.addTypeTests(EfficientLengthFollowedByIterable);
  EfficientLengthFollowedByIterable.prototype[_is_EfficientLengthFollowedByIterable_default] = true;
  EfficientLengthFollowedByIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
  dart.setLibraryUri(EfficientLengthFollowedByIterable, "dart:_internal");
  dart.defineExtensionMethods(EfficientLengthFollowedByIterable, ['skip', 'take', 'elementAt']);
  dart.defineExtensionAccessors(EfficientLengthFollowedByIterable, ['first', 'last']);
  return EfficientLengthFollowedByIterable;
});
_internal.EfficientLengthFollowedByIterable = _internal.EfficientLengthFollowedByIterable$();
dart.addTypeTests(_internal.EfficientLengthFollowedByIterable, _is_EfficientLengthFollowedByIterable_default);
const _nextIterable = dart.privateName(_internal, "_nextIterable");
const _currentIterator = dart.privateName(_internal, "_currentIterator");
const _is_FollowedByIterator_default = Symbol('_is_FollowedByIterator_default');
_internal.FollowedByIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class FollowedByIterator extends core.Object {
    moveNext() {
      if (dart.test(this[_currentIterator].moveNext())) return true;
      if (this[_nextIterable] != null) {
        this[_currentIterator] = this[_nextIterable][$iterator];
        this[_nextIterable] = null;
        return this[_currentIterator].moveNext();
      }
      return false;
    }
    get current() {
      return this[_currentIterator].current;
    }
  }
  (FollowedByIterator.new = function(first, nextIterable) {
    this[_nextIterable] = nextIterable;
    this[_currentIterator] = first[$iterator];
  }).prototype = FollowedByIterator.prototype;
  dart.addTypeTests(FollowedByIterator);
  FollowedByIterator.prototype[_is_FollowedByIterator_default] = true;
  FollowedByIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(FollowedByIterator, () => ({
    __proto__: dart.getMethods(FollowedByIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(FollowedByIterator, () => ({
    __proto__: dart.getGetters(FollowedByIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(FollowedByIterator, "dart:_internal");
  dart.setFieldSignature(FollowedByIterator, () => ({
    __proto__: dart.getFields(FollowedByIterator.__proto__),
    [_currentIterator]: dart.fieldType(IteratorOfE()),
    [_nextIterable]: dart.fieldType(IterableOfE())
  }));
  return FollowedByIterator;
});
_internal.FollowedByIterator = _internal.FollowedByIterator$();
dart.addTypeTests(_internal.FollowedByIterator, _is_FollowedByIterator_default);
const _is_WhereTypeIterable_default = Symbol('_is_WhereTypeIterable_default');
_internal.WhereTypeIterable$ = dart.generic(T => {
  let WhereTypeIteratorOfT = () => (WhereTypeIteratorOfT = dart.constFn(_internal.WhereTypeIterator$(T)))();
  class WhereTypeIterable extends core.Iterable$(T) {
    get iterator() {
      return new (WhereTypeIteratorOfT()).new(this[_source][$iterator]);
    }
  }
  (WhereTypeIterable.new = function(source) {
    this[_source] = source;
    WhereTypeIterable.__proto__.new.call(this);
  }).prototype = WhereTypeIterable.prototype;
  dart.addTypeTests(WhereTypeIterable);
  WhereTypeIterable.prototype[_is_WhereTypeIterable_default] = true;
  dart.setGetterSignature(WhereTypeIterable, () => ({
    __proto__: dart.getGetters(WhereTypeIterable.__proto__),
    iterator: core.Iterator$(T),
    [$iterator]: core.Iterator$(T)
  }));
  dart.setLibraryUri(WhereTypeIterable, "dart:_internal");
  dart.setFieldSignature(WhereTypeIterable, () => ({
    __proto__: dart.getFields(WhereTypeIterable.__proto__),
    [_source]: dart.finalFieldType(IterableOfObject())
  }));
  dart.defineExtensionAccessors(WhereTypeIterable, ['iterator']);
  return WhereTypeIterable;
});
_internal.WhereTypeIterable = _internal.WhereTypeIterable$();
dart.addTypeTests(_internal.WhereTypeIterable, _is_WhereTypeIterable_default);
const _is_WhereTypeIterator_default = Symbol('_is_WhereTypeIterator_default');
_internal.WhereTypeIterator$ = dart.generic(T => {
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  class WhereTypeIterator extends core.Object {
    moveNext() {
      while (dart.test(this[_source].moveNext())) {
        if (T.is(this[_source].current)) return true;
      }
      return false;
    }
    get current() {
      return T._check(this[_source].current);
    }
  }
  (WhereTypeIterator.new = function(source) {
    this[_source] = source;
  }).prototype = WhereTypeIterator.prototype;
  dart.addTypeTests(WhereTypeIterator);
  WhereTypeIterator.prototype[_is_WhereTypeIterator_default] = true;
  WhereTypeIterator[dart.implements] = () => [IteratorOfT()];
  dart.setMethodSignature(WhereTypeIterator, () => ({
    __proto__: dart.getMethods(WhereTypeIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(WhereTypeIterator, () => ({
    __proto__: dart.getGetters(WhereTypeIterator.__proto__),
    current: T
  }));
  dart.setLibraryUri(WhereTypeIterator, "dart:_internal");
  dart.setFieldSignature(WhereTypeIterator, () => ({
    __proto__: dart.getFields(WhereTypeIterator.__proto__),
    [_source]: dart.finalFieldType(IteratorOfObject())
  }));
  return WhereTypeIterator;
});
_internal.WhereTypeIterator = _internal.WhereTypeIterator$();
dart.addTypeTests(_internal.WhereTypeIterator, _is_WhereTypeIterator_default);
_internal.IterableElementError = class IterableElementError extends core.Object {
  static noElement() {
    return new core.StateError.new("No element");
  }
  static tooMany() {
    return new core.StateError.new("Too many elements");
  }
  static tooFew() {
    return new core.StateError.new("Too few elements");
  }
};
(_internal.IterableElementError.new = function() {
}).prototype = _internal.IterableElementError.prototype;
dart.addTypeTests(_internal.IterableElementError);
dart.setLibraryUri(_internal.IterableElementError, "dart:_internal");
const _is_FixedLengthListMixin_default = Symbol('_is_FixedLengthListMixin_default');
_internal.FixedLengthListMixin$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class FixedLengthListMixin extends core.Object {
    set length(newLength) {
      dart.throw(new core.UnsupportedError.new("Cannot change the length of a fixed-length list"));
    }
    add(value) {
      E._check(value);
      dart.throw(new core.UnsupportedError.new("Cannot add to a fixed-length list"));
    }
    insert(index, value) {
      E._check(value);
      dart.throw(new core.UnsupportedError.new("Cannot add to a fixed-length list"));
    }
    insertAll(at, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot add to a fixed-length list"));
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot add to a fixed-length list"));
    }
    remove(element) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from a fixed-length list"));
    }
    removeWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from a fixed-length list"));
    }
    retainWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from a fixed-length list"));
    }
    clear() {
      dart.throw(new core.UnsupportedError.new("Cannot clear a fixed-length list"));
    }
    removeAt(index) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from a fixed-length list"));
    }
    removeLast() {
      dart.throw(new core.UnsupportedError.new("Cannot remove from a fixed-length list"));
    }
    removeRange(start, end) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from a fixed-length list"));
    }
    replaceRange(start, end, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot remove from a fixed-length list"));
    }
  }
  (FixedLengthListMixin.new = function() {
  }).prototype = FixedLengthListMixin.prototype;
  dart.addTypeTests(FixedLengthListMixin);
  FixedLengthListMixin.prototype[_is_FixedLengthListMixin_default] = true;
  dart.setMethodSignature(FixedLengthListMixin, () => ({
    __proto__: dart.getMethods(FixedLengthListMixin.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    [$add]: dart.fnType(dart.void, [core.Object]),
    insert: dart.fnType(dart.void, [core.int, core.Object]),
    [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
    insertAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$insertAll]: dart.fnType(dart.void, [core.int, core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    [$remove]: dart.fnType(core.bool, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$retainWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, []),
    removeAt: dart.fnType(E, [core.int]),
    [$removeAt]: dart.fnType(E, [core.int]),
    removeLast: dart.fnType(E, []),
    [$removeLast]: dart.fnType(E, []),
    removeRange: dart.fnType(dart.void, [core.int, core.int]),
    [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
    replaceRange: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object])
  }));
  dart.setSetterSignature(FixedLengthListMixin, () => ({
    __proto__: dart.getSetters(FixedLengthListMixin.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(FixedLengthListMixin, "dart:_internal");
  dart.defineExtensionMethods(FixedLengthListMixin, [
    'add',
    'insert',
    'insertAll',
    'addAll',
    'remove',
    'removeWhere',
    'retainWhere',
    'clear',
    'removeAt',
    'removeLast',
    'removeRange',
    'replaceRange'
  ]);
  dart.defineExtensionAccessors(FixedLengthListMixin, ['length']);
  return FixedLengthListMixin;
});
_internal.FixedLengthListMixin = _internal.FixedLengthListMixin$();
dart.addTypeTests(_internal.FixedLengthListMixin, _is_FixedLengthListMixin_default);
const _is_FixedLengthListBase_default = Symbol('_is_FixedLengthListBase_default');
_internal.FixedLengthListBase$ = dart.generic(E => {
  const ListBase_FixedLengthListMixin$ = class ListBase_FixedLengthListMixin extends collection.ListBase$(E) {};
  (ListBase_FixedLengthListMixin$.new = function() {
  }).prototype = ListBase_FixedLengthListMixin$.prototype;
  dart.applyMixin(ListBase_FixedLengthListMixin$, _internal.FixedLengthListMixin$(E));
  class FixedLengthListBase extends ListBase_FixedLengthListMixin$ {}
  (FixedLengthListBase.new = function() {
  }).prototype = FixedLengthListBase.prototype;
  dart.addTypeTests(FixedLengthListBase);
  FixedLengthListBase.prototype[_is_FixedLengthListBase_default] = true;
  dart.setLibraryUri(FixedLengthListBase, "dart:_internal");
  return FixedLengthListBase;
});
_internal.FixedLengthListBase = _internal.FixedLengthListBase$();
dart.addTypeTests(_internal.FixedLengthListBase, _is_FixedLengthListBase_default);
const _backedList = dart.privateName(_internal, "_backedList");
_internal._ListIndicesIterable = class _ListIndicesIterable extends _internal.ListIterable$(core.int) {
  get length() {
    return this[_backedList][$length];
  }
  elementAt(index) {
    core.RangeError.checkValidIndex(index, this);
    return index;
  }
};
(_internal._ListIndicesIterable.new = function(backedList) {
  this[_backedList] = backedList;
  _internal._ListIndicesIterable.__proto__.new.call(this);
}).prototype = _internal._ListIndicesIterable.prototype;
dart.addTypeTests(_internal._ListIndicesIterable);
dart.setMethodSignature(_internal._ListIndicesIterable, () => ({
  __proto__: dart.getMethods(_internal._ListIndicesIterable.__proto__),
  elementAt: dart.fnType(core.int, [core.int]),
  [$elementAt]: dart.fnType(core.int, [core.int])
}));
dart.setGetterSignature(_internal._ListIndicesIterable, () => ({
  __proto__: dart.getGetters(_internal._ListIndicesIterable.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(_internal._ListIndicesIterable, "dart:_internal");
dart.setFieldSignature(_internal._ListIndicesIterable, () => ({
  __proto__: dart.getFields(_internal._ListIndicesIterable.__proto__),
  [_backedList]: dart.fieldType(core.List)
}));
dart.defineExtensionMethods(_internal._ListIndicesIterable, ['elementAt']);
dart.defineExtensionAccessors(_internal._ListIndicesIterable, ['length']);
const _values = dart.privateName(_internal, "_values");
const _is__UnmodifiableMapMixin_default = Symbol('_is__UnmodifiableMapMixin_default');
collection._UnmodifiableMapMixin$ = dart.generic((K, V) => {
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let MapEntryOfK$V = () => (MapEntryOfK$V = dart.constFn(core.MapEntry$(K, V)))();
  let IterableOfMapEntryOfK$V = () => (IterableOfMapEntryOfK$V = dart.constFn(core.Iterable$(MapEntryOfK$V())))();
  let KAndVToV = () => (KAndVToV = dart.constFn(dart.fnType(V, [K, V])))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  let VToV = () => (VToV = dart.constFn(dart.fnType(V, [V])))();
  class _UnmodifiableMapMixin extends core.Object {
    _set(key, value) {
      K._check(key);
      V._check(value);
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
      return value;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
    }
    addEntries(entries) {
      IterableOfMapEntryOfK$V()._check(entries);
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
    }
    clear() {
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
    }
    remove(key) {
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
    }
    removeWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
    }
    update(key, update, opts) {
      K._check(key);
      VToV()._check(update);
      let ifAbsent = opts && 'ifAbsent' in opts ? opts.ifAbsent : null;
      VoidToV()._check(ifAbsent);
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
    }
    updateAll(update) {
      KAndVToV()._check(update);
      dart.throw(new core.UnsupportedError.new("Cannot modify unmodifiable map"));
    }
  }
  (_UnmodifiableMapMixin.new = function() {
  }).prototype = _UnmodifiableMapMixin.prototype;
  _UnmodifiableMapMixin.prototype[dart.isMap] = true;
  dart.addTypeTests(_UnmodifiableMapMixin);
  _UnmodifiableMapMixin.prototype[_is__UnmodifiableMapMixin_default] = true;
  _UnmodifiableMapMixin[dart.implements] = () => [MapOfK$V()];
  dart.setMethodSignature(_UnmodifiableMapMixin, () => ({
    __proto__: dart.getMethods(_UnmodifiableMapMixin.__proto__),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    addEntries: dart.fnType(dart.void, [core.Object]),
    [$addEntries]: dart.fnType(dart.void, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, []),
    remove: dart.fnType(V, [core.Object]),
    [$remove]: dart.fnType(V, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [K, V])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [K, V])]),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    update: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    [$update]: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    updateAll: dart.fnType(dart.void, [core.Object]),
    [$updateAll]: dart.fnType(dart.void, [core.Object])
  }));
  dart.setLibraryUri(_UnmodifiableMapMixin, "dart:collection");
  dart.defineExtensionMethods(_UnmodifiableMapMixin, [
    '_set',
    'addAll',
    'addEntries',
    'clear',
    'remove',
    'removeWhere',
    'putIfAbsent',
    'update',
    'updateAll'
  ]);
  return _UnmodifiableMapMixin;
});
collection._UnmodifiableMapMixin = collection._UnmodifiableMapMixin$();
dart.addTypeTests(collection._UnmodifiableMapMixin, _is__UnmodifiableMapMixin_default);
const _is_UnmodifiableMapBase_default = Symbol('_is_UnmodifiableMapBase_default');
collection.UnmodifiableMapBase$ = dart.generic((K, V) => {
  const MapBase__UnmodifiableMapMixin$ = class MapBase__UnmodifiableMapMixin extends collection.MapBase$(K, V) {};
  (MapBase__UnmodifiableMapMixin$.new = function() {
  }).prototype = MapBase__UnmodifiableMapMixin$.prototype;
  dart.applyMixin(MapBase__UnmodifiableMapMixin$, collection._UnmodifiableMapMixin$(K, V));
  class UnmodifiableMapBase extends MapBase__UnmodifiableMapMixin$ {}
  (UnmodifiableMapBase.new = function() {
  }).prototype = UnmodifiableMapBase.prototype;
  dart.addTypeTests(UnmodifiableMapBase);
  UnmodifiableMapBase.prototype[_is_UnmodifiableMapBase_default] = true;
  dart.setLibraryUri(UnmodifiableMapBase, "dart:collection");
  return UnmodifiableMapBase;
});
collection.UnmodifiableMapBase = collection.UnmodifiableMapBase$();
dart.addTypeTests(collection.UnmodifiableMapBase, _is_UnmodifiableMapBase_default);
const _is_ListMapView_default = Symbol('_is_ListMapView_default');
_internal.ListMapView$ = dart.generic(E => {
  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  class ListMapView extends collection.UnmodifiableMapBase$(core.int, E) {
    _get(key) {
      return dart.test(this.containsKey(key)) ? this[_values][$_get](core.int._check(key)) : null;
    }
    get length() {
      return this[_values][$length];
    }
    get values() {
      return new (SubListIterableOfE()).new(this[_values], 0, null);
    }
    get keys() {
      return new _internal._ListIndicesIterable.new(this[_values]);
    }
    get isEmpty() {
      return this[_values][$isEmpty];
    }
    get isNotEmpty() {
      return this[_values][$isNotEmpty];
    }
    containsValue(value) {
      return this[_values][$contains](value);
    }
    containsKey(key) {
      return core.int.is(key) && dart.notNull(key) >= 0 && dart.notNull(key) < dart.notNull(this.length);
    }
    forEach(f) {
      let length = this[_values][$length];
      for (let i = 0; i < dart.notNull(length); i++) {
        f(i, this[_values][$_get](i));
        if (length != this[_values][$length]) {
          dart.throw(new core.ConcurrentModificationError.new(this[_values]));
        }
      }
    }
  }
  (ListMapView.new = function(values) {
    this[_values] = values;
  }).prototype = ListMapView.prototype;
  dart.addTypeTests(ListMapView);
  ListMapView.prototype[_is_ListMapView_default] = true;
  dart.setMethodSignature(ListMapView, () => ({
    __proto__: dart.getMethods(ListMapView.__proto__),
    _get: dart.fnType(E, [core.Object]),
    [$_get]: dart.fnType(E, [core.Object]),
    containsValue: dart.fnType(core.bool, [core.Object]),
    [$containsValue]: dart.fnType(core.bool, [core.Object]),
    containsKey: dart.fnType(core.bool, [core.Object]),
    [$containsKey]: dart.fnType(core.bool, [core.Object]),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [core.int, E])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.int, E])])
  }));
  dart.setGetterSignature(ListMapView, () => ({
    __proto__: dart.getGetters(ListMapView.__proto__),
    length: core.int,
    [$length]: core.int,
    values: core.Iterable$(E),
    [$values]: core.Iterable$(E),
    keys: core.Iterable$(core.int),
    [$keys]: core.Iterable$(core.int),
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool
  }));
  dart.setLibraryUri(ListMapView, "dart:_internal");
  dart.setFieldSignature(ListMapView, () => ({
    __proto__: dart.getFields(ListMapView.__proto__),
    [_values]: dart.fieldType(ListOfE())
  }));
  dart.defineExtensionMethods(ListMapView, ['_get', 'containsValue', 'containsKey', 'forEach']);
  dart.defineExtensionAccessors(ListMapView, [
    'length',
    'values',
    'keys',
    'isEmpty',
    'isNotEmpty'
  ]);
  return ListMapView;
});
_internal.ListMapView = _internal.ListMapView$();
dart.addTypeTests(_internal.ListMapView, _is_ListMapView_default);
const _is_ReversedListIterable_default = Symbol('_is_ReversedListIterable_default');
_internal.ReversedListIterable$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class ReversedListIterable extends _internal.ListIterable$(E) {
    get length() {
      return this[_source][$length];
    }
    elementAt(index) {
      return this[_source][$elementAt](dart.notNull(this[_source][$length]) - 1 - dart.notNull(index));
    }
  }
  (ReversedListIterable.new = function(source) {
    this[_source] = source;
    ReversedListIterable.__proto__.new.call(this);
  }).prototype = ReversedListIterable.prototype;
  dart.addTypeTests(ReversedListIterable);
  ReversedListIterable.prototype[_is_ReversedListIterable_default] = true;
  dart.setMethodSignature(ReversedListIterable, () => ({
    __proto__: dart.getMethods(ReversedListIterable.__proto__),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int])
  }));
  dart.setGetterSignature(ReversedListIterable, () => ({
    __proto__: dart.getGetters(ReversedListIterable.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(ReversedListIterable, "dart:_internal");
  dart.setFieldSignature(ReversedListIterable, () => ({
    __proto__: dart.getFields(ReversedListIterable.__proto__),
    [_source]: dart.fieldType(IterableOfE())
  }));
  dart.defineExtensionMethods(ReversedListIterable, ['elementAt']);
  dart.defineExtensionAccessors(ReversedListIterable, ['length']);
  return ReversedListIterable;
});
_internal.ReversedListIterable = _internal.ReversedListIterable$();
dart.addTypeTests(_internal.ReversedListIterable, _is_ReversedListIterable_default);
_internal.UnmodifiableListError = class UnmodifiableListError extends core.Object {
  static add() {
    return new core.UnsupportedError.new("Cannot add to unmodifiable List");
  }
  static change() {
    return new core.UnsupportedError.new("Cannot change the content of an unmodifiable List");
  }
  static length() {
    return new core.UnsupportedError.new("Cannot change length of unmodifiable List");
  }
  static remove() {
    return new core.UnsupportedError.new("Cannot remove from unmodifiable List");
  }
};
(_internal.UnmodifiableListError.new = function() {
}).prototype = _internal.UnmodifiableListError.prototype;
dart.addTypeTests(_internal.UnmodifiableListError);
dart.setLibraryUri(_internal.UnmodifiableListError, "dart:_internal");
_internal.NonGrowableListError = class NonGrowableListError extends core.Object {
  static add() {
    return new core.UnsupportedError.new("Cannot add to non-growable List");
  }
  static length() {
    return new core.UnsupportedError.new("Cannot change length of non-growable List");
  }
  static remove() {
    return new core.UnsupportedError.new("Cannot remove from non-growable List");
  }
};
(_internal.NonGrowableListError.new = function() {
}).prototype = _internal.NonGrowableListError.prototype;
dart.addTypeTests(_internal.NonGrowableListError);
dart.setLibraryUri(_internal.NonGrowableListError, "dart:_internal");
_internal.makeListFixedLength = function(E, growableList) {
  _interceptors.JSArray.markFixedList(growableList);
  return growableList;
};
_internal.makeFixedListUnmodifiable = function(E, fixedLengthList) {
  _interceptors.JSArray.markUnmodifiableList(fixedLengthList);
  return fixedLengthList;
};
dart.defineLazy(_internal, {
  /*_internal.printToZone*/get printToZone() {
    return null;
  },
  set printToZone(_) {}
});
_internal.printToConsole = function(line) {
  _js_primitives.printString(dart.str(line));
};
_internal.Sort = class Sort extends core.Object {
  static sort(E, a, compare) {
    _internal.Sort._doSort(E, a, 0, dart.notNull(a[$length]) - 1, compare);
  }
  static sortRange(E, a, from, to, compare) {
    if (dart.notNull(from) < 0 || dart.notNull(to) > dart.notNull(a[$length]) || dart.notNull(to) < dart.notNull(from)) {
      dart.throw("OutOfRange");
    }
    _internal.Sort._doSort(E, a, from, dart.notNull(to) - 1, compare);
  }
  static _doSort(E, a, left, right, compare) {
    if (dart.notNull(right) - dart.notNull(left) <= 32) {
      _internal.Sort._insertionSort(E, a, left, right, compare);
    } else {
      _internal.Sort._dualPivotQuicksort(E, a, left, right, compare);
    }
  }
  static _insertionSort(E, a, left, right, compare) {
    for (let i = dart.notNull(left) + 1; i <= dart.notNull(right); i++) {
      let el = a[$_get](i);
      let j = i;
      while (j > dart.notNull(left) && dart.notNull(compare(a[$_get](j - 1), el)) > 0) {
        a[$_set](j, a[$_get](j - 1));
        j--;
      }
      a[$_set](j, el);
    }
  }
  static _dualPivotQuicksort(E, a, left, right, compare) {
    if (!(dart.notNull(right) - dart.notNull(left) > 32)) dart.assertFailed(null, "dart:_internal/sort.dart", 79, 12, "right - left > _INSERTION_SORT_THRESHOLD");
    let sixth = ((dart.notNull(right) - dart.notNull(left) + 1) / 6)[$truncate]();
    let index1 = dart.notNull(left) + sixth;
    let index5 = dart.notNull(right) - sixth;
    let index3 = ((dart.notNull(left) + dart.notNull(right)) / 2)[$truncate]();
    let index2 = index3 - sixth;
    let index4 = index3 + sixth;
    let el1 = a[$_get](index1);
    let el2 = a[$_get](index2);
    let el3 = a[$_get](index3);
    let el4 = a[$_get](index4);
    let el5 = a[$_get](index5);
    if (dart.notNull(compare(el1, el2)) > 0) {
      let t = el1;
      el1 = el2;
      el2 = t;
    }
    if (dart.notNull(compare(el4, el5)) > 0) {
      let t = el4;
      el4 = el5;
      el5 = t;
    }
    if (dart.notNull(compare(el1, el3)) > 0) {
      let t = el1;
      el1 = el3;
      el3 = t;
    }
    if (dart.notNull(compare(el2, el3)) > 0) {
      let t = el2;
      el2 = el3;
      el3 = t;
    }
    if (dart.notNull(compare(el1, el4)) > 0) {
      let t = el1;
      el1 = el4;
      el4 = t;
    }
    if (dart.notNull(compare(el3, el4)) > 0) {
      let t = el3;
      el3 = el4;
      el4 = t;
    }
    if (dart.notNull(compare(el2, el5)) > 0) {
      let t = el2;
      el2 = el5;
      el5 = t;
    }
    if (dart.notNull(compare(el2, el3)) > 0) {
      let t = el2;
      el2 = el3;
      el3 = t;
    }
    if (dart.notNull(compare(el4, el5)) > 0) {
      let t = el4;
      el4 = el5;
      el5 = t;
    }
    let pivot1 = el2;
    let pivot2 = el4;
    a[$_set](index1, el1);
    a[$_set](index3, el3);
    a[$_set](index5, el5);
    a[$_set](index2, a[$_get](left));
    a[$_set](index4, a[$_get](right));
    let less = dart.notNull(left) + 1;
    let great = dart.notNull(right) - 1;
    let pivots_are_equal = compare(pivot1, pivot2) === 0;
    if (pivots_are_equal) {
      let pivot = pivot1;
      for (let k = less; k <= great; k++) {
        let ak = a[$_get](k);
        let comp = compare(ak, pivot);
        if (comp === 0) continue;
        if (dart.notNull(comp) < 0) {
          if (k !== less) {
            a[$_set](k, a[$_get](less));
            a[$_set](less, ak);
          }
          less++;
        } else {
          while (true) {
            comp = compare(a[$_get](great), pivot);
            if (dart.notNull(comp) > 0) {
              great--;
              continue;
            } else if (dart.notNull(comp) < 0) {
              a[$_set](k, a[$_get](less));
              a[$_set](less++, a[$_get](great));
              a[$_set](great--, ak);
              break;
            } else {
              a[$_set](k, a[$_get](great));
              a[$_set](great--, ak);
              break;
            }
          }
        }
      }
    } else {
      for (let k = less; k <= great; k++) {
        let ak = a[$_get](k);
        let comp_pivot1 = compare(ak, pivot1);
        if (dart.notNull(comp_pivot1) < 0) {
          if (k !== less) {
            a[$_set](k, a[$_get](less));
            a[$_set](less, ak);
          }
          less++;
        } else {
          let comp_pivot2 = compare(ak, pivot2);
          if (dart.notNull(comp_pivot2) > 0) {
            while (true) {
              let comp = compare(a[$_get](great), pivot2);
              if (dart.notNull(comp) > 0) {
                great--;
                if (great < k) break;
                continue;
              } else {
                comp = compare(a[$_get](great), pivot1);
                if (dart.notNull(comp) < 0) {
                  a[$_set](k, a[$_get](less));
                  a[$_set](less++, a[$_get](great));
                  a[$_set](great--, ak);
                } else {
                  a[$_set](k, a[$_get](great));
                  a[$_set](great--, ak);
                }
                break;
              }
            }
          }
        }
      }
    }
    a[$_set](left, a[$_get](less - 1));
    a[$_set](less - 1, pivot1);
    a[$_set](right, a[$_get](great + 1));
    a[$_set](great + 1, pivot2);
    _internal.Sort._doSort(E, a, left, less - 2, compare);
    _internal.Sort._doSort(E, a, great + 2, right, compare);
    if (pivots_are_equal) {
      return;
    }
    if (less < index1 && great > index5) {
      while (compare(a[$_get](less), pivot1) === 0) {
        less++;
      }
      while (compare(a[$_get](great), pivot2) === 0) {
        great--;
      }
      for (let k = less; k <= great; k++) {
        let ak = a[$_get](k);
        let comp_pivot1 = compare(ak, pivot1);
        if (comp_pivot1 === 0) {
          if (k !== less) {
            a[$_set](k, a[$_get](less));
            a[$_set](less, ak);
          }
          less++;
        } else {
          let comp_pivot2 = compare(ak, pivot2);
          if (comp_pivot2 === 0) {
            while (true) {
              let comp = compare(a[$_get](great), pivot2);
              if (comp === 0) {
                great--;
                if (great < k) break;
                continue;
              } else {
                comp = compare(a[$_get](great), pivot1);
                if (dart.notNull(comp) < 0) {
                  a[$_set](k, a[$_get](less));
                  a[$_set](less++, a[$_get](great));
                  a[$_set](great--, ak);
                } else {
                  a[$_set](k, a[$_get](great));
                  a[$_set](great--, ak);
                }
                break;
              }
            }
          }
        }
      }
      _internal.Sort._doSort(E, a, less, great, compare);
    } else {
      _internal.Sort._doSort(E, a, less, great, compare);
    }
  }
};
(_internal.Sort.new = function() {
}).prototype = _internal.Sort.prototype;
dart.addTypeTests(_internal.Sort);
dart.setLibraryUri(_internal.Sort, "dart:_internal");
dart.defineLazy(_internal.Sort, {
  /*_internal.Sort._INSERTION_SORT_THRESHOLD*/get _INSERTION_SORT_THRESHOLD() {
    return 32;
  }
});
const _name = dart.privateName(_internal, "_name");
_internal.Symbol = class Symbol extends core.Object {
  _equals(other) {
    return _internal.Symbol.is(other) && this[_name] == other[_name];
  }
  get hashCode() {
    let hash = this._hashCode;
    if (hash != null) return hash;
    let arbitraryPrime = 664597;
    hash = 536870911 & arbitraryPrime * dart.hashCode(this[_name]);
    this._hashCode = hash;
    return hash;
  }
  toString() {
    return "Symbol(\"" + dart.str(this[_name]) + "\")";
  }
  static getName(symbol) {
    return symbol[_name];
  }
  static validatePublicSymbol(name) {
    if (name[$isEmpty] || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
    if (name[$startsWith]("_")) {
      dart.throw(new core.ArgumentError.new("\"" + dart.str(name) + "\" is a private identifier"));
    }
    dart.throw(new core.ArgumentError.new("\"" + dart.str(name) + "\" is not a valid (qualified) symbol name"));
  }
  static isValidSymbol(name) {
    return name[$isEmpty] || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
  }
  static computeUnmangledName(symbol) {
    return symbol[_name];
  }
};
(_internal.Symbol.new = function(name) {
  this[_name] = name;
}).prototype = _internal.Symbol.prototype;
(_internal.Symbol.unvalidated = function(name) {
  this[_name] = name;
}).prototype = _internal.Symbol.prototype;
(_internal.Symbol.validated = function(name) {
  this[_name] = _internal.Symbol.validatePublicSymbol(name);
}).prototype = _internal.Symbol.prototype;
dart.addTypeTests(_internal.Symbol);
_internal.Symbol[dart.implements] = () => [core.Symbol];
dart.setLibraryUri(_internal.Symbol, "dart:_internal");
dart.setFieldSignature(_internal.Symbol, () => ({
  __proto__: dart.getFields(_internal.Symbol.__proto__),
  [_name]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_internal.Symbol, ['_equals', 'toString']);
dart.defineExtensionAccessors(_internal.Symbol, ['hashCode']);
dart.defineLazy(_internal.Symbol, {
  /*_internal.Symbol.reservedWordRE*/get reservedWordRE() {
    return "(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|" + "e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|" + "ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|" + "v(?:ar|oid)|w(?:hile|ith))";
  },
  /*_internal.Symbol.publicIdentifierRE*/get publicIdentifierRE() {
    return "(?!" + "(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))" + "\\b(?!\\$))[a-zA-Z$][\\w$]*";
  },
  /*_internal.Symbol.identifierRE*/get identifierRE() {
    return "(?!" + "(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))" + "\\b(?!\\$))[a-zA-Z$_][\\w$]*";
  },
  /*_internal.Symbol.operatorRE*/get operatorRE() {
    return "(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)";
  },
  /*_internal.Symbol.publicSymbolPattern*/get publicSymbolPattern() {
    return core.RegExp.new("^(?:" + "(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)" + "$|" + "(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*" + "(?:=?$|[.](?!$)))+?$");
  },
  /*_internal.Symbol.symbolPattern*/get symbolPattern() {
    return core.RegExp.new("^(?:" + "(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)" + "$|" + "(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$_][\\w$]*" + "(?:=?$|[.](?!$)))+?$");
  }
});
const _next = dart.privateName(_internal, "_next");
const _previous = dart.privateName(_internal, "_previous");
const _list = dart.privateName(_internal, "_list");
const _is_IterableBase_default = Symbol('_is_IterableBase_default');
collection.IterableBase$ = dart.generic(E => {
  class IterableBase extends core.Iterable$(E) {
    static iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
      if (leftDelimiter === void 0) leftDelimiter = "(";
      if (rightDelimiter === void 0) rightDelimiter = ")";
      if (dart.test(collection._isToStringVisiting(iterable))) {
        if (leftDelimiter === "(" && rightDelimiter === ")") {
          return "(...)";
        }
        return dart.str(leftDelimiter) + "..." + dart.str(rightDelimiter);
      }
      let parts = JSArrayOfString().of([]);
      collection._toStringVisiting[$add](iterable);
      try {
        collection._iterablePartsToStrings(iterable, parts);
      } finally {
        if (!core.identical(collection._toStringVisiting[$last], iterable)) dart.assertFailed(null, "dart:collection/iterable.dart", 240, 14, "identical(_toStringVisiting.last, iterable)");
        collection._toStringVisiting[$removeLast]();
      }
      return (() => {
        let _ = new core.StringBuffer.new(leftDelimiter);
        _.writeAll(parts, ", ");
        _.write(rightDelimiter);
        return _;
      })().toString();
    }
    static iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
      if (leftDelimiter === void 0) leftDelimiter = "(";
      if (rightDelimiter === void 0) rightDelimiter = ")";
      if (dart.test(collection._isToStringVisiting(iterable))) {
        return dart.str(leftDelimiter) + "..." + dart.str(rightDelimiter);
      }
      let buffer = new core.StringBuffer.new(leftDelimiter);
      collection._toStringVisiting[$add](iterable);
      try {
        buffer.writeAll(iterable, ", ");
      } finally {
        if (!core.identical(collection._toStringVisiting[$last], iterable)) dart.assertFailed(null, "dart:collection/iterable.dart", 269, 14, "identical(_toStringVisiting.last, iterable)");
        collection._toStringVisiting[$removeLast]();
      }
      buffer.write(rightDelimiter);
      return buffer.toString();
    }
  }
  (IterableBase.new = function() {
    IterableBase.__proto__.new.call(this);
  }).prototype = IterableBase.prototype;
  dart.addTypeTests(IterableBase);
  IterableBase.prototype[_is_IterableBase_default] = true;
  dart.setLibraryUri(IterableBase, "dart:collection");
  return IterableBase;
});
collection.IterableBase = collection.IterableBase$();
dart.addTypeTests(collection.IterableBase, _is_IterableBase_default);
const _is_LinkedList_default = Symbol('_is_LinkedList_default');
_internal.LinkedList$ = dart.generic(T => {
  let _LinkedListIteratorOfT = () => (_LinkedListIteratorOfT = dart.constFn(_internal._LinkedListIterator$(T)))();
  class LinkedList extends collection.IterableBase$(T) {
    get first() {
      return this[first];
    }
    set first(value) {
      this[first] = T._check(value);
    }
    get last() {
      return this[last];
    }
    set last(value) {
      this[last] = T._check(value);
    }
    get length() {
      return this[length];
    }
    set length(value) {
      this[length] = value;
    }
    get isEmpty() {
      return this.length === 0;
    }
    add(newLast) {
      T._check(newLast);
      if (!(newLast[_next] == null && newLast[_previous] == null)) dart.assertFailed(null, "dart:_internal/linked_list.dart", 19, 12, "newLast._next == null && newLast._previous == null");
      if (this.last != null) {
        if (!(this.last[_next] == null)) dart.assertFailed(null, "dart:_internal/linked_list.dart", 21, 14, "last._next == null");
        this.last[_next] = newLast;
      } else {
        this.first = newLast;
      }
      newLast[_previous] = this.last;
      this.last = newLast;
      this.last[_list] = this;
      this.length = dart.notNull(this.length) + 1;
    }
    addFirst(newFirst) {
      T._check(newFirst);
      if (this.first != null) {
        if (!(this.first[_previous] == null)) dart.assertFailed(null, "dart:_internal/linked_list.dart", 37, 14, "first._previous == null");
        this.first[_previous] = newFirst;
      } else {
        this.last = newFirst;
      }
      newFirst[_next] = this.first;
      this.first = newFirst;
      this.first[_list] = this;
      this.length = dart.notNull(this.length) + 1;
    }
    remove(node) {
      T._check(node);
      if (!dart.equals(node[_list], this)) return;
      this.length = dart.notNull(this.length) - 1;
      if (node[_previous] == null) {
        if (!(node == this.first)) dart.assertFailed(null, "dart:_internal/linked_list.dart", 59, 14, "identical(node, first)");
        this.first = node[_next];
      } else {
        node[_previous][_next] = node[_next];
      }
      if (node[_next] == null) {
        if (!(node == this.last)) dart.assertFailed(null, "dart:_internal/linked_list.dart", 65, 14, "identical(node, last)");
        this.last = node[_previous];
      } else {
        node[_next][_previous] = node[_previous];
      }
      node[_next] = node[_previous] = null;
      node[_list] = null;
    }
    get iterator() {
      return new (_LinkedListIteratorOfT()).new(this);
    }
  }
  (LinkedList.new = function() {
    this[first] = null;
    this[last] = null;
    this[length] = 0;
    LinkedList.__proto__.new.call(this);
  }).prototype = LinkedList.prototype;
  dart.addTypeTests(LinkedList);
  LinkedList.prototype[_is_LinkedList_default] = true;
  const first = Symbol("LinkedList.first");
  const last = Symbol("LinkedList.last");
  const length = Symbol("LinkedList.length");
  dart.setMethodSignature(LinkedList, () => ({
    __proto__: dart.getMethods(LinkedList.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    addFirst: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(dart.void, [core.Object])
  }));
  dart.setGetterSignature(LinkedList, () => ({
    __proto__: dart.getGetters(LinkedList.__proto__),
    iterator: core.Iterator$(T),
    [$iterator]: core.Iterator$(T)
  }));
  dart.setLibraryUri(LinkedList, "dart:_internal");
  dart.setFieldSignature(LinkedList, () => ({
    __proto__: dart.getFields(LinkedList.__proto__),
    first: dart.fieldType(T),
    last: dart.fieldType(T),
    length: dart.fieldType(core.int)
  }));
  dart.defineExtensionAccessors(LinkedList, [
    'isEmpty',
    'iterator',
    'first',
    'last',
    'length'
  ]);
  return LinkedList;
});
_internal.LinkedList = _internal.LinkedList$();
dart.addTypeTests(_internal.LinkedList, _is_LinkedList_default);
const _is_LinkedListEntry_default = Symbol('_is_LinkedListEntry_default');
_internal.LinkedListEntry$ = dart.generic(T => {
  let LinkedListOfT = () => (LinkedListOfT = dart.constFn(_internal.LinkedList$(T)))();
  class LinkedListEntry extends core.Object {
    unlink() {
      if (this[_list] == null) return;
      this[_list].remove(T._check(this));
    }
  }
  (LinkedListEntry.new = function() {
    this[_next] = null;
    this[_previous] = null;
    this[_list] = null;
  }).prototype = LinkedListEntry.prototype;
  dart.addTypeTests(LinkedListEntry);
  LinkedListEntry.prototype[_is_LinkedListEntry_default] = true;
  dart.setMethodSignature(LinkedListEntry, () => ({
    __proto__: dart.getMethods(LinkedListEntry.__proto__),
    unlink: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(LinkedListEntry, "dart:_internal");
  dart.setFieldSignature(LinkedListEntry, () => ({
    __proto__: dart.getFields(LinkedListEntry.__proto__),
    [_next]: dart.fieldType(T),
    [_previous]: dart.fieldType(T),
    [_list]: dart.fieldType(LinkedListOfT())
  }));
  return LinkedListEntry;
});
_internal.LinkedListEntry = _internal.LinkedListEntry$();
dart.addTypeTests(_internal.LinkedListEntry, _is_LinkedListEntry_default);
const _is__LinkedListIterator_default = Symbol('_is__LinkedListIterator_default');
_internal._LinkedListIterator$ = dart.generic(T => {
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  let LinkedListOfT = () => (LinkedListOfT = dart.constFn(_internal.LinkedList$(T)))();
  class _LinkedListIterator extends core.Object {
    moveNext() {
      if (this.current == null) {
        if (this[_list] == null) return false;
        if (!(dart.notNull(this[_list].length) > 0)) dart.assertFailed(null, "dart:_internal/linked_list.dart", 118, 14, "_list.length > 0");
        this.current = this[_list].first;
        this[_list] = null;
        return true;
      }
      this.current = this.current[_next];
      return this.current != null;
    }
  }
  (_LinkedListIterator.new = function(list) {
    this.current = null;
    this[_list] = list;
    if (this[_list].length === 0) this[_list] = null;
  }).prototype = _LinkedListIterator.prototype;
  dart.addTypeTests(_LinkedListIterator);
  _LinkedListIterator.prototype[_is__LinkedListIterator_default] = true;
  _LinkedListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setMethodSignature(_LinkedListIterator, () => ({
    __proto__: dart.getMethods(_LinkedListIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setLibraryUri(_LinkedListIterator, "dart:_internal");
  dart.setFieldSignature(_LinkedListIterator, () => ({
    __proto__: dart.getFields(_LinkedListIterator.__proto__),
    current: dart.fieldType(T),
    [_list]: dart.fieldType(LinkedListOfT())
  }));
  return _LinkedListIterator;
});
_internal._LinkedListIterator = _internal._LinkedListIterator$();
dart.addTypeTests(_internal._LinkedListIterator, _is__LinkedListIterator_default);
_isolate_helper.startRootIsolate = function(main, args) {
  if (args == null) args = JSArrayOfString().of([]);
  if (core.List.is(args)) {
    if (!ListOfString().is(args)) args = ListOfString().from(core.Iterable._check(args));
    if (typeof main == "function") {
      main(args, null);
    } else {
      dart.dcall(main, [args]);
    }
  } else {
    dart.throw(new core.ArgumentError.new("Arguments to main must be a List: " + dart.str(args)));
  }
};
dart.defineLazy(_isolate_helper, {
  /*_isolate_helper.global*/get global() {
    return dart.global;
  }
});
const _once = dart.privateName(_isolate_helper, "_once");
const _handle = dart.privateName(_isolate_helper, "_handle");
const _tick = dart.privateName(_isolate_helper, "_tick");
_isolate_helper.TimerImpl = class TimerImpl extends core.Object {
  get tick() {
    return this[_tick];
  }
  cancel() {
    if (dart.test(_isolate_helper.hasTimer())) {
      if (this[_handle] == null) return;
      dart.removeAsyncCallback();
      if (dart.test(this[_once])) {
        _isolate_helper.global.clearTimeout(this[_handle]);
      } else {
        _isolate_helper.global.clearInterval(this[_handle]);
      }
      this[_handle] = null;
    } else {
      dart.throw(new core.UnsupportedError.new("Canceling a timer."));
    }
  }
  get isActive() {
    return this[_handle] != null;
  }
};
(_isolate_helper.TimerImpl.new = function(milliseconds, callback) {
  this[_handle] = null;
  this[_tick] = 0;
  this[_once] = true;
  if (dart.test(_isolate_helper.hasTimer())) {
    const internalCallback = () => {
      this[_handle] = null;
      dart.removeAsyncCallback();
      this[_tick] = 1;
      callback();
    };
    dart.fn(internalCallback, VoidTovoid());
    dart.addAsyncCallback();
    this[_handle] = _isolate_helper.global.setTimeout(internalCallback, milliseconds);
  } else {
    dart.throw(new core.UnsupportedError.new("`setTimeout()` not found."));
  }
}).prototype = _isolate_helper.TimerImpl.prototype;
(_isolate_helper.TimerImpl.periodic = function(milliseconds, callback) {
  this[_handle] = null;
  this[_tick] = 0;
  this[_once] = false;
  if (dart.test(_isolate_helper.hasTimer())) {
    dart.addAsyncCallback();
    let start = Date.now();
    this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
      let tick = dart.notNull(this[_tick]) + 1;
      if (dart.notNull(milliseconds) > 0) {
        let duration = Date.now() - start;
        if (duration > (tick + 1) * dart.notNull(milliseconds)) {
          tick = (duration / dart.notNull(milliseconds))[$truncate]();
        }
      }
      this[_tick] = tick;
      callback(this);
    }, VoidToNull()), milliseconds);
  } else {
    dart.throw(new core.UnsupportedError.new("Periodic timer."));
  }
}).prototype = _isolate_helper.TimerImpl.prototype;
dart.addTypeTests(_isolate_helper.TimerImpl);
_isolate_helper.TimerImpl[dart.implements] = () => [async.Timer];
dart.setMethodSignature(_isolate_helper.TimerImpl, () => ({
  __proto__: dart.getMethods(_isolate_helper.TimerImpl.__proto__),
  cancel: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(_isolate_helper.TimerImpl, () => ({
  __proto__: dart.getGetters(_isolate_helper.TimerImpl.__proto__),
  tick: core.int,
  isActive: core.bool
}));
dart.setLibraryUri(_isolate_helper.TimerImpl, "dart:_isolate_helper");
dart.setFieldSignature(_isolate_helper.TimerImpl, () => ({
  __proto__: dart.getFields(_isolate_helper.TimerImpl.__proto__),
  [_once]: dart.finalFieldType(core.bool),
  [_handle]: dart.fieldType(core.int),
  [_tick]: dart.fieldType(core.int)
}));
_isolate_helper.hasTimer = function() {
  return _isolate_helper.global.setTimeout != null;
};
_js_helper._Patch = class _Patch extends core.Object {};
(_js_helper._Patch.new = function() {
}).prototype = _js_helper._Patch.prototype;
dart.addTypeTests(_js_helper._Patch);
dart.setLibraryUri(_js_helper._Patch, "dart:_js_helper");
dart.defineLazy(_js_helper, {
  /*_js_helper.patch*/get patch() {
    return dart.const(new _js_helper._Patch.new());
  }
});
const _jsIterator = dart.privateName(_js_helper, "_jsIterator");
const _current$0 = dart.privateName(_js_helper, "_current");
const _is_DartIterator_default = Symbol('_is_DartIterator_default');
_js_helper.DartIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class DartIterator extends core.Object {
    get current() {
      return this[_current$0];
    }
    moveNext() {
      let ret = this[_jsIterator].next();
      this[_current$0] = ret.value;
      return !ret.done;
    }
  }
  (DartIterator.new = function(jsIterator) {
    this[_current$0] = null;
    this[_jsIterator] = jsIterator;
  }).prototype = DartIterator.prototype;
  dart.addTypeTests(DartIterator);
  DartIterator.prototype[_is_DartIterator_default] = true;
  DartIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(DartIterator, () => ({
    __proto__: dart.getMethods(DartIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(DartIterator, () => ({
    __proto__: dart.getGetters(DartIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(DartIterator, "dart:_js_helper");
  dart.setFieldSignature(DartIterator, () => ({
    __proto__: dart.getFields(DartIterator.__proto__),
    [_jsIterator]: dart.finalFieldType(dart.dynamic),
    [_current$0]: dart.fieldType(E)
  }));
  return DartIterator;
});
_js_helper.DartIterator = _js_helper.DartIterator$();
dart.addTypeTests(_js_helper.DartIterator, _is_DartIterator_default);
const _initGenerator = dart.privateName(_js_helper, "_initGenerator");
const _is_SyncIterable_default = Symbol('_is_SyncIterable_default');
_js_helper.SyncIterable$ = dart.generic(E => {
  let DartIteratorOfE = () => (DartIteratorOfE = dart.constFn(_js_helper.DartIterator$(E)))();
  class SyncIterable extends collection.IterableBase$(E) {
    [Symbol.iterator]() {
      return this[_initGenerator]();
    }
    get iterator() {
      return new (DartIteratorOfE()).new(this[_initGenerator]());
    }
  }
  (SyncIterable.new = function(initGenerator) {
    this[_initGenerator] = initGenerator;
    SyncIterable.__proto__.new.call(this);
  }).prototype = SyncIterable.prototype;
  dart.addTypeTests(SyncIterable);
  SyncIterable.prototype[_is_SyncIterable_default] = true;
  dart.setMethodSignature(SyncIterable, () => ({
    __proto__: dart.getMethods(SyncIterable.__proto__),
    [Symbol.iterator]: dart.fnType(dart.dynamic, [])
  }));
  dart.setGetterSignature(SyncIterable, () => ({
    __proto__: dart.getGetters(SyncIterable.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(SyncIterable, "dart:_js_helper");
  dart.setFieldSignature(SyncIterable, () => ({
    __proto__: dart.getFields(SyncIterable.__proto__),
    [_initGenerator]: dart.finalFieldType(VoidTodynamic())
  }));
  dart.defineExtensionAccessors(SyncIterable, ['iterator']);
  return SyncIterable;
});
_js_helper.SyncIterable = _js_helper.SyncIterable$();
dart.addTypeTests(_js_helper.SyncIterable, _is_SyncIterable_default);
_js_helper.Primitives = class Primitives extends core.Object {
  static _parseIntError(source, handleError) {
    if (handleError == null) dart.throw(new core.FormatException.new(source));
    return handleError(source);
  }
  static parseInt(source, _radix, handleError) {
    if (source == null) dart.argumentError(source);
    let re = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i;
    let match = re.exec(source);
    let digitsIndex = 1;
    let hexIndex = 2;
    let decimalIndex = 3;
    if (match == null) {
      return _js_helper.Primitives._parseIntError(source, handleError);
    }
    let decimalMatch = match[$_get](decimalIndex);
    if (_radix == null) {
      if (decimalMatch != null) {
        return parseInt(source, 10);
      }
      if (match[$_get](hexIndex) != null) {
        return parseInt(source, 16);
      }
      return _js_helper.Primitives._parseIntError(source, handleError);
    }
    let radix = _radix;
    if (radix < 2 || radix > 36) {
      dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
    }
    if (radix === 10 && decimalMatch != null) {
      return parseInt(source, 10);
    }
    if (radix < 10 || decimalMatch == null) {
      let maxCharCode = null;
      if (radix <= 10) {
        maxCharCode = 48 - 1 + radix;
      } else {
        maxCharCode = 97 - 10 - 1 + radix;
      }
      if (!(typeof match[$_get](digitsIndex) == 'string')) dart.assertFailed(null, "dart:_js_helper", 134, 14, "match[digitsIndex] is String");
      let digitsPart = match[digitsIndex];
      for (let i = 0; i < digitsPart.length; i++) {
        let characterCode = (digitsPart[$codeUnitAt](i) | 32) >>> 0;
        if (characterCode > dart.notNull(maxCharCode)) {
          return _js_helper.Primitives._parseIntError(source, handleError);
        }
      }
    }
    return parseInt(source, radix);
  }
  static _parseDoubleError(source, handleError) {
    if (handleError == null) {
      dart.throw(new core.FormatException.new("Invalid double", source));
    }
    return handleError(source);
  }
  static parseDouble(source, handleError) {
    if (source == null) dart.argumentError(source);
    if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source)) {
      return _js_helper.Primitives._parseDoubleError(source, handleError);
    }
    let result = parseFloat(source);
    if (result[$isNaN]) {
      let trimmed = source[$trim]();
      if (trimmed === "NaN" || trimmed === "+NaN" || trimmed === "-NaN") {
        return result;
      }
      return _js_helper.Primitives._parseDoubleError(source, handleError);
    }
    return result;
  }
  static dateNow() {
    return Date.now();
  }
  static initTicker() {
    if (_js_helper.Primitives.timerFrequency != null) return;
    _js_helper.Primitives.timerFrequency = 1000;
    _js_helper.Primitives.timerTicks = dart.fn(_js_helper.Primitives.dateNow, VoidToint());
    if (typeof window == "undefined") return;
    let jsWindow = window;
    if (jsWindow == null) return;
    let performance = jsWindow.performance;
    if (performance == null) return;
    if (typeof performance.now != "function") return;
    _js_helper.Primitives.timerFrequency = 1000000;
    _js_helper.Primitives.timerTicks = dart.fn(() => (1000 * performance.now())[$floor](), VoidToint());
  }
  static get isD8() {
    return typeof version == "function" && typeof os == "object" && "system" in os;
  }
  static get isJsshell() {
    return typeof version == "function" && typeof system == "function";
  }
  static currentUri() {
    if (!!dart.global.location) {
      return dart.global.location.href;
    }
    return "";
  }
  static _fromCharCodeApply(array) {
    let kMaxApply = 500;
    let end = dart.notNull(array[$length]);
    if (end <= kMaxApply) {
      return String.fromCharCode.apply(null, array);
    }
    let result = "";
    for (let i = 0; i < end; i = i + kMaxApply) {
      let chunkEnd = i + kMaxApply < end ? i + kMaxApply : end;
      result = result + String.fromCharCode.apply(null, array.slice(i, chunkEnd));
    }
    return result;
  }
  static stringFromCodePoints(codePoints) {
    let a = JSArrayOfint().of([]);
    for (let i of codePoints) {
      if (i == null) dart.argumentError(i);
      {
        if (i <= 65535) {
          a[$add](i);
        } else if (i <= 1114111) {
          a[$add](55296 + (i - 65536 >> 10 & 1023));
          a[$add](56320 + (i & 1023));
        } else {
          dart.throw(_js_helper.argumentErrorValue(i));
        }
      }
    }
    return _js_helper.Primitives._fromCharCodeApply(a);
  }
  static stringFromCharCodes(charCodes) {
    for (let i of charCodes) {
      if (i == null) dart.argumentError(i);
      {
        if (i < 0) dart.throw(_js_helper.argumentErrorValue(i));
        if (i > 65535) return _js_helper.Primitives.stringFromCodePoints(charCodes);
      }
    }
    return _js_helper.Primitives._fromCharCodeApply(charCodes);
  }
  static stringFromNativeUint8List(charCodes, start, end) {
    if (start == null) dart.argumentError(start);
    if (end == null) dart.argumentError(end);
    let kMaxApply = 500;
    if (end <= kMaxApply && start === 0 && end === charCodes[$length]) {
      return String.fromCharCode.apply(null, charCodes);
    }
    let result = "";
    for (let i = start; i < end; i = i + kMaxApply) {
      let chunkEnd = i + kMaxApply < end ? i + kMaxApply : end;
      result = result + String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
    }
    return result;
  }
  static stringFromCharCode(charCode) {
    if (charCode == null) dart.argumentError(charCode);
    if (0 <= charCode) {
      if (charCode <= 65535) {
        return String.fromCharCode(charCode);
      }
      if (charCode <= 1114111) {
        let bits = charCode - 65536;
        let low = 56320 | bits & 1023;
        let high = (55296 | bits[$rightShift](10)) >>> 0;
        return String.fromCharCode(high, low);
      }
    }
    dart.throw(new core.RangeError.range(charCode, 0, 1114111));
  }
  static stringConcatUnchecked(string1, string2) {
    return _foreign_helper.JS_STRING_CONCAT(string1, string2);
  }
  static flattenString(str) {
    return str.charCodeAt(0) == 0 ? str : str;
  }
  static getTimeZoneName(receiver) {
    let d = _js_helper.Primitives.lazyAsJsDate(receiver);
    let match = /\((.*)\)/.exec(d.toString());
    if (match != null) return core.String._check(match[$_get](1));
    match = /^[A-Z,a-z]{3}\s[A-Z,a-z]{3}\s\d+\s\d{2}:\d{2}:\d{2}\s([A-Z]{3,5})\s\d{4}$/.exec(d.toString());
    if (match != null) return core.String._check(match[$_get](1));
    match = /(?:GMT|UTC)[+-]\d{4}/.exec(d.toString());
    if (match != null) return core.String._check(match[$_get](0));
    return "";
  }
  static getTimeZoneOffsetInMinutes(receiver) {
    return -_js_helper.Primitives.lazyAsJsDate(receiver).getTimezoneOffset();
  }
  static valueFromDecomposedDate(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
    if (years == null) dart.argumentError(years);
    if (month == null) dart.argumentError(month);
    if (day == null) dart.argumentError(day);
    if (hours == null) dart.argumentError(hours);
    if (minutes == null) dart.argumentError(minutes);
    if (seconds == null) dart.argumentError(seconds);
    if (milliseconds == null) dart.argumentError(milliseconds);
    if (isUtc == null) dart.argumentError(isUtc);
    let MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
    let jsMonth = month - 1;
    let value = null;
    if (isUtc) {
      value = Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds);
    } else {
      value = new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
    }
    if (value[$isNaN] || dart.notNull(value) < -MAX_MILLISECONDS_SINCE_EPOCH || dart.notNull(value) > MAX_MILLISECONDS_SINCE_EPOCH) {
      return null;
    }
    if (years <= 0 || years < 100) return _js_helper.Primitives.patchUpY2K(value, years, isUtc);
    return value;
  }
  static patchUpY2K(value, years, isUtc) {
    let date = new Date(value);
    if (dart.dtest(isUtc)) {
      date.setUTCFullYear(years);
    } else {
      date.setFullYear(years);
    }
    return date.valueOf();
  }
  static lazyAsJsDate(receiver) {
    if (receiver.date === void 0) {
      receiver.date = new Date(receiver.millisecondsSinceEpoch);
    }
    return receiver.date;
  }
  static getYear(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCFullYear() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getFullYear() + 0;
  }
  static getMonth(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMonth() + 1 : _js_helper.Primitives.lazyAsJsDate(receiver).getMonth() + 1;
  }
  static getDay(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDate() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDate() + 0;
  }
  static getHours(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCHours() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getHours() + 0;
  }
  static getMinutes(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMinutes() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMinutes() + 0;
  }
  static getSeconds(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCSeconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getSeconds() + 0;
  }
  static getMilliseconds(receiver) {
    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMilliseconds() + 0;
  }
  static getWeekday(receiver) {
    let weekday = dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDay() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDay() + 0;
    return (weekday + 6)[$modulo](7) + 1;
  }
  static valueFromDateString(str) {
    if (!(typeof str == 'string')) dart.throw(_js_helper.argumentErrorValue(str));
    let value = Date.parse(str);
    if (value[$isNaN]) dart.throw(_js_helper.argumentErrorValue(str));
    return value;
  }
  static getProperty(object, key) {
    if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
      dart.throw(_js_helper.argumentErrorValue(object));
    }
    return object[key];
  }
  static setProperty(object, key, value) {
    if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
      dart.throw(_js_helper.argumentErrorValue(object));
    }
    object[key] = value;
  }
};
(_js_helper.Primitives.new = function() {
}).prototype = _js_helper.Primitives.prototype;
dart.addTypeTests(_js_helper.Primitives);
dart.setLibraryUri(_js_helper.Primitives, "dart:_js_helper");
dart.defineLazy(_js_helper.Primitives, {
  /*_js_helper.Primitives.DOLLAR_CHAR_VALUE*/get DOLLAR_CHAR_VALUE() {
    return 36;
  },
  /*_js_helper.Primitives.timerFrequency*/get timerFrequency() {
    return null;
  },
  set timerFrequency(_) {},
  /*_js_helper.Primitives.timerTicks*/get timerTicks() {
    return null;
  },
  set timerTicks(_) {}
});
_js_helper.diagnoseIndexError = function(indexable, index) {
  let length = core.int._check(dart.dload(indexable, 'length'));
  if (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(length)) {
    return core.RangeError.index(index, indexable, "index", null, length);
  }
  return new core.RangeError.value(index, "index");
};
_js_helper.diagnoseRangeError = function(start, end, length) {
  if (start == null) {
    return new core.ArgumentError.value(start, "start");
  }
  if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(length)) {
    return new core.RangeError.range(start, 0, length, "start");
  }
  if (end != null) {
    if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(length)) {
      return new core.RangeError.range(end, start, length, "end");
    }
  }
  return new core.ArgumentError.value(end, "end");
};
_js_helper.stringLastIndexOfUnchecked = function(receiver, element, start) {
  return receiver.lastIndexOf(element, start);
};
_js_helper.argumentErrorValue = function(object) {
  return new core.ArgumentError.value(object);
};
_js_helper.throwArgumentErrorValue = function(value) {
  dart.throw(_js_helper.argumentErrorValue(value));
};
_js_helper.checkInt = function(value) {
  if (!core.int.is(value)) dart.throw(_js_helper.argumentErrorValue(value));
  return value;
};
_js_helper.throwRuntimeError = function(message) {
  dart.throw(new _js_helper.RuntimeError.new(message));
};
_js_helper.throwAbstractClassInstantiationError = function(className) {
  dart.throw(new core.AbstractClassInstantiationError.new(core.String._check(className)));
};
_js_helper.throwConcurrentModificationError = function(collection) {
  dart.throw(new core.ConcurrentModificationError.new(collection));
};
const _message = dart.privateName(_js_helper, "_message");
const _method = dart.privateName(_js_helper, "_method");
const _receiver = dart.privateName(_js_helper, "_receiver");
core.Error = class Error extends core.Object {
  static safeToString(object) {
    if (typeof object == 'number' || typeof object == 'boolean' || null == object) {
      return dart.toString(object);
    }
    if (typeof object == 'string') {
      return core.Error._stringToSafeString(object);
    }
    return core.Error._objectToString(object);
  }
  static _stringToSafeString(string) {
    return JSON.stringify(string);
  }
  static _objectToString(object) {
    return "Instance of '" + dart.typeName(dart.getReifiedType(object)) + "'";
  }
  get stackTrace() {
    return dart.stackTraceForError(this);
  }
};
(core.Error.new = function() {
}).prototype = core.Error.prototype;
dart.addTypeTests(core.Error);
dart.setGetterSignature(core.Error, () => ({
  __proto__: dart.getGetters(core.Error.__proto__),
  stackTrace: core.StackTrace,
  [$stackTrace]: core.StackTrace
}));
dart.setLibraryUri(core.Error, "dart:core");
dart.defineExtensionAccessors(core.Error, ['stackTrace']);
_js_helper.JsNoSuchMethodError = class JsNoSuchMethodError extends core.Error {
  toString() {
    if (this[_method] == null) return "NoSuchMethodError: " + dart.str(this[_message]);
    if (this[_receiver] == null) {
      return "NoSuchMethodError: method not found: '" + dart.str(this[_method]) + "' (" + dart.str(this[_message]) + ")";
    }
    return "NoSuchMethodError: " + ("method not found: '" + dart.str(this[_method]) + "' on '" + dart.str(this[_receiver]) + "' (" + dart.str(this[_message]) + ")");
  }
};
(_js_helper.JsNoSuchMethodError.new = function(message, match) {
  this[_message] = message;
  this[_method] = match == null ? null : match.method;
  this[_receiver] = match == null ? null : match.receiver;
  _js_helper.JsNoSuchMethodError.__proto__.new.call(this);
}).prototype = _js_helper.JsNoSuchMethodError.prototype;
dart.addTypeTests(_js_helper.JsNoSuchMethodError);
_js_helper.JsNoSuchMethodError[dart.implements] = () => [core.NoSuchMethodError];
dart.setLibraryUri(_js_helper.JsNoSuchMethodError, "dart:_js_helper");
dart.setFieldSignature(_js_helper.JsNoSuchMethodError, () => ({
  __proto__: dart.getFields(_js_helper.JsNoSuchMethodError.__proto__),
  [_message]: dart.finalFieldType(core.String),
  [_method]: dart.finalFieldType(core.String),
  [_receiver]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_js_helper.JsNoSuchMethodError, ['toString']);
_js_helper.UnknownJsTypeError = class UnknownJsTypeError extends core.Error {
  toString() {
    return this[_message][$isEmpty] ? "Error" : "Error: " + dart.str(this[_message]);
  }
};
(_js_helper.UnknownJsTypeError.new = function(message) {
  this[_message] = message;
  _js_helper.UnknownJsTypeError.__proto__.new.call(this);
}).prototype = _js_helper.UnknownJsTypeError.prototype;
dart.addTypeTests(_js_helper.UnknownJsTypeError);
dart.setLibraryUri(_js_helper.UnknownJsTypeError, "dart:_js_helper");
dart.setFieldSignature(_js_helper.UnknownJsTypeError, () => ({
  __proto__: dart.getFields(_js_helper.UnknownJsTypeError.__proto__),
  [_message]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_js_helper.UnknownJsTypeError, ['toString']);
_js_helper.fillLiteralMap = function(keyValuePairs, result) {
  let index = 0;
  let length = _js_helper.getLength(keyValuePairs);
  while (index < dart.notNull(length)) {
    let key = _js_helper.getIndex(keyValuePairs, index++);
    let value = _js_helper.getIndex(keyValuePairs, index++);
    result[$_set](key, value);
  }
  return result;
};
_js_helper.jsHasOwnProperty = function(jsObject, property) {
  return jsObject.hasOwnProperty(property);
};
_js_helper.jsPropertyAccess = function(jsObject, property) {
  return jsObject[property];
};
_js_helper.getFallThroughError = function() {
  return new _js_helper.FallThroughErrorImplementation.new();
};
_js_helper.Creates = class Creates extends core.Object {};
(_js_helper.Creates.new = function(types) {
  this.types = types;
}).prototype = _js_helper.Creates.prototype;
dart.addTypeTests(_js_helper.Creates);
dart.setLibraryUri(_js_helper.Creates, "dart:_js_helper");
dart.setFieldSignature(_js_helper.Creates, () => ({
  __proto__: dart.getFields(_js_helper.Creates.__proto__),
  types: dart.finalFieldType(core.String)
}));
_js_helper.Returns = class Returns extends core.Object {};
(_js_helper.Returns.new = function(types) {
  this.types = types;
}).prototype = _js_helper.Returns.prototype;
dart.addTypeTests(_js_helper.Returns);
dart.setLibraryUri(_js_helper.Returns, "dart:_js_helper");
dart.setFieldSignature(_js_helper.Returns, () => ({
  __proto__: dart.getFields(_js_helper.Returns.__proto__),
  types: dart.finalFieldType(core.String)
}));
_js_helper.JSName = class JSName extends core.Object {};
(_js_helper.JSName.new = function(name) {
  this.name = name;
}).prototype = _js_helper.JSName.prototype;
dart.addTypeTests(_js_helper.JSName);
dart.setLibraryUri(_js_helper.JSName, "dart:_js_helper");
dart.setFieldSignature(_js_helper.JSName, () => ({
  __proto__: dart.getFields(_js_helper.JSName.__proto__),
  name: dart.finalFieldType(core.String)
}));
const _is_JavaScriptIndexingBehavior_default = Symbol('_is_JavaScriptIndexingBehavior_default');
_js_helper.JavaScriptIndexingBehavior$ = dart.generic(E => {
  class JavaScriptIndexingBehavior extends core.Object {}
  (JavaScriptIndexingBehavior.new = function() {
  }).prototype = JavaScriptIndexingBehavior.prototype;
  dart.addTypeTests(JavaScriptIndexingBehavior);
  JavaScriptIndexingBehavior.prototype[_is_JavaScriptIndexingBehavior_default] = true;
  dart.setLibraryUri(JavaScriptIndexingBehavior, "dart:_js_helper");
  return JavaScriptIndexingBehavior;
});
_js_helper.JavaScriptIndexingBehavior = _js_helper.JavaScriptIndexingBehavior$();
dart.addTypeTests(_js_helper.JavaScriptIndexingBehavior, _is_JavaScriptIndexingBehavior_default);
_js_helper.TypeErrorImpl = class TypeErrorImpl extends core.Error {
  toString() {
    return this.message;
  }
};
(_js_helper.TypeErrorImpl.new = function(message) {
  this.message = message;
  _js_helper.TypeErrorImpl.__proto__.new.call(this);
}).prototype = _js_helper.TypeErrorImpl.prototype;
dart.addTypeTests(_js_helper.TypeErrorImpl);
_js_helper.TypeErrorImpl[dart.implements] = () => [core.TypeError];
dart.setLibraryUri(_js_helper.TypeErrorImpl, "dart:_js_helper");
dart.setFieldSignature(_js_helper.TypeErrorImpl, () => ({
  __proto__: dart.getFields(_js_helper.TypeErrorImpl.__proto__),
  message: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_js_helper.TypeErrorImpl, ['toString']);
_js_helper.CastErrorImpl = class CastErrorImpl extends core.Error {
  toString() {
    return this.message;
  }
};
(_js_helper.CastErrorImpl.new = function(message) {
  this.message = message;
  _js_helper.CastErrorImpl.__proto__.new.call(this);
}).prototype = _js_helper.CastErrorImpl.prototype;
dart.addTypeTests(_js_helper.CastErrorImpl);
_js_helper.CastErrorImpl[dart.implements] = () => [core.CastError];
dart.setLibraryUri(_js_helper.CastErrorImpl, "dart:_js_helper");
dart.setFieldSignature(_js_helper.CastErrorImpl, () => ({
  __proto__: dart.getFields(_js_helper.CastErrorImpl.__proto__),
  message: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_js_helper.CastErrorImpl, ['toString']);
core.FallThroughError = class FallThroughError extends core.Error {
  toString() {
    return super.toString();
  }
};
(core.FallThroughError.new = function() {
  core.FallThroughError.__proto__.new.call(this);
}).prototype = core.FallThroughError.prototype;
(core.FallThroughError._create = function(url, line) {
  core.FallThroughError.__proto__.new.call(this);
}).prototype = core.FallThroughError.prototype;
dart.addTypeTests(core.FallThroughError);
dart.setLibraryUri(core.FallThroughError, "dart:core");
dart.defineExtensionMethods(core.FallThroughError, ['toString']);
_js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
  toString() {
    return "Switch case fall-through.";
  }
};
(_js_helper.FallThroughErrorImplementation.new = function() {
  _js_helper.FallThroughErrorImplementation.__proto__.new.call(this);
}).prototype = _js_helper.FallThroughErrorImplementation.prototype;
dart.addTypeTests(_js_helper.FallThroughErrorImplementation);
dart.setLibraryUri(_js_helper.FallThroughErrorImplementation, "dart:_js_helper");
dart.defineExtensionMethods(_js_helper.FallThroughErrorImplementation, ['toString']);
_js_helper.RuntimeError = class RuntimeError extends core.Error {
  toString() {
    return "RuntimeError: " + dart.str(this.message);
  }
};
(_js_helper.RuntimeError.new = function(message) {
  this.message = message;
  _js_helper.RuntimeError.__proto__.new.call(this);
}).prototype = _js_helper.RuntimeError.prototype;
dart.addTypeTests(_js_helper.RuntimeError);
dart.setLibraryUri(_js_helper.RuntimeError, "dart:_js_helper");
dart.setFieldSignature(_js_helper.RuntimeError, () => ({
  __proto__: dart.getFields(_js_helper.RuntimeError.__proto__),
  message: dart.finalFieldType(dart.dynamic)
}));
dart.defineExtensionMethods(_js_helper.RuntimeError, ['toString']);
const _fileUri = dart.privateName(_js_helper, "_fileUri");
const _line = dart.privateName(_js_helper, "_line");
const _column = dart.privateName(_js_helper, "_column");
const _conditionSource = dart.privateName(_js_helper, "_conditionSource");
core.AssertionError = class AssertionError extends core.Error {
  get message() {
    return this[message$];
  }
  set message(value) {
    super.message = value;
  }
  toString() {
    return "Assertion failed";
  }
};
(core.AssertionError.new = function(message) {
  if (message === void 0) message = null;
  this[message$] = message;
  core.AssertionError.__proto__.new.call(this);
}).prototype = core.AssertionError.prototype;
dart.addTypeTests(core.AssertionError);
const message$ = Symbol("AssertionError.message");
dart.setLibraryUri(core.AssertionError, "dart:core");
dart.setFieldSignature(core.AssertionError, () => ({
  __proto__: dart.getFields(core.AssertionError.__proto__),
  message: dart.finalFieldType(core.Object)
}));
dart.defineExtensionMethods(core.AssertionError, ['toString']);
_js_helper.AssertionErrorImpl = class AssertionErrorImpl extends core.AssertionError {
  toString() {
    let failureMessage = "";
    if (this[_fileUri] != null && this[_line] != null && this[_column] != null && this[_conditionSource] != null) {
      failureMessage = failureMessage + (dart.str(this[_fileUri]) + ":" + dart.str(this[_line]) + ":" + dart.str(this[_column]) + "\n" + dart.str(this[_conditionSource]) + "\n");
    }
    failureMessage = failureMessage + dart.notNull(this.message != null ? core.Error.safeToString(this.message) : "is not true");
    return "Assertion failed: " + failureMessage;
  }
};
(_js_helper.AssertionErrorImpl.new = function(message, fileUri, line, column, conditionSource) {
  if (fileUri === void 0) fileUri = null;
  if (line === void 0) line = null;
  if (column === void 0) column = null;
  if (conditionSource === void 0) conditionSource = null;
  this[_fileUri] = fileUri;
  this[_line] = line;
  this[_column] = column;
  this[_conditionSource] = conditionSource;
  _js_helper.AssertionErrorImpl.__proto__.new.call(this, message);
}).prototype = _js_helper.AssertionErrorImpl.prototype;
dart.addTypeTests(_js_helper.AssertionErrorImpl);
dart.setLibraryUri(_js_helper.AssertionErrorImpl, "dart:_js_helper");
dart.setFieldSignature(_js_helper.AssertionErrorImpl, () => ({
  __proto__: dart.getFields(_js_helper.AssertionErrorImpl.__proto__),
  [_fileUri]: dart.finalFieldType(core.String),
  [_line]: dart.finalFieldType(core.int),
  [_column]: dart.finalFieldType(core.int),
  [_conditionSource]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_js_helper.AssertionErrorImpl, ['toString']);
_js_helper.random64 = function() {
  let int32a = Math.random() * 0x100000000 >>> 0;
  let int32b = Math.random() * 0x100000000 >>> 0;
  return int32a + int32b * 4294967296;
};
_js_helper.BooleanConversionAssertionError = class BooleanConversionAssertionError extends core.AssertionError {
  toString() {
    return "Failed assertion: boolean expression must not be null";
  }
};
(_js_helper.BooleanConversionAssertionError.new = function() {
  _js_helper.BooleanConversionAssertionError.__proto__.new.call(this);
}).prototype = _js_helper.BooleanConversionAssertionError.prototype;
dart.addTypeTests(_js_helper.BooleanConversionAssertionError);
dart.setLibraryUri(_js_helper.BooleanConversionAssertionError, "dart:_js_helper");
dart.defineExtensionMethods(_js_helper.BooleanConversionAssertionError, ['toString']);
_js_helper.registerGlobalObject = function(object) {
  try {
    if (dart.test(dart.polyfill(object))) {
      dart.applyAllExtensions(object);
    }
  } catch (e$) {
    let e = dart.getThrown(e$);
  }
};
_js_helper.applyExtension = function(name, nativeObject) {
  dart.applyExtension(name, nativeObject);
};
const _name$ = dart.privateName(_js_helper, "_name");
const _nativeSymbol = dart.privateName(_js_helper, "_nativeSymbol");
_js_helper.PrivateSymbol = class PrivateSymbol extends core.Object {
  static getName(symbol) {
    return _js_helper.PrivateSymbol.as(symbol)[_name$];
  }
  static getNativeSymbol(symbol) {
    if (_js_helper.PrivateSymbol.is(symbol)) return symbol[_nativeSymbol];
    return null;
  }
  _equals(other) {
    return _js_helper.PrivateSymbol.is(other) && this[_name$] == other[_name$] && core.identical(this[_nativeSymbol], other[_nativeSymbol]);
  }
  get hashCode() {
    return dart.hashCode(this[_name$]);
  }
  toString() {
    return "Symbol(\"" + dart.str(this[_name$]) + "\")";
  }
};
(_js_helper.PrivateSymbol.new = function(name, nativeSymbol) {
  this[_name$] = name;
  this[_nativeSymbol] = nativeSymbol;
}).prototype = _js_helper.PrivateSymbol.prototype;
dart.addTypeTests(_js_helper.PrivateSymbol);
_js_helper.PrivateSymbol[dart.implements] = () => [core.Symbol];
dart.setLibraryUri(_js_helper.PrivateSymbol, "dart:_js_helper");
dart.setFieldSignature(_js_helper.PrivateSymbol, () => ({
  __proto__: dart.getFields(_js_helper.PrivateSymbol.__proto__),
  [_name$]: dart.finalFieldType(core.String),
  [_nativeSymbol]: dart.finalFieldType(core.Object)
}));
dart.defineExtensionMethods(_js_helper.PrivateSymbol, ['_equals', 'toString']);
dart.defineExtensionAccessors(_js_helper.PrivateSymbol, ['hashCode']);
_js_helper.ForceInline = class ForceInline extends core.Object {};
(_js_helper.ForceInline.new = function() {
}).prototype = _js_helper.ForceInline.prototype;
dart.addTypeTests(_js_helper.ForceInline);
dart.setLibraryUri(_js_helper.ForceInline, "dart:_js_helper");
_js_helper._NotNull = class _NotNull extends core.Object {};
(_js_helper._NotNull.new = function() {
}).prototype = _js_helper._NotNull.prototype;
dart.addTypeTests(_js_helper._NotNull);
dart.setLibraryUri(_js_helper._NotNull, "dart:_js_helper");
dart.defineLazy(_js_helper, {
  /*_js_helper.notNull*/get notNull() {
    return dart.const(new _js_helper._NotNull.new());
  }
});
_js_helper.NoReifyGeneric = class NoReifyGeneric extends core.Object {};
(_js_helper.NoReifyGeneric.new = function() {
}).prototype = _js_helper.NoReifyGeneric.prototype;
dart.addTypeTests(_js_helper.NoReifyGeneric);
dart.setLibraryUri(_js_helper.NoReifyGeneric, "dart:_js_helper");
_js_helper.ReifyFunctionTypes = class ReifyFunctionTypes extends core.Object {};
(_js_helper.ReifyFunctionTypes.new = function(value) {
  this.value = value;
}).prototype = _js_helper.ReifyFunctionTypes.prototype;
dart.addTypeTests(_js_helper.ReifyFunctionTypes);
dart.setLibraryUri(_js_helper.ReifyFunctionTypes, "dart:_js_helper");
dart.setFieldSignature(_js_helper.ReifyFunctionTypes, () => ({
  __proto__: dart.getFields(_js_helper.ReifyFunctionTypes.__proto__),
  value: dart.finalFieldType(core.bool)
}));
_js_helper._NullCheck = class _NullCheck extends core.Object {};
(_js_helper._NullCheck.new = function() {
}).prototype = _js_helper._NullCheck.prototype;
dart.addTypeTests(_js_helper._NullCheck);
dart.setLibraryUri(_js_helper._NullCheck, "dart:_js_helper");
dart.defineLazy(_js_helper, {
  /*_js_helper.undefined*/get undefined() {
    return dart.const(new _js_helper._Undefined.new());
  }
});
_js_helper._Undefined = class _Undefined extends core.Object {};
(_js_helper._Undefined.new = function() {
}).prototype = _js_helper._Undefined.prototype;
dart.addTypeTests(_js_helper._Undefined);
dart.setLibraryUri(_js_helper._Undefined, "dart:_js_helper");
dart.defineLazy(_js_helper, {
  /*_js_helper.nullCheck*/get nullCheck() {
    return dart.const(new _js_helper._NullCheck.new());
  }
});
_js_helper.NoThrows = class NoThrows extends core.Object {};
(_js_helper.NoThrows.new = function() {
}).prototype = _js_helper.NoThrows.prototype;
dart.addTypeTests(_js_helper.NoThrows);
dart.setLibraryUri(_js_helper.NoThrows, "dart:_js_helper");
_js_helper.NoInline = class NoInline extends core.Object {};
(_js_helper.NoInline.new = function() {
}).prototype = _js_helper.NoInline.prototype;
dart.addTypeTests(_js_helper.NoInline);
dart.setLibraryUri(_js_helper.NoInline, "dart:_js_helper");
_js_helper.Native = class Native extends core.Object {};
(_js_helper.Native.new = function(name) {
  this.name = name;
}).prototype = _js_helper.Native.prototype;
dart.addTypeTests(_js_helper.Native);
dart.setLibraryUri(_js_helper.Native, "dart:_js_helper");
dart.setFieldSignature(_js_helper.Native, () => ({
  __proto__: dart.getFields(_js_helper.Native.__proto__),
  name: dart.finalFieldType(core.String)
}));
_js_helper.JsPeerInterface = class JsPeerInterface extends core.Object {};
(_js_helper.JsPeerInterface.new = function(opts) {
  let name = opts && 'name' in opts ? opts.name : null;
  this.name = name;
}).prototype = _js_helper.JsPeerInterface.prototype;
dart.addTypeTests(_js_helper.JsPeerInterface);
dart.setLibraryUri(_js_helper.JsPeerInterface, "dart:_js_helper");
dart.setFieldSignature(_js_helper.JsPeerInterface, () => ({
  __proto__: dart.getFields(_js_helper.JsPeerInterface.__proto__),
  name: dart.finalFieldType(core.String)
}));
_js_helper.SupportJsExtensionMethods = class SupportJsExtensionMethods extends core.Object {};
(_js_helper.SupportJsExtensionMethods.new = function() {
}).prototype = _js_helper.SupportJsExtensionMethods.prototype;
dart.addTypeTests(_js_helper.SupportJsExtensionMethods);
dart.setLibraryUri(_js_helper.SupportJsExtensionMethods, "dart:_js_helper");
const _modifications = dart.privateName(_js_helper, "_modifications");
const _map = dart.privateName(_js_helper, "_map");
const _is_InternalMap_default = Symbol('_is_InternalMap_default');
_js_helper.InternalMap$ = dart.generic((K, V) => {
  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
  class InternalMap extends collection.MapBase$(K, V) {
    forEach(action) {
      let modifications = this[_modifications];
      for (let entry of this[_map].entries()) {
        action(entry[0], entry[1]);
        if (modifications !== this[_modifications]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
      }
    }
  }
  (InternalMap.new = function() {
  }).prototype = InternalMap.prototype;
  dart.addTypeTests(InternalMap);
  InternalMap.prototype[_is_InternalMap_default] = true;
  InternalMap[dart.implements] = () => [LinkedHashMapOfK$V(), HashMapOfK$V()];
  dart.setLibraryUri(InternalMap, "dart:_js_helper");
  dart.defineExtensionMethods(InternalMap, ['forEach']);
  return InternalMap;
});
_js_helper.InternalMap = _js_helper.InternalMap$();
dart.addTypeTests(_js_helper.InternalMap, _is_InternalMap_default);
const _keyMap = dart.privateName(_js_helper, "_keyMap");
const _is_LinkedMap_default = Symbol('_is_LinkedMap_default');
_js_helper.LinkedMap$ = dart.generic((K, V) => {
  let _JSMapIterableOfK = () => (_JSMapIterableOfK = dart.constFn(_js_helper._JSMapIterable$(K)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.fnType(core.Null, [K, V])))();
  let _JSMapIterableOfV = () => (_JSMapIterableOfV = dart.constFn(_js_helper._JSMapIterable$(V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  class LinkedMap extends _js_helper.InternalMap$(K, V) {
    get length() {
      return this[_map].size;
    }
    get isEmpty() {
      return this[_map].size == 0;
    }
    get isNotEmpty() {
      return this[_map].size != 0;
    }
    get keys() {
      return new (_JSMapIterableOfK()).new(this, true);
    }
    get values() {
      return new (_JSMapIterableOfV()).new(this, false);
    }
    containsKey(key) {
      if (key == null) {
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        let k = key;
        let buckets = this[_keyMap].get(k[$hashCode] & 0x3ffffff);
        if (buckets != null) {
          for (let i = 0, n = buckets.length; i < n; i++) {
            k = buckets[i];
            if (k[$_equals](key)) return true;
          }
        }
        return false;
      }
      return this[_map].has(key);
    }
    containsValue(value) {
      for (let v of this[_map].values()) {
        if (dart.equals(v, value)) return true;
      }
      return false;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      let map = this[_map];
      let length = map.size;
      other[$forEach](dart.fn((key, value) => {
        if (key == null) {
          key = null;
        } else if (key[$_equals] !== dart.identityEquals) {
          key = _js_helper.putLinkedMapKey(key, this[_keyMap]);
        }
        this[_map].set(key, value);
      }, KAndVToNull()));
      if (length !== map.size) {
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
    }
    _get(key) {
      if (key == null) {
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        let k = key;
        let buckets = this[_keyMap].get(k[$hashCode] & 0x3ffffff);
        if (buckets != null) {
          for (let i = 0, n = buckets.length; i < n; i++) {
            k = buckets[i];
            if (k[$_equals](key)) return this[_map].get(k);
          }
        }
        return null;
      }
      let value = this[_map].get(key);
      return value == null ? null : value;
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      if (key == null) {
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        key = _js_helper.putLinkedMapKey(key, this[_keyMap]);
      }
      let map = this[_map];
      let length = map.size;
      map.set(key, value);
      if (length !== map.size) {
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      let map = this[_map];
      if (key == null) {
        key = null;
        if (map.has(null)) return map.get(null);
      } else if (key[$_equals] !== dart.identityEquals) {
        let k = key;
        let hash = k[$hashCode] & 0x3ffffff;
        let buckets = this[_keyMap].get(hash);
        if (buckets == null) {
          this[_keyMap].set(hash, [key]);
        } else {
          for (let i = 0, n = buckets.length; i < n; i++) {
            k = buckets[i];
            if (k[$_equals](key)) return map.get(k);
          }
          buckets.push(key);
        }
      } else if (map.has(key)) {
        return map.get(key);
      }
      let value = ifAbsent();
      if (value == null) value = null;
      map.set(key, value);
      this[_modifications] = this[_modifications] + 1 & 67108863;
      return value;
    }
    remove(key) {
      if (key == null) {
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        let k = key;
        let hash = k[$hashCode] & 0x3ffffff;
        let buckets = this[_keyMap].get(hash);
        if (buckets == null) return null;
        for (let i = 0, n = buckets.length;;) {
          k = buckets[i];
          if (k[$_equals](key)) {
            key = k;
            if (n === 1) {
              this[_keyMap].delete(hash);
            } else {
              buckets.splice(i, 1);
            }
            break;
          }
          if (++i >= n) return null;
        }
      }
      let map = this[_map];
      let value = map.get(key);
      if (map.delete(key)) {
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
      return value == null ? null : value;
    }
    clear() {
      let map = this[_map];
      if (map.size > 0) {
        map.clear();
        this[_keyMap].clear();
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
    }
  }
  (LinkedMap.new = function() {
    this[_map] = new Map();
    this[_keyMap] = new Map();
    this[_modifications] = 0;
  }).prototype = LinkedMap.prototype;
  (LinkedMap.from = function(entries) {
    this[_map] = new Map();
    this[_keyMap] = new Map();
    this[_modifications] = 0;
    let map = this[_map];
    let keyMap = this[_keyMap];
    for (let i = 0, n = entries.length; i < n; i = i + 2) {
      let key = entries[i];
      let value = entries[i + 1];
      if (key == null) {
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        key = _js_helper.putLinkedMapKey(key, keyMap);
      }
      map.set(key, value);
    }
  }).prototype = LinkedMap.prototype;
  dart.addTypeTests(LinkedMap);
  LinkedMap.prototype[_is_LinkedMap_default] = true;
  dart.setMethodSignature(LinkedMap, () => ({
    __proto__: dart.getMethods(LinkedMap.__proto__),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    _get: dart.fnType(V, [core.Object]),
    [$_get]: dart.fnType(V, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    remove: dart.fnType(V, [core.Object]),
    [$remove]: dart.fnType(V, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(LinkedMap, () => ({
    __proto__: dart.getGetters(LinkedMap.__proto__),
    keys: core.Iterable$(K),
    [$keys]: core.Iterable$(K)
  }));
  dart.setLibraryUri(LinkedMap, "dart:_js_helper");
  dart.setFieldSignature(LinkedMap, () => ({
    __proto__: dart.getFields(LinkedMap.__proto__),
    [_map]: dart.finalFieldType(dart.dynamic),
    [_keyMap]: dart.finalFieldType(dart.dynamic),
    [_modifications]: dart.fieldType(core.int)
  }));
  dart.defineExtensionMethods(LinkedMap, [
    'containsKey',
    'containsValue',
    'addAll',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear'
  ]);
  dart.defineExtensionAccessors(LinkedMap, [
    'length',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'values'
  ]);
  return LinkedMap;
});
_js_helper.LinkedMap = _js_helper.LinkedMap$();
dart.addTypeTests(_js_helper.LinkedMap, _is_LinkedMap_default);
_js_helper.putLinkedMapKey = function(key, keyMap) {
  let hash = key[$hashCode] & 0x3ffffff;
  let buckets = keyMap.get(hash);
  if (buckets == null) {
    keyMap.set(hash, [key]);
    return key;
  }
  for (let i = 0, n = buckets.length; i < n; i++) {
    let k = buckets[i];
    if (k[$_equals](key)) return k;
  }
  buckets.push(key);
  return key;
};
const _is_ImmutableMap_default = Symbol('_is_ImmutableMap_default');
_js_helper.ImmutableMap$ = dart.generic((K, V) => {
  class ImmutableMap extends _js_helper.LinkedMap$(K, V) {
    _set(key, value) {
      dart.throw(_js_helper.ImmutableMap._unsupported());
      return value;
    }
    addAll(other) {
      return dart.throw(_js_helper.ImmutableMap._unsupported());
    }
    clear() {
      return dart.throw(_js_helper.ImmutableMap._unsupported());
    }
    remove(key) {
      return dart.throw(_js_helper.ImmutableMap._unsupported());
    }
    putIfAbsent(key, ifAbsent) {
      return dart.throw(_js_helper.ImmutableMap._unsupported());
    }
    static _unsupported() {
      return new core.UnsupportedError.new("Cannot modify unmodifiable map");
    }
  }
  (ImmutableMap.from = function(entries) {
    ImmutableMap.__proto__.from.call(this, entries);
  }).prototype = ImmutableMap.prototype;
  dart.addTypeTests(ImmutableMap);
  ImmutableMap.prototype[_is_ImmutableMap_default] = true;
  dart.setMethodSignature(ImmutableMap, () => ({
    __proto__: dart.getMethods(ImmutableMap.__proto__),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    putIfAbsent: dart.fnType(V, [core.Object, dart.fnType(core.Object, [])]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, dart.fnType(core.Object, [])])
  }));
  dart.setLibraryUri(ImmutableMap, "dart:_js_helper");
  dart.defineExtensionMethods(ImmutableMap, [
    '_set',
    'addAll',
    'clear',
    'remove',
    'putIfAbsent'
  ]);
  return ImmutableMap;
});
_js_helper.ImmutableMap = _js_helper.ImmutableMap$();
dart.addTypeTests(_js_helper.ImmutableMap, _is_ImmutableMap_default);
const _is_IdentityMap_default = Symbol('_is_IdentityMap_default');
_js_helper.IdentityMap$ = dart.generic((K, V) => {
  let _JSMapIterableOfK = () => (_JSMapIterableOfK = dart.constFn(_js_helper._JSMapIterable$(K)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.fnType(core.Null, [K, V])))();
  let _JSMapIterableOfV = () => (_JSMapIterableOfV = dart.constFn(_js_helper._JSMapIterable$(V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  class IdentityMap extends _js_helper.InternalMap$(K, V) {
    get length() {
      return this[_map].size;
    }
    get isEmpty() {
      return this[_map].size == 0;
    }
    get isNotEmpty() {
      return this[_map].size != 0;
    }
    get keys() {
      return new (_JSMapIterableOfK()).new(this, true);
    }
    get values() {
      return new (_JSMapIterableOfV()).new(this, false);
    }
    containsKey(key) {
      return this[_map].has(key);
    }
    containsValue(value) {
      for (let v of this[_map].values()) {
        if (dart.equals(v, value)) return true;
      }
      return false;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      if (dart.test(other[$isNotEmpty])) {
        let map = this[_map];
        other[$forEach](dart.fn((key, value) => {
          map.set(key, value);
        }, KAndVToNull()));
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
    }
    _get(key) {
      let value = this[_map].get(key);
      return value == null ? null : value;
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      let map = this[_map];
      let length = map.size;
      map.set(key, value);
      if (length !== map.size) {
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      if (this[_map].has(key)) return this[_map].get(key);
      let value = ifAbsent();
      if (value == null) value = null;
      this[_map].set(key, value);
      this[_modifications] = this[_modifications] + 1 & 67108863;
      return value;
    }
    remove(key) {
      let value = this[_map].get(key);
      if (this[_map].delete(key)) {
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
      return value == null ? null : value;
    }
    clear() {
      if (this[_map].size > 0) {
        this[_map].clear();
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
    }
  }
  (IdentityMap.new = function() {
    this[_map] = new Map();
    this[_modifications] = 0;
  }).prototype = IdentityMap.prototype;
  (IdentityMap.from = function(entries) {
    this[_map] = new Map();
    this[_modifications] = 0;
    let map = this[_map];
    for (let i = 0, n = entries.length; i < n; i = i + 2) {
      map.set(entries[i], entries[i + 1]);
    }
  }).prototype = IdentityMap.prototype;
  dart.addTypeTests(IdentityMap);
  IdentityMap.prototype[_is_IdentityMap_default] = true;
  dart.setMethodSignature(IdentityMap, () => ({
    __proto__: dart.getMethods(IdentityMap.__proto__),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    _get: dart.fnType(V, [core.Object]),
    [$_get]: dart.fnType(V, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    remove: dart.fnType(V, [core.Object]),
    [$remove]: dart.fnType(V, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(IdentityMap, () => ({
    __proto__: dart.getGetters(IdentityMap.__proto__),
    keys: core.Iterable$(K),
    [$keys]: core.Iterable$(K)
  }));
  dart.setLibraryUri(IdentityMap, "dart:_js_helper");
  dart.setFieldSignature(IdentityMap, () => ({
    __proto__: dart.getFields(IdentityMap.__proto__),
    [_map]: dart.finalFieldType(dart.dynamic),
    [_modifications]: dart.fieldType(core.int)
  }));
  dart.defineExtensionMethods(IdentityMap, [
    'containsKey',
    'containsValue',
    'addAll',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear'
  ]);
  dart.defineExtensionAccessors(IdentityMap, [
    'length',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'values'
  ]);
  return IdentityMap;
});
_js_helper.IdentityMap = _js_helper.IdentityMap$();
dart.addTypeTests(_js_helper.IdentityMap, _is_IdentityMap_default);
const _isKeys = dart.privateName(_js_helper, "_isKeys");
const _is__JSMapIterable_default = Symbol('_is__JSMapIterable_default');
_js_helper._JSMapIterable$ = dart.generic(E => {
  let DartIteratorOfE = () => (DartIteratorOfE = dart.constFn(_js_helper.DartIterator$(E)))();
  class _JSMapIterable extends _internal.EfficientLengthIterable$(E) {
    get length() {
      return this[_map].length;
    }
    get isEmpty() {
      return this[_map].isEmpty;
    }
    [Symbol.iterator]() {
      let map = this[_map];
      let iterator = this[_isKeys] ? map[_map].keys() : map[_map].values();
      let modifications = map[_modifications];
      return {
        next() {
          if (modifications != map[_modifications]) {
            throw new core.ConcurrentModificationError.new(map);
          }
          return iterator.next();
        }
      };
    }
    get iterator() {
      return new (DartIteratorOfE()).new(this[Symbol.iterator]());
    }
    contains(element) {
      return this[_isKeys] ? this[_map].containsKey(element) : this[_map].containsValue(element);
    }
    forEach(f) {
      for (let entry of this)
        f(entry);
    }
  }
  (_JSMapIterable.new = function(map, isKeys) {
    this[_map] = map;
    this[_isKeys] = isKeys;
    _JSMapIterable.__proto__.new.call(this);
  }).prototype = _JSMapIterable.prototype;
  dart.addTypeTests(_JSMapIterable);
  _JSMapIterable.prototype[_is__JSMapIterable_default] = true;
  dart.setMethodSignature(_JSMapIterable, () => ({
    __proto__: dart.getMethods(_JSMapIterable.__proto__),
    [Symbol.iterator]: dart.fnType(dart.dynamic, [])
  }));
  dart.setGetterSignature(_JSMapIterable, () => ({
    __proto__: dart.getGetters(_JSMapIterable.__proto__),
    length: core.int,
    [$length]: core.int,
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(_JSMapIterable, "dart:_js_helper");
  dart.setFieldSignature(_JSMapIterable, () => ({
    __proto__: dart.getFields(_JSMapIterable.__proto__),
    [_map]: dart.finalFieldType(_js_helper.InternalMap),
    [_isKeys]: dart.finalFieldType(core.bool)
  }));
  dart.defineExtensionMethods(_JSMapIterable, ['contains', 'forEach']);
  dart.defineExtensionAccessors(_JSMapIterable, ['length', 'isEmpty', 'iterator']);
  return _JSMapIterable;
});
_js_helper._JSMapIterable = _js_helper._JSMapIterable$();
dart.addTypeTests(_js_helper._JSMapIterable, _is__JSMapIterable_default);
const _validKey = dart.privateName(_js_helper, "_validKey");
const _equals = dart.privateName(_js_helper, "_equals");
const _hashCode = dart.privateName(_js_helper, "_hashCode");
const _is_CustomHashMap_default = Symbol('_is_CustomHashMap_default');
_js_helper.CustomHashMap$ = dart.generic((K, V) => {
  let _JSMapIterableOfK = () => (_JSMapIterableOfK = dart.constFn(_js_helper._JSMapIterable$(K)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.fnType(core.Null, [K, V])))();
  let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.fnType(core.bool, [K, K])))();
  let KToint = () => (KToint = dart.constFn(dart.fnType(core.int, [K])))();
  let _JSMapIterableOfV = () => (_JSMapIterableOfV = dart.constFn(_js_helper._JSMapIterable$(V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  class CustomHashMap extends _js_helper.InternalMap$(K, V) {
    get length() {
      return this[_map].size;
    }
    get isEmpty() {
      return this[_map].size == 0;
    }
    get isNotEmpty() {
      return this[_map].size != 0;
    }
    get keys() {
      return new (_JSMapIterableOfK()).new(this, true);
    }
    get values() {
      return new (_JSMapIterableOfV()).new(this, false);
    }
    containsKey(key) {
      if (K.is(key)) {
        let buckets = this[_keyMap].get(this[_hashCode](key) & 0x3ffffff);
        if (buckets != null) {
          let equals = this[_equals];
          for (let i = 0, n = buckets.length; i < n; i++) {
            let k = buckets[i];
            if (dart.test(equals(k, key))) return true;
          }
        }
      }
      return false;
    }
    containsValue(value) {
      for (let v of this[_map].values()) {
        if (dart.equals(value, v)) return true;
      }
      return false;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      other[$forEach](dart.fn((key, value) => {
        this._set(key, value);
      }, KAndVToNull()));
    }
    _get(key) {
      if (K.is(key)) {
        let buckets = this[_keyMap].get(this[_hashCode](key) & 0x3ffffff);
        if (buckets != null) {
          let equals = this[_equals];
          for (let i = 0, n = buckets.length; i < n; i++) {
            let k = buckets[i];
            if (dart.test(equals(k, key))) {
              let value = this[_map].get(k);
              return value == null ? null : value;
            }
          }
        }
      }
      return null;
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      let keyMap = this[_keyMap];
      let hash = this[_hashCode](key) & 0x3ffffff;
      let buckets = keyMap.get(hash);
      if (buckets == null) {
        keyMap.set(hash, [key]);
      } else {
        let equals = this[_equals];
        for (let i = 0, n = buckets.length;;) {
          let k = buckets[i];
          if (dart.test(equals(k, key))) {
            key = k;
            break;
          }
          if (++i >= n) {
            buckets.push(key);
            break;
          }
        }
      }
      this[_map].set(key, value);
      this[_modifications] = this[_modifications] + 1 & 67108863;
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      let keyMap = this[_keyMap];
      let hash = this[_hashCode](key) & 0x3ffffff;
      let buckets = keyMap.get(hash);
      if (buckets == null) {
        keyMap.set(hash, [key]);
      } else {
        let equals = this[_equals];
        for (let i = 0, n = buckets.length; i < n; i++) {
          let k = buckets[i];
          if (dart.test(equals(k, key))) return this[_map].get(k);
        }
        buckets.push(key);
      }
      let value = ifAbsent();
      if (value == null) value = null;
      this[_map].set(key, value);
      this[_modifications] = this[_modifications] + 1 & 67108863;
      return value;
    }
    remove(key) {
      if (K.is(key)) {
        let hash = this[_hashCode](key) & 0x3ffffff;
        let keyMap = this[_keyMap];
        let buckets = keyMap.get(hash);
        if (buckets == null) return null;
        let equals = this[_equals];
        for (let i = 0, n = buckets.length; i < n; i++) {
          let k = buckets[i];
          if (dart.test(equals(k, key))) {
            if (n === 1) {
              keyMap.delete(hash);
            } else {
              buckets.splice(i, 1);
            }
            let map = this[_map];
            let value = map.get(k);
            map.delete(k);
            this[_modifications] = this[_modifications] + 1 & 67108863;
            return value == null ? null : value;
          }
        }
      }
      return null;
    }
    clear() {
      let map = this[_map];
      if (map.size > 0) {
        map.clear();
        this[_keyMap].clear();
        this[_modifications] = this[_modifications] + 1 & 67108863;
      }
    }
  }
  (CustomHashMap.new = function(equals, hashCode) {
    this[_map] = new Map();
    this[_keyMap] = new Map();
    this[_modifications] = 0;
    this[_equals] = equals;
    this[_hashCode] = hashCode;
  }).prototype = CustomHashMap.prototype;
  dart.addTypeTests(CustomHashMap);
  CustomHashMap.prototype[_is_CustomHashMap_default] = true;
  dart.setMethodSignature(CustomHashMap, () => ({
    __proto__: dart.getMethods(CustomHashMap.__proto__),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    _get: dart.fnType(V, [core.Object]),
    [$_get]: dart.fnType(V, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    remove: dart.fnType(V, [core.Object]),
    [$remove]: dart.fnType(V, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(CustomHashMap, () => ({
    __proto__: dart.getGetters(CustomHashMap.__proto__),
    keys: core.Iterable$(K),
    [$keys]: core.Iterable$(K)
  }));
  dart.setLibraryUri(CustomHashMap, "dart:_js_helper");
  dart.setFieldSignature(CustomHashMap, () => ({
    __proto__: dart.getFields(CustomHashMap.__proto__),
    [_map]: dart.finalFieldType(dart.dynamic),
    [_keyMap]: dart.finalFieldType(dart.dynamic),
    [_modifications]: dart.fieldType(core.int),
    [_equals]: dart.finalFieldType(KAndKTobool()),
    [_hashCode]: dart.finalFieldType(KToint())
  }));
  dart.defineExtensionMethods(CustomHashMap, [
    'containsKey',
    'containsValue',
    'addAll',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear'
  ]);
  dart.defineExtensionAccessors(CustomHashMap, [
    'length',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'values'
  ]);
  return CustomHashMap;
});
_js_helper.CustomHashMap = _js_helper.CustomHashMap$();
dart.addTypeTests(_js_helper.CustomHashMap, _is_CustomHashMap_default);
const _is_CustomKeyHashMap_default = Symbol('_is_CustomKeyHashMap_default');
_js_helper.CustomKeyHashMap$ = dart.generic((K, V) => {
  class CustomKeyHashMap extends _js_helper.CustomHashMap$(K, V) {
    containsKey(key) {
      if (!dart.test(this[_validKey](key))) return false;
      return super.containsKey(key);
    }
    _get(key) {
      if (!dart.test(this[_validKey](key))) return null;
      return super._get(key);
    }
    remove(key) {
      if (!dart.test(this[_validKey](key))) return null;
      return super.remove(key);
    }
  }
  (CustomKeyHashMap.new = function(equals, hashCode, validKey) {
    this[_validKey] = validKey;
    CustomKeyHashMap.__proto__.new.call(this, equals, hashCode);
  }).prototype = CustomKeyHashMap.prototype;
  dart.addTypeTests(CustomKeyHashMap);
  CustomKeyHashMap.prototype[_is_CustomKeyHashMap_default] = true;
  dart.setLibraryUri(CustomKeyHashMap, "dart:_js_helper");
  dart.setFieldSignature(CustomKeyHashMap, () => ({
    __proto__: dart.getFields(CustomKeyHashMap.__proto__),
    [_validKey]: dart.finalFieldType(ObjectTobool())
  }));
  dart.defineExtensionMethods(CustomKeyHashMap, ['containsKey', '_get', 'remove']);
  return CustomKeyHashMap;
});
_js_helper.CustomKeyHashMap = _js_helper.CustomKeyHashMap$();
dart.addTypeTests(_js_helper.CustomKeyHashMap, _is_CustomKeyHashMap_default);
_js_helper.convertDartClosureToJS = function(F, closure, arity) {
  return closure;
};
_js_helper.setNativeSubclassDispatchRecord = function(proto, interceptor) {
};
_js_helper.findDispatchTagForInterceptorClass = function(interceptorClassConstructor) {
};
_js_helper.makeLeafDispatchRecord = function(interceptor) {
};
const _nativeRegExp = dart.privateName(_js_helper, "_nativeRegExp");
_js_helper.regExpGetNative = function(regexp) {
  return regexp[_nativeRegExp];
};
const _nativeGlobalVersion = dart.privateName(_js_helper, "_nativeGlobalVersion");
_js_helper.regExpGetGlobalNative = function(regexp) {
  let nativeRegexp = regexp[_nativeGlobalVersion];
  nativeRegexp.lastIndex = 0;
  return nativeRegexp;
};
const _nativeAnchoredVersion = dart.privateName(_js_helper, "_nativeAnchoredVersion");
_js_helper.regExpCaptureCount = function(regexp) {
  let nativeAnchoredRegExp = regexp[_nativeAnchoredVersion];
  let match = nativeAnchoredRegExp.exec('');
  return match.length - 2;
};
const _nativeGlobalRegExp = dart.privateName(_js_helper, "_nativeGlobalRegExp");
const _nativeAnchoredRegExp = dart.privateName(_js_helper, "_nativeAnchoredRegExp");
const _isMultiLine = dart.privateName(_js_helper, "_isMultiLine");
const _isCaseSensitive = dart.privateName(_js_helper, "_isCaseSensitive");
const _isUnicode = dart.privateName(_js_helper, "_isUnicode");
const _isDotAll = dart.privateName(_js_helper, "_isDotAll");
const _execGlobal = dart.privateName(_js_helper, "_execGlobal");
const _execAnchored = dart.privateName(_js_helper, "_execAnchored");
_js_helper.JSSyntaxRegExp = class JSSyntaxRegExp extends core.Object {
  toString() {
    return "RegExp/" + dart.str(this.pattern) + "/" + this[_nativeRegExp].flags;
  }
  get [_nativeGlobalVersion]() {
    if (this[_nativeGlobalRegExp] != null) return this[_nativeGlobalRegExp];
    return this[_nativeGlobalRegExp] = _js_helper.JSSyntaxRegExp.makeNative(this.pattern, this[_isMultiLine], this[_isCaseSensitive], this[_isUnicode], this[_isDotAll], true);
  }
  get [_nativeAnchoredVersion]() {
    if (this[_nativeAnchoredRegExp] != null) return this[_nativeAnchoredRegExp];
    return this[_nativeAnchoredRegExp] = _js_helper.JSSyntaxRegExp.makeNative(dart.str(this.pattern) + "|()", this[_isMultiLine], this[_isCaseSensitive], this[_isUnicode], this[_isDotAll], true);
  }
  get [_isMultiLine]() {
    return this[_nativeRegExp].multiline;
  }
  get [_isCaseSensitive]() {
    return !this[_nativeRegExp].ignoreCase;
  }
  get [_isUnicode]() {
    return this[_nativeRegExp].unicode;
  }
  get [_isDotAll]() {
    return this[_nativeRegExp].dotAll;
  }
  static makeNative(source, multiLine, caseSensitive, unicode, dotAll, global) {
    if (source == null) dart.argumentError(source);
    let m = dart.test(multiLine) ? "m" : "";
    let i = dart.test(caseSensitive) ? "" : "i";
    let u = dart.test(unicode) ? "u" : "";
    let s = dart.test(dotAll) ? "s" : "";
    let g = dart.test(global) ? "g" : "";
    let regexp = (function() {
      try {
        return new RegExp(source, m + i + u + s + g);
      } catch (e) {
        return e;
      }
    })();
    if (regexp instanceof RegExp) return regexp;
    let errorMessage = String(regexp);
    dart.throw(new core.FormatException.new("Illegal RegExp pattern: " + source + ", " + errorMessage));
  }
  firstMatch(string) {
    if (string == null) dart.argumentError(string);
    let m = this[_nativeRegExp].exec(string);
    if (m == null) return null;
    return new _js_helper._MatchImplementation.new(this, JSArrayOfString().of(m));
  }
  hasMatch(string) {
    if (string == null) dart.argumentError(string);
    return this[_nativeRegExp].test(string);
  }
  stringMatch(string) {
    let match = this.firstMatch(string);
    if (match != null) return match.group(0);
    return null;
  }
  allMatches(string, start) {
    if (string == null) dart.argumentError(string);
    if (start === void 0) start = 0;
    if (start == null) dart.argumentError(start);
    if (start < 0 || start > string.length) {
      dart.throw(new core.RangeError.range(start, 0, string.length));
    }
    return new _js_helper._AllMatchesIterable.new(this, string, start);
  }
  [_execGlobal](string, start) {
    let regexp = this[_nativeGlobalVersion];
    regexp.lastIndex = start;
    let match = regexp.exec(string);
    if (match == null) return null;
    return new _js_helper._MatchImplementation.new(this, JSArrayOfString().of(match));
  }
  [_execAnchored](string, start) {
    let regexp = this[_nativeAnchoredVersion];
    regexp.lastIndex = start;
    let match = regexp.exec(string);
    if (match == null) return null;
    if (match[$_get](dart.notNull(match[$length]) - 1) != null) return null;
    match[$length] = dart.notNull(match[$length]) - 1;
    return new _js_helper._MatchImplementation.new(this, JSArrayOfString().of(match));
  }
  matchAsPrefix(string, start) {
    if (start === void 0) start = 0;
    if (dart.notNull(start) < 0 || dart.notNull(start) > string.length) {
      dart.throw(new core.RangeError.range(start, 0, string.length));
    }
    return this[_execAnchored](string, start);
  }
  get isMultiLine() {
    return this[_isMultiLine];
  }
  get isCaseSensitive() {
    return this[_isCaseSensitive];
  }
  get isUnicode() {
    return this[_isUnicode];
  }
  get isDotAll() {
    return this[_isDotAll];
  }
};
(_js_helper.JSSyntaxRegExp.new = function(source, opts) {
  let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
  let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
  let unicode = opts && 'unicode' in opts ? opts.unicode : false;
  let dotAll = opts && 'dotAll' in opts ? opts.dotAll : false;
  this[_nativeGlobalRegExp] = null;
  this[_nativeAnchoredRegExp] = null;
  this.pattern = source;
  this[_nativeRegExp] = _js_helper.JSSyntaxRegExp.makeNative(source, multiLine, caseSensitive, unicode, dotAll, false);
}).prototype = _js_helper.JSSyntaxRegExp.prototype;
dart.addTypeTests(_js_helper.JSSyntaxRegExp);
_js_helper.JSSyntaxRegExp[dart.implements] = () => [core.RegExp];
dart.setMethodSignature(_js_helper.JSSyntaxRegExp, () => ({
  __proto__: dart.getMethods(_js_helper.JSSyntaxRegExp.__proto__),
  firstMatch: dart.fnType(core.RegExpMatch, [core.String]),
  hasMatch: dart.fnType(core.bool, [core.String]),
  stringMatch: dart.fnType(core.String, [core.String]),
  allMatches: dart.fnType(core.Iterable$(core.RegExpMatch), [core.String], [core.int]),
  [$allMatches]: dart.fnType(core.Iterable$(core.RegExpMatch), [core.String], [core.int]),
  [_execGlobal]: dart.fnType(core.RegExpMatch, [core.String, core.int]),
  [_execAnchored]: dart.fnType(core.RegExpMatch, [core.String, core.int]),
  matchAsPrefix: dart.fnType(core.RegExpMatch, [core.String], [core.int]),
  [$matchAsPrefix]: dart.fnType(core.RegExpMatch, [core.String], [core.int])
}));
dart.setGetterSignature(_js_helper.JSSyntaxRegExp, () => ({
  __proto__: dart.getGetters(_js_helper.JSSyntaxRegExp.__proto__),
  [_nativeGlobalVersion]: dart.dynamic,
  [_nativeAnchoredVersion]: dart.dynamic,
  [_isMultiLine]: core.bool,
  [_isCaseSensitive]: core.bool,
  [_isUnicode]: core.bool,
  [_isDotAll]: core.bool,
  isMultiLine: core.bool,
  isCaseSensitive: core.bool,
  isUnicode: core.bool,
  isDotAll: core.bool
}));
dart.setLibraryUri(_js_helper.JSSyntaxRegExp, "dart:_js_helper");
dart.setFieldSignature(_js_helper.JSSyntaxRegExp, () => ({
  __proto__: dart.getFields(_js_helper.JSSyntaxRegExp.__proto__),
  pattern: dart.finalFieldType(core.String),
  [_nativeRegExp]: dart.finalFieldType(dart.dynamic),
  [_nativeGlobalRegExp]: dart.fieldType(dart.dynamic),
  [_nativeAnchoredRegExp]: dart.fieldType(dart.dynamic)
}));
dart.defineExtensionMethods(_js_helper.JSSyntaxRegExp, ['toString', 'allMatches', 'matchAsPrefix']);
const _match = dart.privateName(_js_helper, "_match");
_js_helper._MatchImplementation = class _MatchImplementation extends core.Object {
  get input() {
    return this[_match].input;
  }
  get start() {
    return this[_match].index;
  }
  get end() {
    return dart.notNull(this.start) + this[_match][$_get](0).length;
  }
  group(index) {
    return this[_match][$_get](index);
  }
  _get(index) {
    return this.group(index);
  }
  get groupCount() {
    return dart.notNull(this[_match][$length]) - 1;
  }
  groups(groups) {
    let out = JSArrayOfString().of([]);
    for (let i of groups) {
      out[$add](this.group(i));
    }
    return out;
  }
  namedGroup(name) {
    let groups = this[_match].groups;
    if (groups !== null) {
      let result = groups[name];
      if (result != null || name in groups) {
        return result;
      }
    }
    dart.throw(new core.ArgumentError.value(name, "name", "Not a capture group name"));
  }
  get groupNames() {
    let groups = this[_match].groups;
    if (groups !== null) {
      let keys = JSArrayOfString().of(Object.keys(groups));
      return new (SubListIterableOfString()).new(keys, 0, null);
    }
    return IterableOfString().empty();
  }
};
(_js_helper._MatchImplementation.new = function(pattern, match) {
  this.pattern = pattern;
  this[_match] = match;
  if (!(typeof this[_match].input == 'string')) dart.assertFailed(null, "dart:_js_helper/regexp_helper.dart", 181, 12, "JS(\"var\", \"#.input\", _match) is String");
  if (!core.int.is(this[_match].index)) dart.assertFailed(null, "dart:_js_helper/regexp_helper.dart", 182, 12, "JS(\"var\", \"#.index\", _match) is int");
}).prototype = _js_helper._MatchImplementation.prototype;
dart.addTypeTests(_js_helper._MatchImplementation);
_js_helper._MatchImplementation[dart.implements] = () => [core.RegExpMatch];
dart.setMethodSignature(_js_helper._MatchImplementation, () => ({
  __proto__: dart.getMethods(_js_helper._MatchImplementation.__proto__),
  group: dart.fnType(core.String, [core.int]),
  _get: dart.fnType(core.String, [core.int]),
  groups: dart.fnType(core.List$(core.String), [core.List$(core.int)]),
  namedGroup: dart.fnType(core.String, [core.String])
}));
dart.setGetterSignature(_js_helper._MatchImplementation, () => ({
  __proto__: dart.getGetters(_js_helper._MatchImplementation.__proto__),
  input: core.String,
  start: core.int,
  end: core.int,
  groupCount: core.int,
  groupNames: core.Iterable$(core.String)
}));
dart.setLibraryUri(_js_helper._MatchImplementation, "dart:_js_helper");
dart.setFieldSignature(_js_helper._MatchImplementation, () => ({
  __proto__: dart.getFields(_js_helper._MatchImplementation.__proto__),
  pattern: dart.finalFieldType(core.Pattern),
  [_match]: dart.finalFieldType(ListOfString())
}));
const _re = dart.privateName(_js_helper, "_re");
const _string$ = dart.privateName(_js_helper, "_string");
const _start$ = dart.privateName(_js_helper, "_start");
core.RegExpMatch = class RegExpMatch extends core.Object {};
(core.RegExpMatch.new = function() {
}).prototype = core.RegExpMatch.prototype;
dart.addTypeTests(core.RegExpMatch);
core.RegExpMatch[dart.implements] = () => [core.Match];
dart.setLibraryUri(core.RegExpMatch, "dart:core");
_js_helper._AllMatchesIterable = class _AllMatchesIterable extends collection.IterableBase$(core.RegExpMatch) {
  get iterator() {
    return new _js_helper._AllMatchesIterator.new(this[_re], this[_string$], this[_start$]);
  }
};
(_js_helper._AllMatchesIterable.new = function(re, string, start) {
  this[_re] = re;
  this[_string$] = string;
  this[_start$] = start;
  _js_helper._AllMatchesIterable.__proto__.new.call(this);
}).prototype = _js_helper._AllMatchesIterable.prototype;
dart.addTypeTests(_js_helper._AllMatchesIterable);
dart.setGetterSignature(_js_helper._AllMatchesIterable, () => ({
  __proto__: dart.getGetters(_js_helper._AllMatchesIterable.__proto__),
  iterator: core.Iterator$(core.RegExpMatch),
  [$iterator]: core.Iterator$(core.RegExpMatch)
}));
dart.setLibraryUri(_js_helper._AllMatchesIterable, "dart:_js_helper");
dart.setFieldSignature(_js_helper._AllMatchesIterable, () => ({
  __proto__: dart.getFields(_js_helper._AllMatchesIterable.__proto__),
  [_re]: dart.finalFieldType(_js_helper.JSSyntaxRegExp),
  [_string$]: dart.finalFieldType(core.String),
  [_start$]: dart.finalFieldType(core.int)
}));
dart.defineExtensionAccessors(_js_helper._AllMatchesIterable, ['iterator']);
const _regExp = dart.privateName(_js_helper, "_regExp");
const _nextIndex = dart.privateName(_js_helper, "_nextIndex");
_js_helper._AllMatchesIterator = class _AllMatchesIterator extends core.Object {
  get current() {
    return this[_current$0];
  }
  static _isLeadSurrogate(c) {
    return dart.notNull(c) >= 55296 && dart.notNull(c) <= 56319;
  }
  static _isTrailSurrogate(c) {
    return dart.notNull(c) >= 56320 && dart.notNull(c) <= 57343;
  }
  moveNext() {
    if (this[_string$] == null) return false;
    if (dart.notNull(this[_nextIndex]) <= this[_string$].length) {
      let match = this[_regExp][_execGlobal](this[_string$], this[_nextIndex]);
      if (match != null) {
        this[_current$0] = match;
        let nextIndex = match.end;
        if (match.start == nextIndex) {
          if (dart.test(this[_regExp].isUnicode) && dart.notNull(this[_nextIndex]) + 1 < this[_string$].length && dart.test(_js_helper._AllMatchesIterator._isLeadSurrogate(this[_string$][$codeUnitAt](this[_nextIndex]))) && dart.test(_js_helper._AllMatchesIterator._isTrailSurrogate(this[_string$][$codeUnitAt](dart.notNull(this[_nextIndex]) + 1)))) {
            nextIndex = dart.notNull(nextIndex) + 1;
          }
          nextIndex = dart.notNull(nextIndex) + 1;
        }
        this[_nextIndex] = nextIndex;
        return true;
      }
    }
    this[_current$0] = null;
    this[_string$] = null;
    return false;
  }
};
(_js_helper._AllMatchesIterator.new = function(regExp, string, nextIndex) {
  this[_current$0] = null;
  this[_regExp] = regExp;
  this[_string$] = string;
  this[_nextIndex] = nextIndex;
}).prototype = _js_helper._AllMatchesIterator.prototype;
dart.addTypeTests(_js_helper._AllMatchesIterator);
_js_helper._AllMatchesIterator[dart.implements] = () => [IteratorOfRegExpMatch()];
dart.setMethodSignature(_js_helper._AllMatchesIterator, () => ({
  __proto__: dart.getMethods(_js_helper._AllMatchesIterator.__proto__),
  moveNext: dart.fnType(core.bool, [])
}));
dart.setGetterSignature(_js_helper._AllMatchesIterator, () => ({
  __proto__: dart.getGetters(_js_helper._AllMatchesIterator.__proto__),
  current: core.RegExpMatch
}));
dart.setLibraryUri(_js_helper._AllMatchesIterator, "dart:_js_helper");
dart.setFieldSignature(_js_helper._AllMatchesIterator, () => ({
  __proto__: dart.getFields(_js_helper._AllMatchesIterator.__proto__),
  [_regExp]: dart.finalFieldType(_js_helper.JSSyntaxRegExp),
  [_string$]: dart.fieldType(core.String),
  [_nextIndex]: dart.fieldType(core.int),
  [_current$0]: dart.fieldType(core.RegExpMatch)
}));
_js_helper.firstMatchAfter = function(regExp, string, start) {
  return regExp[_execGlobal](string, start);
};
_js_helper.stringIndexOfStringUnchecked = function(receiver, other, startIndex) {
  return receiver.indexOf(other, startIndex);
};
_js_helper.substring1Unchecked = function(receiver, startIndex) {
  return receiver.substring(startIndex);
};
_js_helper.substring2Unchecked = function(receiver, startIndex, endIndex) {
  return receiver.substring(startIndex, endIndex);
};
_js_helper.stringContainsStringUnchecked = function(receiver, other, startIndex) {
  return _js_helper.stringIndexOfStringUnchecked(receiver, other, startIndex) >= 0;
};
_js_helper.StringMatch = class StringMatch extends core.Object {
  get end() {
    return dart.notNull(this.start) + this.pattern.length;
  }
  _get(g) {
    return this.group(g);
  }
  get groupCount() {
    return 0;
  }
  group(group_) {
    if (group_ !== 0) {
      dart.throw(new core.RangeError.value(group_));
    }
    return this.pattern;
  }
  groups(groups_) {
    let result = JSArrayOfString().of([]);
    for (let g of groups_) {
      result[$add](this.group(g));
    }
    return result;
  }
};
(_js_helper.StringMatch.new = function(start, input, pattern) {
  this.start = start;
  this.input = input;
  this.pattern = pattern;
}).prototype = _js_helper.StringMatch.prototype;
dart.addTypeTests(_js_helper.StringMatch);
_js_helper.StringMatch[dart.implements] = () => [core.Match];
dart.setMethodSignature(_js_helper.StringMatch, () => ({
  __proto__: dart.getMethods(_js_helper.StringMatch.__proto__),
  _get: dart.fnType(core.String, [core.int]),
  group: dart.fnType(core.String, [core.int]),
  groups: dart.fnType(core.List$(core.String), [core.List$(core.int)])
}));
dart.setGetterSignature(_js_helper.StringMatch, () => ({
  __proto__: dart.getGetters(_js_helper.StringMatch.__proto__),
  end: core.int,
  groupCount: core.int
}));
dart.setLibraryUri(_js_helper.StringMatch, "dart:_js_helper");
dart.setFieldSignature(_js_helper.StringMatch, () => ({
  __proto__: dart.getFields(_js_helper.StringMatch.__proto__),
  start: dart.finalFieldType(core.int),
  input: dart.finalFieldType(core.String),
  pattern: dart.finalFieldType(core.String)
}));
_js_helper.allMatchesInStringUnchecked = function(pattern, string, startIndex) {
  return new _js_helper._StringAllMatchesIterable.new(string, pattern, startIndex);
};
const _input = dart.privateName(_js_helper, "_input");
const _pattern = dart.privateName(_js_helper, "_pattern");
const _index$0 = dart.privateName(_js_helper, "_index");
core.Match = class Match extends core.Object {};
(core.Match.new = function() {
}).prototype = core.Match.prototype;
dart.addTypeTests(core.Match);
dart.setLibraryUri(core.Match, "dart:core");
_js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
  get iterator() {
    return new _js_helper._StringAllMatchesIterator.new(this[_input], this[_pattern], this[_index$0]);
  }
  get first() {
    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
    if (index >= 0) {
      return new _js_helper.StringMatch.new(index, this[_input], this[_pattern]);
    }
    dart.throw(_internal.IterableElementError.noElement());
  }
};
(_js_helper._StringAllMatchesIterable.new = function(input, pattern, index) {
  this[_input] = input;
  this[_pattern] = pattern;
  this[_index$0] = index;
  _js_helper._StringAllMatchesIterable.__proto__.new.call(this);
}).prototype = _js_helper._StringAllMatchesIterable.prototype;
dart.addTypeTests(_js_helper._StringAllMatchesIterable);
dart.setGetterSignature(_js_helper._StringAllMatchesIterable, () => ({
  __proto__: dart.getGetters(_js_helper._StringAllMatchesIterable.__proto__),
  iterator: core.Iterator$(core.Match),
  [$iterator]: core.Iterator$(core.Match),
  first: core.Match,
  [$first]: core.Match
}));
dart.setLibraryUri(_js_helper._StringAllMatchesIterable, "dart:_js_helper");
dart.setFieldSignature(_js_helper._StringAllMatchesIterable, () => ({
  __proto__: dart.getFields(_js_helper._StringAllMatchesIterable.__proto__),
  [_input]: dart.finalFieldType(core.String),
  [_pattern]: dart.finalFieldType(core.String),
  [_index$0]: dart.finalFieldType(core.int)
}));
dart.defineExtensionAccessors(_js_helper._StringAllMatchesIterable, ['iterator', 'first']);
_js_helper._StringAllMatchesIterator = class _StringAllMatchesIterator extends core.Object {
  moveNext() {
    if (dart.notNull(this[_index$0]) + this[_pattern].length > this[_input].length) {
      this[_current$0] = null;
      return false;
    }
    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
    if (index < 0) {
      this[_index$0] = this[_input].length + 1;
      this[_current$0] = null;
      return false;
    }
    let end = index + this[_pattern].length;
    this[_current$0] = new _js_helper.StringMatch.new(index, this[_input], this[_pattern]);
    if (end === this[_index$0]) end++;
    this[_index$0] = end;
    return true;
  }
  get current() {
    return this[_current$0];
  }
};
(_js_helper._StringAllMatchesIterator.new = function(input, pattern, index) {
  this[_current$0] = null;
  this[_input] = input;
  this[_pattern] = pattern;
  this[_index$0] = index;
}).prototype = _js_helper._StringAllMatchesIterator.prototype;
dart.addTypeTests(_js_helper._StringAllMatchesIterator);
_js_helper._StringAllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
dart.setMethodSignature(_js_helper._StringAllMatchesIterator, () => ({
  __proto__: dart.getMethods(_js_helper._StringAllMatchesIterator.__proto__),
  moveNext: dart.fnType(core.bool, [])
}));
dart.setGetterSignature(_js_helper._StringAllMatchesIterator, () => ({
  __proto__: dart.getGetters(_js_helper._StringAllMatchesIterator.__proto__),
  current: core.Match
}));
dart.setLibraryUri(_js_helper._StringAllMatchesIterator, "dart:_js_helper");
dart.setFieldSignature(_js_helper._StringAllMatchesIterator, () => ({
  __proto__: dart.getFields(_js_helper._StringAllMatchesIterator.__proto__),
  [_input]: dart.finalFieldType(core.String),
  [_pattern]: dart.finalFieldType(core.String),
  [_index$0]: dart.fieldType(core.int),
  [_current$0]: dart.fieldType(core.Match)
}));
_js_helper.stringContainsUnchecked = function(receiver, other, startIndex) {
  if (typeof other == 'string') {
    return _js_helper.stringContainsStringUnchecked(receiver, other, startIndex);
  } else if (_js_helper.JSSyntaxRegExp.is(other)) {
    return other.hasMatch(receiver[$substring](startIndex));
  } else {
    let substr = receiver[$substring](startIndex);
    return core.bool._check(dart.dload(dart.dsend(other, 'allMatches', [substr]), 'isNotEmpty'));
  }
};
_js_helper.stringReplaceJS = function(receiver, replacer, replacement) {
  replacement = replacement.replace(/\$/g, "$$$$");
  return receiver.replace(replacer, replacement);
};
_js_helper.stringReplaceFirstRE = function(receiver, regexp, replacement, startIndex) {
  let match = regexp[_execGlobal](receiver, startIndex);
  if (match == null) return receiver;
  let start = match.start;
  let end = match.end;
  return _js_helper.stringReplaceRangeUnchecked(receiver, start, end, replacement);
};
_js_helper.quoteStringForRegExp = function(string) {
  return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
};
_js_helper.stringReplaceAllUnchecked = function(receiver, pattern, replacement) {
  if (pattern == null) dart.argumentError(pattern);
  if (replacement == null) dart.argumentError(replacement);
  if (typeof pattern == 'string') {
    if (pattern === "") {
      if (receiver === "") {
        return replacement;
      } else {
        let result = new core.StringBuffer.new();
        let length = receiver.length;
        result.write(replacement);
        for (let i = 0; i < length; i++) {
          result.write(receiver[$_get](i));
          result.write(replacement);
        }
        return result.toString();
      }
    } else {
      return receiver.split(pattern).join(replacement);
    }
  } else if (_js_helper.JSSyntaxRegExp.is(pattern)) {
    let re = _js_helper.regExpGetGlobalNative(pattern);
    return _js_helper.stringReplaceJS(receiver, re, replacement);
  } else {
    dart.throw("String.replaceAll(Pattern) UNIMPLEMENTED");
  }
};
_js_helper._matchString = function(match) {
  return match._get(0);
};
_js_helper._stringIdentity = function(string) {
  return string;
};
_js_helper.stringReplaceAllFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
  if (pattern == null) dart.argumentError(pattern);
  if (onMatch == null) onMatch = dart.fn(_js_helper._matchString, MatchToString());
  if (onNonMatch == null) onNonMatch = dart.fn(_js_helper._stringIdentity, StringToString());
  if (typeof pattern == 'string') {
    return _js_helper.stringReplaceAllStringFuncUnchecked(receiver, pattern, onMatch, onNonMatch);
  }
  let buffer = new core.StringBuffer.new();
  let startIndex = 0;
  for (let match of pattern[$allMatches](receiver)) {
    buffer.write(onNonMatch(receiver[$substring](startIndex, match.start)));
    buffer.write(onMatch(match));
    startIndex = match.end;
  }
  buffer.write(onNonMatch(receiver[$substring](startIndex)));
  return buffer.toString();
};
_js_helper.stringReplaceAllEmptyFuncUnchecked = function(receiver, onMatch, onNonMatch) {
  let buffer = new core.StringBuffer.new();
  let length = receiver.length;
  let i = 0;
  buffer.write(onNonMatch(""));
  while (i < length) {
    buffer.write(onMatch(new _js_helper.StringMatch.new(i, receiver, "")));
    let code = receiver[$codeUnitAt](i);
    if ((code & ~1023) === 55296 && length > i + 1) {
      code = receiver[$codeUnitAt](i + 1);
      if ((code & ~1023) === 56320) {
        buffer.write(onNonMatch(receiver[$substring](i, i + 2)));
        i = i + 2;
        continue;
      }
    }
    buffer.write(onNonMatch(receiver[$_get](i)));
    i++;
  }
  buffer.write(onMatch(new _js_helper.StringMatch.new(i, receiver, "")));
  buffer.write(onNonMatch(""));
  return buffer.toString();
};
_js_helper.stringReplaceAllStringFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
  let patternLength = pattern.length;
  if (patternLength === 0) {
    return _js_helper.stringReplaceAllEmptyFuncUnchecked(receiver, onMatch, onNonMatch);
  }
  let length = receiver.length;
  let buffer = new core.StringBuffer.new();
  let startIndex = 0;
  while (startIndex < length) {
    let position = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
    if (position === -1) {
      break;
    }
    buffer.write(onNonMatch(receiver[$substring](startIndex, position)));
    buffer.write(onMatch(new _js_helper.StringMatch.new(position, receiver, pattern)));
    startIndex = position + patternLength;
  }
  buffer.write(onNonMatch(receiver[$substring](startIndex)));
  return buffer.toString();
};
_js_helper.stringReplaceFirstUnchecked = function(receiver, pattern, replacement, startIndex) {
  if (pattern == null) dart.argumentError(pattern);
  if (typeof pattern == 'string') {
    let index = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
    if (index < 0) return receiver;
    let end = index + pattern.length;
    return _js_helper.stringReplaceRangeUnchecked(receiver, index, end, replacement);
  }
  if (_js_helper.JSSyntaxRegExp.is(pattern)) {
    return startIndex === 0 ? _js_helper.stringReplaceJS(receiver, _js_helper.regExpGetNative(pattern), replacement) : _js_helper.stringReplaceFirstRE(receiver, pattern, replacement, startIndex);
  }
  let matches = pattern[$allMatches](receiver, startIndex)[$iterator];
  if (!dart.test(matches.moveNext())) return receiver;
  let match = matches.current;
  return receiver[$replaceRange](match.start, match.end, replacement);
};
_js_helper.stringReplaceFirstMappedUnchecked = function(receiver, pattern, replace, startIndex) {
  let matches = pattern[$allMatches](receiver, startIndex)[$iterator];
  if (!dart.test(matches.moveNext())) return receiver;
  let match = matches.current;
  let replacement = dart.str(replace(match));
  return receiver[$replaceRange](match.start, match.end, replacement);
};
_js_helper.stringJoinUnchecked = function(array, separator) {
  return array.join(separator);
};
_js_helper.stringReplaceRangeUnchecked = function(receiver, start, end, replacement) {
  let prefix = receiver.substring(0, start);
  let suffix = receiver.substring(end);
  return prefix + dart.str(replacement) + suffix;
};
_js_helper.getRuntimeType = function(object) {
  return dart.getReifiedType(object);
};
_js_helper.getIndex = function(array, index) {
  if (!dart.test(_js_helper.isJsArray(array))) dart.assertFailed(null, "dart:_js_helper/js_rti.dart", 14, 10, "isJsArray(array)");
  return array[index];
};
_js_helper.getLength = function(array) {
  if (!dart.test(_js_helper.isJsArray(array))) dart.assertFailed(null, "dart:_js_helper/js_rti.dart", 20, 10, "isJsArray(array)");
  return array.length;
};
_js_helper.isJsArray = function(value) {
  return _interceptors.JSArray.is(value);
};
_js_mirrors.getName = function(symbol) {
  if (_js_helper.PrivateSymbol.is(symbol)) {
    return _js_helper.PrivateSymbol.getName(symbol);
  } else {
    return _internal.Symbol.getName(_internal.Symbol.as(symbol));
  }
};
_js_mirrors.getSymbol = function(name, library) {
  return dart.throw(new core.UnimplementedError.new("MirrorSystem.getSymbol unimplemented"));
};
dart.defineLazy(_js_mirrors, {
  /*_js_mirrors.currentJsMirrorSystem*/get currentJsMirrorSystem() {
    return new _js_mirrors.JsMirrorSystem.new();
  },
  /*_js_mirrors._typeMirror*/get _typeMirror() {
    return Symbol("_typeMirror");
  }
});
_js_mirrors.reflect = function(reflectee) {
  if (core.Function.is(reflectee)) {
    return new _js_mirrors.JsClosureMirror.__(reflectee);
  } else {
    return new _js_mirrors.JsInstanceMirror.__(reflectee);
  }
};
_js_mirrors.reflectType = function(key) {
  let unwrapped = dart.unwrapType(key);
  let property = Object.getOwnPropertyDescriptor(unwrapped, _js_mirrors._typeMirror);
  if (property != null) {
    return property.value;
  }
  let mirror = new _js_mirrors.JsClassMirror.__(key);
  unwrapped[_js_mirrors._typeMirror] = mirror;
  return mirror;
};
_js_mirrors._getESSymbol = function(symbol) {
  return _js_helper.PrivateSymbol.getNativeSymbol(symbol);
};
_js_mirrors._getMember = function(symbol) {
  let privateSymbol = _js_mirrors._getESSymbol(symbol);
  if (privateSymbol != null) {
    return privateSymbol;
  }
  let name = _js_mirrors.getName(symbol);
  switch (name) {
    case "[]":
    {
      name = "_get";
      break;
    }
    case "[]=":
    {
      name = "_set";
      break;
    }
    case "unary-":
    {
      name = "_negate";
      break;
    }
    case "constructor":
    case "prototype":
    {
      name = "_" + dart.str(name);
      break;
    }
  }
  return name;
};
_js_mirrors._getNameForESSymbol = function(member) {
  if (!(typeof member == "symbol")) dart.assertFailed(null, "dart:_js_mirrors", 82, 10, "JS('bool', 'typeof # == \"symbol\"', member)");
  let str = dart.toString(member);
  if (!(str[$startsWith]("Symbol(") && str[$endsWith](")"))) dart.assertFailed(null, "dart:_js_mirrors", 84, 10, "str.startsWith('Symbol(') && str.endsWith(')')");
  return str[$substring](7, str.length - 1);
};
_js_mirrors._getSymbolForESSymbol = function(member) {
  let name = _js_mirrors._getNameForESSymbol(member);
  return new _js_helper.PrivateSymbol.new(name, member);
};
_js_mirrors._getSymbolForMember = function(member) {
  if (typeof member == 'string') {
    return core.Symbol.new(member);
  } else {
    let name = _js_mirrors._getNameForESSymbol(member);
    return new _js_helper.PrivateSymbol.new(name, member);
  }
};
_js_mirrors._toDartMap = function(data) {
  if (data == null) return new (LinkedMapOfSymbol$dynamic()).new();
  let map = new (LinkedMapOfSymbol$dynamic()).new();
  let publicMembers = Object.getOwnPropertyNames(data);
  for (let member of core.Iterable._check(publicMembers)) {
    let symbol = core.Symbol.new(core.String._check(member));
    map[$_set](symbol, data[member]);
  }
  let privateMembers = Object.getOwnPropertySymbols(data);
  for (let member of core.Iterable._check(privateMembers)) {
    let symbol = _js_mirrors._getSymbolForESSymbol(member);
    map[$_set](symbol, data[member]);
  }
  return map;
};
_js_mirrors._runtimeType = function(obj) {
  return dart.wrapType(dart.getReifiedType(obj));
};
_js_mirrors._unimplemented = function(t, i) {
  dart.throw(new core.UnimplementedError.new(dart.str(t) + "." + dart.str(_js_mirrors.getName(i.memberName)) + " unimplemented"));
};
_js_mirrors._toJsMap = function(map) {
  if (map == null) return null;
  let obj = {};
  map[$forEach](dart.fn((key, value) => {
    obj[_js_mirrors.getName(key)] = value;
  }, SymbolAnddynamicToNull()));
  return obj;
};
let const$5;
_js_mirrors.JsMirrorSystem = class JsMirrorSystem extends core.Object {
  get libraries() {
    return const$5 || (const$5 = dart.constMap(core.Uri, mirrors.LibraryMirror, []));
  }
  noSuchMethod(i) {
    _js_mirrors._unimplemented(this.runtimeType, i);
  }
  findLibrary(libraryName) {
    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('findLibrary', [libraryName], {isMethod: true})));
  }
  get isolate() {
    return mirrors.IsolateMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('isolate', [], {isGetter: true})));
  }
  get dynamicType() {
    return mirrors.TypeMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('dynamicType', [], {isGetter: true})));
  }
  get voidType() {
    return mirrors.TypeMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('voidType', [], {isGetter: true})));
  }
};
(_js_mirrors.JsMirrorSystem.new = function() {
}).prototype = _js_mirrors.JsMirrorSystem.prototype;
dart.addTypeTests(_js_mirrors.JsMirrorSystem);
_js_mirrors.JsMirrorSystem[dart.implements] = () => [mirrors.MirrorSystem];
dart.setMethodSignature(_js_mirrors.JsMirrorSystem, () => ({
  __proto__: dart.getMethods(_js_mirrors.JsMirrorSystem.__proto__),
  findLibrary: dart.fnType(mirrors.LibraryMirror, [core.Symbol])
}));
dart.setGetterSignature(_js_mirrors.JsMirrorSystem, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsMirrorSystem.__proto__),
  libraries: core.Map$(core.Uri, mirrors.LibraryMirror),
  isolate: mirrors.IsolateMirror,
  dynamicType: mirrors.TypeMirror,
  voidType: mirrors.TypeMirror
}));
dart.setLibraryUri(_js_mirrors.JsMirrorSystem, "dart:_js_mirrors");
dart.defineExtensionMethods(_js_mirrors.JsMirrorSystem, ['noSuchMethod']);
_js_mirrors.JsMirror = class JsMirror extends core.Object {
  noSuchMethod(i) {
    _js_mirrors._unimplemented(this.runtimeType, i);
  }
};
(_js_mirrors.JsMirror.new = function() {
}).prototype = _js_mirrors.JsMirror.prototype;
dart.addTypeTests(_js_mirrors.JsMirror);
_js_mirrors.JsMirror[dart.implements] = () => [mirrors.Mirror];
dart.setLibraryUri(_js_mirrors.JsMirror, "dart:_js_mirrors");
dart.defineExtensionMethods(_js_mirrors.JsMirror, ['noSuchMethod']);
_js_mirrors.JsCombinatorMirror = class JsCombinatorMirror extends _js_mirrors.JsMirror {
  get identifiers() {
    return ListOfSymbol()._check(this.noSuchMethod(new dart.InvocationImpl.new('identifiers', [], {isGetter: true})));
  }
  get isShow() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isShow', [], {isGetter: true})));
  }
  get isHide() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isHide', [], {isGetter: true})));
  }
};
(_js_mirrors.JsCombinatorMirror.new = function() {
}).prototype = _js_mirrors.JsCombinatorMirror.prototype;
dart.addTypeTests(_js_mirrors.JsCombinatorMirror);
_js_mirrors.JsCombinatorMirror[dart.implements] = () => [mirrors.CombinatorMirror];
dart.setGetterSignature(_js_mirrors.JsCombinatorMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsCombinatorMirror.__proto__),
  identifiers: core.List$(core.Symbol),
  isShow: core.bool,
  isHide: core.bool
}));
dart.setLibraryUri(_js_mirrors.JsCombinatorMirror, "dart:_js_mirrors");
_js_mirrors.JsDeclarationMirror = class JsDeclarationMirror extends _js_mirrors.JsMirror {
  get simpleName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl.new('simpleName', [], {isGetter: true})));
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl.new('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('owner', [], {isGetter: true})));
  }
  get isPrivate() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isPrivate', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl.new('location', [], {isGetter: true})));
  }
  get metadata() {
    return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl.new('metadata', [], {isGetter: true})));
  }
};
(_js_mirrors.JsDeclarationMirror.new = function() {
}).prototype = _js_mirrors.JsDeclarationMirror.prototype;
dart.addTypeTests(_js_mirrors.JsDeclarationMirror);
_js_mirrors.JsDeclarationMirror[dart.implements] = () => [mirrors.DeclarationMirror];
dart.setGetterSignature(_js_mirrors.JsDeclarationMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsDeclarationMirror.__proto__),
  simpleName: core.Symbol,
  qualifiedName: core.Symbol,
  owner: mirrors.DeclarationMirror,
  isPrivate: core.bool,
  isTopLevel: core.bool,
  location: mirrors.SourceLocation,
  metadata: core.List$(mirrors.InstanceMirror)
}));
dart.setLibraryUri(_js_mirrors.JsDeclarationMirror, "dart:_js_mirrors");
_js_mirrors.JsIsolateMirror = class JsIsolateMirror extends _js_mirrors.JsMirror {
  loadUri(uri) {
    return FutureOfLibraryMirror()._check(this.noSuchMethod(new dart.InvocationImpl.new('loadUri', [uri], {isMethod: true})));
  }
  get debugName() {
    return core.String._check(this.noSuchMethod(new dart.InvocationImpl.new('debugName', [], {isGetter: true})));
  }
  get isCurrent() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isCurrent', [], {isGetter: true})));
  }
  get rootLibrary() {
    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('rootLibrary', [], {isGetter: true})));
  }
};
(_js_mirrors.JsIsolateMirror.new = function() {
}).prototype = _js_mirrors.JsIsolateMirror.prototype;
dart.addTypeTests(_js_mirrors.JsIsolateMirror);
_js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
dart.setMethodSignature(_js_mirrors.JsIsolateMirror, () => ({
  __proto__: dart.getMethods(_js_mirrors.JsIsolateMirror.__proto__),
  loadUri: dart.fnType(async.Future$(mirrors.LibraryMirror), [core.Uri])
}));
dart.setGetterSignature(_js_mirrors.JsIsolateMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsIsolateMirror.__proto__),
  debugName: core.String,
  isCurrent: core.bool,
  rootLibrary: mirrors.LibraryMirror
}));
dart.setLibraryUri(_js_mirrors.JsIsolateMirror, "dart:_js_mirrors");
_js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
  loadLibrary() {
    return FutureOfLibraryMirror()._check(this.noSuchMethod(new dart.InvocationImpl.new('loadLibrary', [], {isMethod: true})));
  }
  get isImport() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isImport', [], {isGetter: true})));
  }
  get isExport() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isExport', [], {isGetter: true})));
  }
  get isDeferred() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isDeferred', [], {isGetter: true})));
  }
  get sourceLibrary() {
    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('sourceLibrary', [], {isGetter: true})));
  }
  get targetLibrary() {
    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('targetLibrary', [], {isGetter: true})));
  }
  get prefix() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl.new('prefix', [], {isGetter: true})));
  }
  get combinators() {
    return ListOfCombinatorMirror()._check(this.noSuchMethod(new dart.InvocationImpl.new('combinators', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl.new('location', [], {isGetter: true})));
  }
  get metadata() {
    return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl.new('metadata', [], {isGetter: true})));
  }
};
(_js_mirrors.JsLibraryDependencyMirror.new = function() {
}).prototype = _js_mirrors.JsLibraryDependencyMirror.prototype;
dart.addTypeTests(_js_mirrors.JsLibraryDependencyMirror);
_js_mirrors.JsLibraryDependencyMirror[dart.implements] = () => [mirrors.LibraryDependencyMirror];
dart.setMethodSignature(_js_mirrors.JsLibraryDependencyMirror, () => ({
  __proto__: dart.getMethods(_js_mirrors.JsLibraryDependencyMirror.__proto__),
  loadLibrary: dart.fnType(async.Future$(mirrors.LibraryMirror), [])
}));
dart.setGetterSignature(_js_mirrors.JsLibraryDependencyMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsLibraryDependencyMirror.__proto__),
  isImport: core.bool,
  isExport: core.bool,
  isDeferred: core.bool,
  sourceLibrary: mirrors.LibraryMirror,
  targetLibrary: mirrors.LibraryMirror,
  prefix: core.Symbol,
  combinators: core.List$(mirrors.CombinatorMirror),
  location: mirrors.SourceLocation,
  metadata: core.List$(mirrors.InstanceMirror)
}));
dart.setLibraryUri(_js_mirrors.JsLibraryDependencyMirror, "dart:_js_mirrors");
_js_mirrors.JsObjectMirror = class JsObjectMirror extends _js_mirrors.JsMirror {
  invoke(memberName, positionalArguments, namedArguments) {
    if (namedArguments === void 0) namedArguments = null;
    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('invoke', [memberName, positionalArguments, namedArguments], {isMethod: true})));
  }
  getField(fieldName) {
    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('getField', [fieldName], {isMethod: true})));
  }
  setField(fieldName, value) {
    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('setField', [fieldName, value], {isMethod: true})));
  }
  delegate(invocation) {
    return this.noSuchMethod(new dart.InvocationImpl.new('delegate', [invocation], {isMethod: true}));
  }
};
(_js_mirrors.JsObjectMirror.new = function() {
}).prototype = _js_mirrors.JsObjectMirror.prototype;
dart.addTypeTests(_js_mirrors.JsObjectMirror);
_js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
dart.setMethodSignature(_js_mirrors.JsObjectMirror, () => ({
  __proto__: dart.getMethods(_js_mirrors.JsObjectMirror.__proto__),
  invoke: dart.fnType(mirrors.InstanceMirror, [core.Symbol, core.List], [core.Map$(core.Symbol, dart.dynamic)]),
  getField: dart.fnType(mirrors.InstanceMirror, [core.Symbol]),
  setField: dart.fnType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
  delegate: dart.fnType(dart.dynamic, [core.Invocation])
}));
dart.setLibraryUri(_js_mirrors.JsObjectMirror, "dart:_js_mirrors");
_js_mirrors.JsInstanceMirror = class JsInstanceMirror extends _js_mirrors.JsObjectMirror {
  get hasReflectee() {
    return true;
  }
  get type() {
    if (this.reflectee == null) return mirrors.reflectClass(dart.wrapType(core.Null));
    return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._runtimeType(this.reflectee))));
  }
  _equals(other) {
    return _js_mirrors.JsInstanceMirror.is(other) && core.identical(this.reflectee, other.reflectee);
  }
  get hashCode() {
    return (dart.notNull(core.identityHashCode(this.reflectee)) ^ 909522486) >>> 0;
  }
  getField(symbol) {
    let name = _js_mirrors._getMember(symbol);
    let field = dart.dloadMirror(this.reflectee, name);
    return _js_mirrors.reflect(field);
  }
  setField(symbol, value) {
    let name = _js_mirrors._getMember(symbol);
    dart.dputMirror(this.reflectee, name, value);
    return _js_mirrors.reflect(value);
  }
  invoke(symbol, args, namedArgs) {
    if (namedArgs === void 0) namedArgs = null;
    let name = _js_mirrors._getMember(symbol);
    let result = dart.callMethod(this.reflectee, name, null, args, _js_mirrors._toJsMap(namedArgs), name);
    return _js_mirrors.reflect(result);
  }
  toString() {
    return "InstanceMirror on '" + dart.str(this.reflectee) + "'";
  }
  delegate(invocation) {
    return this.noSuchMethod(new dart.InvocationImpl.new('delegate', [invocation], {isMethod: true}));
  }
};
(_js_mirrors.JsInstanceMirror.__ = function(reflectee) {
  this.reflectee = reflectee;
}).prototype = _js_mirrors.JsInstanceMirror.prototype;
dart.addTypeTests(_js_mirrors.JsInstanceMirror);
_js_mirrors.JsInstanceMirror[dart.implements] = () => [mirrors.InstanceMirror];
dart.setMethodSignature(_js_mirrors.JsInstanceMirror, () => ({
  __proto__: dart.getMethods(_js_mirrors.JsInstanceMirror.__proto__),
  _equals: dart.fnType(core.bool, [core.Object]),
  [$_equals]: dart.fnType(core.bool, [core.Object]),
  getField: dart.fnType(mirrors.InstanceMirror, [core.Symbol]),
  setField: dart.fnType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
  invoke: dart.fnType(mirrors.InstanceMirror, [core.Symbol, core.List], [core.Map$(core.Symbol, dart.dynamic)]),
  delegate: dart.fnType(dart.dynamic, [core.Invocation])
}));
dart.setGetterSignature(_js_mirrors.JsInstanceMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsInstanceMirror.__proto__),
  hasReflectee: core.bool,
  type: mirrors.ClassMirror
}));
dart.setLibraryUri(_js_mirrors.JsInstanceMirror, "dart:_js_mirrors");
dart.setFieldSignature(_js_mirrors.JsInstanceMirror, () => ({
  __proto__: dart.getFields(_js_mirrors.JsInstanceMirror.__proto__),
  reflectee: dart.finalFieldType(dart.dynamic)
}));
dart.defineExtensionMethods(_js_mirrors.JsInstanceMirror, ['_equals', 'toString']);
dart.defineExtensionAccessors(_js_mirrors.JsInstanceMirror, ['hashCode']);
_js_mirrors.JsClosureMirror = class JsClosureMirror extends _js_mirrors.JsInstanceMirror {
  apply(args, namedArgs) {
    if (namedArgs === void 0) namedArgs = null;
    let result = dart.dcall(this.reflectee, args, _js_mirrors._toJsMap(namedArgs));
    return _js_mirrors.reflect(result);
  }
  delegate(invocation) {
    return this.noSuchMethod(new dart.InvocationImpl.new('delegate', [invocation], {isMethod: true}));
  }
  get function() {
    return mirrors.MethodMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('function', [], {isGetter: true})));
  }
};
(_js_mirrors.JsClosureMirror.__ = function(reflectee) {
  _js_mirrors.JsClosureMirror.__proto__.__.call(this, reflectee);
}).prototype = _js_mirrors.JsClosureMirror.prototype;
dart.addTypeTests(_js_mirrors.JsClosureMirror);
_js_mirrors.JsClosureMirror[dart.implements] = () => [mirrors.ClosureMirror];
dart.setMethodSignature(_js_mirrors.JsClosureMirror, () => ({
  __proto__: dart.getMethods(_js_mirrors.JsClosureMirror.__proto__),
  apply: dart.fnType(mirrors.InstanceMirror, [core.List], [core.Map$(core.Symbol, dart.dynamic)]),
  delegate: dart.fnType(dart.dynamic, [core.Invocation])
}));
dart.setGetterSignature(_js_mirrors.JsClosureMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsClosureMirror.__proto__),
  function: mirrors.MethodMirror
}));
dart.setLibraryUri(_js_mirrors.JsClosureMirror, "dart:_js_mirrors");
const _cls = dart.privateName(_js_mirrors, "_cls");
const _raw = dart.privateName(_js_mirrors, "_raw");
const _originalDeclaration = dart.privateName(_js_mirrors, "_originalDeclaration");
const _mixin = dart.privateName(_js_mirrors, "_mixin");
const _typeArguments = dart.privateName(_js_mirrors, "_typeArguments");
const _metadata$ = dart.privateName(_js_mirrors, "_metadata");
const _declarations = dart.privateName(_js_mirrors, "_declarations");
let const$6;
let const$7;
_js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
  get metadata() {
    if (this[_metadata$] == null) {
      let unwrapped = dart.unwrapType(this[_cls]);
      let fn = Object.hasOwnProperty.call(unwrapped, dart.metadata) ? unwrapped[dart.metadata] : null;
      this[_metadata$] = fn == null ? const$7 || (const$7 = dart.constList([], mirrors.InstanceMirror)) : ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dcall(fn, []), 'map', [dart.fn(i => _js_mirrors.reflect(i), dynamicToInstanceMirror())])));
    }
    return this[_metadata$];
  }
  get declarations() {
    if (this[_declarations] == null) {
      this[_declarations] = new (LinkedMapOfSymbol$DeclarationMirror()).new();
      let unwrapped = dart.unwrapType(this[_cls]);
      let constructors = _js_mirrors._toDartMap(dart.getConstructors(unwrapped));
      constructors[$forEach](dart.fn((symbol, ft) => {
        let name = _js_mirrors.getName(symbol);
        this[_declarations][$_set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      if (dart.test(constructors[$isEmpty])) {
        let name = "new";
        let ft = dart.fnType(dart.unwrapType(this[_cls]), []);
        let symbol = core.Symbol.new(name);
        this[_declarations][$_set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
      }
      let fields = _js_mirrors._toDartMap(dart.getFields(unwrapped));
      fields[$forEach](dart.fn((symbol, t) => {
        this[_declarations][$_set](symbol, new _js_mirrors.JsVariableMirror._fromField(symbol, t));
      }, SymbolAnddynamicToNull()));
      let methods = _js_mirrors._toDartMap(dart.getMethods(unwrapped));
      methods[$forEach](dart.fn((symbol, ft) => {
        let name = _js_mirrors.getName(symbol);
        this[_declarations][$_set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      function getterType(type) {
        if (type instanceof Array) {
          let array = type.slice();
          type = array[0];
          array[0] = dart.fnType(type, []);
          return array;
        } else {
          return dart.fnType(type, []);
        }
      }
      dart.fn(getterType, dynamicTodynamic());
      let getters = _js_mirrors._toDartMap(dart.getGetters(unwrapped));
      getters[$forEach](dart.fn((symbol, type) => {
        this[_declarations][$_set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, getterType(type)));
      }, SymbolAnddynamicToNull()));
      function setterType(type) {
        if (type instanceof Array) {
          let array = type.slice();
          type = array[0];
          array[0] = dart.fnType(dart.void, [type]);
          return array;
        } else {
          return dart.fnType(dart.void, [type]);
        }
      }
      dart.fn(setterType, dynamicTodynamic());
      let setters = _js_mirrors._toDartMap(dart.getSetters(unwrapped));
      setters[$forEach](dart.fn((symbol, type) => {
        let name = dart.notNull(_js_mirrors.getName(symbol)) + "=";
        symbol = new _js_helper.PrivateSymbol.new(name, _js_mirrors._getESSymbol(symbol));
        this[_declarations][$_set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, setterType(type)));
      }, SymbolAnddynamicToNull()));
      let staticFields = _js_mirrors._toDartMap(dart.getStaticFields(unwrapped));
      staticFields[$forEach](dart.fn((symbol, t) => {
        this[_declarations][$_set](symbol, new _js_mirrors.JsVariableMirror._fromField(symbol, t));
      }, SymbolAnddynamicToNull()));
      let statics = _js_mirrors._toDartMap(dart.getStaticMethods(unwrapped));
      statics[$forEach](dart.fn((symbol, ft) => {
        this[_declarations][$_set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
      }, SymbolAnddynamicToNull()));
      let staticGetters = _js_mirrors._toDartMap(dart.getStaticGetters(unwrapped));
      staticGetters[$forEach](dart.fn((symbol, type) => {
        this[_declarations][$_set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, getterType(type)));
      }, SymbolAnddynamicToNull()));
      let staticSetters = _js_mirrors._toDartMap(dart.getStaticSetters(unwrapped));
      staticSetters[$forEach](dart.fn((symbol, type) => {
        this[_declarations][$_set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, setterType(type)));
      }, SymbolAnddynamicToNull()));
      this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
    }
    return this[_declarations];
  }
  newInstance(constructorName, args, namedArgs) {
    if (namedArgs === void 0) namedArgs = null;
    let name = _js_mirrors.getName(constructorName);
    if (!(namedArgs == null || dart.test(namedArgs[$isEmpty]))) dart.assertFailed(null, "dart:_js_mirrors", 370, 12, "namedArgs == null || namedArgs.isEmpty");
    if (name === "") name = "new";
    let cls = dart.unwrapType(this[_cls]);
    let ctr = cls[name];
    let instance = cls.prototype == ctr.prototype ? new ctr(...args) : ctr(...args);
    return _js_mirrors.reflect(instance);
  }
  getField(symbol) {
    let name = _js_mirrors.getName(symbol);
    return _js_mirrors.reflect(dart.unwrapType(this[_cls])[name]);
  }
  setField(symbol, value) {
    let name = _js_mirrors.getName(symbol);
    dart.unwrapType(this[_cls])[name] = value;
    return _js_mirrors.reflect(value);
  }
  invoke(symbol, args, namedArgs) {
    if (namedArgs === void 0) namedArgs = null;
    let name = _js_mirrors.getName(symbol);
    if (namedArgs != null) {
      args = core.List.from(args);
      args[$add](_js_mirrors._toJsMap(namedArgs));
    }
    let result = dart.unwrapType(this[_cls])[name](...args);
    return _js_mirrors.reflect(result);
  }
  get superinterfaces() {
    let interfaceThunk = dart.unwrapType(this[_cls])[dart.implements];
    if (interfaceThunk == null) {
      return JSArrayOfClassMirror().of([]);
    } else {
      let interfaces = interfaceThunk();
      return ListOfClassMirror()._check(IterableOfTypeMirror()._check(interfaces[$map](mirrors.TypeMirror, dart.fn(t => _js_mirrors.reflectType(t), TypeToTypeMirror())))[$toList]());
    }
  }
  get hasReflectedType() {
    return true;
  }
  get reflectedType() {
    return this[_cls];
  }
  get isOriginalDeclaration() {
    return this[_raw] == null;
  }
  get typeArguments() {
    return this[_typeArguments];
  }
  get originalDeclaration() {
    if (this[_raw] == null) {
      return this;
    }
    if (this[_originalDeclaration] != null) {
      return this[_originalDeclaration];
    }
    this[_originalDeclaration] = new _js_mirrors.JsClassMirror.__(dart.wrapType(this[_raw]()), {instantiated: false});
    return this[_originalDeclaration];
  }
  get superclass() {
    if (dart.equals(this[_cls], dart.wrapType(core.Object))) {
      return null;
    } else {
      return mirrors.ClassMirror._check(_js_mirrors.reflectType(dart.wrapType(dart.unwrapType(this[_cls]).__proto__)));
    }
  }
  get mixin() {
    if (this[_mixin] != null) {
      return this[_mixin];
    }
    let mixin = dart.getMixin(dart.unwrapType(this[_cls]));
    if (mixin == null) {
      this[_mixin] = this;
      return this[_mixin];
    }
    this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(dart.wrapType(mixin)));
    return this[_mixin];
  }
  toString() {
    return "ClassMirror on '" + dart.str(this[_cls]) + "'";
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl.new('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('owner', [], {isGetter: true})));
  }
  get isPrivate() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isPrivate', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl.new('location', [], {isGetter: true})));
  }
  isSubtypeOf(other) {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isSubtypeOf', [other], {isMethod: true})));
  }
  isAssignableTo(other) {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isAssignableTo', [other], {isMethod: true})));
  }
  get typeVariables() {
    return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl.new('typeVariables', [], {isGetter: true})));
  }
  delegate(invocation) {
    return this.noSuchMethod(new dart.InvocationImpl.new('delegate', [invocation], {isMethod: true}));
  }
  isSubclassOf(other) {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isSubclassOf', [other], {isMethod: true})));
  }
  get isAbstract() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isAbstract', [], {isGetter: true})));
  }
  get isEnum() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isEnum', [], {isGetter: true})));
  }
  get instanceMembers() {
    return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl.new('instanceMembers', [], {isGetter: true})));
  }
  get staticMembers() {
    return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl.new('staticMembers', [], {isGetter: true})));
  }
};
(_js_mirrors.JsClassMirror.__ = function(cls, opts) {
  let instantiated = opts && 'instantiated' in opts ? opts.instantiated : true;
  this[_originalDeclaration] = null;
  this[_mixin] = null;
  this[_typeArguments] = null;
  this[_metadata$] = null;
  this[_declarations] = null;
  this[_cls] = cls;
  this[_raw] = dart.test(instantiated) ? dart.getGenericClass(dart.unwrapType(cls)) : null;
  this.simpleName = core.Symbol.new(dart.unwrapType(cls).name);
  let typeArgs = dart.getGenericArgs(dart.unwrapType(this[_cls]));
  if (typeArgs == null) {
    this[_typeArguments] = const$6 || (const$6 = dart.constList([], mirrors.TypeMirror));
  } else {
    this[_typeArguments] = ListOfTypeMirror().unmodifiable(typeArgs[$map](dart.dynamic, dart.fn(t => _js_mirrors.reflectType(dart.wrapType(t)), dynamicToTypeMirror())));
  }
}).prototype = _js_mirrors.JsClassMirror.prototype;
dart.addTypeTests(_js_mirrors.JsClassMirror);
_js_mirrors.JsClassMirror[dart.implements] = () => [mirrors.ClassMirror];
dart.setMethodSignature(_js_mirrors.JsClassMirror, () => ({
  __proto__: dart.getMethods(_js_mirrors.JsClassMirror.__proto__),
  newInstance: dart.fnType(mirrors.InstanceMirror, [core.Symbol, core.List], [core.Map$(core.Symbol, dart.dynamic)]),
  getField: dart.fnType(mirrors.InstanceMirror, [core.Symbol]),
  setField: dart.fnType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
  invoke: dart.fnType(mirrors.InstanceMirror, [core.Symbol, core.List], [core.Map$(core.Symbol, dart.dynamic)]),
  isSubtypeOf: dart.fnType(core.bool, [mirrors.TypeMirror]),
  isAssignableTo: dart.fnType(core.bool, [mirrors.TypeMirror]),
  delegate: dart.fnType(dart.dynamic, [core.Invocation]),
  isSubclassOf: dart.fnType(core.bool, [mirrors.ClassMirror])
}));
dart.setGetterSignature(_js_mirrors.JsClassMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsClassMirror.__proto__),
  metadata: core.List$(mirrors.InstanceMirror),
  declarations: core.Map$(core.Symbol, mirrors.DeclarationMirror),
  superinterfaces: core.List$(mirrors.ClassMirror),
  hasReflectedType: core.bool,
  reflectedType: core.Type,
  isOriginalDeclaration: core.bool,
  typeArguments: core.List$(mirrors.TypeMirror),
  originalDeclaration: mirrors.TypeMirror,
  superclass: mirrors.ClassMirror,
  mixin: mirrors.ClassMirror,
  qualifiedName: core.Symbol,
  owner: mirrors.DeclarationMirror,
  isPrivate: core.bool,
  isTopLevel: core.bool,
  location: mirrors.SourceLocation,
  typeVariables: core.List$(mirrors.TypeVariableMirror),
  isAbstract: core.bool,
  isEnum: core.bool,
  instanceMembers: core.Map$(core.Symbol, mirrors.MethodMirror),
  staticMembers: core.Map$(core.Symbol, mirrors.MethodMirror)
}));
dart.setLibraryUri(_js_mirrors.JsClassMirror, "dart:_js_mirrors");
dart.setFieldSignature(_js_mirrors.JsClassMirror, () => ({
  __proto__: dart.getFields(_js_mirrors.JsClassMirror.__proto__),
  [_cls]: dart.finalFieldType(core.Type),
  simpleName: dart.finalFieldType(core.Symbol),
  [_raw]: dart.finalFieldType(dart.dynamic),
  [_originalDeclaration]: dart.fieldType(mirrors.ClassMirror),
  [_mixin]: dart.fieldType(mirrors.ClassMirror),
  [_typeArguments]: dart.fieldType(ListOfTypeMirror()),
  [_metadata$]: dart.fieldType(ListOfInstanceMirror()),
  [_declarations]: dart.fieldType(MapOfSymbol$DeclarationMirror())
}));
dart.defineExtensionMethods(_js_mirrors.JsClassMirror, ['toString']);
const _symbol = dart.privateName(_js_mirrors, "_symbol");
const _name$0 = dart.privateName(_js_mirrors, "_name");
_js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
  get simpleName() {
    return this[_symbol];
  }
  toString() {
    return "VariableMirror on '" + dart.str(this[_name$0]) + "'";
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl.new('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('owner', [], {isGetter: true})));
  }
  get isPrivate() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isPrivate', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl.new('location', [], {isGetter: true})));
  }
  get isConst() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isConst', [], {isGetter: true})));
  }
};
(_js_mirrors.JsVariableMirror.__ = function(symbol, t, annotations, opts) {
  let isFinal = opts && 'isFinal' in opts ? opts.isFinal : false;
  this.isStatic = false;
  this.isFinal = isFinal;
  this[_symbol] = symbol;
  this[_name$0] = _js_mirrors.getName(symbol);
  this.type = _js_mirrors.reflectType(t);
  this.metadata = ListOfInstanceMirror().unmodifiable((() => {
    let t = annotations;
    let l = t == null ? null : t[$map](dart.dynamic, dart.fn(_js_mirrors.reflect, dynamicToInstanceMirror()));
    return l != null ? l : [];
  })());
}).prototype = _js_mirrors.JsVariableMirror.prototype;
(_js_mirrors.JsVariableMirror._fromField = function(symbol, fieldInfo) {
  _js_mirrors.JsVariableMirror.__.call(this, symbol, dart.wrapType(fieldInfo.type), fieldInfo.metadata, {isFinal: fieldInfo.isFinal});
}).prototype = _js_mirrors.JsVariableMirror.prototype;
dart.addTypeTests(_js_mirrors.JsVariableMirror);
_js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
dart.setGetterSignature(_js_mirrors.JsVariableMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsVariableMirror.__proto__),
  simpleName: core.Symbol,
  qualifiedName: core.Symbol,
  owner: mirrors.DeclarationMirror,
  isPrivate: core.bool,
  isTopLevel: core.bool,
  location: mirrors.SourceLocation,
  isConst: core.bool
}));
dart.setLibraryUri(_js_mirrors.JsVariableMirror, "dart:_js_mirrors");
dart.setFieldSignature(_js_mirrors.JsVariableMirror, () => ({
  __proto__: dart.getFields(_js_mirrors.JsVariableMirror.__proto__),
  [_symbol]: dart.finalFieldType(core.Symbol),
  [_name$0]: dart.finalFieldType(core.String),
  type: dart.finalFieldType(mirrors.TypeMirror),
  metadata: dart.finalFieldType(ListOfInstanceMirror()),
  isFinal: dart.finalFieldType(core.bool),
  isStatic: dart.finalFieldType(core.bool)
}));
dart.defineExtensionMethods(_js_mirrors.JsVariableMirror, ['toString']);
_js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
  toString() {
    return "ParameterMirror on '" + dart.str(this[_name$0]) + "'";
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl.new('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('owner', [], {isGetter: true})));
  }
  get isPrivate() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isPrivate', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl.new('location', [], {isGetter: true})));
  }
  get isConst() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isConst', [], {isGetter: true})));
  }
  get isOptional() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isOptional', [], {isGetter: true})));
  }
  get isNamed() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isNamed', [], {isGetter: true})));
  }
  get hasDefaultValue() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('hasDefaultValue', [], {isGetter: true})));
  }
  get defaultValue() {
    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('defaultValue', [], {isGetter: true})));
  }
};
(_js_mirrors.JsParameterMirror.__ = function(member, t, annotations) {
  _js_mirrors.JsParameterMirror.__proto__.__.call(this, member, t, annotations);
}).prototype = _js_mirrors.JsParameterMirror.prototype;
dart.addTypeTests(_js_mirrors.JsParameterMirror);
_js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
dart.setGetterSignature(_js_mirrors.JsParameterMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsParameterMirror.__proto__),
  qualifiedName: core.Symbol,
  owner: mirrors.DeclarationMirror,
  isPrivate: core.bool,
  isTopLevel: core.bool,
  location: mirrors.SourceLocation,
  isConst: core.bool,
  isOptional: core.bool,
  isNamed: core.bool,
  hasDefaultValue: core.bool,
  defaultValue: mirrors.InstanceMirror
}));
dart.setLibraryUri(_js_mirrors.JsParameterMirror, "dart:_js_mirrors");
dart.defineExtensionMethods(_js_mirrors.JsParameterMirror, ['toString']);
const _params = dart.privateName(_js_mirrors, "_params");
const _createParameterMirrorList = dart.privateName(_js_mirrors, "_createParameterMirrorList");
let const$8;
let const$9;
let const$10;
_js_mirrors.JsMethodMirror = class JsMethodMirror extends _js_mirrors.JsMirror {
  get isSetter() {
    return this[_name$0][$endsWith]("=");
  }
  get isPrivate() {
    return this[_name$0][$startsWith]("_");
  }
  get simpleName() {
    return this[_symbol];
  }
  get constructorName() {
    return dart.test(this.isConstructor) ? this[_symbol] : null;
  }
  get parameters() {
    return this[_params];
  }
  get metadata() {
    return this[_metadata$];
  }
  [_createParameterMirrorList](ftype) {
    if (ftype == null) {
      this[_params] = const$8 || (const$8 = dart.constList([], mirrors.ParameterMirror));
      this[_metadata$] = const$9 || (const$9 = dart.constList([], mirrors.InstanceMirror));
      return;
    }
    if (!core.Function.is(ftype) && core.List.is(ftype)) {
      this[_metadata$] = ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dsend(ftype, 'skip', [1]), 'map', [dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())])));
      ftype = dart.dindex(ftype, 0);
    } else {
      this[_metadata$] = const$10 || (const$10 = dart.constList([], mirrors.InstanceMirror));
    }
    ftype = dart.getFunctionTypeMirror(dart.AbstractFunctionType._check(ftype));
    let args = core.List._check(dart.dload(ftype, 'args'));
    let opts = core.List._check(dart.dload(ftype, 'optionals'));
    let params = ListOfParameterMirror().new(dart.notNull(args[$length]) + dart.notNull(opts[$length]));
    for (let i = 0; i < dart.notNull(args[$length]); ++i) {
      let type = args[$_get](i);
      let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
      let param = new _js_mirrors.JsParameterMirror.__(core.Symbol.new(""), dart.wrapType(type), core.List._check(metadata));
      params[$_set](i, param);
    }
    for (let i = 0; i < dart.notNull(opts[$length]); ++i) {
      let type = opts[$_get](i);
      let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[$length]) + i);
      let param = new _js_mirrors.JsParameterMirror.__(core.Symbol.new(""), dart.wrapType(type), core.List._check(metadata));
      params[$_set](i + dart.notNull(args[$length]), param);
    }
    this[_params] = ListOfParameterMirror().unmodifiable(params);
  }
  toString() {
    return "MethodMirror on '" + dart.str(this[_name$0]) + "'";
  }
  get qualifiedName() {
    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl.new('qualifiedName', [], {isGetter: true})));
  }
  get owner() {
    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('owner', [], {isGetter: true})));
  }
  get isTopLevel() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isTopLevel', [], {isGetter: true})));
  }
  get location() {
    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl.new('location', [], {isGetter: true})));
  }
  get returnType() {
    return mirrors.TypeMirror._check(this.noSuchMethod(new dart.InvocationImpl.new('returnType', [], {isGetter: true})));
  }
  get source() {
    return core.String._check(this.noSuchMethod(new dart.InvocationImpl.new('source', [], {isGetter: true})));
  }
  get isAbstract() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isAbstract', [], {isGetter: true})));
  }
  get isSynthetic() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isSynthetic', [], {isGetter: true})));
  }
  get isRegularMethod() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isRegularMethod', [], {isGetter: true})));
  }
  get isOperator() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isOperator', [], {isGetter: true})));
  }
  get isGetter() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isGetter', [], {isGetter: true})));
  }
  get isConstConstructor() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isConstConstructor', [], {isGetter: true})));
  }
  get isGenerativeConstructor() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isGenerativeConstructor', [], {isGetter: true})));
  }
  get isRedirectingConstructor() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isRedirectingConstructor', [], {isGetter: true})));
  }
  get isFactoryConstructor() {
    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl.new('isFactoryConstructor', [], {isGetter: true})));
  }
};
(_js_mirrors.JsMethodMirror._constructor = function(cls, symbol, ftype) {
  this[_params] = null;
  this[_metadata$] = null;
  this.isFinal = false;
  this[_symbol] = symbol;
  this[_name$0] = _js_mirrors.getName(symbol);
  this.isConstructor = true;
  this.isStatic = false;
  this[_createParameterMirrorList](ftype);
}).prototype = _js_mirrors.JsMethodMirror.prototype;
(_js_mirrors.JsMethodMirror._instanceMethod = function(cls, symbol, ftype) {
  this[_params] = null;
  this[_metadata$] = null;
  this.isFinal = false;
  this[_symbol] = symbol;
  this[_name$0] = _js_mirrors.getName(symbol);
  this.isConstructor = false;
  this.isStatic = false;
  this[_createParameterMirrorList](ftype);
}).prototype = _js_mirrors.JsMethodMirror.prototype;
(_js_mirrors.JsMethodMirror._staticMethod = function(cls, symbol, ftype) {
  this[_params] = null;
  this[_metadata$] = null;
  this.isFinal = false;
  this[_symbol] = symbol;
  this[_name$0] = _js_mirrors.getName(symbol);
  this.isConstructor = false;
  this.isStatic = true;
  this[_createParameterMirrorList](ftype);
}).prototype = _js_mirrors.JsMethodMirror.prototype;
dart.addTypeTests(_js_mirrors.JsMethodMirror);
_js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
dart.setMethodSignature(_js_mirrors.JsMethodMirror, () => ({
  __proto__: dart.getMethods(_js_mirrors.JsMethodMirror.__proto__),
  [_createParameterMirrorList]: dart.fnType(dart.void, [dart.dynamic])
}));
dart.setGetterSignature(_js_mirrors.JsMethodMirror, () => ({
  __proto__: dart.getGetters(_js_mirrors.JsMethodMirror.__proto__),
  isSetter: core.bool,
  isPrivate: core.bool,
  simpleName: core.Symbol,
  constructorName: core.Symbol,
  parameters: core.List$(mirrors.ParameterMirror),
  metadata: core.List$(mirrors.InstanceMirror),
  qualifiedName: core.Symbol,
  owner: mirrors.DeclarationMirror,
  isTopLevel: core.bool,
  location: mirrors.SourceLocation,
  returnType: mirrors.TypeMirror,
  source: core.String,
  isAbstract: core.bool,
  isSynthetic: core.bool,
  isRegularMethod: core.bool,
  isOperator: core.bool,
  isGetter: core.bool,
  isConstConstructor: core.bool,
  isGenerativeConstructor: core.bool,
  isRedirectingConstructor: core.bool,
  isFactoryConstructor: core.bool
}));
dart.setLibraryUri(_js_mirrors.JsMethodMirror, "dart:_js_mirrors");
dart.setFieldSignature(_js_mirrors.JsMethodMirror, () => ({
  __proto__: dart.getFields(_js_mirrors.JsMethodMirror.__proto__),
  [_symbol]: dart.finalFieldType(core.Symbol),
  [_name$0]: dart.finalFieldType(core.String),
  [_params]: dart.fieldType(ListOfParameterMirror()),
  [_metadata$]: dart.fieldType(ListOfInstanceMirror()),
  isConstructor: dart.finalFieldType(core.bool),
  isStatic: dart.finalFieldType(core.bool),
  isFinal: dart.finalFieldType(core.bool)
}));
dart.defineExtensionMethods(_js_mirrors.JsMethodMirror, ['toString']);
_js_primitives.printString = function(string) {
  if (typeof dartPrint == "function") {
    dartPrint(string);
    return;
  }
  if (typeof console == "object" && typeof console.log != "undefined") {
    console.log(string);
    return;
  }
  if (typeof window == "object") {
    return;
  }
  if (typeof print == "function") {
    print(string);
    return;
  }
  throw "Unable to print message: " + String(string);
};
_metadata.SupportedBrowser = class SupportedBrowser extends core.Object {};
(_metadata.SupportedBrowser.new = function(browserName, minimumVersion) {
  if (minimumVersion === void 0) minimumVersion = null;
  this.browserName = browserName;
  this.minimumVersion = minimumVersion;
}).prototype = _metadata.SupportedBrowser.prototype;
dart.addTypeTests(_metadata.SupportedBrowser);
dart.setLibraryUri(_metadata.SupportedBrowser, "dart:_metadata");
dart.setFieldSignature(_metadata.SupportedBrowser, () => ({
  __proto__: dart.getFields(_metadata.SupportedBrowser.__proto__),
  browserName: dart.finalFieldType(core.String),
  minimumVersion: dart.finalFieldType(core.String)
}));
dart.defineLazy(_metadata.SupportedBrowser, {
  /*_metadata.SupportedBrowser.CHROME*/get CHROME() {
    return "Chrome";
  },
  /*_metadata.SupportedBrowser.FIREFOX*/get FIREFOX() {
    return "Firefox";
  },
  /*_metadata.SupportedBrowser.IE*/get IE() {
    return "Internet Explorer";
  },
  /*_metadata.SupportedBrowser.OPERA*/get OPERA() {
    return "Opera";
  },
  /*_metadata.SupportedBrowser.SAFARI*/get SAFARI() {
    return "Safari";
  }
});
_metadata.Experimental = class Experimental extends core.Object {};
(_metadata.Experimental.new = function() {
}).prototype = _metadata.Experimental.prototype;
dart.addTypeTests(_metadata.Experimental);
dart.setLibraryUri(_metadata.Experimental, "dart:_metadata");
_metadata.DomName = class DomName extends core.Object {};
(_metadata.DomName.new = function(name) {
  this.name = name;
}).prototype = _metadata.DomName.prototype;
dart.addTypeTests(_metadata.DomName);
dart.setLibraryUri(_metadata.DomName, "dart:_metadata");
dart.setFieldSignature(_metadata.DomName, () => ({
  __proto__: dart.getFields(_metadata.DomName.__proto__),
  name: dart.finalFieldType(core.String)
}));
_metadata.DocsEditable = class DocsEditable extends core.Object {};
(_metadata.DocsEditable.new = function() {
}).prototype = _metadata.DocsEditable.prototype;
dart.addTypeTests(_metadata.DocsEditable);
dart.setLibraryUri(_metadata.DocsEditable, "dart:_metadata");
_metadata.Unstable = class Unstable extends core.Object {};
(_metadata.Unstable.new = function() {
}).prototype = _metadata.Unstable.prototype;
dart.addTypeTests(_metadata.Unstable);
dart.setLibraryUri(_metadata.Unstable, "dart:_metadata");
_native_typed_data.NativeByteBuffer = class NativeByteBuffer extends core.Object {
  get [$lengthInBytes]() {
    return this.byteLength;
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.ByteBuffer);
  }
  [$asUint8List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeUint8List.view(this, offsetInBytes, length);
  }
  [$asInt8List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeInt8List.view(this, offsetInBytes, length);
  }
  [$asUint8ClampedList](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeUint8ClampedList.view(this, offsetInBytes, length);
  }
  [$asUint16List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeUint16List.view(this, offsetInBytes, length);
  }
  [$asInt16List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeInt16List.view(this, offsetInBytes, length);
  }
  [$asUint32List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeUint32List.view(this, offsetInBytes, length);
  }
  [$asInt32List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeInt32List.view(this, offsetInBytes, length);
  }
  [$asUint64List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    dart.throw(new core.UnsupportedError.new("Uint64List not supported by dart2js."));
  }
  [$asInt64List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    dart.throw(new core.UnsupportedError.new("Int64List not supported by dart2js."));
  }
  [$asInt32x4List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    let storage = _native_typed_data.NativeInt32List._check(this[$asInt32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
    return new _native_typed_data.NativeInt32x4List._externalStorage(storage);
  }
  [$asFloat32List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeFloat32List.view(this, offsetInBytes, length);
  }
  [$asFloat64List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeFloat64List.view(this, offsetInBytes, length);
  }
  [$asFloat32x4List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    let storage = _native_typed_data.NativeFloat32List._check(this[$asFloat32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
    return new _native_typed_data.NativeFloat32x4List._externalStorage(storage);
  }
  [$asFloat64x2List](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    let storage = _native_typed_data.NativeFloat64List._check(this[$asFloat64List](offsetInBytes, length != null ? dart.notNull(length) * 2 : null));
    return new _native_typed_data.NativeFloat64x2List._externalStorage(storage);
  }
  [$asByteData](offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return _native_typed_data.NativeByteData.view(this, offsetInBytes, length);
  }
};
(_native_typed_data.NativeByteBuffer.new = function() {
}).prototype = _native_typed_data.NativeByteBuffer.prototype;
dart.addTypeTests(_native_typed_data.NativeByteBuffer);
_native_typed_data.NativeByteBuffer[dart.implements] = () => [typed_data.ByteBuffer];
dart.setMethodSignature(_native_typed_data.NativeByteBuffer, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeByteBuffer.__proto__),
  [$asUint8List]: dart.fnType(typed_data.Uint8List, [], [core.int, core.int]),
  [$asInt8List]: dart.fnType(typed_data.Int8List, [], [core.int, core.int]),
  [$asUint8ClampedList]: dart.fnType(typed_data.Uint8ClampedList, [], [core.int, core.int]),
  [$asUint16List]: dart.fnType(typed_data.Uint16List, [], [core.int, core.int]),
  [$asInt16List]: dart.fnType(typed_data.Int16List, [], [core.int, core.int]),
  [$asUint32List]: dart.fnType(typed_data.Uint32List, [], [core.int, core.int]),
  [$asInt32List]: dart.fnType(typed_data.Int32List, [], [core.int, core.int]),
  [$asUint64List]: dart.fnType(typed_data.Uint64List, [], [core.int, core.int]),
  [$asInt64List]: dart.fnType(typed_data.Int64List, [], [core.int, core.int]),
  [$asInt32x4List]: dart.fnType(typed_data.Int32x4List, [], [core.int, core.int]),
  [$asFloat32List]: dart.fnType(typed_data.Float32List, [], [core.int, core.int]),
  [$asFloat64List]: dart.fnType(typed_data.Float64List, [], [core.int, core.int]),
  [$asFloat32x4List]: dart.fnType(typed_data.Float32x4List, [], [core.int, core.int]),
  [$asFloat64x2List]: dart.fnType(typed_data.Float64x2List, [], [core.int, core.int]),
  [$asByteData]: dart.fnType(typed_data.ByteData, [], [core.int, core.int])
}));
dart.setGetterSignature(_native_typed_data.NativeByteBuffer, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeByteBuffer.__proto__),
  [$lengthInBytes]: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeByteBuffer, "dart:_native_typed_data");
dart.registerExtension("ArrayBuffer", _native_typed_data.NativeByteBuffer);
const _storage = dart.privateName(_native_typed_data, "_storage");
typed_data.Float32x4 = class Float32x4 extends core.Object {
  static new(x, y, z, w) {
    return new _native_typed_data.NativeFloat32x4.new(x, y, z, w);
  }
  static splat(v) {
    return new _native_typed_data.NativeFloat32x4.splat(v);
  }
  static zero() {
    return new _native_typed_data.NativeFloat32x4.zero();
  }
  static fromInt32x4Bits(x) {
    return _native_typed_data.NativeFloat32x4.fromInt32x4Bits(x);
  }
  static fromFloat64x2(v) {
    return new _native_typed_data.NativeFloat32x4.fromFloat64x2(v);
  }
};
(typed_data.Float32x4[dart.mixinNew] = function() {
}).prototype = typed_data.Float32x4.prototype;
dart.addTypeTests(typed_data.Float32x4);
dart.setLibraryUri(typed_data.Float32x4, "dart:typed_data");
dart.defineLazy(typed_data.Float32x4, {
  /*typed_data.Float32x4.xxxx*/get xxxx() {
    return 0;
  },
  /*typed_data.Float32x4.xxxy*/get xxxy() {
    return 64;
  },
  /*typed_data.Float32x4.xxxz*/get xxxz() {
    return 128;
  },
  /*typed_data.Float32x4.xxxw*/get xxxw() {
    return 192;
  },
  /*typed_data.Float32x4.xxyx*/get xxyx() {
    return 16;
  },
  /*typed_data.Float32x4.xxyy*/get xxyy() {
    return 80;
  },
  /*typed_data.Float32x4.xxyz*/get xxyz() {
    return 144;
  },
  /*typed_data.Float32x4.xxyw*/get xxyw() {
    return 208;
  },
  /*typed_data.Float32x4.xxzx*/get xxzx() {
    return 32;
  },
  /*typed_data.Float32x4.xxzy*/get xxzy() {
    return 96;
  },
  /*typed_data.Float32x4.xxzz*/get xxzz() {
    return 160;
  },
  /*typed_data.Float32x4.xxzw*/get xxzw() {
    return 224;
  },
  /*typed_data.Float32x4.xxwx*/get xxwx() {
    return 48;
  },
  /*typed_data.Float32x4.xxwy*/get xxwy() {
    return 112;
  },
  /*typed_data.Float32x4.xxwz*/get xxwz() {
    return 176;
  },
  /*typed_data.Float32x4.xxww*/get xxww() {
    return 240;
  },
  /*typed_data.Float32x4.xyxx*/get xyxx() {
    return 4;
  },
  /*typed_data.Float32x4.xyxy*/get xyxy() {
    return 68;
  },
  /*typed_data.Float32x4.xyxz*/get xyxz() {
    return 132;
  },
  /*typed_data.Float32x4.xyxw*/get xyxw() {
    return 196;
  },
  /*typed_data.Float32x4.xyyx*/get xyyx() {
    return 20;
  },
  /*typed_data.Float32x4.xyyy*/get xyyy() {
    return 84;
  },
  /*typed_data.Float32x4.xyyz*/get xyyz() {
    return 148;
  },
  /*typed_data.Float32x4.xyyw*/get xyyw() {
    return 212;
  },
  /*typed_data.Float32x4.xyzx*/get xyzx() {
    return 36;
  },
  /*typed_data.Float32x4.xyzy*/get xyzy() {
    return 100;
  },
  /*typed_data.Float32x4.xyzz*/get xyzz() {
    return 164;
  },
  /*typed_data.Float32x4.xyzw*/get xyzw() {
    return 228;
  },
  /*typed_data.Float32x4.xywx*/get xywx() {
    return 52;
  },
  /*typed_data.Float32x4.xywy*/get xywy() {
    return 116;
  },
  /*typed_data.Float32x4.xywz*/get xywz() {
    return 180;
  },
  /*typed_data.Float32x4.xyww*/get xyww() {
    return 244;
  },
  /*typed_data.Float32x4.xzxx*/get xzxx() {
    return 8;
  },
  /*typed_data.Float32x4.xzxy*/get xzxy() {
    return 72;
  },
  /*typed_data.Float32x4.xzxz*/get xzxz() {
    return 136;
  },
  /*typed_data.Float32x4.xzxw*/get xzxw() {
    return 200;
  },
  /*typed_data.Float32x4.xzyx*/get xzyx() {
    return 24;
  },
  /*typed_data.Float32x4.xzyy*/get xzyy() {
    return 88;
  },
  /*typed_data.Float32x4.xzyz*/get xzyz() {
    return 152;
  },
  /*typed_data.Float32x4.xzyw*/get xzyw() {
    return 216;
  },
  /*typed_data.Float32x4.xzzx*/get xzzx() {
    return 40;
  },
  /*typed_data.Float32x4.xzzy*/get xzzy() {
    return 104;
  },
  /*typed_data.Float32x4.xzzz*/get xzzz() {
    return 168;
  },
  /*typed_data.Float32x4.xzzw*/get xzzw() {
    return 232;
  },
  /*typed_data.Float32x4.xzwx*/get xzwx() {
    return 56;
  },
  /*typed_data.Float32x4.xzwy*/get xzwy() {
    return 120;
  },
  /*typed_data.Float32x4.xzwz*/get xzwz() {
    return 184;
  },
  /*typed_data.Float32x4.xzww*/get xzww() {
    return 248;
  },
  /*typed_data.Float32x4.xwxx*/get xwxx() {
    return 12;
  },
  /*typed_data.Float32x4.xwxy*/get xwxy() {
    return 76;
  },
  /*typed_data.Float32x4.xwxz*/get xwxz() {
    return 140;
  },
  /*typed_data.Float32x4.xwxw*/get xwxw() {
    return 204;
  },
  /*typed_data.Float32x4.xwyx*/get xwyx() {
    return 28;
  },
  /*typed_data.Float32x4.xwyy*/get xwyy() {
    return 92;
  },
  /*typed_data.Float32x4.xwyz*/get xwyz() {
    return 156;
  },
  /*typed_data.Float32x4.xwyw*/get xwyw() {
    return 220;
  },
  /*typed_data.Float32x4.xwzx*/get xwzx() {
    return 44;
  },
  /*typed_data.Float32x4.xwzy*/get xwzy() {
    return 108;
  },
  /*typed_data.Float32x4.xwzz*/get xwzz() {
    return 172;
  },
  /*typed_data.Float32x4.xwzw*/get xwzw() {
    return 236;
  },
  /*typed_data.Float32x4.xwwx*/get xwwx() {
    return 60;
  },
  /*typed_data.Float32x4.xwwy*/get xwwy() {
    return 124;
  },
  /*typed_data.Float32x4.xwwz*/get xwwz() {
    return 188;
  },
  /*typed_data.Float32x4.xwww*/get xwww() {
    return 252;
  },
  /*typed_data.Float32x4.yxxx*/get yxxx() {
    return 1;
  },
  /*typed_data.Float32x4.yxxy*/get yxxy() {
    return 65;
  },
  /*typed_data.Float32x4.yxxz*/get yxxz() {
    return 129;
  },
  /*typed_data.Float32x4.yxxw*/get yxxw() {
    return 193;
  },
  /*typed_data.Float32x4.yxyx*/get yxyx() {
    return 17;
  },
  /*typed_data.Float32x4.yxyy*/get yxyy() {
    return 81;
  },
  /*typed_data.Float32x4.yxyz*/get yxyz() {
    return 145;
  },
  /*typed_data.Float32x4.yxyw*/get yxyw() {
    return 209;
  },
  /*typed_data.Float32x4.yxzx*/get yxzx() {
    return 33;
  },
  /*typed_data.Float32x4.yxzy*/get yxzy() {
    return 97;
  },
  /*typed_data.Float32x4.yxzz*/get yxzz() {
    return 161;
  },
  /*typed_data.Float32x4.yxzw*/get yxzw() {
    return 225;
  },
  /*typed_data.Float32x4.yxwx*/get yxwx() {
    return 49;
  },
  /*typed_data.Float32x4.yxwy*/get yxwy() {
    return 113;
  },
  /*typed_data.Float32x4.yxwz*/get yxwz() {
    return 177;
  },
  /*typed_data.Float32x4.yxww*/get yxww() {
    return 241;
  },
  /*typed_data.Float32x4.yyxx*/get yyxx() {
    return 5;
  },
  /*typed_data.Float32x4.yyxy*/get yyxy() {
    return 69;
  },
  /*typed_data.Float32x4.yyxz*/get yyxz() {
    return 133;
  },
  /*typed_data.Float32x4.yyxw*/get yyxw() {
    return 197;
  },
  /*typed_data.Float32x4.yyyx*/get yyyx() {
    return 21;
  },
  /*typed_data.Float32x4.yyyy*/get yyyy() {
    return 85;
  },
  /*typed_data.Float32x4.yyyz*/get yyyz() {
    return 149;
  },
  /*typed_data.Float32x4.yyyw*/get yyyw() {
    return 213;
  },
  /*typed_data.Float32x4.yyzx*/get yyzx() {
    return 37;
  },
  /*typed_data.Float32x4.yyzy*/get yyzy() {
    return 101;
  },
  /*typed_data.Float32x4.yyzz*/get yyzz() {
    return 165;
  },
  /*typed_data.Float32x4.yyzw*/get yyzw() {
    return 229;
  },
  /*typed_data.Float32x4.yywx*/get yywx() {
    return 53;
  },
  /*typed_data.Float32x4.yywy*/get yywy() {
    return 117;
  },
  /*typed_data.Float32x4.yywz*/get yywz() {
    return 181;
  },
  /*typed_data.Float32x4.yyww*/get yyww() {
    return 245;
  },
  /*typed_data.Float32x4.yzxx*/get yzxx() {
    return 9;
  },
  /*typed_data.Float32x4.yzxy*/get yzxy() {
    return 73;
  },
  /*typed_data.Float32x4.yzxz*/get yzxz() {
    return 137;
  },
  /*typed_data.Float32x4.yzxw*/get yzxw() {
    return 201;
  },
  /*typed_data.Float32x4.yzyx*/get yzyx() {
    return 25;
  },
  /*typed_data.Float32x4.yzyy*/get yzyy() {
    return 89;
  },
  /*typed_data.Float32x4.yzyz*/get yzyz() {
    return 153;
  },
  /*typed_data.Float32x4.yzyw*/get yzyw() {
    return 217;
  },
  /*typed_data.Float32x4.yzzx*/get yzzx() {
    return 41;
  },
  /*typed_data.Float32x4.yzzy*/get yzzy() {
    return 105;
  },
  /*typed_data.Float32x4.yzzz*/get yzzz() {
    return 169;
  },
  /*typed_data.Float32x4.yzzw*/get yzzw() {
    return 233;
  },
  /*typed_data.Float32x4.yzwx*/get yzwx() {
    return 57;
  },
  /*typed_data.Float32x4.yzwy*/get yzwy() {
    return 121;
  },
  /*typed_data.Float32x4.yzwz*/get yzwz() {
    return 185;
  },
  /*typed_data.Float32x4.yzww*/get yzww() {
    return 249;
  },
  /*typed_data.Float32x4.ywxx*/get ywxx() {
    return 13;
  },
  /*typed_data.Float32x4.ywxy*/get ywxy() {
    return 77;
  },
  /*typed_data.Float32x4.ywxz*/get ywxz() {
    return 141;
  },
  /*typed_data.Float32x4.ywxw*/get ywxw() {
    return 205;
  },
  /*typed_data.Float32x4.ywyx*/get ywyx() {
    return 29;
  },
  /*typed_data.Float32x4.ywyy*/get ywyy() {
    return 93;
  },
  /*typed_data.Float32x4.ywyz*/get ywyz() {
    return 157;
  },
  /*typed_data.Float32x4.ywyw*/get ywyw() {
    return 221;
  },
  /*typed_data.Float32x4.ywzx*/get ywzx() {
    return 45;
  },
  /*typed_data.Float32x4.ywzy*/get ywzy() {
    return 109;
  },
  /*typed_data.Float32x4.ywzz*/get ywzz() {
    return 173;
  },
  /*typed_data.Float32x4.ywzw*/get ywzw() {
    return 237;
  },
  /*typed_data.Float32x4.ywwx*/get ywwx() {
    return 61;
  },
  /*typed_data.Float32x4.ywwy*/get ywwy() {
    return 125;
  },
  /*typed_data.Float32x4.ywwz*/get ywwz() {
    return 189;
  },
  /*typed_data.Float32x4.ywww*/get ywww() {
    return 253;
  },
  /*typed_data.Float32x4.zxxx*/get zxxx() {
    return 2;
  },
  /*typed_data.Float32x4.zxxy*/get zxxy() {
    return 66;
  },
  /*typed_data.Float32x4.zxxz*/get zxxz() {
    return 130;
  },
  /*typed_data.Float32x4.zxxw*/get zxxw() {
    return 194;
  },
  /*typed_data.Float32x4.zxyx*/get zxyx() {
    return 18;
  },
  /*typed_data.Float32x4.zxyy*/get zxyy() {
    return 82;
  },
  /*typed_data.Float32x4.zxyz*/get zxyz() {
    return 146;
  },
  /*typed_data.Float32x4.zxyw*/get zxyw() {
    return 210;
  },
  /*typed_data.Float32x4.zxzx*/get zxzx() {
    return 34;
  },
  /*typed_data.Float32x4.zxzy*/get zxzy() {
    return 98;
  },
  /*typed_data.Float32x4.zxzz*/get zxzz() {
    return 162;
  },
  /*typed_data.Float32x4.zxzw*/get zxzw() {
    return 226;
  },
  /*typed_data.Float32x4.zxwx*/get zxwx() {
    return 50;
  },
  /*typed_data.Float32x4.zxwy*/get zxwy() {
    return 114;
  },
  /*typed_data.Float32x4.zxwz*/get zxwz() {
    return 178;
  },
  /*typed_data.Float32x4.zxww*/get zxww() {
    return 242;
  },
  /*typed_data.Float32x4.zyxx*/get zyxx() {
    return 6;
  },
  /*typed_data.Float32x4.zyxy*/get zyxy() {
    return 70;
  },
  /*typed_data.Float32x4.zyxz*/get zyxz() {
    return 134;
  },
  /*typed_data.Float32x4.zyxw*/get zyxw() {
    return 198;
  },
  /*typed_data.Float32x4.zyyx*/get zyyx() {
    return 22;
  },
  /*typed_data.Float32x4.zyyy*/get zyyy() {
    return 86;
  },
  /*typed_data.Float32x4.zyyz*/get zyyz() {
    return 150;
  },
  /*typed_data.Float32x4.zyyw*/get zyyw() {
    return 214;
  },
  /*typed_data.Float32x4.zyzx*/get zyzx() {
    return 38;
  },
  /*typed_data.Float32x4.zyzy*/get zyzy() {
    return 102;
  },
  /*typed_data.Float32x4.zyzz*/get zyzz() {
    return 166;
  },
  /*typed_data.Float32x4.zyzw*/get zyzw() {
    return 230;
  },
  /*typed_data.Float32x4.zywx*/get zywx() {
    return 54;
  },
  /*typed_data.Float32x4.zywy*/get zywy() {
    return 118;
  },
  /*typed_data.Float32x4.zywz*/get zywz() {
    return 182;
  },
  /*typed_data.Float32x4.zyww*/get zyww() {
    return 246;
  },
  /*typed_data.Float32x4.zzxx*/get zzxx() {
    return 10;
  },
  /*typed_data.Float32x4.zzxy*/get zzxy() {
    return 74;
  },
  /*typed_data.Float32x4.zzxz*/get zzxz() {
    return 138;
  },
  /*typed_data.Float32x4.zzxw*/get zzxw() {
    return 202;
  },
  /*typed_data.Float32x4.zzyx*/get zzyx() {
    return 26;
  },
  /*typed_data.Float32x4.zzyy*/get zzyy() {
    return 90;
  },
  /*typed_data.Float32x4.zzyz*/get zzyz() {
    return 154;
  },
  /*typed_data.Float32x4.zzyw*/get zzyw() {
    return 218;
  },
  /*typed_data.Float32x4.zzzx*/get zzzx() {
    return 42;
  },
  /*typed_data.Float32x4.zzzy*/get zzzy() {
    return 106;
  },
  /*typed_data.Float32x4.zzzz*/get zzzz() {
    return 170;
  },
  /*typed_data.Float32x4.zzzw*/get zzzw() {
    return 234;
  },
  /*typed_data.Float32x4.zzwx*/get zzwx() {
    return 58;
  },
  /*typed_data.Float32x4.zzwy*/get zzwy() {
    return 122;
  },
  /*typed_data.Float32x4.zzwz*/get zzwz() {
    return 186;
  },
  /*typed_data.Float32x4.zzww*/get zzww() {
    return 250;
  },
  /*typed_data.Float32x4.zwxx*/get zwxx() {
    return 14;
  },
  /*typed_data.Float32x4.zwxy*/get zwxy() {
    return 78;
  },
  /*typed_data.Float32x4.zwxz*/get zwxz() {
    return 142;
  },
  /*typed_data.Float32x4.zwxw*/get zwxw() {
    return 206;
  },
  /*typed_data.Float32x4.zwyx*/get zwyx() {
    return 30;
  },
  /*typed_data.Float32x4.zwyy*/get zwyy() {
    return 94;
  },
  /*typed_data.Float32x4.zwyz*/get zwyz() {
    return 158;
  },
  /*typed_data.Float32x4.zwyw*/get zwyw() {
    return 222;
  },
  /*typed_data.Float32x4.zwzx*/get zwzx() {
    return 46;
  },
  /*typed_data.Float32x4.zwzy*/get zwzy() {
    return 110;
  },
  /*typed_data.Float32x4.zwzz*/get zwzz() {
    return 174;
  },
  /*typed_data.Float32x4.zwzw*/get zwzw() {
    return 238;
  },
  /*typed_data.Float32x4.zwwx*/get zwwx() {
    return 62;
  },
  /*typed_data.Float32x4.zwwy*/get zwwy() {
    return 126;
  },
  /*typed_data.Float32x4.zwwz*/get zwwz() {
    return 190;
  },
  /*typed_data.Float32x4.zwww*/get zwww() {
    return 254;
  },
  /*typed_data.Float32x4.wxxx*/get wxxx() {
    return 3;
  },
  /*typed_data.Float32x4.wxxy*/get wxxy() {
    return 67;
  },
  /*typed_data.Float32x4.wxxz*/get wxxz() {
    return 131;
  },
  /*typed_data.Float32x4.wxxw*/get wxxw() {
    return 195;
  },
  /*typed_data.Float32x4.wxyx*/get wxyx() {
    return 19;
  },
  /*typed_data.Float32x4.wxyy*/get wxyy() {
    return 83;
  },
  /*typed_data.Float32x4.wxyz*/get wxyz() {
    return 147;
  },
  /*typed_data.Float32x4.wxyw*/get wxyw() {
    return 211;
  },
  /*typed_data.Float32x4.wxzx*/get wxzx() {
    return 35;
  },
  /*typed_data.Float32x4.wxzy*/get wxzy() {
    return 99;
  },
  /*typed_data.Float32x4.wxzz*/get wxzz() {
    return 163;
  },
  /*typed_data.Float32x4.wxzw*/get wxzw() {
    return 227;
  },
  /*typed_data.Float32x4.wxwx*/get wxwx() {
    return 51;
  },
  /*typed_data.Float32x4.wxwy*/get wxwy() {
    return 115;
  },
  /*typed_data.Float32x4.wxwz*/get wxwz() {
    return 179;
  },
  /*typed_data.Float32x4.wxww*/get wxww() {
    return 243;
  },
  /*typed_data.Float32x4.wyxx*/get wyxx() {
    return 7;
  },
  /*typed_data.Float32x4.wyxy*/get wyxy() {
    return 71;
  },
  /*typed_data.Float32x4.wyxz*/get wyxz() {
    return 135;
  },
  /*typed_data.Float32x4.wyxw*/get wyxw() {
    return 199;
  },
  /*typed_data.Float32x4.wyyx*/get wyyx() {
    return 23;
  },
  /*typed_data.Float32x4.wyyy*/get wyyy() {
    return 87;
  },
  /*typed_data.Float32x4.wyyz*/get wyyz() {
    return 151;
  },
  /*typed_data.Float32x4.wyyw*/get wyyw() {
    return 215;
  },
  /*typed_data.Float32x4.wyzx*/get wyzx() {
    return 39;
  },
  /*typed_data.Float32x4.wyzy*/get wyzy() {
    return 103;
  },
  /*typed_data.Float32x4.wyzz*/get wyzz() {
    return 167;
  },
  /*typed_data.Float32x4.wyzw*/get wyzw() {
    return 231;
  },
  /*typed_data.Float32x4.wywx*/get wywx() {
    return 55;
  },
  /*typed_data.Float32x4.wywy*/get wywy() {
    return 119;
  },
  /*typed_data.Float32x4.wywz*/get wywz() {
    return 183;
  },
  /*typed_data.Float32x4.wyww*/get wyww() {
    return 247;
  },
  /*typed_data.Float32x4.wzxx*/get wzxx() {
    return 11;
  },
  /*typed_data.Float32x4.wzxy*/get wzxy() {
    return 75;
  },
  /*typed_data.Float32x4.wzxz*/get wzxz() {
    return 139;
  },
  /*typed_data.Float32x4.wzxw*/get wzxw() {
    return 203;
  },
  /*typed_data.Float32x4.wzyx*/get wzyx() {
    return 27;
  },
  /*typed_data.Float32x4.wzyy*/get wzyy() {
    return 91;
  },
  /*typed_data.Float32x4.wzyz*/get wzyz() {
    return 155;
  },
  /*typed_data.Float32x4.wzyw*/get wzyw() {
    return 219;
  },
  /*typed_data.Float32x4.wzzx*/get wzzx() {
    return 43;
  },
  /*typed_data.Float32x4.wzzy*/get wzzy() {
    return 107;
  },
  /*typed_data.Float32x4.wzzz*/get wzzz() {
    return 171;
  },
  /*typed_data.Float32x4.wzzw*/get wzzw() {
    return 235;
  },
  /*typed_data.Float32x4.wzwx*/get wzwx() {
    return 59;
  },
  /*typed_data.Float32x4.wzwy*/get wzwy() {
    return 123;
  },
  /*typed_data.Float32x4.wzwz*/get wzwz() {
    return 187;
  },
  /*typed_data.Float32x4.wzww*/get wzww() {
    return 251;
  },
  /*typed_data.Float32x4.wwxx*/get wwxx() {
    return 15;
  },
  /*typed_data.Float32x4.wwxy*/get wwxy() {
    return 79;
  },
  /*typed_data.Float32x4.wwxz*/get wwxz() {
    return 143;
  },
  /*typed_data.Float32x4.wwxw*/get wwxw() {
    return 207;
  },
  /*typed_data.Float32x4.wwyx*/get wwyx() {
    return 31;
  },
  /*typed_data.Float32x4.wwyy*/get wwyy() {
    return 95;
  },
  /*typed_data.Float32x4.wwyz*/get wwyz() {
    return 159;
  },
  /*typed_data.Float32x4.wwyw*/get wwyw() {
    return 223;
  },
  /*typed_data.Float32x4.wwzx*/get wwzx() {
    return 47;
  },
  /*typed_data.Float32x4.wwzy*/get wwzy() {
    return 111;
  },
  /*typed_data.Float32x4.wwzz*/get wwzz() {
    return 175;
  },
  /*typed_data.Float32x4.wwzw*/get wwzw() {
    return 239;
  },
  /*typed_data.Float32x4.wwwx*/get wwwx() {
    return 63;
  },
  /*typed_data.Float32x4.wwwy*/get wwwy() {
    return 127;
  },
  /*typed_data.Float32x4.wwwz*/get wwwz() {
    return 191;
  },
  /*typed_data.Float32x4.wwww*/get wwww() {
    return 255;
  }
});
const Object_ListMixin$ = class Object_ListMixin extends core.Object {};
(Object_ListMixin$.new = function() {
}).prototype = Object_ListMixin$.prototype;
dart.applyMixin(Object_ListMixin$, collection.ListMixin$(typed_data.Float32x4));
const Object_FixedLengthListMixin$ = class Object_FixedLengthListMixin extends Object_ListMixin$ {};
(Object_FixedLengthListMixin$.new = function() {
}).prototype = Object_FixedLengthListMixin$.prototype;
dart.applyMixin(Object_FixedLengthListMixin$, _internal.FixedLengthListMixin$(typed_data.Float32x4));
_native_typed_data.NativeFloat32x4List = class NativeFloat32x4List extends Object_FixedLengthListMixin$ {
  get runtimeType() {
    return dart.wrapType(typed_data.Float32x4List);
  }
  static fromList(list) {
    if (_native_typed_data.NativeFloat32x4List.is(list)) {
      return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List.fromList(list[_storage]));
    } else {
      return new _native_typed_data.NativeFloat32x4List._slowFromList(list);
    }
  }
  get buffer() {
    return this[_storage].buffer;
  }
  get lengthInBytes() {
    return this[_storage][$lengthInBytes];
  }
  get offsetInBytes() {
    return this[_storage][$offsetInBytes];
  }
  get elementSizeInBytes() {
    return typed_data.Float32x4List.bytesPerElement;
  }
  get length() {
    return (dart.notNull(this[_storage][$length]) / 4)[$truncate]();
  }
  set length(value) {
    super.length = value;
  }
  _get(index) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    let _x = this[_storage][$_get](dart.notNull(index) * 4 + 0);
    let _y = this[_storage][$_get](dart.notNull(index) * 4 + 1);
    let _z = this[_storage][$_get](dart.notNull(index) * 4 + 2);
    let _w = this[_storage][$_get](dart.notNull(index) * 4 + 3);
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  _set(index, value) {
    typed_data.Float32x4._check(value);
    _native_typed_data._checkValidIndex(index, this, this.length);
    this[_storage][$_set](dart.notNull(index) * 4 + 0, value.x);
    this[_storage][$_set](dart.notNull(index) * 4 + 1, value.y);
    this[_storage][$_set](dart.notNull(index) * 4 + 2, value.z);
    this[_storage][$_set](dart.notNull(index) * 4 + 3, value.w);
    return value;
  }
  sublist(start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this.length);
    return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List._check(this[_storage][$sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
  }
};
(_native_typed_data.NativeFloat32x4List.new = function(length) {
  this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(length) * 4);
}).prototype = _native_typed_data.NativeFloat32x4List.prototype;
(_native_typed_data.NativeFloat32x4List._externalStorage = function(storage) {
  this[_storage] = storage;
}).prototype = _native_typed_data.NativeFloat32x4List.prototype;
(_native_typed_data.NativeFloat32x4List._slowFromList = function(list) {
  this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(list[$length]) * 4);
  for (let i = 0; i < dart.notNull(list[$length]); i++) {
    let e = list[$_get](i);
    this[_storage][$_set](i * 4 + 0, e.x);
    this[_storage][$_set](i * 4 + 1, e.y);
    this[_storage][$_set](i * 4 + 2, e.z);
    this[_storage][$_set](i * 4 + 3, e.w);
  }
}).prototype = _native_typed_data.NativeFloat32x4List.prototype;
dart.addTypeTests(_native_typed_data.NativeFloat32x4List);
_native_typed_data.NativeFloat32x4List[dart.implements] = () => [typed_data.Float32x4List];
dart.setMethodSignature(_native_typed_data.NativeFloat32x4List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeFloat32x4List.__proto__),
  _get: dart.fnType(typed_data.Float32x4, [core.int]),
  [$_get]: dart.fnType(typed_data.Float32x4, [core.int]),
  _set: dart.fnType(dart.void, [core.int, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  sublist: dart.fnType(core.List$(typed_data.Float32x4), [core.int], [core.int]),
  [$sublist]: dart.fnType(core.List$(typed_data.Float32x4), [core.int], [core.int])
}));
dart.setGetterSignature(_native_typed_data.NativeFloat32x4List, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeFloat32x4List.__proto__),
  buffer: typed_data.ByteBuffer,
  [$buffer]: typed_data.ByteBuffer,
  lengthInBytes: core.int,
  [$lengthInBytes]: core.int,
  offsetInBytes: core.int,
  [$offsetInBytes]: core.int,
  elementSizeInBytes: core.int,
  [$elementSizeInBytes]: core.int,
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeFloat32x4List, "dart:_native_typed_data");
dart.setFieldSignature(_native_typed_data.NativeFloat32x4List, () => ({
  __proto__: dart.getFields(_native_typed_data.NativeFloat32x4List.__proto__),
  [_storage]: dart.finalFieldType(_native_typed_data.NativeFloat32List)
}));
dart.defineExtensionMethods(_native_typed_data.NativeFloat32x4List, ['_get', '_set', 'sublist']);
dart.defineExtensionAccessors(_native_typed_data.NativeFloat32x4List, [
  'runtimeType',
  'buffer',
  'lengthInBytes',
  'offsetInBytes',
  'elementSizeInBytes',
  'length'
]);
typed_data.Int32x4 = class Int32x4 extends core.Object {
  static new(x, y, z, w) {
    return new _native_typed_data.NativeInt32x4.new(x, y, z, w);
  }
  static bool(x, y, z, w) {
    return new _native_typed_data.NativeInt32x4.bool(x, y, z, w);
  }
  static fromFloat32x4Bits(x) {
    return _native_typed_data.NativeInt32x4.fromFloat32x4Bits(x);
  }
};
(typed_data.Int32x4[dart.mixinNew] = function() {
}).prototype = typed_data.Int32x4.prototype;
dart.addTypeTests(typed_data.Int32x4);
dart.setLibraryUri(typed_data.Int32x4, "dart:typed_data");
dart.defineLazy(typed_data.Int32x4, {
  /*typed_data.Int32x4.xxxx*/get xxxx() {
    return 0;
  },
  /*typed_data.Int32x4.xxxy*/get xxxy() {
    return 64;
  },
  /*typed_data.Int32x4.xxxz*/get xxxz() {
    return 128;
  },
  /*typed_data.Int32x4.xxxw*/get xxxw() {
    return 192;
  },
  /*typed_data.Int32x4.xxyx*/get xxyx() {
    return 16;
  },
  /*typed_data.Int32x4.xxyy*/get xxyy() {
    return 80;
  },
  /*typed_data.Int32x4.xxyz*/get xxyz() {
    return 144;
  },
  /*typed_data.Int32x4.xxyw*/get xxyw() {
    return 208;
  },
  /*typed_data.Int32x4.xxzx*/get xxzx() {
    return 32;
  },
  /*typed_data.Int32x4.xxzy*/get xxzy() {
    return 96;
  },
  /*typed_data.Int32x4.xxzz*/get xxzz() {
    return 160;
  },
  /*typed_data.Int32x4.xxzw*/get xxzw() {
    return 224;
  },
  /*typed_data.Int32x4.xxwx*/get xxwx() {
    return 48;
  },
  /*typed_data.Int32x4.xxwy*/get xxwy() {
    return 112;
  },
  /*typed_data.Int32x4.xxwz*/get xxwz() {
    return 176;
  },
  /*typed_data.Int32x4.xxww*/get xxww() {
    return 240;
  },
  /*typed_data.Int32x4.xyxx*/get xyxx() {
    return 4;
  },
  /*typed_data.Int32x4.xyxy*/get xyxy() {
    return 68;
  },
  /*typed_data.Int32x4.xyxz*/get xyxz() {
    return 132;
  },
  /*typed_data.Int32x4.xyxw*/get xyxw() {
    return 196;
  },
  /*typed_data.Int32x4.xyyx*/get xyyx() {
    return 20;
  },
  /*typed_data.Int32x4.xyyy*/get xyyy() {
    return 84;
  },
  /*typed_data.Int32x4.xyyz*/get xyyz() {
    return 148;
  },
  /*typed_data.Int32x4.xyyw*/get xyyw() {
    return 212;
  },
  /*typed_data.Int32x4.xyzx*/get xyzx() {
    return 36;
  },
  /*typed_data.Int32x4.xyzy*/get xyzy() {
    return 100;
  },
  /*typed_data.Int32x4.xyzz*/get xyzz() {
    return 164;
  },
  /*typed_data.Int32x4.xyzw*/get xyzw() {
    return 228;
  },
  /*typed_data.Int32x4.xywx*/get xywx() {
    return 52;
  },
  /*typed_data.Int32x4.xywy*/get xywy() {
    return 116;
  },
  /*typed_data.Int32x4.xywz*/get xywz() {
    return 180;
  },
  /*typed_data.Int32x4.xyww*/get xyww() {
    return 244;
  },
  /*typed_data.Int32x4.xzxx*/get xzxx() {
    return 8;
  },
  /*typed_data.Int32x4.xzxy*/get xzxy() {
    return 72;
  },
  /*typed_data.Int32x4.xzxz*/get xzxz() {
    return 136;
  },
  /*typed_data.Int32x4.xzxw*/get xzxw() {
    return 200;
  },
  /*typed_data.Int32x4.xzyx*/get xzyx() {
    return 24;
  },
  /*typed_data.Int32x4.xzyy*/get xzyy() {
    return 88;
  },
  /*typed_data.Int32x4.xzyz*/get xzyz() {
    return 152;
  },
  /*typed_data.Int32x4.xzyw*/get xzyw() {
    return 216;
  },
  /*typed_data.Int32x4.xzzx*/get xzzx() {
    return 40;
  },
  /*typed_data.Int32x4.xzzy*/get xzzy() {
    return 104;
  },
  /*typed_data.Int32x4.xzzz*/get xzzz() {
    return 168;
  },
  /*typed_data.Int32x4.xzzw*/get xzzw() {
    return 232;
  },
  /*typed_data.Int32x4.xzwx*/get xzwx() {
    return 56;
  },
  /*typed_data.Int32x4.xzwy*/get xzwy() {
    return 120;
  },
  /*typed_data.Int32x4.xzwz*/get xzwz() {
    return 184;
  },
  /*typed_data.Int32x4.xzww*/get xzww() {
    return 248;
  },
  /*typed_data.Int32x4.xwxx*/get xwxx() {
    return 12;
  },
  /*typed_data.Int32x4.xwxy*/get xwxy() {
    return 76;
  },
  /*typed_data.Int32x4.xwxz*/get xwxz() {
    return 140;
  },
  /*typed_data.Int32x4.xwxw*/get xwxw() {
    return 204;
  },
  /*typed_data.Int32x4.xwyx*/get xwyx() {
    return 28;
  },
  /*typed_data.Int32x4.xwyy*/get xwyy() {
    return 92;
  },
  /*typed_data.Int32x4.xwyz*/get xwyz() {
    return 156;
  },
  /*typed_data.Int32x4.xwyw*/get xwyw() {
    return 220;
  },
  /*typed_data.Int32x4.xwzx*/get xwzx() {
    return 44;
  },
  /*typed_data.Int32x4.xwzy*/get xwzy() {
    return 108;
  },
  /*typed_data.Int32x4.xwzz*/get xwzz() {
    return 172;
  },
  /*typed_data.Int32x4.xwzw*/get xwzw() {
    return 236;
  },
  /*typed_data.Int32x4.xwwx*/get xwwx() {
    return 60;
  },
  /*typed_data.Int32x4.xwwy*/get xwwy() {
    return 124;
  },
  /*typed_data.Int32x4.xwwz*/get xwwz() {
    return 188;
  },
  /*typed_data.Int32x4.xwww*/get xwww() {
    return 252;
  },
  /*typed_data.Int32x4.yxxx*/get yxxx() {
    return 1;
  },
  /*typed_data.Int32x4.yxxy*/get yxxy() {
    return 65;
  },
  /*typed_data.Int32x4.yxxz*/get yxxz() {
    return 129;
  },
  /*typed_data.Int32x4.yxxw*/get yxxw() {
    return 193;
  },
  /*typed_data.Int32x4.yxyx*/get yxyx() {
    return 17;
  },
  /*typed_data.Int32x4.yxyy*/get yxyy() {
    return 81;
  },
  /*typed_data.Int32x4.yxyz*/get yxyz() {
    return 145;
  },
  /*typed_data.Int32x4.yxyw*/get yxyw() {
    return 209;
  },
  /*typed_data.Int32x4.yxzx*/get yxzx() {
    return 33;
  },
  /*typed_data.Int32x4.yxzy*/get yxzy() {
    return 97;
  },
  /*typed_data.Int32x4.yxzz*/get yxzz() {
    return 161;
  },
  /*typed_data.Int32x4.yxzw*/get yxzw() {
    return 225;
  },
  /*typed_data.Int32x4.yxwx*/get yxwx() {
    return 49;
  },
  /*typed_data.Int32x4.yxwy*/get yxwy() {
    return 113;
  },
  /*typed_data.Int32x4.yxwz*/get yxwz() {
    return 177;
  },
  /*typed_data.Int32x4.yxww*/get yxww() {
    return 241;
  },
  /*typed_data.Int32x4.yyxx*/get yyxx() {
    return 5;
  },
  /*typed_data.Int32x4.yyxy*/get yyxy() {
    return 69;
  },
  /*typed_data.Int32x4.yyxz*/get yyxz() {
    return 133;
  },
  /*typed_data.Int32x4.yyxw*/get yyxw() {
    return 197;
  },
  /*typed_data.Int32x4.yyyx*/get yyyx() {
    return 21;
  },
  /*typed_data.Int32x4.yyyy*/get yyyy() {
    return 85;
  },
  /*typed_data.Int32x4.yyyz*/get yyyz() {
    return 149;
  },
  /*typed_data.Int32x4.yyyw*/get yyyw() {
    return 213;
  },
  /*typed_data.Int32x4.yyzx*/get yyzx() {
    return 37;
  },
  /*typed_data.Int32x4.yyzy*/get yyzy() {
    return 101;
  },
  /*typed_data.Int32x4.yyzz*/get yyzz() {
    return 165;
  },
  /*typed_data.Int32x4.yyzw*/get yyzw() {
    return 229;
  },
  /*typed_data.Int32x4.yywx*/get yywx() {
    return 53;
  },
  /*typed_data.Int32x4.yywy*/get yywy() {
    return 117;
  },
  /*typed_data.Int32x4.yywz*/get yywz() {
    return 181;
  },
  /*typed_data.Int32x4.yyww*/get yyww() {
    return 245;
  },
  /*typed_data.Int32x4.yzxx*/get yzxx() {
    return 9;
  },
  /*typed_data.Int32x4.yzxy*/get yzxy() {
    return 73;
  },
  /*typed_data.Int32x4.yzxz*/get yzxz() {
    return 137;
  },
  /*typed_data.Int32x4.yzxw*/get yzxw() {
    return 201;
  },
  /*typed_data.Int32x4.yzyx*/get yzyx() {
    return 25;
  },
  /*typed_data.Int32x4.yzyy*/get yzyy() {
    return 89;
  },
  /*typed_data.Int32x4.yzyz*/get yzyz() {
    return 153;
  },
  /*typed_data.Int32x4.yzyw*/get yzyw() {
    return 217;
  },
  /*typed_data.Int32x4.yzzx*/get yzzx() {
    return 41;
  },
  /*typed_data.Int32x4.yzzy*/get yzzy() {
    return 105;
  },
  /*typed_data.Int32x4.yzzz*/get yzzz() {
    return 169;
  },
  /*typed_data.Int32x4.yzzw*/get yzzw() {
    return 233;
  },
  /*typed_data.Int32x4.yzwx*/get yzwx() {
    return 57;
  },
  /*typed_data.Int32x4.yzwy*/get yzwy() {
    return 121;
  },
  /*typed_data.Int32x4.yzwz*/get yzwz() {
    return 185;
  },
  /*typed_data.Int32x4.yzww*/get yzww() {
    return 249;
  },
  /*typed_data.Int32x4.ywxx*/get ywxx() {
    return 13;
  },
  /*typed_data.Int32x4.ywxy*/get ywxy() {
    return 77;
  },
  /*typed_data.Int32x4.ywxz*/get ywxz() {
    return 141;
  },
  /*typed_data.Int32x4.ywxw*/get ywxw() {
    return 205;
  },
  /*typed_data.Int32x4.ywyx*/get ywyx() {
    return 29;
  },
  /*typed_data.Int32x4.ywyy*/get ywyy() {
    return 93;
  },
  /*typed_data.Int32x4.ywyz*/get ywyz() {
    return 157;
  },
  /*typed_data.Int32x4.ywyw*/get ywyw() {
    return 221;
  },
  /*typed_data.Int32x4.ywzx*/get ywzx() {
    return 45;
  },
  /*typed_data.Int32x4.ywzy*/get ywzy() {
    return 109;
  },
  /*typed_data.Int32x4.ywzz*/get ywzz() {
    return 173;
  },
  /*typed_data.Int32x4.ywzw*/get ywzw() {
    return 237;
  },
  /*typed_data.Int32x4.ywwx*/get ywwx() {
    return 61;
  },
  /*typed_data.Int32x4.ywwy*/get ywwy() {
    return 125;
  },
  /*typed_data.Int32x4.ywwz*/get ywwz() {
    return 189;
  },
  /*typed_data.Int32x4.ywww*/get ywww() {
    return 253;
  },
  /*typed_data.Int32x4.zxxx*/get zxxx() {
    return 2;
  },
  /*typed_data.Int32x4.zxxy*/get zxxy() {
    return 66;
  },
  /*typed_data.Int32x4.zxxz*/get zxxz() {
    return 130;
  },
  /*typed_data.Int32x4.zxxw*/get zxxw() {
    return 194;
  },
  /*typed_data.Int32x4.zxyx*/get zxyx() {
    return 18;
  },
  /*typed_data.Int32x4.zxyy*/get zxyy() {
    return 82;
  },
  /*typed_data.Int32x4.zxyz*/get zxyz() {
    return 146;
  },
  /*typed_data.Int32x4.zxyw*/get zxyw() {
    return 210;
  },
  /*typed_data.Int32x4.zxzx*/get zxzx() {
    return 34;
  },
  /*typed_data.Int32x4.zxzy*/get zxzy() {
    return 98;
  },
  /*typed_data.Int32x4.zxzz*/get zxzz() {
    return 162;
  },
  /*typed_data.Int32x4.zxzw*/get zxzw() {
    return 226;
  },
  /*typed_data.Int32x4.zxwx*/get zxwx() {
    return 50;
  },
  /*typed_data.Int32x4.zxwy*/get zxwy() {
    return 114;
  },
  /*typed_data.Int32x4.zxwz*/get zxwz() {
    return 178;
  },
  /*typed_data.Int32x4.zxww*/get zxww() {
    return 242;
  },
  /*typed_data.Int32x4.zyxx*/get zyxx() {
    return 6;
  },
  /*typed_data.Int32x4.zyxy*/get zyxy() {
    return 70;
  },
  /*typed_data.Int32x4.zyxz*/get zyxz() {
    return 134;
  },
  /*typed_data.Int32x4.zyxw*/get zyxw() {
    return 198;
  },
  /*typed_data.Int32x4.zyyx*/get zyyx() {
    return 22;
  },
  /*typed_data.Int32x4.zyyy*/get zyyy() {
    return 86;
  },
  /*typed_data.Int32x4.zyyz*/get zyyz() {
    return 150;
  },
  /*typed_data.Int32x4.zyyw*/get zyyw() {
    return 214;
  },
  /*typed_data.Int32x4.zyzx*/get zyzx() {
    return 38;
  },
  /*typed_data.Int32x4.zyzy*/get zyzy() {
    return 102;
  },
  /*typed_data.Int32x4.zyzz*/get zyzz() {
    return 166;
  },
  /*typed_data.Int32x4.zyzw*/get zyzw() {
    return 230;
  },
  /*typed_data.Int32x4.zywx*/get zywx() {
    return 54;
  },
  /*typed_data.Int32x4.zywy*/get zywy() {
    return 118;
  },
  /*typed_data.Int32x4.zywz*/get zywz() {
    return 182;
  },
  /*typed_data.Int32x4.zyww*/get zyww() {
    return 246;
  },
  /*typed_data.Int32x4.zzxx*/get zzxx() {
    return 10;
  },
  /*typed_data.Int32x4.zzxy*/get zzxy() {
    return 74;
  },
  /*typed_data.Int32x4.zzxz*/get zzxz() {
    return 138;
  },
  /*typed_data.Int32x4.zzxw*/get zzxw() {
    return 202;
  },
  /*typed_data.Int32x4.zzyx*/get zzyx() {
    return 26;
  },
  /*typed_data.Int32x4.zzyy*/get zzyy() {
    return 90;
  },
  /*typed_data.Int32x4.zzyz*/get zzyz() {
    return 154;
  },
  /*typed_data.Int32x4.zzyw*/get zzyw() {
    return 218;
  },
  /*typed_data.Int32x4.zzzx*/get zzzx() {
    return 42;
  },
  /*typed_data.Int32x4.zzzy*/get zzzy() {
    return 106;
  },
  /*typed_data.Int32x4.zzzz*/get zzzz() {
    return 170;
  },
  /*typed_data.Int32x4.zzzw*/get zzzw() {
    return 234;
  },
  /*typed_data.Int32x4.zzwx*/get zzwx() {
    return 58;
  },
  /*typed_data.Int32x4.zzwy*/get zzwy() {
    return 122;
  },
  /*typed_data.Int32x4.zzwz*/get zzwz() {
    return 186;
  },
  /*typed_data.Int32x4.zzww*/get zzww() {
    return 250;
  },
  /*typed_data.Int32x4.zwxx*/get zwxx() {
    return 14;
  },
  /*typed_data.Int32x4.zwxy*/get zwxy() {
    return 78;
  },
  /*typed_data.Int32x4.zwxz*/get zwxz() {
    return 142;
  },
  /*typed_data.Int32x4.zwxw*/get zwxw() {
    return 206;
  },
  /*typed_data.Int32x4.zwyx*/get zwyx() {
    return 30;
  },
  /*typed_data.Int32x4.zwyy*/get zwyy() {
    return 94;
  },
  /*typed_data.Int32x4.zwyz*/get zwyz() {
    return 158;
  },
  /*typed_data.Int32x4.zwyw*/get zwyw() {
    return 222;
  },
  /*typed_data.Int32x4.zwzx*/get zwzx() {
    return 46;
  },
  /*typed_data.Int32x4.zwzy*/get zwzy() {
    return 110;
  },
  /*typed_data.Int32x4.zwzz*/get zwzz() {
    return 174;
  },
  /*typed_data.Int32x4.zwzw*/get zwzw() {
    return 238;
  },
  /*typed_data.Int32x4.zwwx*/get zwwx() {
    return 62;
  },
  /*typed_data.Int32x4.zwwy*/get zwwy() {
    return 126;
  },
  /*typed_data.Int32x4.zwwz*/get zwwz() {
    return 190;
  },
  /*typed_data.Int32x4.zwww*/get zwww() {
    return 254;
  },
  /*typed_data.Int32x4.wxxx*/get wxxx() {
    return 3;
  },
  /*typed_data.Int32x4.wxxy*/get wxxy() {
    return 67;
  },
  /*typed_data.Int32x4.wxxz*/get wxxz() {
    return 131;
  },
  /*typed_data.Int32x4.wxxw*/get wxxw() {
    return 195;
  },
  /*typed_data.Int32x4.wxyx*/get wxyx() {
    return 19;
  },
  /*typed_data.Int32x4.wxyy*/get wxyy() {
    return 83;
  },
  /*typed_data.Int32x4.wxyz*/get wxyz() {
    return 147;
  },
  /*typed_data.Int32x4.wxyw*/get wxyw() {
    return 211;
  },
  /*typed_data.Int32x4.wxzx*/get wxzx() {
    return 35;
  },
  /*typed_data.Int32x4.wxzy*/get wxzy() {
    return 99;
  },
  /*typed_data.Int32x4.wxzz*/get wxzz() {
    return 163;
  },
  /*typed_data.Int32x4.wxzw*/get wxzw() {
    return 227;
  },
  /*typed_data.Int32x4.wxwx*/get wxwx() {
    return 51;
  },
  /*typed_data.Int32x4.wxwy*/get wxwy() {
    return 115;
  },
  /*typed_data.Int32x4.wxwz*/get wxwz() {
    return 179;
  },
  /*typed_data.Int32x4.wxww*/get wxww() {
    return 243;
  },
  /*typed_data.Int32x4.wyxx*/get wyxx() {
    return 7;
  },
  /*typed_data.Int32x4.wyxy*/get wyxy() {
    return 71;
  },
  /*typed_data.Int32x4.wyxz*/get wyxz() {
    return 135;
  },
  /*typed_data.Int32x4.wyxw*/get wyxw() {
    return 199;
  },
  /*typed_data.Int32x4.wyyx*/get wyyx() {
    return 23;
  },
  /*typed_data.Int32x4.wyyy*/get wyyy() {
    return 87;
  },
  /*typed_data.Int32x4.wyyz*/get wyyz() {
    return 151;
  },
  /*typed_data.Int32x4.wyyw*/get wyyw() {
    return 215;
  },
  /*typed_data.Int32x4.wyzx*/get wyzx() {
    return 39;
  },
  /*typed_data.Int32x4.wyzy*/get wyzy() {
    return 103;
  },
  /*typed_data.Int32x4.wyzz*/get wyzz() {
    return 167;
  },
  /*typed_data.Int32x4.wyzw*/get wyzw() {
    return 231;
  },
  /*typed_data.Int32x4.wywx*/get wywx() {
    return 55;
  },
  /*typed_data.Int32x4.wywy*/get wywy() {
    return 119;
  },
  /*typed_data.Int32x4.wywz*/get wywz() {
    return 183;
  },
  /*typed_data.Int32x4.wyww*/get wyww() {
    return 247;
  },
  /*typed_data.Int32x4.wzxx*/get wzxx() {
    return 11;
  },
  /*typed_data.Int32x4.wzxy*/get wzxy() {
    return 75;
  },
  /*typed_data.Int32x4.wzxz*/get wzxz() {
    return 139;
  },
  /*typed_data.Int32x4.wzxw*/get wzxw() {
    return 203;
  },
  /*typed_data.Int32x4.wzyx*/get wzyx() {
    return 27;
  },
  /*typed_data.Int32x4.wzyy*/get wzyy() {
    return 91;
  },
  /*typed_data.Int32x4.wzyz*/get wzyz() {
    return 155;
  },
  /*typed_data.Int32x4.wzyw*/get wzyw() {
    return 219;
  },
  /*typed_data.Int32x4.wzzx*/get wzzx() {
    return 43;
  },
  /*typed_data.Int32x4.wzzy*/get wzzy() {
    return 107;
  },
  /*typed_data.Int32x4.wzzz*/get wzzz() {
    return 171;
  },
  /*typed_data.Int32x4.wzzw*/get wzzw() {
    return 235;
  },
  /*typed_data.Int32x4.wzwx*/get wzwx() {
    return 59;
  },
  /*typed_data.Int32x4.wzwy*/get wzwy() {
    return 123;
  },
  /*typed_data.Int32x4.wzwz*/get wzwz() {
    return 187;
  },
  /*typed_data.Int32x4.wzww*/get wzww() {
    return 251;
  },
  /*typed_data.Int32x4.wwxx*/get wwxx() {
    return 15;
  },
  /*typed_data.Int32x4.wwxy*/get wwxy() {
    return 79;
  },
  /*typed_data.Int32x4.wwxz*/get wwxz() {
    return 143;
  },
  /*typed_data.Int32x4.wwxw*/get wwxw() {
    return 207;
  },
  /*typed_data.Int32x4.wwyx*/get wwyx() {
    return 31;
  },
  /*typed_data.Int32x4.wwyy*/get wwyy() {
    return 95;
  },
  /*typed_data.Int32x4.wwyz*/get wwyz() {
    return 159;
  },
  /*typed_data.Int32x4.wwyw*/get wwyw() {
    return 223;
  },
  /*typed_data.Int32x4.wwzx*/get wwzx() {
    return 47;
  },
  /*typed_data.Int32x4.wwzy*/get wwzy() {
    return 111;
  },
  /*typed_data.Int32x4.wwzz*/get wwzz() {
    return 175;
  },
  /*typed_data.Int32x4.wwzw*/get wwzw() {
    return 239;
  },
  /*typed_data.Int32x4.wwwx*/get wwwx() {
    return 63;
  },
  /*typed_data.Int32x4.wwwy*/get wwwy() {
    return 127;
  },
  /*typed_data.Int32x4.wwwz*/get wwwz() {
    return 191;
  },
  /*typed_data.Int32x4.wwww*/get wwww() {
    return 255;
  }
});
const Object_ListMixin$$ = class Object_ListMixin extends core.Object {};
(Object_ListMixin$$.new = function() {
}).prototype = Object_ListMixin$$.prototype;
dart.applyMixin(Object_ListMixin$$, collection.ListMixin$(typed_data.Int32x4));
const Object_FixedLengthListMixin$$ = class Object_FixedLengthListMixin extends Object_ListMixin$$ {};
(Object_FixedLengthListMixin$$.new = function() {
}).prototype = Object_FixedLengthListMixin$$.prototype;
dart.applyMixin(Object_FixedLengthListMixin$$, _internal.FixedLengthListMixin$(typed_data.Int32x4));
_native_typed_data.NativeInt32x4List = class NativeInt32x4List extends Object_FixedLengthListMixin$$ {
  get runtimeType() {
    return dart.wrapType(typed_data.Int32x4List);
  }
  static fromList(list) {
    if (_native_typed_data.NativeInt32x4List.is(list)) {
      return new _native_typed_data.NativeInt32x4List._externalStorage(_native_typed_data.NativeInt32List.fromList(list[_storage]));
    } else {
      return new _native_typed_data.NativeInt32x4List._slowFromList(list);
    }
  }
  get buffer() {
    return this[_storage][$buffer];
  }
  get lengthInBytes() {
    return this[_storage][$lengthInBytes];
  }
  get offsetInBytes() {
    return this[_storage][$offsetInBytes];
  }
  get elementSizeInBytes() {
    return typed_data.Int32x4List.bytesPerElement;
  }
  get length() {
    return (dart.notNull(this[_storage][$length]) / 4)[$truncate]();
  }
  set length(value) {
    super.length = value;
  }
  _get(index) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    let _x = this[_storage][$_get](dart.notNull(index) * 4 + 0);
    let _y = this[_storage][$_get](dart.notNull(index) * 4 + 1);
    let _z = this[_storage][$_get](dart.notNull(index) * 4 + 2);
    let _w = this[_storage][$_get](dart.notNull(index) * 4 + 3);
    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
  }
  _set(index, value) {
    typed_data.Int32x4._check(value);
    _native_typed_data._checkValidIndex(index, this, this.length);
    this[_storage][$_set](dart.notNull(index) * 4 + 0, value.x);
    this[_storage][$_set](dart.notNull(index) * 4 + 1, value.y);
    this[_storage][$_set](dart.notNull(index) * 4 + 2, value.z);
    this[_storage][$_set](dart.notNull(index) * 4 + 3, value.w);
    return value;
  }
  sublist(start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this.length);
    return new _native_typed_data.NativeInt32x4List._externalStorage(typed_data.Int32List._check(this[_storage][$sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
  }
};
(_native_typed_data.NativeInt32x4List.new = function(length) {
  this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(length) * 4);
}).prototype = _native_typed_data.NativeInt32x4List.prototype;
(_native_typed_data.NativeInt32x4List._externalStorage = function(storage) {
  this[_storage] = storage;
}).prototype = _native_typed_data.NativeInt32x4List.prototype;
(_native_typed_data.NativeInt32x4List._slowFromList = function(list) {
  this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(list[$length]) * 4);
  for (let i = 0; i < dart.notNull(list[$length]); i++) {
    let e = list[$_get](i);
    this[_storage][$_set](i * 4 + 0, e.x);
    this[_storage][$_set](i * 4 + 1, e.y);
    this[_storage][$_set](i * 4 + 2, e.z);
    this[_storage][$_set](i * 4 + 3, e.w);
  }
}).prototype = _native_typed_data.NativeInt32x4List.prototype;
dart.addTypeTests(_native_typed_data.NativeInt32x4List);
_native_typed_data.NativeInt32x4List[dart.implements] = () => [typed_data.Int32x4List];
dart.setMethodSignature(_native_typed_data.NativeInt32x4List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeInt32x4List.__proto__),
  _get: dart.fnType(typed_data.Int32x4, [core.int]),
  [$_get]: dart.fnType(typed_data.Int32x4, [core.int]),
  _set: dart.fnType(dart.void, [core.int, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  sublist: dart.fnType(core.List$(typed_data.Int32x4), [core.int], [core.int]),
  [$sublist]: dart.fnType(core.List$(typed_data.Int32x4), [core.int], [core.int])
}));
dart.setGetterSignature(_native_typed_data.NativeInt32x4List, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeInt32x4List.__proto__),
  buffer: typed_data.ByteBuffer,
  [$buffer]: typed_data.ByteBuffer,
  lengthInBytes: core.int,
  [$lengthInBytes]: core.int,
  offsetInBytes: core.int,
  [$offsetInBytes]: core.int,
  elementSizeInBytes: core.int,
  [$elementSizeInBytes]: core.int,
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeInt32x4List, "dart:_native_typed_data");
dart.setFieldSignature(_native_typed_data.NativeInt32x4List, () => ({
  __proto__: dart.getFields(_native_typed_data.NativeInt32x4List.__proto__),
  [_storage]: dart.finalFieldType(typed_data.Int32List)
}));
dart.defineExtensionMethods(_native_typed_data.NativeInt32x4List, ['_get', '_set', 'sublist']);
dart.defineExtensionAccessors(_native_typed_data.NativeInt32x4List, [
  'runtimeType',
  'buffer',
  'lengthInBytes',
  'offsetInBytes',
  'elementSizeInBytes',
  'length'
]);
typed_data.Float64x2 = class Float64x2 extends core.Object {
  static new(x, y) {
    return new _native_typed_data.NativeFloat64x2.new(x, y);
  }
  static splat(v) {
    return new _native_typed_data.NativeFloat64x2.splat(v);
  }
  static zero() {
    return new _native_typed_data.NativeFloat64x2.zero();
  }
  static fromFloat32x4(v) {
    return new _native_typed_data.NativeFloat64x2.fromFloat32x4(v);
  }
};
(typed_data.Float64x2[dart.mixinNew] = function() {
}).prototype = typed_data.Float64x2.prototype;
dart.addTypeTests(typed_data.Float64x2);
dart.setLibraryUri(typed_data.Float64x2, "dart:typed_data");
const Object_ListMixin$$0 = class Object_ListMixin extends core.Object {};
(Object_ListMixin$$0.new = function() {
}).prototype = Object_ListMixin$$0.prototype;
dart.applyMixin(Object_ListMixin$$0, collection.ListMixin$(typed_data.Float64x2));
const Object_FixedLengthListMixin$$0 = class Object_FixedLengthListMixin extends Object_ListMixin$$0 {};
(Object_FixedLengthListMixin$$0.new = function() {
}).prototype = Object_FixedLengthListMixin$$0.prototype;
dart.applyMixin(Object_FixedLengthListMixin$$0, _internal.FixedLengthListMixin$(typed_data.Float64x2));
_native_typed_data.NativeFloat64x2List = class NativeFloat64x2List extends Object_FixedLengthListMixin$$0 {
  static fromList(list) {
    if (_native_typed_data.NativeFloat64x2List.is(list)) {
      return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List.fromList(list[_storage]));
    } else {
      return new _native_typed_data.NativeFloat64x2List._slowFromList(list);
    }
  }
  get runtimeType() {
    return dart.wrapType(typed_data.Float64x2List);
  }
  get buffer() {
    return this[_storage].buffer;
  }
  get lengthInBytes() {
    return this[_storage][$lengthInBytes];
  }
  get offsetInBytes() {
    return this[_storage][$offsetInBytes];
  }
  get elementSizeInBytes() {
    return typed_data.Float64x2List.bytesPerElement;
  }
  get length() {
    return (dart.notNull(this[_storage][$length]) / 2)[$truncate]();
  }
  set length(value) {
    super.length = value;
  }
  _get(index) {
    _native_typed_data._checkValidIndex(index, this, this.length);
    let _x = this[_storage][$_get](dart.notNull(index) * 2 + 0);
    let _y = this[_storage][$_get](dart.notNull(index) * 2 + 1);
    return typed_data.Float64x2.new(_x, _y);
  }
  _set(index, value) {
    typed_data.Float64x2._check(value);
    _native_typed_data._checkValidIndex(index, this, this.length);
    this[_storage][$_set](dart.notNull(index) * 2 + 0, value.x);
    this[_storage][$_set](dart.notNull(index) * 2 + 1, value.y);
    return value;
  }
  sublist(start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this.length);
    return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List._check(this[_storage][$sublist](dart.notNull(start) * 2, dart.notNull(end) * 2)));
  }
};
(_native_typed_data.NativeFloat64x2List.new = function(length) {
  this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(length) * 2);
}).prototype = _native_typed_data.NativeFloat64x2List.prototype;
(_native_typed_data.NativeFloat64x2List._externalStorage = function(storage) {
  this[_storage] = storage;
}).prototype = _native_typed_data.NativeFloat64x2List.prototype;
(_native_typed_data.NativeFloat64x2List._slowFromList = function(list) {
  this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(list[$length]) * 2);
  for (let i = 0; i < dart.notNull(list[$length]); i++) {
    let e = list[$_get](i);
    this[_storage][$_set](i * 2 + 0, e.x);
    this[_storage][$_set](i * 2 + 1, e.y);
  }
}).prototype = _native_typed_data.NativeFloat64x2List.prototype;
dart.addTypeTests(_native_typed_data.NativeFloat64x2List);
_native_typed_data.NativeFloat64x2List[dart.implements] = () => [typed_data.Float64x2List];
dart.setMethodSignature(_native_typed_data.NativeFloat64x2List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeFloat64x2List.__proto__),
  _get: dart.fnType(typed_data.Float64x2, [core.int]),
  [$_get]: dart.fnType(typed_data.Float64x2, [core.int]),
  _set: dart.fnType(dart.void, [core.int, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  sublist: dart.fnType(core.List$(typed_data.Float64x2), [core.int], [core.int]),
  [$sublist]: dart.fnType(core.List$(typed_data.Float64x2), [core.int], [core.int])
}));
dart.setGetterSignature(_native_typed_data.NativeFloat64x2List, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeFloat64x2List.__proto__),
  buffer: typed_data.ByteBuffer,
  [$buffer]: typed_data.ByteBuffer,
  lengthInBytes: core.int,
  [$lengthInBytes]: core.int,
  offsetInBytes: core.int,
  [$offsetInBytes]: core.int,
  elementSizeInBytes: core.int,
  [$elementSizeInBytes]: core.int,
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeFloat64x2List, "dart:_native_typed_data");
dart.setFieldSignature(_native_typed_data.NativeFloat64x2List, () => ({
  __proto__: dart.getFields(_native_typed_data.NativeFloat64x2List.__proto__),
  [_storage]: dart.finalFieldType(_native_typed_data.NativeFloat64List)
}));
dart.defineExtensionMethods(_native_typed_data.NativeFloat64x2List, ['_get', '_set', 'sublist']);
dart.defineExtensionAccessors(_native_typed_data.NativeFloat64x2List, [
  'runtimeType',
  'buffer',
  'lengthInBytes',
  'offsetInBytes',
  'elementSizeInBytes',
  'length'
]);
const _invalidPosition = dart.privateName(_native_typed_data, "_invalidPosition");
const _checkPosition = dart.privateName(_native_typed_data, "_checkPosition");
_native_typed_data.NativeTypedData = class NativeTypedData extends core.Object {
  get [$buffer]() {
    return this.buffer;
  }
  get [$lengthInBytes]() {
    return this.byteLength;
  }
  get [$offsetInBytes]() {
    return this.byteOffset;
  }
  get [$elementSizeInBytes]() {
    return this.BYTES_PER_ELEMENT;
  }
  [_invalidPosition](position, length, name) {
    if (!core.int.is(position)) {
      dart.throw(new core.ArgumentError.value(position, name, "Invalid list position"));
    } else {
      dart.throw(new core.RangeError.range(position, 0, length, name));
    }
  }
  [_checkPosition](position, length, name) {
    if (position >>> 0 !== position || position > dart.notNull(length)) {
      this[_invalidPosition](position, length, name);
    }
  }
};
(_native_typed_data.NativeTypedData.new = function() {
}).prototype = _native_typed_data.NativeTypedData.prototype;
dart.addTypeTests(_native_typed_data.NativeTypedData);
_native_typed_data.NativeTypedData[dart.implements] = () => [typed_data.TypedData];
dart.setMethodSignature(_native_typed_data.NativeTypedData, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeTypedData.__proto__),
  [_invalidPosition]: dart.fnType(dart.void, [core.int, core.int, core.String]),
  [_checkPosition]: dart.fnType(dart.void, [core.int, core.int, core.String])
}));
dart.setGetterSignature(_native_typed_data.NativeTypedData, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeTypedData.__proto__),
  [$buffer]: typed_data.ByteBuffer,
  [$lengthInBytes]: core.int,
  [$offsetInBytes]: core.int,
  [$elementSizeInBytes]: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeTypedData, "dart:_native_typed_data");
dart.registerExtension("ArrayBufferView", _native_typed_data.NativeTypedData);
_native_typed_data._checkLength = function(length) {
  if (!core.int.is(length)) dart.throw(new core.ArgumentError.new("Invalid length " + dart.str(length)));
  return core.int._check(length);
};
_native_typed_data._checkViewArguments = function(buffer, offsetInBytes, length) {
  if (!_native_typed_data.NativeByteBuffer.is(buffer)) {
    dart.throw(new core.ArgumentError.new("Invalid view buffer"));
  }
  if (!core.int.is(offsetInBytes)) {
    dart.throw(new core.ArgumentError.new("Invalid view offsetInBytes " + dart.str(offsetInBytes)));
  }
  if (length != null && !core.int.is(length)) {
    dart.throw(new core.ArgumentError.new("Invalid view length " + dart.str(length)));
  }
};
_native_typed_data._ensureNativeList = function(list) {
  if (_interceptors.JSIndexable.is(list)) return list;
  let result = core.List.new(list[$length]);
  for (let i = 0; i < dart.notNull(list[$length]); i++) {
    result[$_set](i, list[$_get](i));
  }
  return result;
};
const _getFloat32 = dart.privateName(_native_typed_data, "_getFloat32");
const _getFloat64 = dart.privateName(_native_typed_data, "_getFloat64");
const _getInt16 = dart.privateName(_native_typed_data, "_getInt16");
const _getInt32 = dart.privateName(_native_typed_data, "_getInt32");
const _getUint16 = dart.privateName(_native_typed_data, "_getUint16");
const _getUint32 = dart.privateName(_native_typed_data, "_getUint32");
const _setFloat32 = dart.privateName(_native_typed_data, "_setFloat32");
const _setFloat64 = dart.privateName(_native_typed_data, "_setFloat64");
const _setInt16 = dart.privateName(_native_typed_data, "_setInt16");
const _setInt32 = dart.privateName(_native_typed_data, "_setInt32");
const _setUint16 = dart.privateName(_native_typed_data, "_setUint16");
const _setUint32 = dart.privateName(_native_typed_data, "_setUint32");
_native_typed_data.NativeByteData = class NativeByteData extends _native_typed_data.NativeTypedData {
  static new(length) {
    return _native_typed_data.NativeByteData._create1(_native_typed_data._checkLength(length));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeByteData._create2(buffer, offsetInBytes) : _native_typed_data.NativeByteData._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.ByteData);
  }
  get [$elementSizeInBytes]() {
    return 1;
  }
  [$getFloat32](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_getFloat32](byteOffset, typed_data.Endian.little._equals(endian));
  }
  [_getFloat32](...args) {
    return this.getFloat32.apply(this, args);
  }
  [$getFloat64](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_getFloat64](byteOffset, typed_data.Endian.little._equals(endian));
  }
  [_getFloat64](...args) {
    return this.getFloat64.apply(this, args);
  }
  [$getInt16](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_getInt16](byteOffset, typed_data.Endian.little._equals(endian));
  }
  [_getInt16](...args) {
    return this.getInt16.apply(this, args);
  }
  [$getInt32](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_getInt32](byteOffset, typed_data.Endian.little._equals(endian));
  }
  [_getInt32](...args) {
    return this.getInt32.apply(this, args);
  }
  [$getInt64](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    dart.throw(new core.UnsupportedError.new("Int64 accessor not supported by dart2js."));
  }
  [$getInt8](...args) {
    return this.getInt8.apply(this, args);
  }
  [$getUint16](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_getUint16](byteOffset, typed_data.Endian.little._equals(endian));
  }
  [_getUint16](...args) {
    return this.getUint16.apply(this, args);
  }
  [$getUint32](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_getUint32](byteOffset, typed_data.Endian.little._equals(endian));
  }
  [_getUint32](...args) {
    return this.getUint32.apply(this, args);
  }
  [$getUint64](byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    dart.throw(new core.UnsupportedError.new("Uint64 accessor not supported by dart2js."));
  }
  [$getUint8](...args) {
    return this.getUint8.apply(this, args);
  }
  [$setFloat32](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_setFloat32](byteOffset, value, typed_data.Endian.little._equals(endian));
  }
  [_setFloat32](...args) {
    return this.setFloat32.apply(this, args);
  }
  [$setFloat64](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_setFloat64](byteOffset, value, typed_data.Endian.little._equals(endian));
  }
  [_setFloat64](...args) {
    return this.setFloat64.apply(this, args);
  }
  [$setInt16](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_setInt16](byteOffset, value, typed_data.Endian.little._equals(endian));
  }
  [_setInt16](...args) {
    return this.setInt16.apply(this, args);
  }
  [$setInt32](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_setInt32](byteOffset, value, typed_data.Endian.little._equals(endian));
  }
  [_setInt32](...args) {
    return this.setInt32.apply(this, args);
  }
  [$setInt64](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    dart.throw(new core.UnsupportedError.new("Int64 accessor not supported by dart2js."));
  }
  [$setInt8](...args) {
    return this.setInt8.apply(this, args);
  }
  [$setUint16](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_setUint16](byteOffset, value, typed_data.Endian.little._equals(endian));
  }
  [_setUint16](...args) {
    return this.setUint16.apply(this, args);
  }
  [$setUint32](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_setUint32](byteOffset, value, typed_data.Endian.little._equals(endian));
  }
  [_setUint32](...args) {
    return this.setUint32.apply(this, args);
  }
  [$setUint64](byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    dart.throw(new core.UnsupportedError.new("Uint64 accessor not supported by dart2js."));
  }
  [$setUint8](...args) {
    return this.setUint8.apply(this, args);
  }
  static _create1(arg) {
    return new DataView(new ArrayBuffer(arg));
  }
  static _create2(arg1, arg2) {
    return new DataView(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new DataView(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeByteData);
_native_typed_data.NativeByteData[dart.implements] = () => [typed_data.ByteData];
dart.setMethodSignature(_native_typed_data.NativeByteData, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeByteData.__proto__),
  [$getFloat32]: dart.fnType(core.double, [core.int], [typed_data.Endian]),
  [_getFloat32]: dart.fnType(core.double, [core.int], [core.bool]),
  [$getFloat64]: dart.fnType(core.double, [core.int], [typed_data.Endian]),
  [_getFloat64]: dart.fnType(core.double, [core.int], [core.bool]),
  [$getInt16]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [_getInt16]: dart.fnType(core.int, [core.int], [core.bool]),
  [$getInt32]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [_getInt32]: dart.fnType(core.int, [core.int], [core.bool]),
  [$getInt64]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [$getInt8]: dart.fnType(core.int, [core.int]),
  [$getUint16]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [_getUint16]: dart.fnType(core.int, [core.int], [core.bool]),
  [$getUint32]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [_getUint32]: dart.fnType(core.int, [core.int], [core.bool]),
  [$getUint64]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [$getUint8]: dart.fnType(core.int, [core.int]),
  [$setFloat32]: dart.fnType(dart.void, [core.int, core.num], [typed_data.Endian]),
  [_setFloat32]: dart.fnType(dart.void, [core.int, core.num], [core.bool]),
  [$setFloat64]: dart.fnType(dart.void, [core.int, core.num], [typed_data.Endian]),
  [_setFloat64]: dart.fnType(dart.void, [core.int, core.num], [core.bool]),
  [$setInt16]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [_setInt16]: dart.fnType(dart.void, [core.int, core.int], [core.bool]),
  [$setInt32]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [_setInt32]: dart.fnType(dart.void, [core.int, core.int], [core.bool]),
  [$setInt64]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [$setInt8]: dart.fnType(dart.void, [core.int, core.int]),
  [$setUint16]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [_setUint16]: dart.fnType(dart.void, [core.int, core.int], [core.bool]),
  [$setUint32]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [_setUint32]: dart.fnType(dart.void, [core.int, core.int], [core.bool]),
  [$setUint64]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [$setUint8]: dart.fnType(dart.void, [core.int, core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeByteData, "dart:_native_typed_data");
dart.registerExtension("DataView", _native_typed_data.NativeByteData);
const _setRangeFast = dart.privateName(_native_typed_data, "_setRangeFast");
_native_typed_data.NativeTypedArray = class NativeTypedArray extends _native_typed_data.NativeTypedData {
  [_setRangeFast](start, end, source, skipCount) {
    let targetLength = this[$length];
    this[_checkPosition](start, targetLength, "start");
    this[_checkPosition](end, targetLength, "end");
    if (dart.notNull(start) > dart.notNull(end)) dart.throw(new core.RangeError.range(start, 0, end));
    let count = dart.notNull(end) - dart.notNull(start);
    if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError.new(skipCount));
    let sourceLength = source[$length];
    if (dart.notNull(sourceLength) - dart.notNull(skipCount) < count) {
      dart.throw(new core.StateError.new("Not enough elements"));
    }
    if (skipCount !== 0 || sourceLength !== count) {
      source = source.subarray(skipCount, dart.notNull(skipCount) + count);
    }
    this.set(source, start);
  }
};
(_native_typed_data.NativeTypedArray.new = function() {
}).prototype = _native_typed_data.NativeTypedArray.prototype;
dart.addTypeTests(_native_typed_data.NativeTypedArray);
_native_typed_data.NativeTypedArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior];
dart.setMethodSignature(_native_typed_data.NativeTypedArray, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeTypedArray.__proto__),
  [_setRangeFast]: dart.fnType(dart.void, [core.int, core.int, _native_typed_data.NativeTypedArray, core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeTypedArray, "dart:_native_typed_data");
core.double = class double extends core.num {
  static parse(source, onError) {
    if (onError === void 0) onError = null;
    return _js_helper.Primitives.parseDouble(source, onError);
  }
  static tryParse(source) {
    return _js_helper.Primitives.parseDouble(source, dart.fn(core._kNull, dynamicToNull()));
  }
};
(core.double.new = function() {
}).prototype = core.double.prototype;
core.double.is = function is_num(o) {
  return typeof o == "number";
};
core.double.as = function as_num(o) {
  if (typeof o == "number" || o == null) return o;
  return dart.as(o, core.double, false);
};
core.double._check = function check_num(o) {
  if (typeof o == "number" || o == null) return o;
  return dart.as(o, core.double, true);
};
dart.setLibraryUri(core.double, "dart:core");
dart.defineLazy(core.double, {
  /*core.double.nan*/get nan() {
    return 0.0 / 0.0;
  },
  /*core.double.infinity*/get infinity() {
    return 1.0 / 0.0;
  },
  /*core.double.negativeInfinity*/get negativeInfinity() {
    return -Infinity;
  },
  /*core.double.minPositive*/get minPositive() {
    return 5e-324;
  },
  /*core.double.maxFinite*/get maxFinite() {
    return 1.7976931348623157e+308;
  }
});
const NativeTypedArray_ListMixin$ = class NativeTypedArray_ListMixin extends _native_typed_data.NativeTypedArray {};
(NativeTypedArray_ListMixin$.new = function() {
}).prototype = NativeTypedArray_ListMixin$.prototype;
dart.applyMixin(NativeTypedArray_ListMixin$, collection.ListMixin$(core.double));
const NativeTypedArray_FixedLengthListMixin$ = class NativeTypedArray_FixedLengthListMixin extends NativeTypedArray_ListMixin$ {};
(NativeTypedArray_FixedLengthListMixin$.new = function() {
}).prototype = NativeTypedArray_FixedLengthListMixin$.prototype;
dart.applyMixin(NativeTypedArray_FixedLengthListMixin$, _internal.FixedLengthListMixin$(core.double));
_native_typed_data.NativeTypedArrayOfDouble = class NativeTypedArrayOfDouble extends NativeTypedArray_FixedLengthListMixin$ {
  get length() {
    return this.length;
  }
  set length(value) {
    super.length = value;
  }
  _get(index) {
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    return this[index];
  }
  _set(index, value) {
    core.num._check(value);
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    this[index] = value;
    return value;
  }
  setRange(start, end, iterable, skipCount) {
    IterableOfdouble()._check(iterable);
    if (skipCount === void 0) skipCount = 0;
    if (_native_typed_data.NativeTypedArrayOfDouble.is(iterable)) {
      this[_setRangeFast](start, end, iterable, skipCount);
      return;
    }
    super[$setRange](start, end, iterable, skipCount);
  }
};
(_native_typed_data.NativeTypedArrayOfDouble.new = function() {
}).prototype = _native_typed_data.NativeTypedArrayOfDouble.prototype;
dart.addTypeTests(_native_typed_data.NativeTypedArrayOfDouble);
dart.setMethodSignature(_native_typed_data.NativeTypedArrayOfDouble, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeTypedArrayOfDouble.__proto__),
  _get: dart.fnType(core.double, [core.int]),
  [$_get]: dart.fnType(core.double, [core.int]),
  _set: dart.fnType(dart.void, [core.int, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
  [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int])
}));
dart.setGetterSignature(_native_typed_data.NativeTypedArrayOfDouble, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeTypedArrayOfDouble.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeTypedArrayOfDouble, "dart:_native_typed_data");
dart.defineExtensionMethods(_native_typed_data.NativeTypedArrayOfDouble, ['_get', '_set', 'setRange']);
dart.defineExtensionAccessors(_native_typed_data.NativeTypedArrayOfDouble, ['length']);
const NativeTypedArray_ListMixin$$ = class NativeTypedArray_ListMixin extends _native_typed_data.NativeTypedArray {};
(NativeTypedArray_ListMixin$$.new = function() {
}).prototype = NativeTypedArray_ListMixin$$.prototype;
dart.applyMixin(NativeTypedArray_ListMixin$$, collection.ListMixin$(core.int));
const NativeTypedArray_FixedLengthListMixin$$ = class NativeTypedArray_FixedLengthListMixin extends NativeTypedArray_ListMixin$$ {};
(NativeTypedArray_FixedLengthListMixin$$.new = function() {
}).prototype = NativeTypedArray_FixedLengthListMixin$$.prototype;
dart.applyMixin(NativeTypedArray_FixedLengthListMixin$$, _internal.FixedLengthListMixin$(core.int));
_native_typed_data.NativeTypedArrayOfInt = class NativeTypedArrayOfInt extends NativeTypedArray_FixedLengthListMixin$$ {
  get length() {
    return this.length;
  }
  set length(value) {
    super.length = value;
  }
  _set(index, value) {
    core.int._check(value);
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    this[index] = value;
    return value;
  }
  setRange(start, end, iterable, skipCount) {
    IterableOfint()._check(iterable);
    if (skipCount === void 0) skipCount = 0;
    if (_native_typed_data.NativeTypedArrayOfInt.is(iterable)) {
      this[_setRangeFast](start, end, iterable, skipCount);
      return;
    }
    super[$setRange](start, end, iterable, skipCount);
  }
};
(_native_typed_data.NativeTypedArrayOfInt.new = function() {
}).prototype = _native_typed_data.NativeTypedArrayOfInt.prototype;
_native_typed_data.NativeTypedArrayOfInt.prototype[dart.isList] = true;
dart.addTypeTests(_native_typed_data.NativeTypedArrayOfInt);
_native_typed_data.NativeTypedArrayOfInt[dart.implements] = () => [ListOfint()];
dart.setMethodSignature(_native_typed_data.NativeTypedArrayOfInt, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeTypedArrayOfInt.__proto__),
  _set: dart.fnType(dart.void, [core.int, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
  [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int])
}));
dart.setGetterSignature(_native_typed_data.NativeTypedArrayOfInt, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeTypedArrayOfInt.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeTypedArrayOfInt, "dart:_native_typed_data");
dart.defineExtensionMethods(_native_typed_data.NativeTypedArrayOfInt, ['_set', 'setRange']);
dart.defineExtensionAccessors(_native_typed_data.NativeTypedArrayOfInt, ['length']);
_native_typed_data.NativeFloat32List = class NativeFloat32List extends _native_typed_data.NativeTypedArrayOfDouble {
  static new(length) {
    return _native_typed_data.NativeFloat32List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat32List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeFloat32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat32List._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Float32List);
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeFloat32List._create1(source);
  }
  static _create1(arg) {
    return new Float32Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Float32Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Float32Array(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeFloat32List);
_native_typed_data.NativeFloat32List[dart.implements] = () => [typed_data.Float32List];
dart.setMethodSignature(_native_typed_data.NativeFloat32List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeFloat32List.__proto__),
  [$sublist]: dart.fnType(core.List$(core.double), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeFloat32List, "dart:_native_typed_data");
dart.registerExtension("Float32Array", _native_typed_data.NativeFloat32List);
_native_typed_data.NativeFloat64List = class NativeFloat64List extends _native_typed_data.NativeTypedArrayOfDouble {
  static new(length) {
    return _native_typed_data.NativeFloat64List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat64List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeFloat64List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat64List._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Float64List);
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeFloat64List._create1(source);
  }
  static _create1(arg) {
    return new Float64Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Float64Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Float64Array(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeFloat64List);
_native_typed_data.NativeFloat64List[dart.implements] = () => [typed_data.Float64List];
dart.setMethodSignature(_native_typed_data.NativeFloat64List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeFloat64List.__proto__),
  [$sublist]: dart.fnType(core.List$(core.double), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeFloat64List, "dart:_native_typed_data");
dart.registerExtension("Float64Array", _native_typed_data.NativeFloat64List);
_native_typed_data.NativeInt16List = class NativeInt16List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeInt16List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt16List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeInt16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt16List._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Int16List);
  }
  [$_get](index) {
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    return this[index];
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeInt16List._create1(source);
  }
  static _create1(arg) {
    return new Int16Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Int16Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Int16Array(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeInt16List);
_native_typed_data.NativeInt16List[dart.implements] = () => [typed_data.Int16List];
dart.setMethodSignature(_native_typed_data.NativeInt16List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeInt16List.__proto__),
  [$_get]: dart.fnType(core.int, [core.int]),
  [$sublist]: dart.fnType(core.List$(core.int), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeInt16List, "dart:_native_typed_data");
dart.registerExtension("Int16Array", _native_typed_data.NativeInt16List);
_native_typed_data.NativeInt32List = class NativeInt32List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeInt32List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt32List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeInt32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt32List._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Int32List);
  }
  [$_get](index) {
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    return this[index];
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeInt32List._create1(source);
  }
  static _create1(arg) {
    return new Int32Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Int32Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Int32Array(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeInt32List);
_native_typed_data.NativeInt32List[dart.implements] = () => [typed_data.Int32List];
dart.setMethodSignature(_native_typed_data.NativeInt32List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeInt32List.__proto__),
  [$_get]: dart.fnType(core.int, [core.int]),
  [$sublist]: dart.fnType(core.List$(core.int), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeInt32List, "dart:_native_typed_data");
dart.registerExtension("Int32Array", _native_typed_data.NativeInt32List);
_native_typed_data.NativeInt8List = class NativeInt8List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeInt8List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt8List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return _native_typed_data.NativeInt8List._check(length == null ? _native_typed_data.NativeInt8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt8List._create3(buffer, offsetInBytes, length));
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Int8List);
  }
  [$_get](index) {
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    return this[index];
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeInt8List._create1(source);
  }
  static _create1(arg) {
    return new Int8Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Int8Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Int8Array(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeInt8List);
_native_typed_data.NativeInt8List[dart.implements] = () => [typed_data.Int8List];
dart.setMethodSignature(_native_typed_data.NativeInt8List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeInt8List.__proto__),
  [$_get]: dart.fnType(core.int, [core.int]),
  [$sublist]: dart.fnType(core.List$(core.int), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeInt8List, "dart:_native_typed_data");
dart.registerExtension("Int8Array", _native_typed_data.NativeInt8List);
_native_typed_data.NativeUint16List = class NativeUint16List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeUint16List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(list) {
    return _native_typed_data.NativeUint16List._create1(_native_typed_data._ensureNativeList(list));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeUint16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint16List._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Uint16List);
  }
  [$_get](index) {
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    return this[index];
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeUint16List._create1(source);
  }
  static _create1(arg) {
    return new Uint16Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Uint16Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Uint16Array(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeUint16List);
_native_typed_data.NativeUint16List[dart.implements] = () => [typed_data.Uint16List];
dart.setMethodSignature(_native_typed_data.NativeUint16List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeUint16List.__proto__),
  [$_get]: dart.fnType(core.int, [core.int]),
  [$sublist]: dart.fnType(core.List$(core.int), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeUint16List, "dart:_native_typed_data");
dart.registerExtension("Uint16Array", _native_typed_data.NativeUint16List);
_native_typed_data.NativeUint32List = class NativeUint32List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeUint32List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint32List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeUint32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint32List._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Uint32List);
  }
  [$_get](index) {
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    return this[index];
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeUint32List._create1(source);
  }
  static _create1(arg) {
    return new Uint32Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Uint32Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Uint32Array(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeUint32List);
_native_typed_data.NativeUint32List[dart.implements] = () => [typed_data.Uint32List];
dart.setMethodSignature(_native_typed_data.NativeUint32List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeUint32List.__proto__),
  [$_get]: dart.fnType(core.int, [core.int]),
  [$sublist]: dart.fnType(core.List$(core.int), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeUint32List, "dart:_native_typed_data");
dart.registerExtension("Uint32Array", _native_typed_data.NativeUint32List);
_native_typed_data.NativeUint8ClampedList = class NativeUint8ClampedList extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeUint8ClampedList._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8ClampedList._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Uint8ClampedList);
  }
  get [$length]() {
    return this.length;
  }
  set [$length](value) {
    super[$length] = value;
  }
  [$_get](index) {
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    return this[index];
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeUint8ClampedList._create1(source);
  }
  static _create1(arg) {
    return new Uint8ClampedArray(arg);
  }
  static _create2(arg1, arg2) {
    return new Uint8ClampedArray(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Uint8ClampedArray(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeUint8ClampedList);
_native_typed_data.NativeUint8ClampedList[dart.implements] = () => [typed_data.Uint8ClampedList];
dart.setMethodSignature(_native_typed_data.NativeUint8ClampedList, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeUint8ClampedList.__proto__),
  [$_get]: dart.fnType(core.int, [core.int]),
  [$sublist]: dart.fnType(core.List$(core.int), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeUint8ClampedList, "dart:_native_typed_data");
dart.registerExtension("Uint8ClampedArray", _native_typed_data.NativeUint8ClampedList);
dart.registerExtension("CanvasPixelArray", _native_typed_data.NativeUint8ClampedList);
_native_typed_data.NativeUint8List = class NativeUint8List extends _native_typed_data.NativeTypedArrayOfInt {
  static new(length) {
    return _native_typed_data.NativeUint8List._create1(_native_typed_data._checkLength(length));
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint8List._create1(_native_typed_data._ensureNativeList(elements));
  }
  static view(buffer, offsetInBytes, length) {
    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
    return length == null ? _native_typed_data.NativeUint8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8List._create3(buffer, offsetInBytes, length);
  }
  get [$runtimeType]() {
    return dart.wrapType(typed_data.Uint8List);
  }
  get [$length]() {
    return this.length;
  }
  set [$length](value) {
    super[$length] = value;
  }
  [$_get](index) {
    _native_typed_data._checkValidIndex(index, this, this[$length]);
    return this[index];
  }
  [$sublist](start, end) {
    if (end === void 0) end = null;
    end = _native_typed_data._checkValidRange(start, end, this[$length]);
    let source = this.subarray(start, end);
    return _native_typed_data.NativeUint8List._create1(source);
  }
  static _create1(arg) {
    return new Uint8Array(arg);
  }
  static _create2(arg1, arg2) {
    return new Uint8Array(arg1, arg2);
  }
  static _create3(arg1, arg2, arg3) {
    return new Uint8Array(arg1, arg2, arg3);
  }
};
dart.addTypeTests(_native_typed_data.NativeUint8List);
_native_typed_data.NativeUint8List[dart.implements] = () => [typed_data.Uint8List];
dart.setMethodSignature(_native_typed_data.NativeUint8List, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeUint8List.__proto__),
  [$_get]: dart.fnType(core.int, [core.int]),
  [$sublist]: dart.fnType(core.List$(core.int), [core.int], [core.int])
}));
dart.setLibraryUri(_native_typed_data.NativeUint8List, "dart:_native_typed_data");
dart.registerExtension("Uint8Array", _native_typed_data.NativeUint8List);
_native_typed_data.NativeFloat32x4 = class NativeFloat32x4 extends core.Object {
  static _truncate(x) {
    _native_typed_data.NativeFloat32x4._list[$_set](0, core.num._check(x));
    return _native_typed_data.NativeFloat32x4._list[$_get](0);
  }
  static fromInt32x4Bits(i) {
    _native_typed_data.NativeFloat32x4._uint32view[$_set](0, i.x);
    _native_typed_data.NativeFloat32x4._uint32view[$_set](1, i.y);
    _native_typed_data.NativeFloat32x4._uint32view[$_set](2, i.z);
    _native_typed_data.NativeFloat32x4._uint32view[$_set](3, i.w);
    return new _native_typed_data.NativeFloat32x4._truncated(_native_typed_data.NativeFloat32x4._list[$_get](0), _native_typed_data.NativeFloat32x4._list[$_get](1), _native_typed_data.NativeFloat32x4._list[$_get](2), _native_typed_data.NativeFloat32x4._list[$_get](3));
  }
  toString() {
    return "[" + dart.str(this.x) + ", " + dart.str(this.y) + ", " + dart.str(this.z) + ", " + dart.str(this.w) + "]";
  }
  ['+'](other) {
    let _x = dart.notNull(this.x) + dart.notNull(other.x);
    let _y = dart.notNull(this.y) + dart.notNull(other.y);
    let _z = dart.notNull(this.z) + dart.notNull(other.z);
    let _w = dart.notNull(this.w) + dart.notNull(other.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  _negate() {
    return new _native_typed_data.NativeFloat32x4._truncated(-dart.notNull(this.x), -dart.notNull(this.y), -dart.notNull(this.z), -dart.notNull(this.w));
  }
  ['-'](other) {
    let _x = dart.notNull(this.x) - dart.notNull(other.x);
    let _y = dart.notNull(this.y) - dart.notNull(other.y);
    let _z = dart.notNull(this.z) - dart.notNull(other.z);
    let _w = dart.notNull(this.w) - dart.notNull(other.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  ['*'](other) {
    let _x = dart.notNull(this.x) * dart.notNull(other.x);
    let _y = dart.notNull(this.y) * dart.notNull(other.y);
    let _z = dart.notNull(this.z) * dart.notNull(other.z);
    let _w = dart.notNull(this.w) * dart.notNull(other.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  ['/'](other) {
    let _x = dart.notNull(this.x) / dart.notNull(other.x);
    let _y = dart.notNull(this.y) / dart.notNull(other.y);
    let _z = dart.notNull(this.z) / dart.notNull(other.z);
    let _w = dart.notNull(this.w) / dart.notNull(other.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  lessThan(other) {
    let _cx = dart.notNull(this.x) < dart.notNull(other.x);
    let _cy = dart.notNull(this.y) < dart.notNull(other.y);
    let _cz = dart.notNull(this.z) < dart.notNull(other.z);
    let _cw = dart.notNull(this.w) < dart.notNull(other.w);
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  lessThanOrEqual(other) {
    let _cx = dart.notNull(this.x) <= dart.notNull(other.x);
    let _cy = dart.notNull(this.y) <= dart.notNull(other.y);
    let _cz = dart.notNull(this.z) <= dart.notNull(other.z);
    let _cw = dart.notNull(this.w) <= dart.notNull(other.w);
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  greaterThan(other) {
    let _cx = dart.notNull(this.x) > dart.notNull(other.x);
    let _cy = dart.notNull(this.y) > dart.notNull(other.y);
    let _cz = dart.notNull(this.z) > dart.notNull(other.z);
    let _cw = dart.notNull(this.w) > dart.notNull(other.w);
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  greaterThanOrEqual(other) {
    let _cx = dart.notNull(this.x) >= dart.notNull(other.x);
    let _cy = dart.notNull(this.y) >= dart.notNull(other.y);
    let _cz = dart.notNull(this.z) >= dart.notNull(other.z);
    let _cw = dart.notNull(this.w) >= dart.notNull(other.w);
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  equal(other) {
    let _cx = this.x == other.x;
    let _cy = this.y == other.y;
    let _cz = this.z == other.z;
    let _cw = this.w == other.w;
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  notEqual(other) {
    let _cx = this.x != other.x;
    let _cy = this.y != other.y;
    let _cz = this.z != other.z;
    let _cw = this.w != other.w;
    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
  }
  scale(s) {
    let _x = dart.notNull(s) * dart.notNull(this.x);
    let _y = dart.notNull(s) * dart.notNull(this.y);
    let _z = dart.notNull(s) * dart.notNull(this.z);
    let _w = dart.notNull(s) * dart.notNull(this.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  abs() {
    let _x = this.x[$abs]();
    let _y = this.y[$abs]();
    let _z = this.z[$abs]();
    let _w = this.w[$abs]();
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  clamp(lowerLimit, upperLimit) {
    let _lx = lowerLimit.x;
    let _ly = lowerLimit.y;
    let _lz = lowerLimit.z;
    let _lw = lowerLimit.w;
    let _ux = upperLimit.x;
    let _uy = upperLimit.y;
    let _uz = upperLimit.z;
    let _uw = upperLimit.w;
    let _x = this.x;
    let _y = this.y;
    let _z = this.z;
    let _w = this.w;
    _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
    _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
    _z = dart.notNull(_z) > dart.notNull(_uz) ? _uz : _z;
    _w = dart.notNull(_w) > dart.notNull(_uw) ? _uw : _w;
    _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
    _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
    _z = dart.notNull(_z) < dart.notNull(_lz) ? _lz : _z;
    _w = dart.notNull(_w) < dart.notNull(_lw) ? _lw : _w;
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  get signMask() {
    let view = _native_typed_data.NativeFloat32x4._uint32view;
    let mx = null, my = null, mz = null, mw = null;
    _native_typed_data.NativeFloat32x4._list[$_set](0, this.x);
    _native_typed_data.NativeFloat32x4._list[$_set](1, this.y);
    _native_typed_data.NativeFloat32x4._list[$_set](2, this.z);
    _native_typed_data.NativeFloat32x4._list[$_set](3, this.w);
    mx = (dart.notNull(view[$_get](0)) & 2147483648) >>> 31;
    my = (dart.notNull(view[$_get](1)) & 2147483648) >>> 30;
    mz = (dart.notNull(view[$_get](2)) & 2147483648) >>> 29;
    mw = (dart.notNull(view[$_get](3)) & 2147483648) >>> 28;
    return core.int._check(dart.dsend(dart.dsend(dart.dsend(mx, '|', [my]), '|', [mz]), '|', [mw]));
  }
  shuffle(mask) {
    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
    }
    _native_typed_data.NativeFloat32x4._list[$_set](0, this.x);
    _native_typed_data.NativeFloat32x4._list[$_set](1, this.y);
    _native_typed_data.NativeFloat32x4._list[$_set](2, this.z);
    _native_typed_data.NativeFloat32x4._list[$_set](3, this.w);
    let _x = _native_typed_data.NativeFloat32x4._list[$_get](dart.notNull(mask) & 3);
    let _y = _native_typed_data.NativeFloat32x4._list[$_get](dart.notNull(mask) >> 2 & 3);
    let _z = _native_typed_data.NativeFloat32x4._list[$_get](dart.notNull(mask) >> 4 & 3);
    let _w = _native_typed_data.NativeFloat32x4._list[$_get](dart.notNull(mask) >> 6 & 3);
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  shuffleMix(other, mask) {
    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
    }
    _native_typed_data.NativeFloat32x4._list[$_set](0, this.x);
    _native_typed_data.NativeFloat32x4._list[$_set](1, this.y);
    _native_typed_data.NativeFloat32x4._list[$_set](2, this.z);
    _native_typed_data.NativeFloat32x4._list[$_set](3, this.w);
    let _x = _native_typed_data.NativeFloat32x4._list[$_get](dart.notNull(mask) & 3);
    let _y = _native_typed_data.NativeFloat32x4._list[$_get](dart.notNull(mask) >> 2 & 3);
    _native_typed_data.NativeFloat32x4._list[$_set](0, other.x);
    _native_typed_data.NativeFloat32x4._list[$_set](1, other.y);
    _native_typed_data.NativeFloat32x4._list[$_set](2, other.z);
    _native_typed_data.NativeFloat32x4._list[$_set](3, other.w);
    let _z = _native_typed_data.NativeFloat32x4._list[$_get](dart.notNull(mask) >> 4 & 3);
    let _w = _native_typed_data.NativeFloat32x4._list[$_get](dart.notNull(mask) >> 6 & 3);
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  withX(newX) {
    return new _native_typed_data.NativeFloat32x4._truncated(core.double._check(_native_typed_data.NativeFloat32x4._truncate(newX)), this.y, this.z, this.w);
  }
  withY(newY) {
    return new _native_typed_data.NativeFloat32x4._truncated(this.x, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newY)), this.z, this.w);
  }
  withZ(newZ) {
    return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newZ)), this.w);
  }
  withW(newW) {
    return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, this.z, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newW)));
  }
  min(other) {
    let _x = dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x;
    let _y = dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y;
    let _z = dart.notNull(this.z) < dart.notNull(other.z) ? this.z : other.z;
    let _w = dart.notNull(this.w) < dart.notNull(other.w) ? this.w : other.w;
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  max(other) {
    let _x = dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x;
    let _y = dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y;
    let _z = dart.notNull(this.z) > dart.notNull(other.z) ? this.z : other.z;
    let _w = dart.notNull(this.w) > dart.notNull(other.w) ? this.w : other.w;
    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
  }
  sqrt() {
    let _x = math.sqrt(this.x);
    let _y = math.sqrt(this.y);
    let _z = math.sqrt(this.z);
    let _w = math.sqrt(this.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  reciprocal() {
    let _x = 1.0 / dart.notNull(this.x);
    let _y = 1.0 / dart.notNull(this.y);
    let _z = 1.0 / dart.notNull(this.z);
    let _w = 1.0 / dart.notNull(this.w);
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
  reciprocalSqrt() {
    let _x = math.sqrt(1.0 / dart.notNull(this.x));
    let _y = math.sqrt(1.0 / dart.notNull(this.y));
    let _z = math.sqrt(1.0 / dart.notNull(this.z));
    let _w = math.sqrt(1.0 / dart.notNull(this.w));
    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
  }
};
(_native_typed_data.NativeFloat32x4.new = function(x, y, z, w) {
  this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
  this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
  this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
  this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
  if (!(typeof x == 'number')) dart.throw(new core.ArgumentError.new(x));
  if (!(typeof y == 'number')) dart.throw(new core.ArgumentError.new(y));
  if (!(typeof z == 'number')) dart.throw(new core.ArgumentError.new(z));
  if (!(typeof w == 'number')) dart.throw(new core.ArgumentError.new(w));
}).prototype = _native_typed_data.NativeFloat32x4.prototype;
(_native_typed_data.NativeFloat32x4.splat = function(v) {
  _native_typed_data.NativeFloat32x4.new.call(this, v, v, v, v);
}).prototype = _native_typed_data.NativeFloat32x4.prototype;
(_native_typed_data.NativeFloat32x4.zero = function() {
  _native_typed_data.NativeFloat32x4._truncated.call(this, 0.0, 0.0, 0.0, 0.0);
}).prototype = _native_typed_data.NativeFloat32x4.prototype;
(_native_typed_data.NativeFloat32x4.fromFloat64x2 = function(v) {
  _native_typed_data.NativeFloat32x4._truncated.call(this, core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.x)), core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.y)), 0.0, 0.0);
}).prototype = _native_typed_data.NativeFloat32x4.prototype;
(_native_typed_data.NativeFloat32x4._doubles = function(x, y, z, w) {
  this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
  this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
  this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
  this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
}).prototype = _native_typed_data.NativeFloat32x4.prototype;
(_native_typed_data.NativeFloat32x4._truncated = function(x, y, z, w) {
  this.x = x;
  this.y = y;
  this.z = z;
  this.w = w;
}).prototype = _native_typed_data.NativeFloat32x4.prototype;
dart.addTypeTests(_native_typed_data.NativeFloat32x4);
_native_typed_data.NativeFloat32x4[dart.implements] = () => [typed_data.Float32x4];
dart.setMethodSignature(_native_typed_data.NativeFloat32x4, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeFloat32x4.__proto__),
  '+': dart.fnType(typed_data.Float32x4, [typed_data.Float32x4]),
  _negate: dart.fnType(typed_data.Float32x4, []),
  '-': dart.fnType(typed_data.Float32x4, [typed_data.Float32x4]),
  '*': dart.fnType(typed_data.Float32x4, [typed_data.Float32x4]),
  '/': dart.fnType(typed_data.Float32x4, [typed_data.Float32x4]),
  lessThan: dart.fnType(typed_data.Int32x4, [typed_data.Float32x4]),
  lessThanOrEqual: dart.fnType(typed_data.Int32x4, [typed_data.Float32x4]),
  greaterThan: dart.fnType(typed_data.Int32x4, [typed_data.Float32x4]),
  greaterThanOrEqual: dart.fnType(typed_data.Int32x4, [typed_data.Float32x4]),
  equal: dart.fnType(typed_data.Int32x4, [typed_data.Float32x4]),
  notEqual: dart.fnType(typed_data.Int32x4, [typed_data.Float32x4]),
  scale: dart.fnType(typed_data.Float32x4, [core.double]),
  abs: dart.fnType(typed_data.Float32x4, []),
  clamp: dart.fnType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4]),
  shuffle: dart.fnType(typed_data.Float32x4, [core.int]),
  shuffleMix: dart.fnType(typed_data.Float32x4, [typed_data.Float32x4, core.int]),
  withX: dart.fnType(typed_data.Float32x4, [core.double]),
  withY: dart.fnType(typed_data.Float32x4, [core.double]),
  withZ: dart.fnType(typed_data.Float32x4, [core.double]),
  withW: dart.fnType(typed_data.Float32x4, [core.double]),
  min: dart.fnType(typed_data.Float32x4, [typed_data.Float32x4]),
  max: dart.fnType(typed_data.Float32x4, [typed_data.Float32x4]),
  sqrt: dart.fnType(typed_data.Float32x4, []),
  reciprocal: dart.fnType(typed_data.Float32x4, []),
  reciprocalSqrt: dart.fnType(typed_data.Float32x4, [])
}));
dart.setGetterSignature(_native_typed_data.NativeFloat32x4, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeFloat32x4.__proto__),
  signMask: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeFloat32x4, "dart:_native_typed_data");
dart.setFieldSignature(_native_typed_data.NativeFloat32x4, () => ({
  __proto__: dart.getFields(_native_typed_data.NativeFloat32x4.__proto__),
  x: dart.finalFieldType(core.double),
  y: dart.finalFieldType(core.double),
  z: dart.finalFieldType(core.double),
  w: dart.finalFieldType(core.double)
}));
dart.defineExtensionMethods(_native_typed_data.NativeFloat32x4, ['toString']);
dart.defineLazy(_native_typed_data.NativeFloat32x4, {
  /*_native_typed_data.NativeFloat32x4._list*/get _list() {
    return _native_typed_data.NativeFloat32List.new(4);
  },
  /*_native_typed_data.NativeFloat32x4._uint32view*/get _uint32view() {
    return _native_typed_data.NativeFloat32x4._list.buffer[$asUint32List]();
  }
});
_native_typed_data.NativeInt32x4 = class NativeInt32x4 extends core.Object {
  static _truncate(x) {
    _native_typed_data.NativeInt32x4._list[$_set](0, core.int._check(x));
    return _native_typed_data.NativeInt32x4._list[$_get](0);
  }
  static fromFloat32x4Bits(f) {
    let floatList = _native_typed_data.NativeFloat32x4._list;
    floatList[$_set](0, f.x);
    floatList[$_set](1, f.y);
    floatList[$_set](2, f.z);
    floatList[$_set](3, f.w);
    let view = _native_typed_data.NativeInt32List._check(floatList.buffer[$asInt32List]());
    return new _native_typed_data.NativeInt32x4._truncated(view[$_get](0), view[$_get](1), view[$_get](2), view[$_get](3));
  }
  toString() {
    return "[" + dart.str(this.x) + ", " + dart.str(this.y) + ", " + dart.str(this.z) + ", " + dart.str(this.w) + "]";
  }
  ['|'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x | other.x, this.y | other.y, this.z | other.z, this.w | other.w);
  }
  ['&'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x & other.x, this.y & other.y, this.z & other.z, this.w & other.w);
  }
  ['^'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x ^ other.x, this.y ^ other.y, this.z ^ other.z, this.w ^ other.w);
  }
  ['+'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x + other.x | 0, this.y + other.y | 0, this.z + other.z | 0, this.w + other.w | 0);
  }
  ['-'](other) {
    return new _native_typed_data.NativeInt32x4._truncated(this.x - other.x | 0, this.y - other.y | 0, this.z - other.z | 0, this.w - other.w | 0);
  }
  _negate() {
    return new _native_typed_data.NativeInt32x4._truncated(-this.x | 0, -this.y | 0, -this.z | 0, -this.w | 0);
  }
  get signMask() {
    let mx = (dart.notNull(this.x) & 2147483648) >>> 31;
    let my = (dart.notNull(this.y) & 2147483648) >>> 31;
    let mz = (dart.notNull(this.z) & 2147483648) >>> 31;
    let mw = (dart.notNull(this.w) & 2147483648) >>> 31;
    return (mx | my << 1 | mz << 2 | mw << 3) >>> 0;
  }
  shuffle(mask) {
    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
    }
    _native_typed_data.NativeInt32x4._list[$_set](0, this.x);
    _native_typed_data.NativeInt32x4._list[$_set](1, this.y);
    _native_typed_data.NativeInt32x4._list[$_set](2, this.z);
    _native_typed_data.NativeInt32x4._list[$_set](3, this.w);
    let _x = _native_typed_data.NativeInt32x4._list[$_get](dart.notNull(mask) & 3);
    let _y = _native_typed_data.NativeInt32x4._list[$_get](dart.notNull(mask) >> 2 & 3);
    let _z = _native_typed_data.NativeInt32x4._list[$_get](dart.notNull(mask) >> 4 & 3);
    let _w = _native_typed_data.NativeInt32x4._list[$_get](dart.notNull(mask) >> 6 & 3);
    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
  }
  shuffleMix(other, mask) {
    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
    }
    _native_typed_data.NativeInt32x4._list[$_set](0, this.x);
    _native_typed_data.NativeInt32x4._list[$_set](1, this.y);
    _native_typed_data.NativeInt32x4._list[$_set](2, this.z);
    _native_typed_data.NativeInt32x4._list[$_set](3, this.w);
    let _x = _native_typed_data.NativeInt32x4._list[$_get](dart.notNull(mask) & 3);
    let _y = _native_typed_data.NativeInt32x4._list[$_get](dart.notNull(mask) >> 2 & 3);
    _native_typed_data.NativeInt32x4._list[$_set](0, other.x);
    _native_typed_data.NativeInt32x4._list[$_set](1, other.y);
    _native_typed_data.NativeInt32x4._list[$_set](2, other.z);
    _native_typed_data.NativeInt32x4._list[$_set](3, other.w);
    let _z = _native_typed_data.NativeInt32x4._list[$_get](dart.notNull(mask) >> 4 & 3);
    let _w = _native_typed_data.NativeInt32x4._list[$_get](dart.notNull(mask) >> 6 & 3);
    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
  }
  withX(x) {
    let _x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
    return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
  }
  withY(y) {
    let _y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
    return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
  }
  withZ(z) {
    let _z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
  }
  withW(w) {
    let _w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
  }
  get flagX() {
    return this.x !== 0;
  }
  get flagY() {
    return this.y !== 0;
  }
  get flagZ() {
    return this.z !== 0;
  }
  get flagW() {
    return this.w !== 0;
  }
  withFlagX(flagX) {
    let _x = dart.test(flagX) ? -1 : 0;
    return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
  }
  withFlagY(flagY) {
    let _y = dart.test(flagY) ? -1 : 0;
    return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
  }
  withFlagZ(flagZ) {
    let _z = dart.test(flagZ) ? -1 : 0;
    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
  }
  withFlagW(flagW) {
    let _w = dart.test(flagW) ? -1 : 0;
    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
  }
  select(trueValue, falseValue) {
    let floatList = _native_typed_data.NativeFloat32x4._list;
    let intView = _native_typed_data.NativeFloat32x4._uint32view;
    floatList[$_set](0, trueValue.x);
    floatList[$_set](1, trueValue.y);
    floatList[$_set](2, trueValue.z);
    floatList[$_set](3, trueValue.w);
    let stx = intView[$_get](0);
    let sty = intView[$_get](1);
    let stz = intView[$_get](2);
    let stw = intView[$_get](3);
    floatList[$_set](0, falseValue.x);
    floatList[$_set](1, falseValue.y);
    floatList[$_set](2, falseValue.z);
    floatList[$_set](3, falseValue.w);
    let sfx = intView[$_get](0);
    let sfy = intView[$_get](1);
    let sfz = intView[$_get](2);
    let sfw = intView[$_get](3);
    let _x = (dart.notNull(this.x) & dart.notNull(stx) | ~dart.notNull(this.x) & dart.notNull(sfx)) >>> 0;
    let _y = (dart.notNull(this.y) & dart.notNull(sty) | ~dart.notNull(this.y) & dart.notNull(sfy)) >>> 0;
    let _z = (dart.notNull(this.z) & dart.notNull(stz) | ~dart.notNull(this.z) & dart.notNull(sfz)) >>> 0;
    let _w = (dart.notNull(this.w) & dart.notNull(stw) | ~dart.notNull(this.w) & dart.notNull(sfw)) >>> 0;
    intView[$_set](0, _x);
    intView[$_set](1, _y);
    intView[$_set](2, _z);
    intView[$_set](3, _w);
    return new _native_typed_data.NativeFloat32x4._truncated(floatList[$_get](0), floatList[$_get](1), floatList[$_get](2), floatList[$_get](3));
  }
};
(_native_typed_data.NativeInt32x4.new = function(x, y, z, w) {
  this.x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
  this.y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
  this.z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
  this.w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
  if (x != this.x && !core.int.is(x)) dart.throw(new core.ArgumentError.new(x));
  if (y != this.y && !core.int.is(y)) dart.throw(new core.ArgumentError.new(y));
  if (z != this.z && !core.int.is(z)) dart.throw(new core.ArgumentError.new(z));
  if (w != this.w && !core.int.is(w)) dart.throw(new core.ArgumentError.new(w));
}).prototype = _native_typed_data.NativeInt32x4.prototype;
(_native_typed_data.NativeInt32x4.bool = function(x, y, z, w) {
  this.x = dart.test(x) ? -1 : 0;
  this.y = dart.test(y) ? -1 : 0;
  this.z = dart.test(z) ? -1 : 0;
  this.w = dart.test(w) ? -1 : 0;
}).prototype = _native_typed_data.NativeInt32x4.prototype;
(_native_typed_data.NativeInt32x4._truncated = function(x, y, z, w) {
  this.x = x;
  this.y = y;
  this.z = z;
  this.w = w;
}).prototype = _native_typed_data.NativeInt32x4.prototype;
dart.addTypeTests(_native_typed_data.NativeInt32x4);
_native_typed_data.NativeInt32x4[dart.implements] = () => [typed_data.Int32x4];
dart.setMethodSignature(_native_typed_data.NativeInt32x4, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeInt32x4.__proto__),
  '|': dart.fnType(typed_data.Int32x4, [typed_data.Int32x4]),
  '&': dart.fnType(typed_data.Int32x4, [typed_data.Int32x4]),
  '^': dart.fnType(typed_data.Int32x4, [typed_data.Int32x4]),
  '+': dart.fnType(typed_data.Int32x4, [typed_data.Int32x4]),
  '-': dart.fnType(typed_data.Int32x4, [typed_data.Int32x4]),
  _negate: dart.fnType(typed_data.Int32x4, []),
  shuffle: dart.fnType(typed_data.Int32x4, [core.int]),
  shuffleMix: dart.fnType(typed_data.Int32x4, [typed_data.Int32x4, core.int]),
  withX: dart.fnType(typed_data.Int32x4, [core.int]),
  withY: dart.fnType(typed_data.Int32x4, [core.int]),
  withZ: dart.fnType(typed_data.Int32x4, [core.int]),
  withW: dart.fnType(typed_data.Int32x4, [core.int]),
  withFlagX: dart.fnType(typed_data.Int32x4, [core.bool]),
  withFlagY: dart.fnType(typed_data.Int32x4, [core.bool]),
  withFlagZ: dart.fnType(typed_data.Int32x4, [core.bool]),
  withFlagW: dart.fnType(typed_data.Int32x4, [core.bool]),
  select: dart.fnType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4])
}));
dart.setGetterSignature(_native_typed_data.NativeInt32x4, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeInt32x4.__proto__),
  signMask: core.int,
  flagX: core.bool,
  flagY: core.bool,
  flagZ: core.bool,
  flagW: core.bool
}));
dart.setLibraryUri(_native_typed_data.NativeInt32x4, "dart:_native_typed_data");
dart.setFieldSignature(_native_typed_data.NativeInt32x4, () => ({
  __proto__: dart.getFields(_native_typed_data.NativeInt32x4.__proto__),
  x: dart.finalFieldType(core.int),
  y: dart.finalFieldType(core.int),
  z: dart.finalFieldType(core.int),
  w: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(_native_typed_data.NativeInt32x4, ['toString']);
dart.defineLazy(_native_typed_data.NativeInt32x4, {
  /*_native_typed_data.NativeInt32x4._list*/get _list() {
    return _native_typed_data.NativeInt32List.new(4);
  }
});
_native_typed_data.NativeFloat64x2 = class NativeFloat64x2 extends core.Object {
  toString() {
    return "[" + dart.str(this.x) + ", " + dart.str(this.y) + "]";
  }
  ['+'](other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
  }
  _negate() {
    return new _native_typed_data.NativeFloat64x2._doubles(-dart.notNull(this.x), -dart.notNull(this.y));
  }
  ['-'](other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
  }
  ['*'](other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(other.x), dart.notNull(this.y) * dart.notNull(other.y));
  }
  ['/'](other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) / dart.notNull(other.x), dart.notNull(this.y) / dart.notNull(other.y));
  }
  scale(s) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(s), dart.notNull(this.y) * dart.notNull(s));
  }
  abs() {
    return new _native_typed_data.NativeFloat64x2._doubles(this.x[$abs](), this.y[$abs]());
  }
  clamp(lowerLimit, upperLimit) {
    let _lx = lowerLimit.x;
    let _ly = lowerLimit.y;
    let _ux = upperLimit.x;
    let _uy = upperLimit.y;
    let _x = this.x;
    let _y = this.y;
    _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
    _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
    _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
    _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
    return new _native_typed_data.NativeFloat64x2._doubles(_x, _y);
  }
  get signMask() {
    let view = _native_typed_data.NativeFloat64x2._uint32View;
    _native_typed_data.NativeFloat64x2._list[$_set](0, this.x);
    _native_typed_data.NativeFloat64x2._list[$_set](1, this.y);
    let mx = (dart.notNull(view[$_get](1)) & 2147483648) >>> 31;
    let my = (dart.notNull(view[$_get](3)) & 2147483648) >>> 31;
    return (mx | my << 1) >>> 0;
  }
  withX(x) {
    if (!(typeof x == 'number')) dart.throw(new core.ArgumentError.new(x));
    return new _native_typed_data.NativeFloat64x2._doubles(x, this.y);
  }
  withY(y) {
    if (!(typeof y == 'number')) dart.throw(new core.ArgumentError.new(y));
    return new _native_typed_data.NativeFloat64x2._doubles(this.x, y);
  }
  min(other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y);
  }
  max(other) {
    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y);
  }
  sqrt() {
    return new _native_typed_data.NativeFloat64x2._doubles(math.sqrt(this.x), math.sqrt(this.y));
  }
};
(_native_typed_data.NativeFloat64x2.new = function(x, y) {
  this.x = x;
  this.y = y;
  if (!(typeof this.x == 'number')) dart.throw(new core.ArgumentError.new(this.x));
  if (!(typeof this.y == 'number')) dart.throw(new core.ArgumentError.new(this.y));
}).prototype = _native_typed_data.NativeFloat64x2.prototype;
(_native_typed_data.NativeFloat64x2.splat = function(v) {
  _native_typed_data.NativeFloat64x2.new.call(this, v, v);
}).prototype = _native_typed_data.NativeFloat64x2.prototype;
(_native_typed_data.NativeFloat64x2.zero = function() {
  _native_typed_data.NativeFloat64x2.splat.call(this, 0.0);
}).prototype = _native_typed_data.NativeFloat64x2.prototype;
(_native_typed_data.NativeFloat64x2.fromFloat32x4 = function(v) {
  _native_typed_data.NativeFloat64x2.new.call(this, v.x, v.y);
}).prototype = _native_typed_data.NativeFloat64x2.prototype;
(_native_typed_data.NativeFloat64x2._doubles = function(x, y) {
  this.x = x;
  this.y = y;
}).prototype = _native_typed_data.NativeFloat64x2.prototype;
dart.addTypeTests(_native_typed_data.NativeFloat64x2);
_native_typed_data.NativeFloat64x2[dart.implements] = () => [typed_data.Float64x2];
dart.setMethodSignature(_native_typed_data.NativeFloat64x2, () => ({
  __proto__: dart.getMethods(_native_typed_data.NativeFloat64x2.__proto__),
  '+': dart.fnType(typed_data.Float64x2, [typed_data.Float64x2]),
  _negate: dart.fnType(typed_data.Float64x2, []),
  '-': dart.fnType(typed_data.Float64x2, [typed_data.Float64x2]),
  '*': dart.fnType(typed_data.Float64x2, [typed_data.Float64x2]),
  '/': dart.fnType(typed_data.Float64x2, [typed_data.Float64x2]),
  scale: dart.fnType(typed_data.Float64x2, [core.double]),
  abs: dart.fnType(typed_data.Float64x2, []),
  clamp: dart.fnType(typed_data.Float64x2, [typed_data.Float64x2, typed_data.Float64x2]),
  withX: dart.fnType(typed_data.Float64x2, [core.double]),
  withY: dart.fnType(typed_data.Float64x2, [core.double]),
  min: dart.fnType(typed_data.Float64x2, [typed_data.Float64x2]),
  max: dart.fnType(typed_data.Float64x2, [typed_data.Float64x2]),
  sqrt: dart.fnType(typed_data.Float64x2, [])
}));
dart.setGetterSignature(_native_typed_data.NativeFloat64x2, () => ({
  __proto__: dart.getGetters(_native_typed_data.NativeFloat64x2.__proto__),
  signMask: core.int
}));
dart.setLibraryUri(_native_typed_data.NativeFloat64x2, "dart:_native_typed_data");
dart.setFieldSignature(_native_typed_data.NativeFloat64x2, () => ({
  __proto__: dart.getFields(_native_typed_data.NativeFloat64x2.__proto__),
  x: dart.finalFieldType(core.double),
  y: dart.finalFieldType(core.double)
}));
dart.defineExtensionMethods(_native_typed_data.NativeFloat64x2, ['toString']);
dart.defineLazy(_native_typed_data.NativeFloat64x2, {
  /*_native_typed_data.NativeFloat64x2._list*/get _list() {
    return _native_typed_data.NativeFloat64List.new(2);
  },
  set _list(_) {},
  /*_native_typed_data.NativeFloat64x2._uint32View*/get _uint32View() {
    return _native_typed_data.NativeUint32List._check(_native_typed_data.NativeFloat64x2._list.buffer[$asUint32List]());
  },
  set _uint32View(_) {}
});
_native_typed_data._isInvalidArrayIndex = function(index) {
  return index >>> 0 !== index;
};
_native_typed_data._checkValidIndex = function(index, list, length) {
  if (dart.test(_native_typed_data._isInvalidArrayIndex(index)) || index >= dart.notNull(length)) {
    dart.throw(_js_helper.diagnoseIndexError(list, index));
  }
};
_native_typed_data._checkValidRange = function(start, end, length) {
  if (dart.test(_native_typed_data._isInvalidArrayIndex(start)) || (end == null ? dart.notNull(start) > dart.notNull(length) : dart.test(_native_typed_data._isInvalidArrayIndex(end)) || dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length))) {
    dart.throw(_js_helper.diagnoseRangeError(start, end, length));
  }
  if (end == null) return length;
  return end;
};
const _thenNoZoneRegistration = dart.privateName(async, "_thenNoZoneRegistration");
const _completeWithValue = dart.privateName(async, "_completeWithValue");
const _asyncComplete = dart.privateName(async, "_asyncComplete");
async.async = function(T, initGenerator) {
  let iter = null;
  let onValue = null;
  let onError = null;
  function onAwait(value) {
    let f = null;
    if (async._Future.is(value)) {
      f = value;
    } else if (async.Future.is(value)) {
      f = new async._Future.new();
      async._Future._chainForeignFuture(value, f);
    } else {
      f = new async._Future.value(value);
    }
    f = f[_thenNoZoneRegistration](core.Object, onValue, onError);
    return f;
  }
  onValue = value => {
    let iteratorResult = iter.next(value);
    value = iteratorResult.value;
    return iteratorResult.done ? value : onAwait(value);
  };
  onError = (value, stackTrace) => {
    let iteratorResult = iter.throw(dart.createErrorWithStack(value, stackTrace));
    value = iteratorResult.value;
    return iteratorResult.done ? value : onAwait(value);
  };
  let zone = async.Zone.current;
  if (!(zone === async._rootZone)) {
    onValue = zone.registerUnaryCallback(core.Object, core.Object, onValue);
    onError = zone.registerBinaryCallback(core.Object, core.Object, core.StackTrace, onError);
  }
  let asyncFuture = new (async._Future$(T)).new();
  let isRunningAsEvent = false;
  function runBody() {
    try {
      iter = initGenerator()[Symbol.iterator]();
      let iteratorValue = iter.next(null);
      let value = iteratorValue.value;
      if (iteratorValue.done) {
        if (async.Future.is(value)) {
          if (async._Future.is(value)) {
            async._Future._chainCoreFuture(value, asyncFuture);
          } else {
            async._Future._chainForeignFuture(value, asyncFuture);
          }
        } else if (isRunningAsEvent) {
          asyncFuture[_completeWithValue](value);
        } else {
          asyncFuture[_asyncComplete](value);
        }
      } else {
        async._Future._chainCoreFuture(onAwait(value), asyncFuture);
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      if (isRunningAsEvent) {
        async._completeWithErrorCallback(asyncFuture, e, s);
      } else {
        async._asyncCompleteWithErrorCallback(asyncFuture, e, s);
      }
    }
  }
  if (dart.test(dart.startAsyncSynchronously)) {
    runBody();
    isRunningAsEvent = true;
  } else {
    isRunningAsEvent = true;
    async.scheduleMicrotask(runBody);
  }
  return asyncFuture;
};
const _handleErrorCallback = dart.privateName(async, "_handleErrorCallback");
const _runBodyCallback = dart.privateName(async, "_runBodyCallback");
const _fatal = dart.privateName(async, "_fatal");
const _is__AsyncStarImpl_default = Symbol('_is__AsyncStarImpl_default');
async._AsyncStarImpl$ = dart.generic(T => {
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let _AsyncStarImplOfT = () => (_AsyncStarImplOfT = dart.constFn(async._AsyncStarImpl$(T)))();
  let _AsyncStarImplOfTToObject = () => (_AsyncStarImplOfTToObject = dart.constFn(dart.fnType(core.Object, [_AsyncStarImplOfT()])))();
  class _AsyncStarImpl extends core.Object {
    get stream() {
      return this.controller.stream;
    }
    get handleError() {
      if (this[_handleErrorCallback] == null) {
        this[_handleErrorCallback] = dart.fn((error, stackTrace) => {
          try {
            this.jsIterator.throw(dart.createErrorWithStack(error, stackTrace));
          } catch (e$) {
            let e = dart.getThrown(e$);
            let newStack = dart.stackTrace(e$);
            this.addError(e, newStack);
          }
        }, ObjectAndStackTraceToNull());
        let zone = async.Zone.current;
        if (!(zone === async.Zone.root)) {
          this[_handleErrorCallback] = zone.bindBinaryCallback(core.Null, core.Object, core.StackTrace, this[_handleErrorCallback]);
        }
      }
      return this[_handleErrorCallback];
    }
    scheduleGenerator() {
      if (this.isScheduled || dart.test(this.controller.isPaused) || this.isSuspendedAtYieldStar || this.isSuspendedAtAwait) {
        return;
      }
      this.isScheduled = true;
      let zone = async.Zone.current;
      if (this[_runBodyCallback] == null) {
        this[_runBodyCallback] = this.runBody.bind(this);
        if (!(zone === async.Zone.root)) {
          let registered = zone.registerUnaryCallback(dart.void, core.Object, this[_runBodyCallback]);
          this[_runBodyCallback] = dart.fn(arg => {
            if (arg === void 0) arg = null;
            return zone.runUnaryGuarded(core.Object, registered, arg);
          }, __Tovoid());
        }
      }
      zone.scheduleMicrotask(this[_runBodyCallback]);
    }
    runBody(awaitValue) {
      this.isScheduled = false;
      this.isSuspendedAtYield = false;
      this.isSuspendedAtAwait = false;
      let iterResult = null;
      try {
        iterResult = this.jsIterator.next(awaitValue);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        this.addError(e, s);
        return null;
      }
      if (iterResult.done) {
        this.close();
        return null;
      }
      if (this.isSuspendedAtYield || this.isSuspendedAtYieldStar) return null;
      this.isSuspendedAtAwait = true;
      let value = iterResult.value;
      let f = null;
      if (async._Future.is(value)) {
        f = value;
      } else if (async.Future.is(value)) {
        f = new async._Future.new();
        async._Future._chainForeignFuture(value, f);
      } else {
        f = new async._Future.value(value);
      }
      f[_thenNoZoneRegistration](dart.void, this[_runBodyCallback], this.handleError);
    }
    add(event) {
      T._check(event);
      if (!this.onListenReceived) this[_fatal]("yield before stream is listened to");
      if (this.isSuspendedAtYield) this[_fatal]("unexpected yield");
      if (!dart.test(this.controller.hasListener)) {
        return true;
      }
      this.controller.add(event);
      this.scheduleGenerator();
      this.isSuspendedAtYield = true;
      return false;
    }
    addStream(stream) {
      StreamOfT()._check(stream);
      if (!this.onListenReceived) this[_fatal]("yield* before stream is listened to");
      if (!dart.test(this.controller.hasListener)) return true;
      this.isSuspendedAtYieldStar = true;
      let whenDoneAdding = this.controller.addStream(stream, {cancelOnError: false});
      FutureOfNull()._check(whenDoneAdding.then(core.Null, dart.fn(_ => {
        this.isSuspendedAtYieldStar = false;
        this.scheduleGenerator();
        if (!this.isScheduled) this.isSuspendedAtYield = true;
      }, dynamicToNull()), {onError: this.handleError}));
      return false;
    }
    addError(error, stackTrace) {
      if (this.cancellationCompleter != null && !dart.test(this.cancellationCompleter.isCompleted)) {
        this.cancellationCompleter.completeError(error, stackTrace);
      } else if (dart.test(this.controller.hasListener)) {
        this.controller.addError(error, stackTrace);
      }
      this.close();
    }
    close() {
      if (this.cancellationCompleter != null && !dart.test(this.cancellationCompleter.isCompleted)) {
        this.cancellationCompleter.complete();
      }
      this.controller.close();
    }
    onListen() {
      if (!!this.onListenReceived) dart.assertFailed(null, "dart:async", 485, 12, "!onListenReceived");
      this.onListenReceived = true;
      this.scheduleGenerator();
    }
    onResume() {
      if (this.isSuspendedAtYield) {
        this.scheduleGenerator();
      }
    }
    onCancel() {
      if (dart.test(this.controller.isClosed)) {
        return null;
      }
      if (this.cancellationCompleter == null) {
        this.cancellationCompleter = async.Completer.new();
        if (this.isSuspendedAtYield) {
          this.scheduleGenerator();
        }
      }
      return this.cancellationCompleter.future;
    }
    [_fatal](message) {
      return dart.throw(new core.StateError.new(message));
    }
  }
  (_AsyncStarImpl.new = function(initGenerator) {
    this.controller = null;
    this.isSuspendedAtYieldStar = false;
    this.onListenReceived = false;
    this.isScheduled = false;
    this.isSuspendedAtYield = false;
    this.isSuspendedAtAwait = false;
    this.cancellationCompleter = null;
    this.jsIterator = null;
    this[_handleErrorCallback] = null;
    this[_runBodyCallback] = null;
    this.initGenerator = initGenerator;
    this.controller = StreamControllerOfT().new({onListen: this.onListen.bind(this), onResume: this.onResume.bind(this), onCancel: this.onCancel.bind(this)});
    this.jsIterator = this.initGenerator(this)[Symbol.iterator]();
  }).prototype = _AsyncStarImpl.prototype;
  dart.addTypeTests(_AsyncStarImpl);
  _AsyncStarImpl.prototype[_is__AsyncStarImpl_default] = true;
  dart.setMethodSignature(_AsyncStarImpl, () => ({
    __proto__: dart.getMethods(_AsyncStarImpl.__proto__),
    scheduleGenerator: dart.fnType(dart.void, []),
    runBody: dart.fnType(dart.void, [dart.dynamic]),
    add: dart.fnType(core.bool, [core.Object]),
    addStream: dart.fnType(core.bool, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    close: dart.fnType(dart.void, []),
    onListen: dart.fnType(dart.dynamic, []),
    onResume: dart.fnType(dart.dynamic, []),
    onCancel: dart.fnType(dart.dynamic, []),
    [_fatal]: dart.fnType(dart.dynamic, [core.String])
  }));
  dart.setGetterSignature(_AsyncStarImpl, () => ({
    __proto__: dart.getGetters(_AsyncStarImpl.__proto__),
    stream: async.Stream$(T),
    handleError: dart.fnType(core.Null, [core.Object, core.StackTrace])
  }));
  dart.setLibraryUri(_AsyncStarImpl, "dart:async");
  dart.setFieldSignature(_AsyncStarImpl, () => ({
    __proto__: dart.getFields(_AsyncStarImpl.__proto__),
    controller: dart.fieldType(StreamControllerOfT()),
    initGenerator: dart.fieldType(_AsyncStarImplOfTToObject()),
    isSuspendedAtYieldStar: dart.fieldType(core.bool),
    onListenReceived: dart.fieldType(core.bool),
    isScheduled: dart.fieldType(core.bool),
    isSuspendedAtYield: dart.fieldType(core.bool),
    isSuspendedAtAwait: dart.fieldType(core.bool),
    cancellationCompleter: dart.fieldType(async.Completer),
    jsIterator: dart.fieldType(core.Object),
    [_handleErrorCallback]: dart.fieldType(ObjectAndStackTraceToNull()),
    [_runBodyCallback]: dart.fieldType(__Tovoid())
  }));
  return _AsyncStarImpl;
});
async._AsyncStarImpl = async._AsyncStarImpl$();
dart.addTypeTests(async._AsyncStarImpl, _is__AsyncStarImpl_default);
async._invokeErrorHandler = function(errorHandler, error, stackTrace) {
  if (NullAndNullTodynamic().is(errorHandler)) {
    return dart.dcall(errorHandler, [error, stackTrace]);
  } else {
    let unaryErrorHandler = dynamicTodynamic()._check(errorHandler);
    return unaryErrorHandler(error);
  }
};
const _controller = dart.privateName(async, "_controller");
const _subscribe = dart.privateName(async, "_subscribe");
const _createSubscription = dart.privateName(async, "_createSubscription");
const _onListen = dart.privateName(async, "_onListen");
const _is__StreamImpl_default = Symbol('_is__StreamImpl_default');
async._StreamImpl$ = dart.generic(T => {
  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
  class _StreamImpl extends async.Stream$(T) {
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      cancelOnError = true === cancelOnError;
      let subscription = this[_createSubscription](onData, onError, onDone, cancelOnError);
      this[_onListen](subscription);
      return subscription;
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_BufferingStreamSubscriptionOfT()).new(onData, onError, onDone, cancelOnError);
    }
    [_onListen](subscription) {}
  }
  (_StreamImpl.new = function() {
    _StreamImpl.__proto__.new.call(this);
  }).prototype = _StreamImpl.prototype;
  dart.addTypeTests(_StreamImpl);
  _StreamImpl.prototype[_is__StreamImpl_default] = true;
  dart.setMethodSignature(_StreamImpl, () => ({
    __proto__: dart.getMethods(_StreamImpl.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
    [_createSubscription]: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T]), core.Function, dart.fnType(dart.void, []), core.bool]),
    [_onListen]: dart.fnType(dart.void, [async.StreamSubscription])
  }));
  dart.setLibraryUri(_StreamImpl, "dart:async");
  return _StreamImpl;
});
async._StreamImpl = async._StreamImpl$();
dart.addTypeTests(async._StreamImpl, _is__StreamImpl_default);
const _is__ControllerStream_default = Symbol('_is__ControllerStream_default');
async._ControllerStream$ = dart.generic(T => {
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  class _ControllerStream extends async._StreamImpl$(T) {
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return this[_controller][_subscribe](onData, onError, onDone, cancelOnError);
    }
    get hashCode() {
      return (dart.notNull(dart.hashCode(this[_controller])) ^ 892482866) >>> 0;
    }
    _equals(other) {
      if (this === other) return true;
      return async._ControllerStream.is(other) && other[_controller] == this[_controller];
    }
  }
  (_ControllerStream.new = function(controller) {
    this[_controller] = controller;
    _ControllerStream.__proto__.new.call(this);
  }).prototype = _ControllerStream.prototype;
  dart.addTypeTests(_ControllerStream);
  _ControllerStream.prototype[_is__ControllerStream_default] = true;
  dart.setMethodSignature(_ControllerStream, () => ({
    __proto__: dart.getMethods(_ControllerStream.__proto__),
    _equals: dart.fnType(core.bool, [core.Object]),
    [$_equals]: dart.fnType(core.bool, [core.Object])
  }));
  dart.setGetterSignature(_ControllerStream, () => ({
    __proto__: dart.getGetters(_ControllerStream.__proto__),
    hashCode: core.int,
    [$hashCode]: core.int
  }));
  dart.setLibraryUri(_ControllerStream, "dart:async");
  dart.setFieldSignature(_ControllerStream, () => ({
    __proto__: dart.getFields(_ControllerStream.__proto__),
    [_controller]: dart.fieldType(_StreamControllerLifecycleOfT())
  }));
  dart.defineExtensionMethods(_ControllerStream, ['_equals']);
  dart.defineExtensionAccessors(_ControllerStream, ['hashCode']);
  return _ControllerStream;
});
async._ControllerStream = async._ControllerStream$();
dart.addTypeTests(async._ControllerStream, _is__ControllerStream_default);
const _is__BroadcastStream_default = Symbol('_is__BroadcastStream_default');
async._BroadcastStream$ = dart.generic(T => {
  class _BroadcastStream extends async._ControllerStream$(T) {
    get isBroadcast() {
      return true;
    }
  }
  (_BroadcastStream.new = function(controller) {
    _BroadcastStream.__proto__.new.call(this, controller);
  }).prototype = _BroadcastStream.prototype;
  dart.addTypeTests(_BroadcastStream);
  _BroadcastStream.prototype[_is__BroadcastStream_default] = true;
  dart.setLibraryUri(_BroadcastStream, "dart:async");
  return _BroadcastStream;
});
async._BroadcastStream = async._BroadcastStream$();
dart.addTypeTests(async._BroadcastStream, _is__BroadcastStream_default);
const _eventState = dart.privateName(async, "_eventState");
const _next$ = dart.privateName(async, "_next");
const _previous$ = dart.privateName(async, "_previous");
const _expectsEvent = dart.privateName(async, "_expectsEvent");
const _toggleEventId = dart.privateName(async, "_toggleEventId");
const _isFiring = dart.privateName(async, "_isFiring");
const _setRemoveAfterFiring = dart.privateName(async, "_setRemoveAfterFiring");
const _removeAfterFiring = dart.privateName(async, "_removeAfterFiring");
const _onPause = dart.privateName(async, "_onPause");
const _onResume = dart.privateName(async, "_onResume");
const _recordCancel = dart.privateName(async, "_recordCancel");
const _onCancel = dart.privateName(async, "_onCancel");
const _recordPause = dart.privateName(async, "_recordPause");
const _recordResume = dart.privateName(async, "_recordResume");
const _state = dart.privateName(async, "_state");
const _onData$ = dart.privateName(async, "_onData");
const _onError = dart.privateName(async, "_onError");
const _onDone = dart.privateName(async, "_onDone");
const _zone$ = dart.privateName(async, "_zone");
const _cancelFuture = dart.privateName(async, "_cancelFuture");
const _pending = dart.privateName(async, "_pending");
const _setPendingEvents = dart.privateName(async, "_setPendingEvents");
const _isCanceled = dart.privateName(async, "_isCanceled");
const _isPaused = dart.privateName(async, "_isPaused");
const _isInputPaused = dart.privateName(async, "_isInputPaused");
const _inCallback = dart.privateName(async, "_inCallback");
const _guardCallback = dart.privateName(async, "_guardCallback");
const _decrementPauseCount = dart.privateName(async, "_decrementPauseCount");
const _hasPending = dart.privateName(async, "_hasPending");
const _mayResumeInput = dart.privateName(async, "_mayResumeInput");
const _cancel = dart.privateName(async, "_cancel");
const _isClosed = dart.privateName(async, "_isClosed");
const _waitsForCancel = dart.privateName(async, "_waitsForCancel");
const _canFire = dart.privateName(async, "_canFire");
const _cancelOnError = dart.privateName(async, "_cancelOnError");
const _sendData = dart.privateName(async, "_sendData");
const _addPending = dart.privateName(async, "_addPending");
const _sendError = dart.privateName(async, "_sendError");
const _sendDone = dart.privateName(async, "_sendDone");
let const$11;
const _close = dart.privateName(async, "_close");
const _checkState = dart.privateName(async, "_checkState");
const _is__BufferingStreamSubscription_default = Symbol('_is__BufferingStreamSubscription_default');
async._BufferingStreamSubscription$ = dart.generic(T => {
  let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  let TTovoid = () => (TTovoid = dart.constFn(dart.fnType(dart.void, [T])))();
  class _BufferingStreamSubscription extends core.Object {
    [_setPendingEvents](pendingEvents) {
      _PendingEventsOfT()._check(pendingEvents);
      if (!(this[_pending] == null)) dart.assertFailed(null, "dart:async/stream_impl.dart", 124, 12, "_pending == null");
      if (pendingEvents == null) return;
      this[_pending] = pendingEvents;
      if (!dart.test(pendingEvents.isEmpty)) {
        this[_state] = (dart.notNull(this[_state]) | 64) >>> 0;
        this[_pending].schedule(this);
      }
    }
    onData(handleData) {
      let t = handleData;
      t == null ? handleData = dart.fn(async._nullDataHandler, ObjectTovoid()) : t;
      this[_onData$] = this[_zone$].registerUnaryCallback(dart.dynamic, T, handleData);
    }
    onError(handleError) {
      let t = handleError;
      t == null ? handleError = dart.fn(async._nullErrorHandler, Object__Tovoid()) : t;
      if (ObjectAndStackTraceTovoid().is(handleError)) {
        this[_onError] = this[_zone$].registerBinaryCallback(dart.dynamic, core.Object, core.StackTrace, handleError);
      } else if (ObjectTovoid().is(handleError)) {
        this[_onError] = this[_zone$].registerUnaryCallback(dart.dynamic, core.Object, handleError);
      } else {
        dart.throw(new core.ArgumentError.new("handleError callback must take either an Object " + "(the error), or both an Object (the error) and a StackTrace."));
      }
    }
    onDone(handleDone) {
      let t = handleDone;
      t == null ? handleDone = dart.fn(async._nullDoneHandler, VoidTovoid()) : t;
      this[_onDone] = this[_zone$].registerCallback(dart.void, handleDone);
    }
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      if (dart.test(this[_isCanceled])) return;
      let wasPaused = this[_isPaused];
      let wasInputPaused = this[_isInputPaused];
      this[_state] = (dart.notNull(this[_state]) + 128 | 4) >>> 0;
      if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
      if (!dart.test(wasPaused) && this[_pending] != null) this[_pending].cancelSchedule();
      if (!dart.test(wasInputPaused) && !dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onPause));
    }
    resume() {
      if (dart.test(this[_isCanceled])) return;
      if (dart.test(this[_isPaused])) {
        this[_decrementPauseCount]();
        if (!dart.test(this[_isPaused])) {
          if (dart.test(this[_hasPending]) && !dart.test(this[_pending].isEmpty)) {
            this[_pending].schedule(this);
          } else {
            if (!dart.test(this[_mayResumeInput])) dart.assertFailed(null, "dart:async/stream_impl.dart", 180, 18, "_mayResumeInput");
            this[_state] = (dart.notNull(this[_state]) & ~4) >>> 0;
            if (!dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onResume));
          }
        }
      }
    }
    cancel() {
      this[_state] = (dart.notNull(this[_state]) & ~16) >>> 0;
      if (!dart.test(this[_isCanceled])) {
        this[_cancel]();
      }
      let l = this[_cancelFuture];
      return l != null ? l : async.Future._nullFuture;
    }
    asFuture(E, futureValue) {
      if (futureValue === void 0) futureValue = null;
      let result = new (async._Future$(E)).new();
      this[_onDone] = dart.fn(() => {
        result[_complete](futureValue);
      }, VoidToNull());
      this[_onError] = dart.fn((error, stackTrace) => {
        let cancelFuture = this.cancel();
        if (!(cancelFuture == async.Future._nullFuture)) {
          cancelFuture.whenComplete(dart.fn(() => {
            result[_completeError](error, stackTrace);
          }, VoidToNull()));
        } else {
          result[_completeError](error, stackTrace);
        }
      }, dynamicAndStackTraceToNull());
      return result;
    }
    get [_isInputPaused]() {
      return (dart.notNull(this[_state]) & 4) !== 0;
    }
    get [_isClosed]() {
      return (dart.notNull(this[_state]) & 2) !== 0;
    }
    get [_isCanceled]() {
      return (dart.notNull(this[_state]) & 8) !== 0;
    }
    get [_waitsForCancel]() {
      return (dart.notNull(this[_state]) & 16) !== 0;
    }
    get [_inCallback]() {
      return (dart.notNull(this[_state]) & 32) !== 0;
    }
    get [_hasPending]() {
      return (dart.notNull(this[_state]) & 64) !== 0;
    }
    get [_isPaused]() {
      return dart.notNull(this[_state]) >= 128;
    }
    get [_canFire]() {
      return dart.notNull(this[_state]) < 32;
    }
    get [_mayResumeInput]() {
      return !dart.test(this[_isPaused]) && (this[_pending] == null || dart.test(this[_pending].isEmpty));
    }
    get [_cancelOnError]() {
      return (dart.notNull(this[_state]) & 1) !== 0;
    }
    get isPaused() {
      return this[_isPaused];
    }
    [_cancel]() {
      this[_state] = (dart.notNull(this[_state]) | 8) >>> 0;
      if (dart.test(this[_hasPending])) {
        this[_pending].cancelSchedule();
      }
      if (!dart.test(this[_inCallback])) this[_pending] = null;
      this[_cancelFuture] = this[_onCancel]();
    }
    [_decrementPauseCount]() {
      if (!dart.test(this[_isPaused])) dart.assertFailed(null, "dart:async/stream_impl.dart", 253, 12, "_isPaused");
      this[_state] = dart.notNull(this[_state]) - 128;
    }
    [_add](data) {
      T._check(data);
      if (!!dart.test(this[_isClosed])) dart.assertFailed(null, "dart:async/stream_impl.dart", 260, 12, "!_isClosed");
      if (dart.test(this[_isCanceled])) return;
      if (dart.test(this[_canFire])) {
        this[_sendData](data);
      } else {
        this[_addPending](new (_DelayedDataOfT()).new(data));
      }
    }
    [_addError](error, stackTrace) {
      if (dart.test(this[_isCanceled])) return;
      if (dart.test(this[_canFire])) {
        this[_sendError](error, stackTrace);
      } else {
        this[_addPending](new async._DelayedError.new(error, stackTrace));
      }
    }
    [_close]() {
      if (!!dart.test(this[_isClosed])) dart.assertFailed(null, "dart:async/stream_impl.dart", 279, 12, "!_isClosed");
      if (dart.test(this[_isCanceled])) return;
      this[_state] = (dart.notNull(this[_state]) | 2) >>> 0;
      if (dart.test(this[_canFire])) {
        this[_sendDone]();
      } else {
        this[_addPending](const$11 || (const$11 = dart.const(new async._DelayedDone.new())));
      }
    }
    [_onPause]() {
      if (!dart.test(this[_isInputPaused])) dart.assertFailed(null, "dart:async/stream_impl.dart", 294, 12, "_isInputPaused");
    }
    [_onResume]() {
      if (!!dart.test(this[_isInputPaused])) dart.assertFailed(null, "dart:async/stream_impl.dart", 298, 12, "!_isInputPaused");
    }
    [_onCancel]() {
      if (!dart.test(this[_isCanceled])) dart.assertFailed(null, "dart:async/stream_impl.dart", 302, 12, "_isCanceled");
      return null;
    }
    [_addPending](event) {
      let pending = _StreamImplEventsOfT()._check(this[_pending]);
      if (this[_pending] == null) {
        pending = this[_pending] = new (_StreamImplEventsOfT()).new();
      }
      pending.add(event);
      if (!dart.test(this[_hasPending])) {
        this[_state] = (dart.notNull(this[_state]) | 64) >>> 0;
        if (!dart.test(this[_isPaused])) {
          this[_pending].schedule(this);
        }
      }
    }
    [_sendData](data) {
      T._check(data);
      if (!!dart.test(this[_isCanceled])) dart.assertFailed(null, "dart:async/stream_impl.dart", 331, 12, "!_isCanceled");
      if (!!dart.test(this[_isPaused])) dart.assertFailed(null, "dart:async/stream_impl.dart", 332, 12, "!_isPaused");
      if (!!dart.test(this[_inCallback])) dart.assertFailed(null, "dart:async/stream_impl.dart", 333, 12, "!_inCallback");
      let wasInputPaused = this[_isInputPaused];
      this[_state] = (dart.notNull(this[_state]) | 32) >>> 0;
      this[_zone$].runUnaryGuarded(T, this[_onData$], data);
      this[_state] = (dart.notNull(this[_state]) & ~32) >>> 0;
      this[_checkState](wasInputPaused);
    }
    [_sendError](error, stackTrace) {
      if (!!dart.test(this[_isCanceled])) dart.assertFailed(null, "dart:async/stream_impl.dart", 342, 12, "!_isCanceled");
      if (!!dart.test(this[_isPaused])) dart.assertFailed(null, "dart:async/stream_impl.dart", 343, 12, "!_isPaused");
      if (!!dart.test(this[_inCallback])) dart.assertFailed(null, "dart:async/stream_impl.dart", 344, 12, "!_inCallback");
      let wasInputPaused = this[_isInputPaused];
      const sendError = () => {
        if (dart.test(this[_isCanceled]) && !dart.test(this[_waitsForCancel])) return;
        this[_state] = (dart.notNull(this[_state]) | 32) >>> 0;
        let onError = this[_onError];
        if (ObjectAndStackTraceTovoid().is(onError)) {
          this[_zone$].runBinaryGuarded(core.Object, core.StackTrace, onError, error, stackTrace);
        } else {
          if (!ObjectTovoid().is(this[_onError])) dart.assertFailed(null, "dart:async/stream_impl.dart", 357, 16, "_onError is void Function(Object)");
          this[_zone$].runUnaryGuarded(core.Object, ObjectTovoid()._check(this[_onError]), error);
        }
        this[_state] = (dart.notNull(this[_state]) & ~32) >>> 0;
      };
      dart.fn(sendError, VoidTovoid());
      if (dart.test(this[_cancelOnError])) {
        this[_state] = (dart.notNull(this[_state]) | 16) >>> 0;
        this[_cancel]();
        if (this[_cancelFuture] != null && !(this[_cancelFuture] == async.Future._nullFuture)) {
          this[_cancelFuture].whenComplete(sendError);
        } else {
          sendError();
        }
      } else {
        sendError();
        this[_checkState](wasInputPaused);
      }
    }
    [_sendDone]() {
      if (!!dart.test(this[_isCanceled])) dart.assertFailed(null, "dart:async/stream_impl.dart", 380, 12, "!_isCanceled");
      if (!!dart.test(this[_isPaused])) dart.assertFailed(null, "dart:async/stream_impl.dart", 381, 12, "!_isPaused");
      if (!!dart.test(this[_inCallback])) dart.assertFailed(null, "dart:async/stream_impl.dart", 382, 12, "!_inCallback");
      const sendDone = () => {
        if (!dart.test(this[_waitsForCancel])) return;
        this[_state] = (dart.notNull(this[_state]) | 8 | 2 | 32) >>> 0;
        this[_zone$].runGuarded(this[_onDone]);
        this[_state] = (dart.notNull(this[_state]) & ~32) >>> 0;
      };
      dart.fn(sendDone, VoidTovoid());
      this[_cancel]();
      this[_state] = (dart.notNull(this[_state]) | 16) >>> 0;
      if (this[_cancelFuture] != null && !(this[_cancelFuture] == async.Future._nullFuture)) {
        this[_cancelFuture].whenComplete(sendDone);
      } else {
        sendDone();
      }
    }
    [_guardCallback](callback) {
      if (!!dart.test(this[_inCallback])) dart.assertFailed(null, "dart:async/stream_impl.dart", 411, 12, "!_inCallback");
      let wasInputPaused = this[_isInputPaused];
      this[_state] = (dart.notNull(this[_state]) | 32) >>> 0;
      callback();
      this[_state] = (dart.notNull(this[_state]) & ~32) >>> 0;
      this[_checkState](wasInputPaused);
    }
    [_checkState](wasInputPaused) {
      if (!!dart.test(this[_inCallback])) dart.assertFailed(null, "dart:async/stream_impl.dart", 430, 12, "!_inCallback");
      if (dart.test(this[_hasPending]) && dart.test(this[_pending].isEmpty)) {
        this[_state] = (dart.notNull(this[_state]) & ~64) >>> 0;
        if (dart.test(this[_isInputPaused]) && dart.test(this[_mayResumeInput])) {
          this[_state] = (dart.notNull(this[_state]) & ~4) >>> 0;
        }
      }
      while (true) {
        if (dart.test(this[_isCanceled])) {
          this[_pending] = null;
          return;
        }
        let isInputPaused = this[_isInputPaused];
        if (wasInputPaused == isInputPaused) break;
        this[_state] = (dart.notNull(this[_state]) ^ 32) >>> 0;
        if (dart.test(isInputPaused)) {
          this[_onPause]();
        } else {
          this[_onResume]();
        }
        this[_state] = (dart.notNull(this[_state]) & ~32) >>> 0;
        wasInputPaused = isInputPaused;
      }
      if (dart.test(this[_hasPending]) && !dart.test(this[_isPaused])) {
        this[_pending].schedule(this);
      }
    }
  }
  (_BufferingStreamSubscription.new = function(onData, onError, onDone, cancelOnError) {
    this[_onData$] = null;
    this[_onError] = null;
    this[_onDone] = null;
    this[_zone$] = async.Zone.current;
    this[_cancelFuture] = null;
    this[_pending] = null;
    this[_state] = dart.test(cancelOnError) ? 1 : 0;
    this.onData(onData);
    this.onError(onError);
    this.onDone(onDone);
  }).prototype = _BufferingStreamSubscription.prototype;
  _BufferingStreamSubscription.prototype[dart.isStreamSubscription] = true;
  dart.addTypeTests(_BufferingStreamSubscription);
  _BufferingStreamSubscription.prototype[_is__BufferingStreamSubscription_default] = true;
  _BufferingStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT(), _EventSinkOfT(), _EventDispatchOfT()];
  dart.setMethodSignature(_BufferingStreamSubscription, () => ({
    __proto__: dart.getMethods(_BufferingStreamSubscription.__proto__),
    [_setPendingEvents]: dart.fnType(dart.void, [core.Object]),
    onData: dart.fnType(dart.void, [dart.fnType(dart.void, [T])]),
    onError: dart.fnType(dart.void, [core.Function]),
    onDone: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
    pause: dart.fnType(dart.void, [], [async.Future]),
    resume: dart.fnType(dart.void, []),
    cancel: dart.fnType(async.Future, []),
    asFuture: dart.gFnType(E => [async.Future$(E), [], [E]]),
    [_cancel]: dart.fnType(dart.void, []),
    [_decrementPauseCount]: dart.fnType(dart.void, []),
    [_add]: dart.fnType(dart.void, [core.Object]),
    [_addError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_close]: dart.fnType(dart.void, []),
    [_onPause]: dart.fnType(dart.void, []),
    [_onResume]: dart.fnType(dart.void, []),
    [_onCancel]: dart.fnType(async.Future, []),
    [_addPending]: dart.fnType(dart.void, [async._DelayedEvent]),
    [_sendData]: dart.fnType(dart.void, [core.Object]),
    [_sendError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_sendDone]: dart.fnType(dart.void, []),
    [_guardCallback]: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
    [_checkState]: dart.fnType(dart.void, [core.bool])
  }));
  dart.setGetterSignature(_BufferingStreamSubscription, () => ({
    __proto__: dart.getGetters(_BufferingStreamSubscription.__proto__),
    [_isInputPaused]: core.bool,
    [_isClosed]: core.bool,
    [_isCanceled]: core.bool,
    [_waitsForCancel]: core.bool,
    [_inCallback]: core.bool,
    [_hasPending]: core.bool,
    [_isPaused]: core.bool,
    [_canFire]: core.bool,
    [_mayResumeInput]: core.bool,
    [_cancelOnError]: core.bool,
    isPaused: core.bool
  }));
  dart.setLibraryUri(_BufferingStreamSubscription, "dart:async");
  dart.setFieldSignature(_BufferingStreamSubscription, () => ({
    __proto__: dart.getFields(_BufferingStreamSubscription.__proto__),
    [_onData$]: dart.fieldType(TTovoid()),
    [_onError]: dart.fieldType(core.Function),
    [_onDone]: dart.fieldType(VoidTovoid()),
    [_zone$]: dart.finalFieldType(async.Zone),
    [_state]: dart.fieldType(core.int),
    [_cancelFuture]: dart.fieldType(async.Future),
    [_pending]: dart.fieldType(_PendingEventsOfT())
  }));
  return _BufferingStreamSubscription;
});
async._BufferingStreamSubscription = async._BufferingStreamSubscription$();
dart.defineLazy(async._BufferingStreamSubscription, {
  /*async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR*/get _STATE_CANCEL_ON_ERROR() {
    return 1;
  },
  /*async._BufferingStreamSubscription._STATE_CLOSED*/get _STATE_CLOSED() {
    return 2;
  },
  /*async._BufferingStreamSubscription._STATE_INPUT_PAUSED*/get _STATE_INPUT_PAUSED() {
    return 4;
  },
  /*async._BufferingStreamSubscription._STATE_CANCELED*/get _STATE_CANCELED() {
    return 8;
  },
  /*async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL*/get _STATE_WAIT_FOR_CANCEL() {
    return 16;
  },
  /*async._BufferingStreamSubscription._STATE_IN_CALLBACK*/get _STATE_IN_CALLBACK() {
    return 32;
  },
  /*async._BufferingStreamSubscription._STATE_HAS_PENDING*/get _STATE_HAS_PENDING() {
    return 64;
  },
  /*async._BufferingStreamSubscription._STATE_PAUSE_COUNT*/get _STATE_PAUSE_COUNT() {
    return 128;
  }
});
dart.addTypeTests(async._BufferingStreamSubscription, _is__BufferingStreamSubscription_default);
const _is__ControllerSubscription_default = Symbol('_is__ControllerSubscription_default');
async._ControllerSubscription$ = dart.generic(T => {
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
    [_onCancel]() {
      return this[_controller][_recordCancel](this);
    }
    [_onPause]() {
      this[_controller][_recordPause](this);
    }
    [_onResume]() {
      this[_controller][_recordResume](this);
    }
  }
  (_ControllerSubscription.new = function(controller, onData, onError, onDone, cancelOnError) {
    this[_controller] = controller;
    _ControllerSubscription.__proto__.new.call(this, onData, onError, onDone, cancelOnError);
  }).prototype = _ControllerSubscription.prototype;
  dart.addTypeTests(_ControllerSubscription);
  _ControllerSubscription.prototype[_is__ControllerSubscription_default] = true;
  dart.setLibraryUri(_ControllerSubscription, "dart:async");
  dart.setFieldSignature(_ControllerSubscription, () => ({
    __proto__: dart.getFields(_ControllerSubscription.__proto__),
    [_controller]: dart.finalFieldType(_StreamControllerLifecycleOfT())
  }));
  return _ControllerSubscription;
});
async._ControllerSubscription = async._ControllerSubscription$();
dart.addTypeTests(async._ControllerSubscription, _is__ControllerSubscription_default);
const _is__BroadcastSubscription_default = Symbol('_is__BroadcastSubscription_default');
async._BroadcastSubscription$ = dart.generic(T => {
  let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
  class _BroadcastSubscription extends async._ControllerSubscription$(T) {
    get [_next$]() {
      return this[_next];
    }
    set [_next$](value) {
      this[_next] = _BroadcastSubscriptionOfT()._check(value);
    }
    get [_previous$]() {
      return this[_previous];
    }
    set [_previous$](value) {
      this[_previous] = _BroadcastSubscriptionOfT()._check(value);
    }
    [_expectsEvent](eventId) {
      return (dart.notNull(this[_eventState]) & 1) === eventId;
    }
    [_toggleEventId]() {
      this[_eventState] = (dart.notNull(this[_eventState]) ^ 1) >>> 0;
    }
    get [_isFiring]() {
      return (dart.notNull(this[_eventState]) & 2) !== 0;
    }
    [_setRemoveAfterFiring]() {
      if (!dart.test(this[_isFiring])) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 41, 12, "_isFiring");
      this[_eventState] = (dart.notNull(this[_eventState]) | 4) >>> 0;
    }
    get [_removeAfterFiring]() {
      return (dart.notNull(this[_eventState]) & 4) !== 0;
    }
    [_onPause]() {}
    [_onResume]() {}
  }
  (_BroadcastSubscription.new = function(controller, onData, onError, onDone, cancelOnError) {
    this[_eventState] = 0;
    this[_next] = null;
    this[_previous] = null;
    _BroadcastSubscription.__proto__.new.call(this, controller, onData, onError, onDone, cancelOnError);
    this[_next$] = this[_previous$] = this;
  }).prototype = _BroadcastSubscription.prototype;
  dart.addTypeTests(_BroadcastSubscription);
  _BroadcastSubscription.prototype[_is__BroadcastSubscription_default] = true;
  const _next = Symbol("_BroadcastSubscription._next");
  const _previous = Symbol("_BroadcastSubscription._previous");
  dart.setMethodSignature(_BroadcastSubscription, () => ({
    __proto__: dart.getMethods(_BroadcastSubscription.__proto__),
    [_expectsEvent]: dart.fnType(core.bool, [core.int]),
    [_toggleEventId]: dart.fnType(dart.void, []),
    [_setRemoveAfterFiring]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_BroadcastSubscription, () => ({
    __proto__: dart.getGetters(_BroadcastSubscription.__proto__),
    [_isFiring]: core.bool,
    [_removeAfterFiring]: core.bool
  }));
  dart.setLibraryUri(_BroadcastSubscription, "dart:async");
  dart.setFieldSignature(_BroadcastSubscription, () => ({
    __proto__: dart.getFields(_BroadcastSubscription.__proto__),
    [_eventState]: dart.fieldType(core.int),
    [_next$]: dart.fieldType(_BroadcastSubscriptionOfT()),
    [_previous$]: dart.fieldType(_BroadcastSubscriptionOfT())
  }));
  return _BroadcastSubscription;
});
async._BroadcastSubscription = async._BroadcastSubscription$();
dart.defineLazy(async._BroadcastSubscription, {
  /*async._BroadcastSubscription._STATE_EVENT_ID*/get _STATE_EVENT_ID() {
    return 1;
  },
  /*async._BroadcastSubscription._STATE_FIRING*/get _STATE_FIRING() {
    return 2;
  },
  /*async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING*/get _STATE_REMOVE_AFTER_FIRING() {
    return 4;
  }
});
dart.addTypeTests(async._BroadcastSubscription, _is__BroadcastSubscription_default);
const _firstSubscription = dart.privateName(async, "_firstSubscription");
const _lastSubscription = dart.privateName(async, "_lastSubscription");
const _addStreamState = dart.privateName(async, "_addStreamState");
const _doneFuture = dart.privateName(async, "_doneFuture");
const _isEmpty = dart.privateName(async, "_isEmpty");
const _hasOneListener = dart.privateName(async, "_hasOneListener");
const _isAddingStream = dart.privateName(async, "_isAddingStream");
const _mayAddEvent = dart.privateName(async, "_mayAddEvent");
const _ensureDoneFuture = dart.privateName(async, "_ensureDoneFuture");
const _addListener = dart.privateName(async, "_addListener");
const _removeListener = dart.privateName(async, "_removeListener");
const _callOnCancel = dart.privateName(async, "_callOnCancel");
const _addEventError = dart.privateName(async, "_addEventError");
const _forEachListener = dart.privateName(async, "_forEachListener");
const _mayComplete = dart.privateName(async, "_mayComplete");
const _is__BroadcastStreamController_default = Symbol('_is__BroadcastStreamController_default');
async._BroadcastStreamController$ = dart.generic(T => {
  let _BroadcastStreamOfT = () => (_BroadcastStreamOfT = dart.constFn(async._BroadcastStream$(T)))();
  let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
  let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let _AddStreamStateOfT = () => (_AddStreamStateOfT = dart.constFn(async._AddStreamState$(T)))();
  let _StreamControllerBaseOfT = () => (_StreamControllerBaseOfT = dart.constFn(async._StreamControllerBase$(T)))();
  class _BroadcastStreamController extends core.Object {
    get onPause() {
      dart.throw(new core.UnsupportedError.new("Broadcast stream controllers do not support pause callbacks"));
    }
    set onPause(onPauseHandler) {
      dart.throw(new core.UnsupportedError.new("Broadcast stream controllers do not support pause callbacks"));
    }
    get onResume() {
      dart.throw(new core.UnsupportedError.new("Broadcast stream controllers do not support pause callbacks"));
    }
    set onResume(onResumeHandler) {
      dart.throw(new core.UnsupportedError.new("Broadcast stream controllers do not support pause callbacks"));
    }
    get stream() {
      return new (_BroadcastStreamOfT()).new(this);
    }
    get sink() {
      return new (_StreamSinkWrapperOfT()).new(this);
    }
    get isClosed() {
      return (dart.notNull(this[_state]) & 4) !== 0;
    }
    get isPaused() {
      return false;
    }
    get hasListener() {
      return !dart.test(this[_isEmpty]);
    }
    get [_hasOneListener]() {
      if (!!dart.test(this[_isEmpty])) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 143, 12, "!_isEmpty");
      return this[_firstSubscription] == this[_lastSubscription];
    }
    get [_isFiring]() {
      return (dart.notNull(this[_state]) & 2) !== 0;
    }
    get [_isAddingStream]() {
      return (dart.notNull(this[_state]) & 8) !== 0;
    }
    get [_mayAddEvent]() {
      return dart.notNull(this[_state]) < 4;
    }
    [_ensureDoneFuture]() {
      if (this[_doneFuture] != null) return this[_doneFuture];
      return this[_doneFuture] = new async._Future.new();
    }
    get [_isEmpty]() {
      return this[_firstSubscription] == null;
    }
    [_addListener](subscription) {
      _BroadcastSubscriptionOfT()._check(subscription);
      if (!(subscription[_next$] == subscription)) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 165, 12, "identical(subscription._next, subscription)");
      subscription[_eventState] = dart.notNull(this[_state]) & 1;
      let oldLast = this[_lastSubscription];
      this[_lastSubscription] = subscription;
      subscription[_next$] = null;
      subscription[_previous$] = oldLast;
      if (oldLast == null) {
        this[_firstSubscription] = subscription;
      } else {
        oldLast[_next$] = subscription;
      }
    }
    [_removeListener](subscription) {
      _BroadcastSubscriptionOfT()._check(subscription);
      if (!(subscription[_controller] === this)) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 180, 12, "identical(subscription._controller, this)");
      if (!!(subscription[_next$] == subscription)) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 181, 12, "!identical(subscription._next, subscription)");
      let previous = subscription[_previous$];
      let next = subscription[_next$];
      if (previous == null) {
        this[_firstSubscription] = next;
      } else {
        previous[_next$] = next;
      }
      if (next == null) {
        this[_lastSubscription] = previous;
      } else {
        next[_previous$] = previous;
      }
      subscription[_next$] = subscription[_previous$] = subscription;
    }
    [_subscribe](onData, onError, onDone, cancelOnError) {
      if (dart.test(this.isClosed)) {
        let t = onDone;
        t == null ? onDone = dart.fn(async._nullDoneHandler, VoidTovoid()) : t;
        return new (_DoneStreamSubscriptionOfT()).new(onDone);
      }
      let subscription = new (_BroadcastSubscriptionOfT()).new(this, onData, onError, onDone, cancelOnError);
      this[_addListener](_BroadcastSubscriptionOfT()._check(subscription));
      if (this[_firstSubscription] == this[_lastSubscription]) {
        async._runGuarded(this.onListen);
      }
      return subscription;
    }
    [_recordCancel](sub) {
      StreamSubscriptionOfT()._check(sub);
      let subscription = _BroadcastSubscriptionOfT()._check(sub);
      if (subscription[_next$] == subscription) return null;
      if (dart.test(subscription[_isFiring])) {
        subscription[_setRemoveAfterFiring]();
      } else {
        this[_removeListener](subscription);
        if (!dart.test(this[_isFiring]) && dart.test(this[_isEmpty])) {
          this[_callOnCancel]();
        }
      }
      return null;
    }
    [_recordPause](subscription) {
      StreamSubscriptionOfT()._check(subscription);
    }
    [_recordResume](subscription) {
      StreamSubscriptionOfT()._check(subscription);
    }
    [_addEventError]() {
      if (dart.test(this.isClosed)) {
        return new core.StateError.new("Cannot add new events after calling close");
      }
      if (!dart.test(this[_isAddingStream])) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 244, 12, "_isAddingStream");
      return new core.StateError.new("Cannot add new events while doing an addStream");
    }
    add(data) {
      T._check(data);
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      this[_sendData](data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      error = async._nonNullError(error);
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      let replacement = async.Zone.current.errorCallback(error, stackTrace);
      if (replacement != null) {
        error = async._nonNullError(replacement.error);
        stackTrace = replacement.stackTrace;
      }
      this[_sendError](error, stackTrace);
    }
    close() {
      if (dart.test(this.isClosed)) {
        if (!(this[_doneFuture] != null)) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 266, 14, "_doneFuture != null");
        return this[_doneFuture];
      }
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      this[_state] = (dart.notNull(this[_state]) | 4) >>> 0;
      let doneFuture = this[_ensureDoneFuture]();
      this[_sendDone]();
      return doneFuture;
    }
    get done() {
      return this[_ensureDoneFuture]();
    }
    addStream(stream, opts) {
      StreamOfT()._check(stream);
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      this[_state] = (dart.notNull(this[_state]) | 8) >>> 0;
      this[_addStreamState] = new (_AddStreamStateOfT()).new(this, stream, cancelOnError != null ? cancelOnError : false);
      return this[_addStreamState].addStreamFuture;
    }
    [_add](data) {
      T._check(data);
      this[_sendData](data);
    }
    [_addError](error, stackTrace) {
      this[_sendError](error, stackTrace);
    }
    [_close]() {
      if (!dart.test(this[_isAddingStream])) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 295, 12, "_isAddingStream");
      let addState = this[_addStreamState];
      this[_addStreamState] = null;
      this[_state] = (dart.notNull(this[_state]) & ~8) >>> 0;
      addState.complete();
    }
    [_forEachListener](action) {
      if (dart.test(this[_isFiring])) {
        dart.throw(new core.StateError.new("Cannot fire new event. Controller is already firing an event"));
      }
      if (dart.test(this[_isEmpty])) return;
      let id = dart.notNull(this[_state]) & 1;
      this[_state] = (dart.notNull(this[_state]) ^ (1 | 2)) >>> 0;
      let subscription = this[_firstSubscription];
      while (subscription != null) {
        if (dart.test(subscription[_expectsEvent](id))) {
          subscription[_eventState] = (dart.notNull(subscription[_eventState]) | async._BroadcastSubscription._STATE_FIRING) >>> 0;
          action(subscription);
          subscription[_toggleEventId]();
          let next = subscription[_next$];
          if (dart.test(subscription[_removeAfterFiring])) {
            this[_removeListener](subscription);
          }
          subscription[_eventState] = (dart.notNull(subscription[_eventState]) & ~async._BroadcastSubscription._STATE_FIRING) >>> 0;
          subscription = next;
        } else {
          subscription = subscription[_next$];
        }
      }
      this[_state] = (dart.notNull(this[_state]) & ~2) >>> 0;
      if (dart.test(this[_isEmpty])) {
        this[_callOnCancel]();
      }
    }
    [_callOnCancel]() {
      if (!dart.test(this[_isEmpty])) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 344, 12, "_isEmpty");
      if (dart.test(this.isClosed) && dart.test(this[_doneFuture][_mayComplete])) {
        this[_doneFuture][_asyncComplete](null);
      }
      async._runGuarded(this.onCancel);
    }
  }
  (_BroadcastStreamController.new = function(onListen, onCancel) {
    this[_firstSubscription] = null;
    this[_lastSubscription] = null;
    this[_addStreamState] = null;
    this[_doneFuture] = null;
    this.onListen = onListen;
    this.onCancel = onCancel;
    this[_state] = 0;
  }).prototype = _BroadcastStreamController.prototype;
  dart.addTypeTests(_BroadcastStreamController);
  _BroadcastStreamController.prototype[_is__BroadcastStreamController_default] = true;
  _BroadcastStreamController[dart.implements] = () => [_StreamControllerBaseOfT()];
  dart.setMethodSignature(_BroadcastStreamController, () => ({
    __proto__: dart.getMethods(_BroadcastStreamController.__proto__),
    [_ensureDoneFuture]: dart.fnType(async._Future, []),
    [_addListener]: dart.fnType(dart.void, [core.Object]),
    [_removeListener]: dart.fnType(dart.void, [core.Object]),
    [_subscribe]: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T]), core.Function, dart.fnType(dart.void, []), core.bool]),
    [_recordCancel]: dart.fnType(async.Future, [core.Object]),
    [_recordPause]: dart.fnType(dart.void, [core.Object]),
    [_recordResume]: dart.fnType(dart.void, [core.Object]),
    [_addEventError]: dart.fnType(core.Error, []),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.fnType(async.Future, []),
    addStream: dart.fnType(async.Future, [core.Object], {cancelOnError: core.bool}),
    [_add]: dart.fnType(dart.void, [core.Object]),
    [_addError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_close]: dart.fnType(dart.void, []),
    [_forEachListener]: dart.fnType(dart.void, [dart.fnType(dart.void, [async._BufferingStreamSubscription$(T)])]),
    [_callOnCancel]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_BroadcastStreamController, () => ({
    __proto__: dart.getGetters(_BroadcastStreamController.__proto__),
    onPause: dart.fnType(dart.void, []),
    onResume: dart.fnType(dart.void, []),
    stream: async.Stream$(T),
    sink: async.StreamSink$(T),
    isClosed: core.bool,
    isPaused: core.bool,
    hasListener: core.bool,
    [_hasOneListener]: core.bool,
    [_isFiring]: core.bool,
    [_isAddingStream]: core.bool,
    [_mayAddEvent]: core.bool,
    [_isEmpty]: core.bool,
    done: async.Future
  }));
  dart.setSetterSignature(_BroadcastStreamController, () => ({
    __proto__: dart.getSetters(_BroadcastStreamController.__proto__),
    onPause: dart.fnType(dart.void, []),
    onResume: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_BroadcastStreamController, "dart:async");
  dart.setFieldSignature(_BroadcastStreamController, () => ({
    __proto__: dart.getFields(_BroadcastStreamController.__proto__),
    onListen: dart.fieldType(VoidTovoid()),
    onCancel: dart.fieldType(VoidTodynamic()),
    [_state]: dart.fieldType(core.int),
    [_firstSubscription]: dart.fieldType(_BroadcastSubscriptionOfT()),
    [_lastSubscription]: dart.fieldType(_BroadcastSubscriptionOfT()),
    [_addStreamState]: dart.fieldType(_AddStreamStateOfT()),
    [_doneFuture]: dart.fieldType(async._Future)
  }));
  return _BroadcastStreamController;
});
async._BroadcastStreamController = async._BroadcastStreamController$();
dart.defineLazy(async._BroadcastStreamController, {
  /*async._BroadcastStreamController._STATE_INITIAL*/get _STATE_INITIAL() {
    return 0;
  },
  /*async._BroadcastStreamController._STATE_EVENT_ID*/get _STATE_EVENT_ID() {
    return 1;
  },
  /*async._BroadcastStreamController._STATE_FIRING*/get _STATE_FIRING() {
    return 2;
  },
  /*async._BroadcastStreamController._STATE_CLOSED*/get _STATE_CLOSED() {
    return 4;
  },
  /*async._BroadcastStreamController._STATE_ADDSTREAM*/get _STATE_ADDSTREAM() {
    return 8;
  }
});
dart.addTypeTests(async._BroadcastStreamController, _is__BroadcastStreamController_default);
const _is__SyncBroadcastStreamController_default = Symbol('_is__SyncBroadcastStreamController_default');
async._SyncBroadcastStreamController$ = dart.generic(T => {
  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
  let _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.fnType(core.Null, [_BufferingStreamSubscriptionOfT()])))();
  let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
  class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
    get [_mayAddEvent]() {
      return dart.test(super[_mayAddEvent]) && !dart.test(this[_isFiring]);
    }
    [_addEventError]() {
      if (dart.test(this[_isFiring])) {
        return new core.StateError.new("Cannot fire new event. Controller is already firing an event");
      }
      return super[_addEventError]();
    }
    [_sendData](data) {
      T._check(data);
      if (dart.test(this[_isEmpty])) return;
      if (dart.test(this[_hasOneListener])) {
        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_FIRING) >>> 0;
        let subscription = this[_firstSubscription];
        subscription[_add](data);
        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
        if (dart.test(this[_isEmpty])) {
          this[_callOnCancel]();
        }
        return;
      }
      this[_forEachListener](dart.fn(subscription => {
        subscription[_add](data);
      }, _BufferingStreamSubscriptionOfTToNull()));
    }
    [_sendError](error, stackTrace) {
      if (dart.test(this[_isEmpty])) return;
      this[_forEachListener](dart.fn(subscription => {
        subscription[_addError](error, stackTrace);
      }, _BufferingStreamSubscriptionOfTToNull()));
    }
    [_sendDone]() {
      if (!dart.test(this[_isEmpty])) {
        this[_forEachListener](dart.fn(subscription => {
          subscription[_close]();
        }, _BufferingStreamSubscriptionOfTToNull()));
      } else {
        if (!(this[_doneFuture] != null)) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 400, 14, "_doneFuture != null");
        if (!dart.test(this[_doneFuture][_mayComplete])) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 401, 14, "_doneFuture._mayComplete");
        this[_doneFuture][_asyncComplete](null);
      }
    }
  }
  (_SyncBroadcastStreamController.new = function(onListen, onCancel) {
    _SyncBroadcastStreamController.__proto__.new.call(this, onListen, onCancel);
  }).prototype = _SyncBroadcastStreamController.prototype;
  dart.addTypeTests(_SyncBroadcastStreamController);
  _SyncBroadcastStreamController.prototype[_is__SyncBroadcastStreamController_default] = true;
  _SyncBroadcastStreamController[dart.implements] = () => [SynchronousStreamControllerOfT()];
  dart.setMethodSignature(_SyncBroadcastStreamController, () => ({
    __proto__: dart.getMethods(_SyncBroadcastStreamController.__proto__),
    [_sendData]: dart.fnType(dart.void, [core.Object]),
    [_sendError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_sendDone]: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_SyncBroadcastStreamController, "dart:async");
  return _SyncBroadcastStreamController;
});
async._SyncBroadcastStreamController = async._SyncBroadcastStreamController$();
dart.addTypeTests(async._SyncBroadcastStreamController, _is__SyncBroadcastStreamController_default);
let const$12;
const _is__AsyncBroadcastStreamController_default = Symbol('_is__AsyncBroadcastStreamController_default');
async._AsyncBroadcastStreamController$ = dart.generic(T => {
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  class _AsyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
    [_sendData](data) {
      T._check(data);
      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
        subscription[_addPending](new (_DelayedDataOfT()).new(data));
      }
    }
    [_sendError](error, stackTrace) {
      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
        subscription[_addPending](new async._DelayedError.new(error, stackTrace));
      }
    }
    [_sendDone]() {
      if (!dart.test(this[_isEmpty])) {
        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
          subscription[_addPending](const$12 || (const$12 = dart.const(new async._DelayedDone.new())));
        }
      } else {
        if (!(this[_doneFuture] != null)) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 437, 14, "_doneFuture != null");
        if (!dart.test(this[_doneFuture][_mayComplete])) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 438, 14, "_doneFuture._mayComplete");
        this[_doneFuture][_asyncComplete](null);
      }
    }
  }
  (_AsyncBroadcastStreamController.new = function(onListen, onCancel) {
    _AsyncBroadcastStreamController.__proto__.new.call(this, onListen, onCancel);
  }).prototype = _AsyncBroadcastStreamController.prototype;
  dart.addTypeTests(_AsyncBroadcastStreamController);
  _AsyncBroadcastStreamController.prototype[_is__AsyncBroadcastStreamController_default] = true;
  dart.setMethodSignature(_AsyncBroadcastStreamController, () => ({
    __proto__: dart.getMethods(_AsyncBroadcastStreamController.__proto__),
    [_sendData]: dart.fnType(dart.void, [core.Object]),
    [_sendError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_sendDone]: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_AsyncBroadcastStreamController, "dart:async");
  return _AsyncBroadcastStreamController;
});
async._AsyncBroadcastStreamController = async._AsyncBroadcastStreamController$();
dart.addTypeTests(async._AsyncBroadcastStreamController, _is__AsyncBroadcastStreamController_default);
const _addPendingEvent = dart.privateName(async, "_addPendingEvent");
let const$13;
const _is__AsBroadcastStreamController_default = Symbol('_is__AsBroadcastStreamController_default');
async._AsBroadcastStreamController$ = dart.generic(T => {
  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _AsBroadcastStreamController extends async._SyncBroadcastStreamController$(T) {
    get [_hasPending]() {
      return this[_pending] != null && !dart.test(this[_pending].isEmpty);
    }
    [_addPendingEvent](event) {
      let t = this[_pending];
      t == null ? this[_pending] = new (_StreamImplEventsOfT()).new() : t;
      this[_pending].add(event);
    }
    add(data) {
      T._check(data);
      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
        this[_addPendingEvent](new (_DelayedDataOfT()).new(data));
        return;
      }
      super.add(data);
      while (dart.test(this[_hasPending])) {
        this[_pending].handleNext(this);
      }
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
        this[_addPendingEvent](new async._DelayedError.new(error, stackTrace));
        return;
      }
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
      this[_sendError](error, stackTrace);
      while (dart.test(this[_hasPending])) {
        this[_pending].handleNext(this);
      }
    }
    close() {
      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
        this[_addPendingEvent](const$13 || (const$13 = dart.const(new async._DelayedDone.new())));
        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
        return super.done;
      }
      let result = super.close();
      if (!!dart.test(this[_hasPending])) dart.assertFailed(null, "dart:async/broadcast_stream_controller.dart", 499, 12, "!_hasPending");
      return result;
    }
    [_callOnCancel]() {
      if (dart.test(this[_hasPending])) {
        this[_pending].clear();
        this[_pending] = null;
      }
      super[_callOnCancel]();
    }
  }
  (_AsBroadcastStreamController.new = function(onListen, onCancel) {
    this[_pending] = null;
    _AsBroadcastStreamController.__proto__.new.call(this, onListen, onCancel);
  }).prototype = _AsBroadcastStreamController.prototype;
  dart.addTypeTests(_AsBroadcastStreamController);
  _AsBroadcastStreamController.prototype[_is__AsBroadcastStreamController_default] = true;
  _AsBroadcastStreamController[dart.implements] = () => [_EventDispatchOfT()];
  dart.setMethodSignature(_AsBroadcastStreamController, () => ({
    __proto__: dart.getMethods(_AsBroadcastStreamController.__proto__),
    [_addPendingEvent]: dart.fnType(dart.void, [async._DelayedEvent]),
    add: dart.fnType(dart.void, [core.Object])
  }));
  dart.setGetterSignature(_AsBroadcastStreamController, () => ({
    __proto__: dart.getGetters(_AsBroadcastStreamController.__proto__),
    [_hasPending]: core.bool
  }));
  dart.setLibraryUri(_AsBroadcastStreamController, "dart:async");
  dart.setFieldSignature(_AsBroadcastStreamController, () => ({
    __proto__: dart.getFields(_AsBroadcastStreamController.__proto__),
    [_pending]: dart.fieldType(_StreamImplEventsOfT())
  }));
  return _AsBroadcastStreamController;
});
async._AsBroadcastStreamController = async._AsBroadcastStreamController$();
dart.addTypeTests(async._AsBroadcastStreamController, _is__AsBroadcastStreamController_default);
async.DeferredLibrary = class DeferredLibrary extends core.Object {
  get libraryName() {
    return this[libraryName$];
  }
  set libraryName(value) {
    super.libraryName = value;
  }
  get uri() {
    return this[uri$];
  }
  set uri(value) {
    super.uri = value;
  }
  load() {
    dart.throw("DeferredLibrary not supported. " + "please use the `import \"lib.dart\" deferred as lib` syntax.");
  }
};
(async.DeferredLibrary.new = function(libraryName, opts) {
  let uri = opts && 'uri' in opts ? opts.uri : null;
  this[libraryName$] = libraryName;
  this[uri$] = uri;
}).prototype = async.DeferredLibrary.prototype;
dart.addTypeTests(async.DeferredLibrary);
const libraryName$ = Symbol("DeferredLibrary.libraryName");
const uri$ = Symbol("DeferredLibrary.uri");
dart.setMethodSignature(async.DeferredLibrary, () => ({
  __proto__: dart.getMethods(async.DeferredLibrary.__proto__),
  load: dart.fnType(async.Future$(core.Null), [])
}));
dart.setLibraryUri(async.DeferredLibrary, "dart:async");
dart.setFieldSignature(async.DeferredLibrary, () => ({
  __proto__: dart.getFields(async.DeferredLibrary.__proto__),
  libraryName: dart.finalFieldType(core.String),
  uri: dart.finalFieldType(core.String)
}));
const _s = dart.privateName(async, "_s");
async.DeferredLoadException = class DeferredLoadException extends core.Object {
  toString() {
    return "DeferredLoadException: '" + dart.str(this[_s]) + "'";
  }
};
(async.DeferredLoadException.new = function(s) {
  this[_s] = s;
}).prototype = async.DeferredLoadException.prototype;
dart.addTypeTests(async.DeferredLoadException);
async.DeferredLoadException[dart.implements] = () => [core.Exception];
dart.setLibraryUri(async.DeferredLoadException, "dart:async");
dart.setFieldSignature(async.DeferredLoadException, () => ({
  __proto__: dart.getFields(async.DeferredLoadException.__proto__),
  [_s]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(async.DeferredLoadException, ['toString']);
async.FutureOr$ = dart.generic(T => {
  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
  class FutureOr extends core.Object {}
  (FutureOr.__ = function() {
    dart.throw(new core.UnsupportedError.new("FutureOr can't be instantiated"));
  }).prototype = FutureOr.prototype;
  FutureOr.is = function is_FutureOr(o) {
    return T.is(o) || FutureOfT().is(o);
  };
  FutureOr.as = function as_FutureOr(o) {
    if (o == null || T.is(o) || FutureOfT().is(o)) return o;
    return dart.as(o, this, false);
  };
  FutureOr._check = function check_FutureOr(o) {
    if (o == null || T.is(o) || FutureOfT().is(o)) return o;
    return dart.as(o, this, true);
  };
  dart.setLibraryUri(FutureOr, "dart:async");
  return FutureOr;
});
async.FutureOr = async.FutureOr$();
const _asyncCompleteError = dart.privateName(async, "_asyncCompleteError");
let const$14;
async.Future$ = dart.generic(T => {
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
  class Future extends core.Object {
    static new(computation) {
      let result = new (_FutureOfT()).new();
      async.Timer.run(dart.fn(() => {
        try {
          result[_complete](computation());
        } catch (e$) {
          let e = dart.getThrown(e$);
          let s = dart.stackTrace(e$);
          async._completeWithErrorCallback(result, e, s);
        }
      }, VoidToNull()));
      return result;
    }
    static microtask(computation) {
      let result = new (_FutureOfT()).new();
      async.scheduleMicrotask(dart.fn(() => {
        try {
          result[_complete](computation());
        } catch (e$) {
          let e = dart.getThrown(e$);
          let s = dart.stackTrace(e$);
          async._completeWithErrorCallback(result, e, s);
        }
      }, VoidToNull()));
      return result;
    }
    static sync(computation) {
      try {
        let result = computation();
        if (FutureOfT().is(result)) {
          return result;
        } else {
          return new (_FutureOfT()).value(T._check(result));
        }
      } catch (e) {
        let error = dart.getThrown(e);
        let stackTrace = dart.stackTrace(e);
        let future = new (_FutureOfT()).new();
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          future[_asyncCompleteError](async._nonNullError(replacement.error), replacement.stackTrace);
        } else {
          future[_asyncCompleteError](error, stackTrace);
        }
        return future;
      }
    }
    static value(value) {
      if (value === void 0) value = null;
      return new (_FutureOfT()).immediate(value);
    }
    static error(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      error = async._nonNullError(error);
      if (!(async.Zone.current === async._rootZone)) {
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          error = async._nonNullError(replacement.error);
          stackTrace = replacement.stackTrace;
        }
      }
      return new (_FutureOfT()).immediateError(error, stackTrace);
    }
    static delayed(duration, computation) {
      if (computation === void 0) computation = null;
      let result = new (_FutureOfT()).new();
      async.Timer.new(duration, dart.fn(() => {
        if (computation == null) {
          result[_complete](null);
        } else {
          try {
            result[_complete](computation());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            async._completeWithErrorCallback(result, e, s);
          }
        }
      }, VoidToNull()));
      return result;
    }
    static wait(T, futures, opts) {
      let eagerError = opts && 'eagerError' in opts ? opts.eagerError : false;
      let cleanUp = opts && 'cleanUp' in opts ? opts.cleanUp : null;
      let result = new (async._Future$(core.List$(T))).new();
      let values = null;
      let remaining = 0;
      let error = null;
      let stackTrace = null;
      function handleError(theError, theStackTrace) {
        remaining--;
        if (values != null) {
          if (cleanUp != null) {
            for (let value of values) {
              if (value != null) {
                FutureOfNull().sync(dart.fn(() => {
                  cleanUp(value);
                }, VoidToNull()));
              }
            }
          }
          values = null;
          if (remaining === 0 || dart.test(eagerError)) {
            result[_completeError](theError, theStackTrace);
          } else {
            error = theError;
            stackTrace = theStackTrace;
          }
        } else if (remaining === 0 && !dart.test(eagerError)) {
          result[_completeError](error, stackTrace);
        }
      }
      dart.fn(handleError, dynamicAndStackTraceToNull());
      try {
        for (let future of futures) {
          let pos = remaining;
          FutureOfNull()._check(future.then(core.Null, dart.fn(value => {
            remaining--;
            if (values != null) {
              values[$_set](pos, value);
              if (remaining === 0) {
                result[_completeWithValue](values);
              }
            } else {
              if (cleanUp != null && value != null) {
                FutureOfNull().sync(dart.fn(() => {
                  cleanUp(value);
                }, VoidToNull()));
              }
              if (remaining === 0 && !dart.test(eagerError)) {
                result[_completeError](error, stackTrace);
              }
            }
          }, dart.fnType(core.Null, [T])), {onError: handleError}));
          remaining++;
        }
        if (remaining === 0) {
          return async.Future$(core.List$(T)).value(const$14 || (const$14 = dart.constList([], core.Null)));
        }
        values = core.List$(T).new(remaining);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let st = dart.stackTrace(e$);
        if (remaining === 0 || dart.test(eagerError)) {
          return async.Future$(core.List$(T)).error(e, st);
        } else {
          error = e;
          stackTrace = st;
        }
      }
      return result;
    }
    static any(T, futures) {
      let completer = async.Completer$(T).sync();
      let onValue = value => {
        if (!dart.test(completer.isCompleted)) completer.complete(value);
      };
      dart.fn(onValue, dart.fnType(core.Null, [T]));
      let onError = (error, stack) => {
        if (!dart.test(completer.isCompleted)) completer.completeError(error, stack);
      };
      dart.fn(onError, dynamicAndStackTraceToNull());
      for (let future of futures) {
        FutureOfNull()._check(future.then(core.Null, onValue, {onError: onError}));
      }
      return completer.future;
    }
    static forEach(T, elements, action) {
      let iterator = elements[$iterator];
      return async.Future.doWhile(dart.fn(() => {
        if (!dart.test(iterator.moveNext())) return false;
        let result = action(iterator.current);
        if (async.Future.is(result)) return FutureOfbool()._check(result.then(core.bool, dart.fn(async.Future._kTrue, dynamicTobool())));
        return true;
      }, VoidToFutureOrOfbool()));
    }
    static _kTrue(_) {
      return true;
    }
    static doWhile(action) {
      let doneSignal = new async._Future.new();
      let nextIteration = null;
      nextIteration = async.Zone.current.bindUnaryCallbackGuarded(core.bool, dart.fn(keepGoing => {
        while (dart.test(keepGoing)) {
          let result = null;
          try {
            result = action();
          } catch (e) {
            let error = dart.getThrown(e);
            let stackTrace = dart.stackTrace(e);
            async._asyncCompleteWithErrorCallback(doneSignal, error, stackTrace);
            return;
          }
          if (FutureOfbool().is(result)) {
            result.then(dart.void, nextIteration, {onError: dart.bind(doneSignal, _completeError)});
            return;
          }
          keepGoing = core.bool._check(result);
        }
        doneSignal[_complete](null);
      }, boolToNull()));
      nextIteration(true);
      return doneSignal;
    }
  }
  (Future[dart.mixinNew] = function() {
  }).prototype = Future.prototype;
  dart.addTypeTests(Future);
  Future.prototype[dart.isFuture] = true;
  dart.setLibraryUri(Future, "dart:async");
  return Future;
});
async.Future = async.Future$();
dart.defineLazy(async.Future, {
  /*async.Future._nullFuture*/get _nullFuture() {
    return new (_FutureOfNull()).zoneValue(null, async.Zone.root);
  },
  /*async.Future._falseFuture*/get _falseFuture() {
    return new (_FutureOfbool()).zoneValue(false, async.Zone.root);
  }
});
dart.addTypeTests(async.Future, dart.isFuture);
async.TimeoutException = class TimeoutException extends core.Object {
  get message() {
    return this[message$0];
  }
  set message(value) {
    super.message = value;
  }
  get duration() {
    return this[duration$];
  }
  set duration(value) {
    super.duration = value;
  }
  toString() {
    let result = "TimeoutException";
    if (this.duration != null) result = "TimeoutException after " + dart.str(this.duration);
    if (this.message != null) result = result + ": " + dart.str(this.message);
    return result;
  }
};
(async.TimeoutException.new = function(message, duration) {
  if (duration === void 0) duration = null;
  this[message$0] = message;
  this[duration$] = duration;
}).prototype = async.TimeoutException.prototype;
dart.addTypeTests(async.TimeoutException);
const message$0 = Symbol("TimeoutException.message");
const duration$ = Symbol("TimeoutException.duration");
async.TimeoutException[dart.implements] = () => [core.Exception];
dart.setLibraryUri(async.TimeoutException, "dart:async");
dart.setFieldSignature(async.TimeoutException, () => ({
  __proto__: dart.getFields(async.TimeoutException.__proto__),
  message: dart.finalFieldType(core.String),
  duration: dart.finalFieldType(core.Duration)
}));
dart.defineExtensionMethods(async.TimeoutException, ['toString']);
const _is_Completer_default = Symbol('_is_Completer_default');
async.Completer$ = dart.generic(T => {
  let _AsyncCompleterOfT = () => (_AsyncCompleterOfT = dart.constFn(async._AsyncCompleter$(T)))();
  let _SyncCompleterOfT = () => (_SyncCompleterOfT = dart.constFn(async._SyncCompleter$(T)))();
  class Completer extends core.Object {
    static new() {
      return new (_AsyncCompleterOfT()).new();
    }
    static sync() {
      return new (_SyncCompleterOfT()).new();
    }
  }
  (Completer[dart.mixinNew] = function() {
  }).prototype = Completer.prototype;
  dart.addTypeTests(Completer);
  Completer.prototype[_is_Completer_default] = true;
  dart.setLibraryUri(Completer, "dart:async");
  return Completer;
});
async.Completer = async.Completer$();
dart.addTypeTests(async.Completer, _is_Completer_default);
async._completeWithErrorCallback = function(result, error, stackTrace) {
  let replacement = async.Zone.current.errorCallback(error, stackTrace);
  if (replacement != null) {
    error = async._nonNullError(replacement.error);
    stackTrace = replacement.stackTrace;
  }
  result[_completeError](error, stackTrace);
};
async._asyncCompleteWithErrorCallback = function(result, error, stackTrace) {
  let replacement = async.Zone.current.errorCallback(error, stackTrace);
  if (replacement != null) {
    error = async._nonNullError(replacement.error);
    stackTrace = replacement.stackTrace;
  }
  result[_asyncCompleteError](error, stackTrace);
};
async._nonNullError = function(error) {
  return error != null ? error : new core.NullThrownError.new();
};
const _is__Completer_default = Symbol('_is__Completer_default');
async._Completer$ = dart.generic(T => {
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  let CompleterOfT = () => (CompleterOfT = dart.constFn(async.Completer$(T)))();
  class _Completer extends core.Object {
    completeError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      error = async._nonNullError(error);
      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError.new("Future already completed"));
      let replacement = async.Zone.current.errorCallback(error, stackTrace);
      if (replacement != null) {
        error = async._nonNullError(replacement.error);
        stackTrace = replacement.stackTrace;
      }
      this[_completeError](error, stackTrace);
    }
    get isCompleted() {
      return !dart.test(this.future[_mayComplete]);
    }
  }
  (_Completer.new = function() {
    this.future = new (_FutureOfT()).new();
  }).prototype = _Completer.prototype;
  dart.addTypeTests(_Completer);
  _Completer.prototype[_is__Completer_default] = true;
  _Completer[dart.implements] = () => [CompleterOfT()];
  dart.setMethodSignature(_Completer, () => ({
    __proto__: dart.getMethods(_Completer.__proto__),
    completeError: dart.fnType(dart.void, [core.Object], [core.StackTrace])
  }));
  dart.setGetterSignature(_Completer, () => ({
    __proto__: dart.getGetters(_Completer.__proto__),
    isCompleted: core.bool
  }));
  dart.setLibraryUri(_Completer, "dart:async");
  dart.setFieldSignature(_Completer, () => ({
    __proto__: dart.getFields(_Completer.__proto__),
    future: dart.finalFieldType(_FutureOfT())
  }));
  return _Completer;
});
async._Completer = async._Completer$();
dart.addTypeTests(async._Completer, _is__Completer_default);
const _is__AsyncCompleter_default = Symbol('_is__AsyncCompleter_default');
async._AsyncCompleter$ = dart.generic(T => {
  let FutureOrOfT = () => (FutureOrOfT = dart.constFn(async.FutureOr$(T)))();
  class _AsyncCompleter extends async._Completer$(T) {
    complete(value) {
      if (value === void 0) value = null;
      FutureOrOfT()._check(value);
      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError.new("Future already completed"));
      this.future[_asyncComplete](value);
    }
    [_completeError](error, stackTrace) {
      this.future[_asyncCompleteError](error, stackTrace);
    }
  }
  (_AsyncCompleter.new = function() {
    _AsyncCompleter.__proto__.new.call(this);
  }).prototype = _AsyncCompleter.prototype;
  dart.addTypeTests(_AsyncCompleter);
  _AsyncCompleter.prototype[_is__AsyncCompleter_default] = true;
  dart.setMethodSignature(_AsyncCompleter, () => ({
    __proto__: dart.getMethods(_AsyncCompleter.__proto__),
    complete: dart.fnType(dart.void, [], [core.Object]),
    [_completeError]: dart.fnType(dart.void, [core.Object, core.StackTrace])
  }));
  dart.setLibraryUri(_AsyncCompleter, "dart:async");
  return _AsyncCompleter;
});
async._AsyncCompleter = async._AsyncCompleter$();
dart.addTypeTests(async._AsyncCompleter, _is__AsyncCompleter_default);
const _is__SyncCompleter_default = Symbol('_is__SyncCompleter_default');
async._SyncCompleter$ = dart.generic(T => {
  let FutureOrOfT = () => (FutureOrOfT = dart.constFn(async.FutureOr$(T)))();
  class _SyncCompleter extends async._Completer$(T) {
    complete(value) {
      if (value === void 0) value = null;
      FutureOrOfT()._check(value);
      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError.new("Future already completed"));
      this.future[_complete](value);
    }
    [_completeError](error, stackTrace) {
      this.future[_completeError](error, stackTrace);
    }
  }
  (_SyncCompleter.new = function() {
    _SyncCompleter.__proto__.new.call(this);
  }).prototype = _SyncCompleter.prototype;
  dart.addTypeTests(_SyncCompleter);
  _SyncCompleter.prototype[_is__SyncCompleter_default] = true;
  dart.setMethodSignature(_SyncCompleter, () => ({
    __proto__: dart.getMethods(_SyncCompleter.__proto__),
    complete: dart.fnType(dart.void, [], [core.Object]),
    [_completeError]: dart.fnType(dart.void, [core.Object, core.StackTrace])
  }));
  dart.setLibraryUri(_SyncCompleter, "dart:async");
  return _SyncCompleter;
});
async._SyncCompleter = async._SyncCompleter$();
dart.addTypeTests(async._SyncCompleter, _is__SyncCompleter_default);
const _nextListener = dart.privateName(async, "_nextListener");
const _onValue = dart.privateName(async, "_onValue");
const _errorTest = dart.privateName(async, "_errorTest");
const _whenCompleteAction = dart.privateName(async, "_whenCompleteAction");
const _is__FutureListener_default = Symbol('_is__FutureListener_default');
async._FutureListener$ = dart.generic((S, T) => {
  let SToFutureOrOfT = () => (SToFutureOrOfT = dart.constFn(dart.fnType(FutureOrOfT(), [S])))();
  let FutureOrOfT = () => (FutureOrOfT = dart.constFn(async.FutureOr$(T)))();
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  class _FutureListener extends core.Object {
    get [_zone$]() {
      return this.result[_zone$];
    }
    get handlesValue() {
      return (dart.notNull(this.state) & 1) !== 0;
    }
    get handlesError() {
      return (dart.notNull(this.state) & 2) !== 0;
    }
    get hasErrorTest() {
      return this.state === 6;
    }
    get handlesComplete() {
      return this.state === 8;
    }
    get [_onValue]() {
      if (!dart.test(this.handlesValue)) dart.assertFailed(null, "dart:async/future_impl.dart", 102, 12, "handlesValue");
      return SToFutureOrOfT()._check(this.callback);
    }
    get [_onError]() {
      return this.errorCallback;
    }
    get [_errorTest]() {
      if (!dart.test(this.hasErrorTest)) dart.assertFailed(null, "dart:async/future_impl.dart", 108, 12, "hasErrorTest");
      return ObjectTobool()._check(this.callback);
    }
    get [_whenCompleteAction]() {
      if (!dart.test(this.handlesComplete)) dart.assertFailed(null, "dart:async/future_impl.dart", 113, 12, "handlesComplete");
      return VoidTodynamic()._check(this.callback);
    }
    get hasErrorCallback() {
      if (!dart.test(this.handlesError)) dart.assertFailed(null, "dart:async/future_impl.dart", 121, 12, "handlesError");
      return this[_onError] != null;
    }
    handleValue(sourceResult) {
      S._check(sourceResult);
      return this[_zone$].runUnary(FutureOrOfT(), S, this[_onValue], sourceResult);
    }
    matchesErrorTest(asyncError) {
      if (!dart.test(this.hasErrorTest)) return true;
      return this[_zone$].runUnary(core.bool, core.Object, this[_errorTest], asyncError.error);
    }
    handleError(asyncError) {
      if (!(dart.test(this.handlesError) && dart.test(this.hasErrorCallback))) dart.assertFailed(null, "dart:async/future_impl.dart", 135, 12, "handlesError && hasErrorCallback");
      let errorCallback = this.errorCallback;
      if (ObjectAndStackTraceTodynamic().is(errorCallback)) {
        return FutureOrOfT()._check(this[_zone$].runBinary(dart.dynamic, core.Object, core.StackTrace, errorCallback, asyncError.error, asyncError.stackTrace));
      } else {
        if (!ObjectTodynamic().is(errorCallback)) dart.assertFailed(null, "dart:async/future_impl.dart", 143, 14, "errorCallback is dynamic Function(Object)");
        return FutureOrOfT()._check(this[_zone$].runUnary(dart.dynamic, core.Object, ObjectTodynamic()._check(errorCallback), asyncError.error));
      }
    }
    handleWhenComplete() {
      if (!!dart.test(this.handlesError)) dart.assertFailed(null, "dart:async/future_impl.dart", 149, 12, "!handlesError");
      return this[_zone$].run(dart.dynamic, this[_whenCompleteAction]);
    }
  }
  (_FutureListener.then = function(result, onValue, errorCallback) {
    this[_nextListener] = null;
    this.result = result;
    this.callback = onValue;
    this.errorCallback = errorCallback;
    this.state = errorCallback == null ? 1 : 3;
  }).prototype = _FutureListener.prototype;
  (_FutureListener.catchError = function(result, errorCallback, callback) {
    this[_nextListener] = null;
    this.result = result;
    this.errorCallback = errorCallback;
    this.callback = callback;
    this.state = callback == null ? 2 : 6;
  }).prototype = _FutureListener.prototype;
  (_FutureListener.whenComplete = function(result, callback) {
    this[_nextListener] = null;
    this.result = result;
    this.callback = callback;
    this.errorCallback = null;
    this.state = 8;
  }).prototype = _FutureListener.prototype;
  dart.addTypeTests(_FutureListener);
  _FutureListener.prototype[_is__FutureListener_default] = true;
  dart.setMethodSignature(_FutureListener, () => ({
    __proto__: dart.getMethods(_FutureListener.__proto__),
    handleValue: dart.fnType(async.FutureOr$(T), [core.Object]),
    matchesErrorTest: dart.fnType(core.bool, [async.AsyncError]),
    handleError: dart.fnType(async.FutureOr$(T), [async.AsyncError]),
    handleWhenComplete: dart.fnType(dart.dynamic, [])
  }));
  dart.setGetterSignature(_FutureListener, () => ({
    __proto__: dart.getGetters(_FutureListener.__proto__),
    [_zone$]: async.Zone,
    handlesValue: core.bool,
    handlesError: core.bool,
    hasErrorTest: core.bool,
    handlesComplete: core.bool,
    [_onValue]: dart.fnType(async.FutureOr$(T), [S]),
    [_onError]: core.Function,
    [_errorTest]: dart.fnType(core.bool, [core.Object]),
    [_whenCompleteAction]: dart.fnType(dart.dynamic, []),
    hasErrorCallback: core.bool
  }));
  dart.setLibraryUri(_FutureListener, "dart:async");
  dart.setFieldSignature(_FutureListener, () => ({
    __proto__: dart.getFields(_FutureListener.__proto__),
    [_nextListener]: dart.fieldType(async._FutureListener),
    result: dart.finalFieldType(_FutureOfT()),
    state: dart.finalFieldType(core.int),
    callback: dart.finalFieldType(core.Function),
    errorCallback: dart.finalFieldType(core.Function)
  }));
  return _FutureListener;
});
async._FutureListener = async._FutureListener$();
dart.defineLazy(async._FutureListener, {
  /*async._FutureListener.maskValue*/get maskValue() {
    return 1;
  },
  /*async._FutureListener.maskError*/get maskError() {
    return 2;
  },
  /*async._FutureListener.maskTestError*/get maskTestError() {
    return 4;
  },
  /*async._FutureListener.maskWhencomplete*/get maskWhencomplete() {
    return 8;
  },
  /*async._FutureListener.stateChain*/get stateChain() {
    return 0;
  },
  /*async._FutureListener.stateThen*/get stateThen() {
    return 1;
  },
  /*async._FutureListener.stateThenOnerror*/get stateThenOnerror() {
    return 1 | 2;
  },
  /*async._FutureListener.stateCatcherror*/get stateCatcherror() {
    return 2;
  },
  /*async._FutureListener.stateCatcherrorTest*/get stateCatcherrorTest() {
    return 2 | 4;
  },
  /*async._FutureListener.stateWhencomplete*/get stateWhencomplete() {
    return 8;
  }
});
dart.addTypeTests(async._FutureListener, _is__FutureListener_default);
const _resultOrListeners = dart.privateName(async, "_resultOrListeners");
const _setValue = dart.privateName(async, "_setValue");
const _isPendingComplete = dart.privateName(async, "_isPendingComplete");
const _mayAddListener = dart.privateName(async, "_mayAddListener");
const _isChained = dart.privateName(async, "_isChained");
const _isComplete = dart.privateName(async, "_isComplete");
const _hasError = dart.privateName(async, "_hasError");
const _setChained = dart.privateName(async, "_setChained");
const _setPendingComplete = dart.privateName(async, "_setPendingComplete");
const _clearPendingComplete = dart.privateName(async, "_clearPendingComplete");
const _error = dart.privateName(async, "_error");
const _chainSource = dart.privateName(async, "_chainSource");
const _setErrorObject = dart.privateName(async, "_setErrorObject");
const _setError = dart.privateName(async, "_setError");
const _cloneResult = dart.privateName(async, "_cloneResult");
const _prependListeners = dart.privateName(async, "_prependListeners");
const _reverseListeners = dart.privateName(async, "_reverseListeners");
const _removeListeners = dart.privateName(async, "_removeListeners");
const _chainFuture = dart.privateName(async, "_chainFuture");
const _is__Future_default = Symbol('_is__Future_default');
async._Future$ = dart.generic(T => {
  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
  let _FutureListenerOfT$T = () => (_FutureListenerOfT$T = dart.constFn(async._FutureListener$(T, T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let FutureOrOfT = () => (FutureOrOfT = dart.constFn(async.FutureOr$(T)))();
  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
  let VoidToFutureOrOfT = () => (VoidToFutureOrOfT = dart.constFn(dart.fnType(FutureOrOfT(), [])))();
  let TToNull = () => (TToNull = dart.constFn(dart.fnType(core.Null, [T])))();
  class _Future extends core.Object {
    get [_mayComplete]() {
      return this[_state] === 0;
    }
    get [_isPendingComplete]() {
      return this[_state] === 1;
    }
    get [_mayAddListener]() {
      return dart.notNull(this[_state]) <= 1;
    }
    get [_isChained]() {
      return this[_state] === 2;
    }
    get [_isComplete]() {
      return dart.notNull(this[_state]) >= 4;
    }
    get [_hasError]() {
      return this[_state] === 8;
    }
    [_setChained](source) {
      if (!dart.test(this[_mayAddListener])) dart.assertFailed(null, "dart:async/future_impl.dart", 233, 12, "_mayAddListener");
      this[_state] = 2;
      this[_resultOrListeners] = source;
    }
    then(R, f, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let currentZone = async.Zone.current;
      if (!(currentZone === async._rootZone)) {
        f = currentZone.registerUnaryCallback(async.FutureOr$(R), T, f);
        if (onError != null) {
          onError = async._registerErrorHandler(onError, currentZone);
        }
      }
      return this[_thenNoZoneRegistration](R, f, onError);
    }
    [_thenNoZoneRegistration](E, f, onError) {
      let result = new (async._Future$(E)).new();
      this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
      return result;
    }
    catchError(onError, opts) {
      let test = opts && 'test' in opts ? opts.test : null;
      let result = new (_FutureOfT()).new();
      if (!(result[_zone$] === async._rootZone)) {
        onError = async._registerErrorHandler(onError, result[_zone$]);
        if (test != null) test = result[_zone$].registerUnaryCallback(core.bool, dart.dynamic, test);
      }
      this[_addListener](new (_FutureListenerOfT$T()).catchError(result, onError, test));
      return result;
    }
    whenComplete(action) {
      let result = new (_FutureOfT()).new();
      if (!(result[_zone$] === async._rootZone)) {
        action = result[_zone$].registerCallback(dart.dynamic, action);
      }
      this[_addListener](new (_FutureListenerOfT$T()).whenComplete(result, action));
      return result;
    }
    asStream() {
      return StreamOfT().fromFuture(this);
    }
    [_setPendingComplete]() {
      if (!dart.test(this[_mayComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 282, 12, "_mayComplete");
      this[_state] = 1;
    }
    [_clearPendingComplete]() {
      if (!dart.test(this[_isPendingComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 287, 12, "_isPendingComplete");
      this[_state] = 0;
    }
    get [_error]() {
      if (!dart.test(this[_hasError])) dart.assertFailed(null, "dart:async/future_impl.dart", 292, 12, "_hasError");
      return async.AsyncError._check(this[_resultOrListeners]);
    }
    get [_chainSource]() {
      if (!dart.test(this[_isChained])) dart.assertFailed(null, "dart:async/future_impl.dart", 297, 12, "_isChained");
      return async._Future._check(this[_resultOrListeners]);
    }
    [_setValue](value) {
      T._check(value);
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 303, 12, "!_isComplete");
      this[_state] = 4;
      this[_resultOrListeners] = value;
    }
    [_setErrorObject](error) {
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 309, 12, "!_isComplete");
      this[_state] = 8;
      this[_resultOrListeners] = error;
    }
    [_setError](error, stackTrace) {
      this[_setErrorObject](new async.AsyncError.new(error, stackTrace));
    }
    [_cloneResult](source) {
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 322, 12, "!_isComplete");
      if (!dart.test(source[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 323, 12, "source._isComplete");
      this[_state] = source[_state];
      this[_resultOrListeners] = source[_resultOrListeners];
    }
    [_addListener](listener) {
      if (!(listener[_nextListener] == null)) dart.assertFailed(null, "dart:async/future_impl.dart", 329, 12, "listener._nextListener == null");
      if (dart.test(this[_mayAddListener])) {
        listener[_nextListener] = async._FutureListener._check(this[_resultOrListeners]);
        this[_resultOrListeners] = listener;
      } else {
        if (dart.test(this[_isChained])) {
          let source = this[_chainSource];
          if (!dart.test(source[_isComplete])) {
            source[_addListener](listener);
            return;
          }
          this[_cloneResult](source);
        }
        if (!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 345, 14, "_isComplete");
        this[_zone$].scheduleMicrotask(dart.fn(() => {
          async._Future._propagateToListeners(this, listener);
        }, VoidToNull()));
      }
    }
    [_prependListeners](listeners) {
      if (listeners == null) return;
      if (dart.test(this[_mayAddListener])) {
        let existingListeners = async._FutureListener._check(this[_resultOrListeners]);
        this[_resultOrListeners] = listeners;
        if (existingListeners != null) {
          let cursor = listeners;
          while (cursor[_nextListener] != null) {
            cursor = cursor[_nextListener];
          }
          cursor[_nextListener] = existingListeners;
        }
      } else {
        if (dart.test(this[_isChained])) {
          let source = this[_chainSource];
          if (!dart.test(source[_isComplete])) {
            source[_prependListeners](listeners);
            return;
          }
          this[_cloneResult](source);
        }
        if (!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 377, 14, "_isComplete");
        listeners = this[_reverseListeners](listeners);
        this[_zone$].scheduleMicrotask(dart.fn(() => {
          async._Future._propagateToListeners(this, listeners);
        }, VoidToNull()));
      }
    }
    [_removeListeners]() {
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 388, 12, "!_isComplete");
      let current = async._FutureListener._check(this[_resultOrListeners]);
      this[_resultOrListeners] = null;
      return this[_reverseListeners](current);
    }
    [_reverseListeners](listeners) {
      let prev = null;
      let current = listeners;
      while (current != null) {
        let next = current[_nextListener];
        current[_nextListener] = prev;
        prev = current;
        current = next;
      }
      return prev;
    }
    static _chainForeignFuture(source, target) {
      if (!!dart.test(target[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 411, 12, "!target._isComplete");
      if (!!async._Future.is(source)) dart.assertFailed(null, "dart:async/future_impl.dart", 412, 12, "source is! _Future");
      target[_setPendingComplete]();
      try {
        FutureOfNull()._check(source.then(core.Null, dart.fn(value => {
          if (!dart.test(target[_isPendingComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 418, 16, "target._isPendingComplete");
          target[_clearPendingComplete]();
          target[_complete](value);
        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
            if (stackTrace === void 0) stackTrace = null;
            if (!dart.test(target[_isPendingComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 430, 16, "target._isPendingComplete");
            target[_completeError](error, stackTrace);
          }, dynamic__ToNull())}));
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        async.scheduleMicrotask(dart.fn(() => {
          target[_completeError](e, s);
        }, VoidToNull()));
      }
    }
    static _chainCoreFuture(source, target) {
      if (!dart.test(target[_mayAddListener])) dart.assertFailed(null, "dart:async/future_impl.dart", 447, 12, "target._mayAddListener");
      while (dart.test(source[_isChained])) {
        source = source[_chainSource];
      }
      if (dart.test(source[_isComplete])) {
        let listeners = target[_removeListeners]();
        target[_cloneResult](source);
        async._Future._propagateToListeners(target, listeners);
      } else {
        let listeners = async._FutureListener._check(target[_resultOrListeners]);
        target[_setChained](source);
        source[_prependListeners](listeners);
      }
    }
    [_complete](value) {
      FutureOrOfT()._check(value);
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 463, 12, "!_isComplete");
      if (FutureOfT().is(value)) {
        if (_FutureOfT().is(value)) {
          async._Future._chainCoreFuture(value, this);
        } else {
          async._Future._chainForeignFuture(value, this);
        }
      } else {
        let listeners = this[_removeListeners]();
        this[_setValue](T._check(value));
        async._Future._propagateToListeners(this, listeners);
      }
    }
    [_completeWithValue](value) {
      T._check(value);
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 478, 12, "!_isComplete");
      if (!!FutureOfT().is(value)) dart.assertFailed(null, "dart:async/future_impl.dart", 479, 12, "value is! Future<T>");
      let listeners = this[_removeListeners]();
      this[_setValue](value);
      async._Future._propagateToListeners(this, listeners);
    }
    [_completeError](error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 487, 12, "!_isComplete");
      let listeners = this[_removeListeners]();
      this[_setError](error, stackTrace);
      async._Future._propagateToListeners(this, listeners);
    }
    [_asyncComplete](value) {
      FutureOrOfT()._check(value);
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 495, 12, "!_isComplete");
      if (FutureOfT().is(value)) {
        this[_chainFuture](value);
        return;
      }
      this[_setPendingComplete]();
      this[_zone$].scheduleMicrotask(dart.fn(() => {
        this[_completeWithValue](T._check(value));
      }, VoidToNull()));
    }
    [_chainFuture](value) {
      FutureOfT()._check(value);
      if (_FutureOfT().is(value)) {
        if (dart.test(value[_hasError])) {
          this[_setPendingComplete]();
          this[_zone$].scheduleMicrotask(dart.fn(() => {
            async._Future._chainCoreFuture(value, this);
          }, VoidToNull()));
        } else {
          async._Future._chainCoreFuture(value, this);
        }
        return;
      }
      async._Future._chainForeignFuture(value, this);
    }
    [_asyncCompleteError](error, stackTrace) {
      if (!!dart.test(this[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 535, 12, "!_isComplete");
      this[_setPendingComplete]();
      this[_zone$].scheduleMicrotask(dart.fn(() => {
        this[_completeError](error, stackTrace);
      }, VoidToNull()));
    }
    static _propagateToListeners(source, listeners) {
      while (true) {
        if (!dart.test(source[_isComplete])) dart.assertFailed(null, "dart:async/future_impl.dart", 549, 14, "source._isComplete");
        let hasError = source[_hasError];
        if (listeners == null) {
          if (dart.test(hasError)) {
            let asyncError = source[_error];
            source[_zone$].handleUncaughtError(asyncError.error, asyncError.stackTrace);
          }
          return;
        }
        while (listeners[_nextListener] != null) {
          let listener = listeners;
          listeners = listener[_nextListener];
          listener[_nextListener] = null;
          async._Future._propagateToListeners(source, listener);
        }
        let listener = listeners;
        let sourceResult = source[_resultOrListeners];
        let listenerHasError = hasError;
        let listenerValueOrError = sourceResult;
        if (dart.test(hasError) || dart.test(listener.handlesValue) || dart.test(listener.handlesComplete)) {
          let zone = listener[_zone$];
          if (dart.test(hasError) && !dart.test(source[_zone$].inSameErrorZone(zone))) {
            let asyncError = source[_error];
            source[_zone$].handleUncaughtError(asyncError.error, asyncError.stackTrace);
            return;
          }
          let oldZone = null;
          if (!(async.Zone.current == zone)) {
            oldZone = async.Zone._enter(zone);
          }
          function handleWhenCompleteCallback() {
            if (!!dart.test(listener.handlesValue)) dart.assertFailed(null, "dart:async/future_impl.dart", 605, 18, "!listener.handlesValue");
            if (!!dart.test(listener.handlesError)) dart.assertFailed(null, "dart:async/future_impl.dart", 606, 18, "!listener.handlesError");
            let completeResult = null;
            try {
              completeResult = listener.handleWhenComplete();
            } catch (e$) {
              let e = dart.getThrown(e$);
              let s = dart.stackTrace(e$);
              if (dart.test(hasError) && core.identical(source[_error].error, e)) {
                listenerValueOrError = source[_error];
              } else {
                listenerValueOrError = new async.AsyncError.new(e, s);
              }
              listenerHasError = true;
              return;
            }
            if (async.Future.is(completeResult)) {
              if (async._Future.is(completeResult) && dart.test(completeResult[_isComplete])) {
                if (dart.test(completeResult[_hasError])) {
                  listenerValueOrError = completeResult[_error];
                  listenerHasError = true;
                }
                return;
              }
              let originalSource = source;
              listenerValueOrError = completeResult.then(dart.dynamic, dart.fn(_ => originalSource, dynamicTo_Future()));
              listenerHasError = false;
            }
          }
          dart.fn(handleWhenCompleteCallback, VoidTovoid());
          function handleValueCallback() {
            try {
              listenerValueOrError = listener.handleValue(sourceResult);
            } catch (e$) {
              let e = dart.getThrown(e$);
              let s = dart.stackTrace(e$);
              listenerValueOrError = new async.AsyncError.new(e, s);
              listenerHasError = true;
            }
          }
          dart.fn(handleValueCallback, VoidTovoid());
          function handleError() {
            try {
              let asyncError = source[_error];
              if (dart.test(listener.matchesErrorTest(asyncError)) && dart.test(listener.hasErrorCallback)) {
                listenerValueOrError = listener.handleError(asyncError);
                listenerHasError = false;
              }
            } catch (e$) {
              let e = dart.getThrown(e$);
              let s = dart.stackTrace(e$);
              if (core.identical(source[_error].error, e)) {
                listenerValueOrError = source[_error];
              } else {
                listenerValueOrError = new async.AsyncError.new(e, s);
              }
              listenerHasError = true;
            }
          }
          dart.fn(handleError, VoidTovoid());
          if (dart.test(listener.handlesComplete)) {
            handleWhenCompleteCallback();
          } else if (!dart.test(hasError)) {
            if (dart.test(listener.handlesValue)) {
              handleValueCallback();
            }
          } else {
            if (dart.test(listener.handlesError)) {
              handleError();
            }
          }
          if (oldZone != null) async.Zone._leave(oldZone);
          if (async.Future.is(listenerValueOrError)) {
            let chainSource = async.Future._check(listenerValueOrError);
            let result = listener.result;
            if (async._Future.is(chainSource)) {
              if (dart.test(chainSource[_isComplete])) {
                listeners = result[_removeListeners]();
                result[_cloneResult](chainSource);
                source = chainSource;
                continue;
              } else {
                async._Future._chainCoreFuture(chainSource, result);
              }
            } else {
              async._Future._chainForeignFuture(chainSource, result);
            }
            return;
          }
        }
        let result = listener.result;
        listeners = result[_removeListeners]();
        if (!dart.test(listenerHasError)) {
          result[_setValue](listenerValueOrError);
        } else {
          let asyncError = async.AsyncError._check(listenerValueOrError);
          result[_setErrorObject](asyncError);
        }
        source = result;
      }
    }
    timeout(timeLimit, opts) {
      let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
      VoidToFutureOrOfT()._check(onTimeout);
      if (dart.test(this[_isComplete])) return new (_FutureOfT()).immediate(this);
      let result = new (_FutureOfT()).new();
      let timer = null;
      if (onTimeout == null) {
        timer = async.Timer.new(timeLimit, dart.fn(() => {
          result[_completeError](new async.TimeoutException.new("Future not completed", timeLimit));
        }, VoidToNull()));
      } else {
        let zone = async.Zone.current;
        onTimeout = zone.registerCallback(FutureOrOfT(), onTimeout);
        timer = async.Timer.new(timeLimit, dart.fn(() => {
          try {
            result[_complete](zone.run(FutureOrOfT(), onTimeout));
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            result[_completeError](e, s);
          }
        }, VoidToNull()));
      }
      this.then(core.Null, dart.fn(v => {
        if (dart.test(timer.isActive)) {
          timer.cancel();
          result[_completeWithValue](v);
        }
      }, TToNull()), {onError: dart.fn((e, s) => {
          if (dart.test(timer.isActive)) {
            timer.cancel();
            result[_completeError](e, s);
          }
        }, dynamicAndStackTraceToNull())});
      return result;
    }
  }
  (_Future.new = function() {
    this[_state] = 0;
    this[_resultOrListeners] = null;
    this[_zone$] = async.Zone.current;
  }).prototype = _Future.prototype;
  (_Future.immediate = function(result) {
    this[_state] = 0;
    this[_resultOrListeners] = null;
    this[_zone$] = async.Zone.current;
    this[_asyncComplete](result);
  }).prototype = _Future.prototype;
  (_Future.zoneValue = function(value, zone) {
    this[_state] = 0;
    this[_resultOrListeners] = null;
    this[_zone$] = zone;
    this[_setValue](value);
  }).prototype = _Future.prototype;
  (_Future.immediateError = function(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_state] = 0;
    this[_resultOrListeners] = null;
    this[_zone$] = async.Zone.current;
    this[_asyncCompleteError](error, stackTrace);
  }).prototype = _Future.prototype;
  (_Future.value = function(value) {
    _Future.zoneValue.call(this, value, async.Zone.current);
  }).prototype = _Future.prototype;
  _Future.prototype[dart.isFuture] = true;
  dart.addTypeTests(_Future);
  _Future.prototype[_is__Future_default] = true;
  _Future[dart.implements] = () => [FutureOfT()];
  dart.setMethodSignature(_Future, () => ({
    __proto__: dart.getMethods(_Future.__proto__),
    [_setChained]: dart.fnType(dart.void, [async._Future]),
    then: dart.gFnType(R => [async.Future$(R), [dart.fnType(async.FutureOr$(R), [T])], {onError: core.Function}]),
    [_thenNoZoneRegistration]: dart.gFnType(E => [async.Future$(E), [dart.fnType(async.FutureOr$(E), [T]), core.Function]]),
    catchError: dart.fnType(async.Future$(T), [core.Function], {test: dart.fnType(core.bool, [dart.dynamic])}),
    whenComplete: dart.fnType(async.Future$(T), [dart.fnType(dart.dynamic, [])]),
    asStream: dart.fnType(async.Stream$(T), []),
    [_setPendingComplete]: dart.fnType(dart.void, []),
    [_clearPendingComplete]: dart.fnType(dart.void, []),
    [_setValue]: dart.fnType(dart.void, [core.Object]),
    [_setErrorObject]: dart.fnType(dart.void, [async.AsyncError]),
    [_setError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_cloneResult]: dart.fnType(dart.void, [async._Future]),
    [_addListener]: dart.fnType(dart.void, [async._FutureListener]),
    [_prependListeners]: dart.fnType(dart.void, [async._FutureListener]),
    [_removeListeners]: dart.fnType(async._FutureListener, []),
    [_reverseListeners]: dart.fnType(async._FutureListener, [async._FutureListener]),
    [_complete]: dart.fnType(dart.void, [core.Object]),
    [_completeWithValue]: dart.fnType(dart.void, [core.Object]),
    [_completeError]: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    [_asyncComplete]: dart.fnType(dart.void, [core.Object]),
    [_chainFuture]: dart.fnType(dart.void, [core.Object]),
    [_asyncCompleteError]: dart.fnType(dart.void, [dart.dynamic, core.StackTrace]),
    timeout: dart.fnType(async.Future$(T), [core.Duration], {onTimeout: core.Object})
  }));
  dart.setGetterSignature(_Future, () => ({
    __proto__: dart.getGetters(_Future.__proto__),
    [_mayComplete]: core.bool,
    [_isPendingComplete]: core.bool,
    [_mayAddListener]: core.bool,
    [_isChained]: core.bool,
    [_isComplete]: core.bool,
    [_hasError]: core.bool,
    [_error]: async.AsyncError,
    [_chainSource]: async._Future
  }));
  dart.setLibraryUri(_Future, "dart:async");
  dart.setFieldSignature(_Future, () => ({
    __proto__: dart.getFields(_Future.__proto__),
    [_state]: dart.fieldType(core.int),
    [_zone$]: dart.finalFieldType(async.Zone),
    [_resultOrListeners]: dart.fieldType(dart.dynamic)
  }));
  return _Future;
});
async._Future = async._Future$();
dart.defineLazy(async._Future, {
  /*async._Future._stateIncomplete*/get _stateIncomplete() {
    return 0;
  },
  /*async._Future._statePendingComplete*/get _statePendingComplete() {
    return 1;
  },
  /*async._Future._stateChained*/get _stateChained() {
    return 2;
  },
  /*async._Future._stateValue*/get _stateValue() {
    return 4;
  },
  /*async._Future._stateError*/get _stateError() {
    return 8;
  }
});
dart.addTypeTests(async._Future, _is__Future_default);
async._registerErrorHandler = function(errorHandler, zone) {
  if (ObjectAndStackTraceTodynamic().is(errorHandler)) {
    return zone.registerBinaryCallback(dart.dynamic, core.Object, core.StackTrace, errorHandler);
  }
  if (ObjectTodynamic().is(errorHandler)) {
    return zone.registerUnaryCallback(dart.dynamic, core.Object, errorHandler);
  }
  dart.throw(new core.ArgumentError.value(errorHandler, "onError", "Error handler must accept one Object or one Object and a StackTrace" + " as arguments, and return a a valid result"));
};
async._AsyncCallbackEntry = class _AsyncCallbackEntry extends core.Object {};
(async._AsyncCallbackEntry.new = function(callback) {
  this.next = null;
  this.callback = callback;
}).prototype = async._AsyncCallbackEntry.prototype;
dart.addTypeTests(async._AsyncCallbackEntry);
dart.setLibraryUri(async._AsyncCallbackEntry, "dart:async");
dart.setFieldSignature(async._AsyncCallbackEntry, () => ({
  __proto__: dart.getFields(async._AsyncCallbackEntry.__proto__),
  callback: dart.finalFieldType(VoidTovoid()),
  next: dart.fieldType(async._AsyncCallbackEntry)
}));
dart.defineLazy(async, {
  /*async._nextCallback*/get _nextCallback() {
    return null;
  },
  set _nextCallback(_) {},
  /*async._lastCallback*/get _lastCallback() {
    return null;
  },
  set _lastCallback(_) {},
  /*async._lastPriorityCallback*/get _lastPriorityCallback() {
    return null;
  },
  set _lastPriorityCallback(_) {},
  /*async._isInCallbackLoop*/get _isInCallbackLoop() {
    return false;
  },
  set _isInCallbackLoop(_) {}
});
async._microtaskLoop = function() {
  while (async._nextCallback != null) {
    async._lastPriorityCallback = null;
    let entry = async._nextCallback;
    async._nextCallback = entry.next;
    if (async._nextCallback == null) async._lastCallback = null;
    entry.callback();
  }
};
async._startMicrotaskLoop = function() {
  async._isInCallbackLoop = true;
  try {
    async._microtaskLoop();
  } finally {
    async._lastPriorityCallback = null;
    async._isInCallbackLoop = false;
    if (async._nextCallback != null) {
      async._AsyncRun._scheduleImmediate(dart.fn(async._startMicrotaskLoop, VoidTovoid()));
    }
  }
};
async._scheduleAsyncCallback = function(callback) {
  let newEntry = new async._AsyncCallbackEntry.new(callback);
  if (async._nextCallback == null) {
    async._nextCallback = async._lastCallback = newEntry;
    if (!dart.test(async._isInCallbackLoop)) {
      async._AsyncRun._scheduleImmediate(dart.fn(async._startMicrotaskLoop, VoidTovoid()));
    }
  } else {
    async._lastCallback.next = newEntry;
    async._lastCallback = newEntry;
  }
};
async._schedulePriorityAsyncCallback = function(callback) {
  if (async._nextCallback == null) {
    async._scheduleAsyncCallback(callback);
    async._lastPriorityCallback = async._lastCallback;
    return;
  }
  let entry = new async._AsyncCallbackEntry.new(callback);
  if (async._lastPriorityCallback == null) {
    entry.next = async._nextCallback;
    async._nextCallback = async._lastPriorityCallback = entry;
  } else {
    entry.next = async._lastPriorityCallback.next;
    async._lastPriorityCallback.next = entry;
    async._lastPriorityCallback = entry;
    if (entry.next == null) {
      async._lastCallback = entry;
    }
  }
};
const _scheduleMicrotask = dart.privateName(async, "_scheduleMicrotask");
async.scheduleMicrotask = function(callback) {
  let currentZone = async._Zone._check(async.Zone.current);
  if (async._rootZone === currentZone) {
    async._rootScheduleMicrotask(null, null, async._rootZone, callback);
    return;
  }
  let implementation = currentZone[_scheduleMicrotask];
  if (async._rootZone === implementation.zone && dart.test(async._rootZone.inSameErrorZone(currentZone))) {
    async._rootScheduleMicrotask(null, null, currentZone, currentZone.registerCallback(dart.void, callback));
    return;
  }
  async.Zone.current.scheduleMicrotask(async.Zone.current.bindCallbackGuarded(callback));
};
async._AsyncRun = class _AsyncRun extends core.Object {
  static _scheduleImmediate(callback) {
    async._AsyncRun._scheduleImmediateClosure(callback);
  }
  static _initializeScheduleImmediate() {
    if (dart.global.scheduleImmediate != null) {
      return async._AsyncRun._scheduleImmediateJSOverride;
    }
    return async._AsyncRun._scheduleImmediateWithPromise;
  }
  static _scheduleImmediateJSOverride(callback) {
    dart.addAsyncCallback();
    dart.global.scheduleImmediate(() => {
      dart.removeAsyncCallback();
      callback();
    });
  }
  static _scheduleImmediateWithPromise(callback) {
    dart.addAsyncCallback();
    dart.global.Promise.resolve(null).then(() => {
      dart.removeAsyncCallback();
      callback();
    });
  }
};
(async._AsyncRun.new = function() {
}).prototype = async._AsyncRun.prototype;
dart.addTypeTests(async._AsyncRun);
dart.setLibraryUri(async._AsyncRun, "dart:async");
dart.defineLazy(async._AsyncRun, {
  /*async._AsyncRun._scheduleImmediateClosure*/get _scheduleImmediateClosure() {
    return async._AsyncRun._initializeScheduleImmediate();
  }
});
async.StreamSubscription$ = dart.generic(T => {
  class StreamSubscription extends core.Object {}
  (StreamSubscription.new = function() {
  }).prototype = StreamSubscription.prototype;
  dart.addTypeTests(StreamSubscription);
  StreamSubscription.prototype[dart.isStreamSubscription] = true;
  dart.setLibraryUri(StreamSubscription, "dart:async");
  return StreamSubscription;
});
async.StreamSubscription = async.StreamSubscription$();
dart.addTypeTests(async.StreamSubscription, dart.isStreamSubscription);
const _is_EventSink_default = Symbol('_is_EventSink_default');
async.EventSink$ = dart.generic(T => {
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  class EventSink extends core.Object {}
  (EventSink.new = function() {
  }).prototype = EventSink.prototype;
  dart.addTypeTests(EventSink);
  EventSink.prototype[_is_EventSink_default] = true;
  EventSink[dart.implements] = () => [SinkOfT()];
  dart.setLibraryUri(EventSink, "dart:async");
  return EventSink;
});
async.EventSink = async.EventSink$();
dart.addTypeTests(async.EventSink, _is_EventSink_default);
const _stream = dart.privateName(async, "_stream");
const _is_StreamView_default = Symbol('_is_StreamView_default');
async.StreamView$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class StreamView extends async.Stream$(T) {
    get isBroadcast() {
      return this[_stream].isBroadcast;
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return this[_stream].asBroadcastStream({onListen: onListen, onCancel: onCancel});
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
  }
  (StreamView.new = function(stream) {
    this[_stream] = stream;
    StreamView.__proto__._internal.call(this);
  }).prototype = StreamView.prototype;
  dart.addTypeTests(StreamView);
  StreamView.prototype[_is_StreamView_default] = true;
  dart.setMethodSignature(StreamView, () => ({
    __proto__: dart.getMethods(StreamView.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool})
  }));
  dart.setLibraryUri(StreamView, "dart:async");
  dart.setFieldSignature(StreamView, () => ({
    __proto__: dart.getFields(StreamView.__proto__),
    [_stream]: dart.finalFieldType(StreamOfT())
  }));
  return StreamView;
});
async.StreamView = async.StreamView$();
dart.addTypeTests(async.StreamView, _is_StreamView_default);
const _is_StreamConsumer_default = Symbol('_is_StreamConsumer_default');
async.StreamConsumer$ = dart.generic(S => {
  class StreamConsumer extends core.Object {}
  (StreamConsumer.new = function() {
  }).prototype = StreamConsumer.prototype;
  dart.addTypeTests(StreamConsumer);
  StreamConsumer.prototype[_is_StreamConsumer_default] = true;
  dart.setLibraryUri(StreamConsumer, "dart:async");
  return StreamConsumer;
});
async.StreamConsumer = async.StreamConsumer$();
dart.addTypeTests(async.StreamConsumer, _is_StreamConsumer_default);
const _is_StreamSink_default = Symbol('_is_StreamSink_default');
async.StreamSink$ = dart.generic(S => {
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let StreamConsumerOfS = () => (StreamConsumerOfS = dart.constFn(async.StreamConsumer$(S)))();
  class StreamSink extends core.Object {}
  (StreamSink.new = function() {
  }).prototype = StreamSink.prototype;
  dart.addTypeTests(StreamSink);
  StreamSink.prototype[_is_StreamSink_default] = true;
  StreamSink[dart.implements] = () => [EventSinkOfS(), StreamConsumerOfS()];
  dart.setLibraryUri(StreamSink, "dart:async");
  return StreamSink;
});
async.StreamSink = async.StreamSink$();
dart.addTypeTests(async.StreamSink, _is_StreamSink_default);
const _is_StreamTransformer_default = Symbol('_is_StreamTransformer_default');
async.StreamTransformer$ = dart.generic((S, T) => {
  let _StreamSubscriptionTransformerOfS$T = () => (_StreamSubscriptionTransformerOfS$T = dart.constFn(async._StreamSubscriptionTransformer$(S, T)))();
  let _StreamHandlerTransformerOfS$T = () => (_StreamHandlerTransformerOfS$T = dart.constFn(async._StreamHandlerTransformer$(S, T)))();
  let _StreamBindTransformerOfS$T = () => (_StreamBindTransformerOfS$T = dart.constFn(async._StreamBindTransformer$(S, T)))();
  class StreamTransformer extends core.Object {
    static new(onListen) {
      return new (_StreamSubscriptionTransformerOfS$T()).new(onListen);
    }
    static fromHandlers(opts) {
      return new (_StreamHandlerTransformerOfS$T()).new(opts);
    }
    static fromBind(bind) {
      return new (_StreamBindTransformerOfS$T()).new(bind);
    }
    static castFrom(SS, ST, TS, TT, source) {
      return new (_internal.CastStreamTransformer$(SS, ST, TS, TT)).new(source);
    }
  }
  (StreamTransformer[dart.mixinNew] = function() {
  }).prototype = StreamTransformer.prototype;
  dart.addTypeTests(StreamTransformer);
  StreamTransformer.prototype[_is_StreamTransformer_default] = true;
  dart.setLibraryUri(StreamTransformer, "dart:async");
  return StreamTransformer;
});
async.StreamTransformer = async.StreamTransformer$();
dart.addTypeTests(async.StreamTransformer, _is_StreamTransformer_default);
const _is_StreamIterator_default = Symbol('_is_StreamIterator_default');
async.StreamIterator$ = dart.generic(T => {
  let _StreamIteratorOfT = () => (_StreamIteratorOfT = dart.constFn(async._StreamIterator$(T)))();
  class StreamIterator extends core.Object {
    static new(stream) {
      return new (_StreamIteratorOfT()).new(stream);
    }
  }
  (StreamIterator[dart.mixinNew] = function() {
  }).prototype = StreamIterator.prototype;
  dart.addTypeTests(StreamIterator);
  StreamIterator.prototype[_is_StreamIterator_default] = true;
  dart.setLibraryUri(StreamIterator, "dart:async");
  return StreamIterator;
});
async.StreamIterator = async.StreamIterator$();
dart.addTypeTests(async.StreamIterator, _is_StreamIterator_default);
const _is__ControllerEventSinkWrapper_default = Symbol('_is__ControllerEventSinkWrapper_default');
async._ControllerEventSinkWrapper$ = dart.generic(T => {
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _ControllerEventSinkWrapper extends core.Object {
    add(data) {
      T._check(data);
      this[_sink].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_sink].addError(error, stackTrace);
    }
    close() {
      this[_sink].close();
    }
  }
  (_ControllerEventSinkWrapper.new = function(sink) {
    this[_sink] = sink;
  }).prototype = _ControllerEventSinkWrapper.prototype;
  dart.addTypeTests(_ControllerEventSinkWrapper);
  _ControllerEventSinkWrapper.prototype[_is__ControllerEventSinkWrapper_default] = true;
  _ControllerEventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
  dart.setMethodSignature(_ControllerEventSinkWrapper, () => ({
    __proto__: dart.getMethods(_ControllerEventSinkWrapper.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_ControllerEventSinkWrapper, "dart:async");
  dart.setFieldSignature(_ControllerEventSinkWrapper, () => ({
    __proto__: dart.getFields(_ControllerEventSinkWrapper.__proto__),
    [_sink]: dart.fieldType(async.EventSink)
  }));
  return _ControllerEventSinkWrapper;
});
async._ControllerEventSinkWrapper = async._ControllerEventSinkWrapper$();
dart.addTypeTests(async._ControllerEventSinkWrapper, _is__ControllerEventSinkWrapper_default);
const _is_StreamController_default = Symbol('_is_StreamController_default');
async.StreamController$ = dart.generic(T => {
  let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
  let _AsyncStreamControllerOfT = () => (_AsyncStreamControllerOfT = dart.constFn(async._AsyncStreamController$(T)))();
  let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
  let _AsyncBroadcastStreamControllerOfT = () => (_AsyncBroadcastStreamControllerOfT = dart.constFn(async._AsyncBroadcastStreamController$(T)))();
  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
  class StreamController extends core.Object {
    static new(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onPause = opts && 'onPause' in opts ? opts.onPause : null;
      let onResume = opts && 'onResume' in opts ? opts.onResume : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      let sync = opts && 'sync' in opts ? opts.sync : false;
      return dart.test(sync) ? new (_SyncStreamControllerOfT()).new(onListen, onPause, onResume, onCancel) : new (_AsyncStreamControllerOfT()).new(onListen, onPause, onResume, onCancel);
    }
    static broadcast(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      let sync = opts && 'sync' in opts ? opts.sync : false;
      return dart.test(sync) ? new (_SyncBroadcastStreamControllerOfT()).new(onListen, onCancel) : new (_AsyncBroadcastStreamControllerOfT()).new(onListen, onCancel);
    }
  }
  (StreamController[dart.mixinNew] = function() {
  }).prototype = StreamController.prototype;
  dart.addTypeTests(StreamController);
  StreamController.prototype[_is_StreamController_default] = true;
  StreamController[dart.implements] = () => [StreamSinkOfT()];
  dart.setLibraryUri(StreamController, "dart:async");
  return StreamController;
});
async.StreamController = async.StreamController$();
dart.addTypeTests(async.StreamController, _is_StreamController_default);
const _is_SynchronousStreamController_default = Symbol('_is_SynchronousStreamController_default');
async.SynchronousStreamController$ = dart.generic(T => {
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  class SynchronousStreamController extends core.Object {}
  (SynchronousStreamController.new = function() {
  }).prototype = SynchronousStreamController.prototype;
  dart.addTypeTests(SynchronousStreamController);
  SynchronousStreamController.prototype[_is_SynchronousStreamController_default] = true;
  SynchronousStreamController[dart.implements] = () => [StreamControllerOfT()];
  dart.setLibraryUri(SynchronousStreamController, "dart:async");
  return SynchronousStreamController;
});
async.SynchronousStreamController = async.SynchronousStreamController$();
dart.addTypeTests(async.SynchronousStreamController, _is_SynchronousStreamController_default);
const _is__StreamControllerLifecycle_default = Symbol('_is__StreamControllerLifecycle_default');
async._StreamControllerLifecycle$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  class _StreamControllerLifecycle extends core.Object {
    [_recordPause](subscription) {
      StreamSubscriptionOfT()._check(subscription);
    }
    [_recordResume](subscription) {
      StreamSubscriptionOfT()._check(subscription);
    }
    [_recordCancel](subscription) {
      StreamSubscriptionOfT()._check(subscription);
      return null;
    }
  }
  (_StreamControllerLifecycle.new = function() {
  }).prototype = _StreamControllerLifecycle.prototype;
  dart.addTypeTests(_StreamControllerLifecycle);
  _StreamControllerLifecycle.prototype[_is__StreamControllerLifecycle_default] = true;
  dart.setMethodSignature(_StreamControllerLifecycle, () => ({
    __proto__: dart.getMethods(_StreamControllerLifecycle.__proto__),
    [_recordPause]: dart.fnType(dart.void, [core.Object]),
    [_recordResume]: dart.fnType(dart.void, [core.Object]),
    [_recordCancel]: dart.fnType(async.Future, [core.Object])
  }));
  dart.setLibraryUri(_StreamControllerLifecycle, "dart:async");
  return _StreamControllerLifecycle;
});
async._StreamControllerLifecycle = async._StreamControllerLifecycle$();
dart.addTypeTests(async._StreamControllerLifecycle, _is__StreamControllerLifecycle_default);
const _is__StreamControllerBase_default = Symbol('_is__StreamControllerBase_default');
async._StreamControllerBase$ = dart.generic(T => {
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _StreamControllerBase extends core.Object {}
  (_StreamControllerBase.new = function() {
  }).prototype = _StreamControllerBase.prototype;
  dart.addTypeTests(_StreamControllerBase);
  _StreamControllerBase.prototype[_is__StreamControllerBase_default] = true;
  _StreamControllerBase[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
  dart.setLibraryUri(_StreamControllerBase, "dart:async");
  return _StreamControllerBase;
});
async._StreamControllerBase = async._StreamControllerBase$();
dart.addTypeTests(async._StreamControllerBase, _is__StreamControllerBase_default);
const _varData = dart.privateName(async, "_varData");
const _isInitialState = dart.privateName(async, "_isInitialState");
const _subscription = dart.privateName(async, "_subscription");
const _pendingEvents = dart.privateName(async, "_pendingEvents");
const _ensurePendingEvents = dart.privateName(async, "_ensurePendingEvents");
const _badEventState = dart.privateName(async, "_badEventState");
let const$15;
const _is__StreamController_default = Symbol('_is__StreamController_default');
async._StreamController$ = dart.generic(T => {
  let _ControllerStreamOfT = () => (_ControllerStreamOfT = dart.constFn(async._ControllerStream$(T)))();
  let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
  let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
  let _StreamControllerAddStreamStateOfT = () => (_StreamControllerAddStreamStateOfT = dart.constFn(async._StreamControllerAddStreamState$(T)))();
  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
  let _ControllerSubscriptionOfT = () => (_ControllerSubscriptionOfT = dart.constFn(async._ControllerSubscription$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let _StreamControllerBaseOfT = () => (_StreamControllerBaseOfT = dart.constFn(async._StreamControllerBase$(T)))();
  class _StreamController extends core.Object {
    get stream() {
      return new (_ControllerStreamOfT()).new(this);
    }
    get sink() {
      return new (_StreamSinkWrapperOfT()).new(this);
    }
    get [_isCanceled]() {
      return (dart.notNull(this[_state]) & 2) !== 0;
    }
    get hasListener() {
      return (dart.notNull(this[_state]) & 1) !== 0;
    }
    get [_isInitialState]() {
      return (dart.notNull(this[_state]) & 3) === 0;
    }
    get isClosed() {
      return (dart.notNull(this[_state]) & 4) !== 0;
    }
    get isPaused() {
      return dart.test(this.hasListener) ? this[_subscription][_isInputPaused] : !dart.test(this[_isCanceled]);
    }
    get [_isAddingStream]() {
      return (dart.notNull(this[_state]) & 8) !== 0;
    }
    get [_mayAddEvent]() {
      return dart.notNull(this[_state]) < 4;
    }
    get [_pendingEvents]() {
      if (!dart.test(this[_isInitialState])) dart.assertFailed(null, "dart:async/stream_controller.dart", 510, 12, "_isInitialState");
      if (!dart.test(this[_isAddingStream])) {
        return _PendingEventsOfT()._check(this[_varData]);
      }
      let state = _StreamControllerAddStreamStateOfT()._check(this[_varData]);
      return _PendingEventsOfT()._check(state.varData);
    }
    [_ensurePendingEvents]() {
      if (!dart.test(this[_isInitialState])) dart.assertFailed(null, "dart:async/stream_controller.dart", 520, 12, "_isInitialState");
      if (!dart.test(this[_isAddingStream])) {
        let t = this[_varData];
        t == null ? this[_varData] = new (_StreamImplEventsOfT()).new() : t;
        return _StreamImplEventsOfT()._check(this[_varData]);
      }
      let state = _StreamControllerAddStreamStateOfT()._check(this[_varData]);
      if (state.varData == null) state.varData = new (_StreamImplEventsOfT()).new();
      return _StreamImplEventsOfT()._check(state.varData);
    }
    get [_subscription]() {
      if (!dart.test(this.hasListener)) dart.assertFailed(null, "dart:async/stream_controller.dart", 534, 12, "hasListener");
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT()._check(this[_varData]);
        return _ControllerSubscriptionOfT()._check(addState.varData);
      }
      return _ControllerSubscriptionOfT()._check(this[_varData]);
    }
    [_badEventState]() {
      if (dart.test(this.isClosed)) {
        return new core.StateError.new("Cannot add event after closing");
      }
      if (!dart.test(this[_isAddingStream])) dart.assertFailed(null, "dart:async/stream_controller.dart", 551, 12, "_isAddingStream");
      return new core.StateError.new("Cannot add event while adding a stream");
    }
    addStream(source, opts) {
      StreamOfT()._check(source);
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
      if (dart.test(this[_isCanceled])) return new async._Future.immediate(null);
      let addState = new (_StreamControllerAddStreamStateOfT()).new(this, this[_varData], source, cancelOnError != null ? cancelOnError : false);
      this[_varData] = addState;
      this[_state] = (dart.notNull(this[_state]) | 8) >>> 0;
      return addState.addStreamFuture;
    }
    get done() {
      return this[_ensureDoneFuture]();
    }
    [_ensureDoneFuture]() {
      let t = this[_doneFuture];
      t == null ? this[_doneFuture] = dart.test(this[_isCanceled]) ? async.Future._nullFuture : new async._Future.new() : t;
      return this[_doneFuture];
    }
    add(value) {
      T._check(value);
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
      this[_add](value);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
      error = async._nonNullError(error);
      let replacement = async.Zone.current.errorCallback(error, stackTrace);
      if (replacement != null) {
        error = async._nonNullError(replacement.error);
        stackTrace = replacement.stackTrace;
      }
      this[_addError](error, stackTrace);
    }
    close() {
      if (dart.test(this.isClosed)) {
        return this[_ensureDoneFuture]();
      }
      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
      this[_closeUnchecked]();
      return this[_ensureDoneFuture]();
    }
    [_closeUnchecked]() {
      this[_state] = (dart.notNull(this[_state]) | 4) >>> 0;
      if (dart.test(this.hasListener)) {
        this[_sendDone]();
      } else if (dart.test(this[_isInitialState])) {
        this[_ensurePendingEvents]().add(const$15 || (const$15 = dart.const(new async._DelayedDone.new())));
      }
    }
    [_add](value) {
      T._check(value);
      if (dart.test(this.hasListener)) {
        this[_sendData](value);
      } else if (dart.test(this[_isInitialState])) {
        this[_ensurePendingEvents]().add(new (_DelayedDataOfT()).new(value));
      }
    }
    [_addError](error, stackTrace) {
      if (dart.test(this.hasListener)) {
        this[_sendError](error, stackTrace);
      } else if (dart.test(this[_isInitialState])) {
        this[_ensurePendingEvents]().add(new async._DelayedError.new(error, stackTrace));
      }
    }
    [_close]() {
      if (!dart.test(this[_isAddingStream])) dart.assertFailed(null, "dart:async/stream_controller.dart", 656, 12, "_isAddingStream");
      let addState = _StreamControllerAddStreamStateOfT()._check(this[_varData]);
      this[_varData] = addState.varData;
      this[_state] = (dart.notNull(this[_state]) & ~8) >>> 0;
      addState.complete();
    }
    [_subscribe](onData, onError, onDone, cancelOnError) {
      if (!dart.test(this[_isInitialState])) {
        dart.throw(new core.StateError.new("Stream has already been listened to."));
      }
      let subscription = new (_ControllerSubscriptionOfT()).new(this, onData, onError, onDone, cancelOnError);
      let pendingEvents = this[_pendingEvents];
      this[_state] = (dart.notNull(this[_state]) | 1) >>> 0;
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT()._check(this[_varData]);
        addState.varData = subscription;
        addState.resume();
      } else {
        this[_varData] = subscription;
      }
      subscription[_setPendingEvents](pendingEvents);
      subscription[_guardCallback](dart.fn(() => {
        async._runGuarded(this.onListen);
      }, VoidToNull()));
      return subscription;
    }
    [_recordCancel](subscription) {
      StreamSubscriptionOfT()._check(subscription);
      let result = null;
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT()._check(this[_varData]);
        result = addState.cancel();
      }
      this[_varData] = null;
      this[_state] = (dart.notNull(this[_state]) & ~(1 | 8) | 2) >>> 0;
      if (this.onCancel != null) {
        if (result == null) {
          try {
            result = async.Future._check(this.onCancel());
          } catch (e$) {
            let e = dart.getThrown(e$);
            let s = dart.stackTrace(e$);
            result = new async._Future.new();
            result[_asyncCompleteError](e, s);
          }
        } else {
          result = result.whenComplete(this.onCancel);
        }
      }
      const complete = () => {
        if (this[_doneFuture] != null && dart.test(this[_doneFuture][_mayComplete])) {
          this[_doneFuture][_asyncComplete](null);
        }
      };
      dart.fn(complete, VoidTovoid());
      if (result != null) {
        result = result.whenComplete(complete);
      } else {
        complete();
      }
      return result;
    }
    [_recordPause](subscription) {
      StreamSubscriptionOfT()._check(subscription);
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT()._check(this[_varData]);
        addState.pause();
      }
      async._runGuarded(this.onPause);
    }
    [_recordResume](subscription) {
      StreamSubscriptionOfT()._check(subscription);
      if (dart.test(this[_isAddingStream])) {
        let addState = _StreamControllerAddStreamStateOfT()._check(this[_varData]);
        addState.resume();
      }
      async._runGuarded(this.onResume);
    }
  }
  (_StreamController.new = function(onListen, onPause, onResume, onCancel) {
    this[_varData] = null;
    this[_state] = 0;
    this[_doneFuture] = null;
    this.onListen = onListen;
    this.onPause = onPause;
    this.onResume = onResume;
    this.onCancel = onCancel;
  }).prototype = _StreamController.prototype;
  dart.addTypeTests(_StreamController);
  _StreamController.prototype[_is__StreamController_default] = true;
  _StreamController[dart.implements] = () => [_StreamControllerBaseOfT()];
  dart.setMethodSignature(_StreamController, () => ({
    __proto__: dart.getMethods(_StreamController.__proto__),
    [_ensurePendingEvents]: dart.fnType(async._StreamImplEvents$(T), []),
    [_badEventState]: dart.fnType(core.Error, []),
    addStream: dart.fnType(async.Future, [core.Object], {cancelOnError: core.bool}),
    [_ensureDoneFuture]: dart.fnType(async.Future, []),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.fnType(async.Future, []),
    [_closeUnchecked]: dart.fnType(dart.void, []),
    [_add]: dart.fnType(dart.void, [core.Object]),
    [_addError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_close]: dart.fnType(dart.void, []),
    [_subscribe]: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T]), core.Function, dart.fnType(dart.void, []), core.bool]),
    [_recordCancel]: dart.fnType(async.Future, [core.Object]),
    [_recordPause]: dart.fnType(dart.void, [core.Object]),
    [_recordResume]: dart.fnType(dart.void, [core.Object])
  }));
  dart.setGetterSignature(_StreamController, () => ({
    __proto__: dart.getGetters(_StreamController.__proto__),
    stream: async.Stream$(T),
    sink: async.StreamSink$(T),
    [_isCanceled]: core.bool,
    hasListener: core.bool,
    [_isInitialState]: core.bool,
    isClosed: core.bool,
    isPaused: core.bool,
    [_isAddingStream]: core.bool,
    [_mayAddEvent]: core.bool,
    [_pendingEvents]: async._PendingEvents$(T),
    [_subscription]: async._ControllerSubscription$(T),
    done: async.Future
  }));
  dart.setLibraryUri(_StreamController, "dart:async");
  dart.setFieldSignature(_StreamController, () => ({
    __proto__: dart.getFields(_StreamController.__proto__),
    [_varData]: dart.fieldType(dart.dynamic),
    [_state]: dart.fieldType(core.int),
    [_doneFuture]: dart.fieldType(async._Future),
    onListen: dart.fieldType(VoidTovoid()),
    onPause: dart.fieldType(VoidTovoid()),
    onResume: dart.fieldType(VoidTovoid()),
    onCancel: dart.fieldType(VoidTodynamic())
  }));
  return _StreamController;
});
async._StreamController = async._StreamController$();
dart.defineLazy(async._StreamController, {
  /*async._StreamController._STATE_INITIAL*/get _STATE_INITIAL() {
    return 0;
  },
  /*async._StreamController._STATE_SUBSCRIBED*/get _STATE_SUBSCRIBED() {
    return 1;
  },
  /*async._StreamController._STATE_CANCELED*/get _STATE_CANCELED() {
    return 2;
  },
  /*async._StreamController._STATE_SUBSCRIPTION_MASK*/get _STATE_SUBSCRIPTION_MASK() {
    return 3;
  },
  /*async._StreamController._STATE_CLOSED*/get _STATE_CLOSED() {
    return 4;
  },
  /*async._StreamController._STATE_ADDSTREAM*/get _STATE_ADDSTREAM() {
    return 8;
  }
});
dart.addTypeTests(async._StreamController, _is__StreamController_default);
const _is__SyncStreamControllerDispatch_default = Symbol('_is__SyncStreamControllerDispatch_default');
async._SyncStreamControllerDispatch$ = dart.generic(T => {
  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
  let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
  class _SyncStreamControllerDispatch extends core.Object {
    [_sendData](data) {
      T._check(data);
      this[_subscription][_add](data);
    }
    [_sendError](error, stackTrace) {
      this[_subscription][_addError](error, stackTrace);
    }
    [_sendDone]() {
      this[_subscription][_close]();
    }
  }
  (_SyncStreamControllerDispatch.new = function() {
  }).prototype = _SyncStreamControllerDispatch.prototype;
  dart.addTypeTests(_SyncStreamControllerDispatch);
  _SyncStreamControllerDispatch.prototype[_is__SyncStreamControllerDispatch_default] = true;
  _SyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT(), SynchronousStreamControllerOfT()];
  dart.setMethodSignature(_SyncStreamControllerDispatch, () => ({
    __proto__: dart.getMethods(_SyncStreamControllerDispatch.__proto__),
    [_sendData]: dart.fnType(dart.void, [core.Object]),
    [_sendError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_sendDone]: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_SyncStreamControllerDispatch, "dart:async");
  return _SyncStreamControllerDispatch;
});
async._SyncStreamControllerDispatch = async._SyncStreamControllerDispatch$();
dart.addTypeTests(async._SyncStreamControllerDispatch, _is__SyncStreamControllerDispatch_default);
let const$16;
const _is__AsyncStreamControllerDispatch_default = Symbol('_is__AsyncStreamControllerDispatch_default');
async._AsyncStreamControllerDispatch$ = dart.generic(T => {
  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
  class _AsyncStreamControllerDispatch extends core.Object {
    [_sendData](data) {
      T._check(data);
      this[_subscription][_addPending](new (_DelayedDataOfT()).new(data));
    }
    [_sendError](error, stackTrace) {
      this[_subscription][_addPending](new async._DelayedError.new(error, stackTrace));
    }
    [_sendDone]() {
      this[_subscription][_addPending](const$16 || (const$16 = dart.const(new async._DelayedDone.new())));
    }
  }
  (_AsyncStreamControllerDispatch.new = function() {
  }).prototype = _AsyncStreamControllerDispatch.prototype;
  dart.addTypeTests(_AsyncStreamControllerDispatch);
  _AsyncStreamControllerDispatch.prototype[_is__AsyncStreamControllerDispatch_default] = true;
  _AsyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT()];
  dart.setMethodSignature(_AsyncStreamControllerDispatch, () => ({
    __proto__: dart.getMethods(_AsyncStreamControllerDispatch.__proto__),
    [_sendData]: dart.fnType(dart.void, [core.Object]),
    [_sendError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_sendDone]: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_AsyncStreamControllerDispatch, "dart:async");
  return _AsyncStreamControllerDispatch;
});
async._AsyncStreamControllerDispatch = async._AsyncStreamControllerDispatch$();
dart.addTypeTests(async._AsyncStreamControllerDispatch, _is__AsyncStreamControllerDispatch_default);
const _is__AsyncStreamController_default = Symbol('_is__AsyncStreamController_default');
async._AsyncStreamController$ = dart.generic(T => {
  const _StreamController__AsyncStreamControllerDispatch$ = class _StreamController__AsyncStreamControllerDispatch extends async._StreamController$(T) {};
  (_StreamController__AsyncStreamControllerDispatch$.new = function(onListen, onPause, onResume, onCancel) {
    _StreamController__AsyncStreamControllerDispatch$.__proto__.new.call(this, onListen, onPause, onResume, onCancel);
  }).prototype = _StreamController__AsyncStreamControllerDispatch$.prototype;
  dart.applyMixin(_StreamController__AsyncStreamControllerDispatch$, async._AsyncStreamControllerDispatch$(T));
  class _AsyncStreamController extends _StreamController__AsyncStreamControllerDispatch$ {}
  (_AsyncStreamController.new = function(onListen, onPause, onResume, onCancel) {
    _AsyncStreamController.__proto__.new.call(this, onListen, onPause, onResume, onCancel);
  }).prototype = _AsyncStreamController.prototype;
  dart.addTypeTests(_AsyncStreamController);
  _AsyncStreamController.prototype[_is__AsyncStreamController_default] = true;
  dart.setLibraryUri(_AsyncStreamController, "dart:async");
  return _AsyncStreamController;
});
async._AsyncStreamController = async._AsyncStreamController$();
dart.addTypeTests(async._AsyncStreamController, _is__AsyncStreamController_default);
const _is__SyncStreamController_default = Symbol('_is__SyncStreamController_default');
async._SyncStreamController$ = dart.generic(T => {
  const _StreamController__SyncStreamControllerDispatch$ = class _StreamController__SyncStreamControllerDispatch extends async._StreamController$(T) {};
  (_StreamController__SyncStreamControllerDispatch$.new = function(onListen, onPause, onResume, onCancel) {
    _StreamController__SyncStreamControllerDispatch$.__proto__.new.call(this, onListen, onPause, onResume, onCancel);
  }).prototype = _StreamController__SyncStreamControllerDispatch$.prototype;
  dart.applyMixin(_StreamController__SyncStreamControllerDispatch$, async._SyncStreamControllerDispatch$(T));
  class _SyncStreamController extends _StreamController__SyncStreamControllerDispatch$ {}
  (_SyncStreamController.new = function(onListen, onPause, onResume, onCancel) {
    _SyncStreamController.__proto__.new.call(this, onListen, onPause, onResume, onCancel);
  }).prototype = _SyncStreamController.prototype;
  dart.addTypeTests(_SyncStreamController);
  _SyncStreamController.prototype[_is__SyncStreamController_default] = true;
  dart.setLibraryUri(_SyncStreamController, "dart:async");
  return _SyncStreamController;
});
async._SyncStreamController = async._SyncStreamController$();
dart.addTypeTests(async._SyncStreamController, _is__SyncStreamController_default);
async._runGuarded = function(notificationHandler) {
  if (notificationHandler == null) return;
  try {
    notificationHandler();
  } catch (e$) {
    let e = dart.getThrown(e$);
    let s = dart.stackTrace(e$);
    async.Zone.current.handleUncaughtError(e, s);
  }
};
const _target = dart.privateName(async, "_target");
const _is__StreamSinkWrapper_default = Symbol('_is__StreamSinkWrapper_default');
async._StreamSinkWrapper$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
  class _StreamSinkWrapper extends core.Object {
    add(data) {
      T._check(data);
      this[_target].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_target].addError(error, stackTrace);
    }
    close() {
      return this[_target].close();
    }
    addStream(source) {
      StreamOfT()._check(source);
      return this[_target].addStream(source);
    }
    get done() {
      return this[_target].done;
    }
  }
  (_StreamSinkWrapper.new = function(target) {
    this[_target] = target;
  }).prototype = _StreamSinkWrapper.prototype;
  dart.addTypeTests(_StreamSinkWrapper);
  _StreamSinkWrapper.prototype[_is__StreamSinkWrapper_default] = true;
  _StreamSinkWrapper[dart.implements] = () => [StreamSinkOfT()];
  dart.setMethodSignature(_StreamSinkWrapper, () => ({
    __proto__: dart.getMethods(_StreamSinkWrapper.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.fnType(async.Future, []),
    addStream: dart.fnType(async.Future, [core.Object])
  }));
  dart.setGetterSignature(_StreamSinkWrapper, () => ({
    __proto__: dart.getGetters(_StreamSinkWrapper.__proto__),
    done: async.Future
  }));
  dart.setLibraryUri(_StreamSinkWrapper, "dart:async");
  dart.setFieldSignature(_StreamSinkWrapper, () => ({
    __proto__: dart.getFields(_StreamSinkWrapper.__proto__),
    [_target]: dart.finalFieldType(async.StreamController)
  }));
  return _StreamSinkWrapper;
});
async._StreamSinkWrapper = async._StreamSinkWrapper$();
dart.addTypeTests(async._StreamSinkWrapper, _is__StreamSinkWrapper_default);
const _is__AddStreamState_default = Symbol('_is__AddStreamState_default');
async._AddStreamState$ = dart.generic(T => {
  class _AddStreamState extends core.Object {
    static makeErrorHandler(controller) {
      return dart.fn((e, s) => {
        controller[_addError](e, s);
        controller[_close]();
      }, dynamicAndStackTraceToNull());
    }
    pause() {
      this.addSubscription.pause();
    }
    resume() {
      this.addSubscription.resume();
    }
    cancel() {
      let cancel = this.addSubscription.cancel();
      if (cancel == null) {
        this.addStreamFuture[_asyncComplete](null);
        return null;
      }
      return cancel.whenComplete(dart.fn(() => {
        this.addStreamFuture[_asyncComplete](null);
      }, VoidToNull()));
    }
    complete() {
      this.addStreamFuture[_asyncComplete](null);
    }
  }
  (_AddStreamState.new = function(controller, source, cancelOnError) {
    this.addStreamFuture = new async._Future.new();
    this.addSubscription = source.listen(dart.bind(controller, _add), {onError: core.Function._check(dart.test(cancelOnError) ? async._AddStreamState.makeErrorHandler(controller) : dart.bind(controller, _addError)), onDone: dart.bind(controller, _close), cancelOnError: cancelOnError});
  }).prototype = _AddStreamState.prototype;
  dart.addTypeTests(_AddStreamState);
  _AddStreamState.prototype[_is__AddStreamState_default] = true;
  dart.setMethodSignature(_AddStreamState, () => ({
    __proto__: dart.getMethods(_AddStreamState.__proto__),
    pause: dart.fnType(dart.void, []),
    resume: dart.fnType(dart.void, []),
    cancel: dart.fnType(async.Future, []),
    complete: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_AddStreamState, "dart:async");
  dart.setFieldSignature(_AddStreamState, () => ({
    __proto__: dart.getFields(_AddStreamState.__proto__),
    addStreamFuture: dart.finalFieldType(async._Future),
    addSubscription: dart.finalFieldType(async.StreamSubscription)
  }));
  return _AddStreamState;
});
async._AddStreamState = async._AddStreamState$();
dart.addTypeTests(async._AddStreamState, _is__AddStreamState_default);
const _is__StreamControllerAddStreamState_default = Symbol('_is__StreamControllerAddStreamState_default');
async._StreamControllerAddStreamState$ = dart.generic(T => {
  class _StreamControllerAddStreamState extends async._AddStreamState$(T) {}
  (_StreamControllerAddStreamState.new = function(controller, varData, source, cancelOnError) {
    this.varData = varData;
    _StreamControllerAddStreamState.__proto__.new.call(this, controller, source, cancelOnError);
    if (dart.test(controller.isPaused)) {
      this.addSubscription.pause();
    }
  }).prototype = _StreamControllerAddStreamState.prototype;
  dart.addTypeTests(_StreamControllerAddStreamState);
  _StreamControllerAddStreamState.prototype[_is__StreamControllerAddStreamState_default] = true;
  dart.setLibraryUri(_StreamControllerAddStreamState, "dart:async");
  dart.setFieldSignature(_StreamControllerAddStreamState, () => ({
    __proto__: dart.getFields(_StreamControllerAddStreamState.__proto__),
    varData: dart.fieldType(dart.dynamic)
  }));
  return _StreamControllerAddStreamState;
});
async._StreamControllerAddStreamState = async._StreamControllerAddStreamState$();
dart.addTypeTests(async._StreamControllerAddStreamState, _is__StreamControllerAddStreamState_default);
const _is__EventSink_default = Symbol('_is__EventSink_default');
async._EventSink$ = dart.generic(T => {
  class _EventSink extends core.Object {}
  (_EventSink.new = function() {
  }).prototype = _EventSink.prototype;
  dart.addTypeTests(_EventSink);
  _EventSink.prototype[_is__EventSink_default] = true;
  dart.setLibraryUri(_EventSink, "dart:async");
  return _EventSink;
});
async._EventSink = async._EventSink$();
dart.addTypeTests(async._EventSink, _is__EventSink_default);
const _is__EventDispatch_default = Symbol('_is__EventDispatch_default');
async._EventDispatch$ = dart.generic(T => {
  class _EventDispatch extends core.Object {}
  (_EventDispatch.new = function() {
  }).prototype = _EventDispatch.prototype;
  dart.addTypeTests(_EventDispatch);
  _EventDispatch.prototype[_is__EventDispatch_default] = true;
  dart.setLibraryUri(_EventDispatch, "dart:async");
  return _EventDispatch;
});
async._EventDispatch = async._EventDispatch$();
dart.addTypeTests(async._EventDispatch, _is__EventDispatch_default);
const _isUsed = dart.privateName(async, "_isUsed");
const _is__GeneratedStreamImpl_default = Symbol('_is__GeneratedStreamImpl_default');
async._GeneratedStreamImpl$ = dart.generic(T => {
  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
  let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
  let VoidTo_PendingEventsOfT = () => (VoidTo_PendingEventsOfT = dart.constFn(dart.fnType(_PendingEventsOfT(), [])))();
  class _GeneratedStreamImpl extends async._StreamImpl$(T) {
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      if (dart.test(this[_isUsed])) dart.throw(new core.StateError.new("Stream has already been listened to."));
      this[_isUsed] = true;
      let _ = new (_BufferingStreamSubscriptionOfT()).new(onData, onError, onDone, cancelOnError);
      _[_setPendingEvents](this[_pending]());
      return _;
    }
  }
  (_GeneratedStreamImpl.new = function(pending) {
    this[_isUsed] = false;
    this[_pending] = pending;
    _GeneratedStreamImpl.__proto__.new.call(this);
  }).prototype = _GeneratedStreamImpl.prototype;
  dart.addTypeTests(_GeneratedStreamImpl);
  _GeneratedStreamImpl.prototype[_is__GeneratedStreamImpl_default] = true;
  dart.setLibraryUri(_GeneratedStreamImpl, "dart:async");
  dart.setFieldSignature(_GeneratedStreamImpl, () => ({
    __proto__: dart.getFields(_GeneratedStreamImpl.__proto__),
    [_pending]: dart.finalFieldType(VoidTo_PendingEventsOfT()),
    [_isUsed]: dart.fieldType(core.bool)
  }));
  return _GeneratedStreamImpl;
});
async._GeneratedStreamImpl = async._GeneratedStreamImpl$();
dart.addTypeTests(async._GeneratedStreamImpl, _is__GeneratedStreamImpl_default);
const _iterator$ = dart.privateName(async, "_iterator");
let const$17;
const _eventScheduled = dart.privateName(async, "_eventScheduled");
const _is__PendingEvents_default = Symbol('_is__PendingEvents_default');
async._PendingEvents$ = dart.generic(T => {
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _PendingEvents extends core.Object {
    get isScheduled() {
      return this[_state] === 1;
    }
    get [_eventScheduled]() {
      return dart.notNull(this[_state]) >= 1;
    }
    schedule(dispatch) {
      _EventDispatchOfT()._check(dispatch);
      if (dart.test(this.isScheduled)) return;
      if (!!dart.test(this.isEmpty)) dart.assertFailed(null, "dart:async/stream_impl.dart", 657, 12, "!isEmpty");
      if (dart.test(this[_eventScheduled])) {
        if (!(this[_state] === 3)) dart.assertFailed(null, "dart:async/stream_impl.dart", 659, 14, "_state == _STATE_CANCELED");
        this[_state] = 1;
        return;
      }
      async.scheduleMicrotask(dart.fn(() => {
        let oldState = this[_state];
        this[_state] = 0;
        if (oldState === 3) return;
        this.handleNext(dispatch);
      }, VoidToNull()));
      this[_state] = 1;
    }
    cancelSchedule() {
      if (dart.test(this.isScheduled)) this[_state] = 3;
    }
  }
  (_PendingEvents.new = function() {
    this[_state] = 0;
  }).prototype = _PendingEvents.prototype;
  dart.addTypeTests(_PendingEvents);
  _PendingEvents.prototype[_is__PendingEvents_default] = true;
  dart.setMethodSignature(_PendingEvents, () => ({
    __proto__: dart.getMethods(_PendingEvents.__proto__),
    schedule: dart.fnType(dart.void, [core.Object]),
    cancelSchedule: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_PendingEvents, () => ({
    __proto__: dart.getGetters(_PendingEvents.__proto__),
    isScheduled: core.bool,
    [_eventScheduled]: core.bool
  }));
  dart.setLibraryUri(_PendingEvents, "dart:async");
  dart.setFieldSignature(_PendingEvents, () => ({
    __proto__: dart.getFields(_PendingEvents.__proto__),
    [_state]: dart.fieldType(core.int)
  }));
  return _PendingEvents;
});
async._PendingEvents = async._PendingEvents$();
dart.defineLazy(async._PendingEvents, {
  /*async._PendingEvents._STATE_UNSCHEDULED*/get _STATE_UNSCHEDULED() {
    return 0;
  },
  /*async._PendingEvents._STATE_SCHEDULED*/get _STATE_SCHEDULED() {
    return 1;
  },
  /*async._PendingEvents._STATE_CANCELED*/get _STATE_CANCELED() {
    return 3;
  }
});
dart.addTypeTests(async._PendingEvents, _is__PendingEvents_default);
const _is__IterablePendingEvents_default = Symbol('_is__IterablePendingEvents_default');
async._IterablePendingEvents$ = dart.generic(T => {
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  class _IterablePendingEvents extends async._PendingEvents$(T) {
    get isEmpty() {
      return this[_iterator$] == null;
    }
    handleNext(dispatch) {
      _EventDispatchOfT()._check(dispatch);
      if (this[_iterator$] == null) {
        dart.throw(new core.StateError.new("No events pending."));
      }
      let hasMore = null;
      try {
        hasMore = this[_iterator$].moveNext();
        if (dart.test(hasMore)) {
          dispatch[_sendData](this[_iterator$].current);
        } else {
          this[_iterator$] = null;
          dispatch[_sendDone]();
        }
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        if (hasMore == null) {
          this[_iterator$] = const$17 || (const$17 = dart.const(new (EmptyIteratorOfNull()).new()));
          dispatch[_sendError](e, s);
        } else {
          dispatch[_sendError](e, s);
        }
      }
    }
    clear() {
      if (dart.test(this.isScheduled)) this.cancelSchedule();
      this[_iterator$] = null;
    }
  }
  (_IterablePendingEvents.new = function(data) {
    this[_iterator$] = data[$iterator];
    _IterablePendingEvents.__proto__.new.call(this);
  }).prototype = _IterablePendingEvents.prototype;
  dart.addTypeTests(_IterablePendingEvents);
  _IterablePendingEvents.prototype[_is__IterablePendingEvents_default] = true;
  dart.setMethodSignature(_IterablePendingEvents, () => ({
    __proto__: dart.getMethods(_IterablePendingEvents.__proto__),
    handleNext: dart.fnType(dart.void, [core.Object]),
    clear: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_IterablePendingEvents, () => ({
    __proto__: dart.getGetters(_IterablePendingEvents.__proto__),
    isEmpty: core.bool
  }));
  dart.setLibraryUri(_IterablePendingEvents, "dart:async");
  dart.setFieldSignature(_IterablePendingEvents, () => ({
    __proto__: dart.getFields(_IterablePendingEvents.__proto__),
    [_iterator$]: dart.fieldType(IteratorOfT())
  }));
  return _IterablePendingEvents;
});
async._IterablePendingEvents = async._IterablePendingEvents$();
dart.addTypeTests(async._IterablePendingEvents, _is__IterablePendingEvents_default);
async._nullDataHandler = function(value) {
};
async._nullErrorHandler = function(error, stackTrace) {
  if (stackTrace === void 0) stackTrace = null;
  async.Zone.current.handleUncaughtError(error, stackTrace);
};
async._nullDoneHandler = function() {
};
const _is__DelayedEvent_default = Symbol('_is__DelayedEvent_default');
async._DelayedEvent$ = dart.generic(T => {
  class _DelayedEvent extends core.Object {}
  (_DelayedEvent.new = function() {
    this.next = null;
  }).prototype = _DelayedEvent.prototype;
  dart.addTypeTests(_DelayedEvent);
  _DelayedEvent.prototype[_is__DelayedEvent_default] = true;
  dart.setLibraryUri(_DelayedEvent, "dart:async");
  dart.setFieldSignature(_DelayedEvent, () => ({
    __proto__: dart.getFields(_DelayedEvent.__proto__),
    next: dart.fieldType(async._DelayedEvent)
  }));
  return _DelayedEvent;
});
async._DelayedEvent = async._DelayedEvent$();
dart.addTypeTests(async._DelayedEvent, _is__DelayedEvent_default);
const _is__DelayedData_default = Symbol('_is__DelayedData_default');
async._DelayedData$ = dart.generic(T => {
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _DelayedData extends async._DelayedEvent$(T) {
    perform(dispatch) {
      _EventDispatchOfT()._check(dispatch);
      dispatch[_sendData](this.value);
    }
  }
  (_DelayedData.new = function(value) {
    this.value = value;
    _DelayedData.__proto__.new.call(this);
  }).prototype = _DelayedData.prototype;
  dart.addTypeTests(_DelayedData);
  _DelayedData.prototype[_is__DelayedData_default] = true;
  dart.setMethodSignature(_DelayedData, () => ({
    __proto__: dart.getMethods(_DelayedData.__proto__),
    perform: dart.fnType(dart.void, [core.Object])
  }));
  dart.setLibraryUri(_DelayedData, "dart:async");
  dart.setFieldSignature(_DelayedData, () => ({
    __proto__: dart.getFields(_DelayedData.__proto__),
    value: dart.finalFieldType(T)
  }));
  return _DelayedData;
});
async._DelayedData = async._DelayedData$();
dart.addTypeTests(async._DelayedData, _is__DelayedData_default);
async._DelayedError = class _DelayedError extends async._DelayedEvent {
  perform(dispatch) {
    dispatch[_sendError](this.error, this.stackTrace);
  }
};
(async._DelayedError.new = function(error, stackTrace) {
  this.error = error;
  this.stackTrace = stackTrace;
  async._DelayedError.__proto__.new.call(this);
}).prototype = async._DelayedError.prototype;
dart.addTypeTests(async._DelayedError);
dart.setMethodSignature(async._DelayedError, () => ({
  __proto__: dart.getMethods(async._DelayedError.__proto__),
  perform: dart.fnType(dart.void, [async._EventDispatch])
}));
dart.setLibraryUri(async._DelayedError, "dart:async");
dart.setFieldSignature(async._DelayedError, () => ({
  __proto__: dart.getFields(async._DelayedError.__proto__),
  error: dart.finalFieldType(dart.dynamic),
  stackTrace: dart.finalFieldType(core.StackTrace)
}));
async._DelayedDone = class _DelayedDone extends core.Object {
  perform(dispatch) {
    dispatch[_sendDone]();
  }
  get next() {
    return null;
  }
  set next(_) {
    dart.throw(new core.StateError.new("No events after a done."));
  }
};
(async._DelayedDone.new = function() {
}).prototype = async._DelayedDone.prototype;
dart.addTypeTests(async._DelayedDone);
async._DelayedDone[dart.implements] = () => [async._DelayedEvent];
dart.setMethodSignature(async._DelayedDone, () => ({
  __proto__: dart.getMethods(async._DelayedDone.__proto__),
  perform: dart.fnType(dart.void, [async._EventDispatch])
}));
dart.setGetterSignature(async._DelayedDone, () => ({
  __proto__: dart.getGetters(async._DelayedDone.__proto__),
  next: async._DelayedEvent
}));
dart.setSetterSignature(async._DelayedDone, () => ({
  __proto__: dart.getSetters(async._DelayedDone.__proto__),
  next: async._DelayedEvent
}));
dart.setLibraryUri(async._DelayedDone, "dart:async");
const _is__StreamImplEvents_default = Symbol('_is__StreamImplEvents_default');
async._StreamImplEvents$ = dart.generic(T => {
  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
  class _StreamImplEvents extends async._PendingEvents$(T) {
    get isEmpty() {
      return this.lastPendingEvent == null;
    }
    add(event) {
      if (this.lastPendingEvent == null) {
        this.firstPendingEvent = this.lastPendingEvent = event;
      } else {
        this.lastPendingEvent = this.lastPendingEvent.next = event;
      }
    }
    handleNext(dispatch) {
      _EventDispatchOfT()._check(dispatch);
      if (!!dart.test(this.isScheduled)) dart.assertFailed(null, "dart:async/stream_impl.dart", 701, 12, "!isScheduled");
      let event = this.firstPendingEvent;
      this.firstPendingEvent = event.next;
      if (this.firstPendingEvent == null) {
        this.lastPendingEvent = null;
      }
      event.perform(dispatch);
    }
    clear() {
      if (dart.test(this.isScheduled)) this.cancelSchedule();
      this.firstPendingEvent = this.lastPendingEvent = null;
    }
  }
  (_StreamImplEvents.new = function() {
    this.firstPendingEvent = null;
    this.lastPendingEvent = null;
    _StreamImplEvents.__proto__.new.call(this);
  }).prototype = _StreamImplEvents.prototype;
  dart.addTypeTests(_StreamImplEvents);
  _StreamImplEvents.prototype[_is__StreamImplEvents_default] = true;
  dart.setMethodSignature(_StreamImplEvents, () => ({
    __proto__: dart.getMethods(_StreamImplEvents.__proto__),
    add: dart.fnType(dart.void, [async._DelayedEvent]),
    handleNext: dart.fnType(dart.void, [core.Object]),
    clear: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_StreamImplEvents, () => ({
    __proto__: dart.getGetters(_StreamImplEvents.__proto__),
    isEmpty: core.bool
  }));
  dart.setLibraryUri(_StreamImplEvents, "dart:async");
  dart.setFieldSignature(_StreamImplEvents, () => ({
    __proto__: dart.getFields(_StreamImplEvents.__proto__),
    firstPendingEvent: dart.fieldType(async._DelayedEvent),
    lastPendingEvent: dart.fieldType(async._DelayedEvent)
  }));
  return _StreamImplEvents;
});
async._StreamImplEvents = async._StreamImplEvents$();
dart.addTypeTests(async._StreamImplEvents, _is__StreamImplEvents_default);
const _schedule = dart.privateName(async, "_schedule");
const _isSent = dart.privateName(async, "_isSent");
const _isScheduled = dart.privateName(async, "_isScheduled");
const _is__DoneStreamSubscription_default = Symbol('_is__DoneStreamSubscription_default');
async._DoneStreamSubscription$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  class _DoneStreamSubscription extends core.Object {
    get [_isSent]() {
      return (dart.notNull(this[_state]) & 1) !== 0;
    }
    get [_isScheduled]() {
      return (dart.notNull(this[_state]) & 2) !== 0;
    }
    get isPaused() {
      return dart.notNull(this[_state]) >= 4;
    }
    [_schedule]() {
      if (dart.test(this[_isScheduled])) return;
      this[_zone$].scheduleMicrotask(dart.bind(this, _sendDone));
      this[_state] = (dart.notNull(this[_state]) | 2) >>> 0;
    }
    onData(handleData) {}
    onError(handleError) {}
    onDone(handleDone) {
      this[_onDone] = handleDone;
    }
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      this[_state] = dart.notNull(this[_state]) + 4;
      if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
    }
    resume() {
      if (dart.test(this.isPaused)) {
        this[_state] = dart.notNull(this[_state]) - 4;
        if (!dart.test(this.isPaused) && !dart.test(this[_isSent])) {
          this[_schedule]();
        }
      }
    }
    cancel() {
      return async.Future._nullFuture;
    }
    asFuture(E, futureValue) {
      if (futureValue === void 0) futureValue = null;
      let result = new (async._Future$(E)).new();
      this[_onDone] = dart.fn(() => {
        result[_completeWithValue](futureValue);
      }, VoidToNull());
      return result;
    }
    [_sendDone]() {
      this[_state] = (dart.notNull(this[_state]) & ~2) >>> 0;
      if (dart.test(this.isPaused)) return;
      this[_state] = (dart.notNull(this[_state]) | 1) >>> 0;
      if (this[_onDone] != null) this[_zone$].runGuarded(this[_onDone]);
    }
  }
  (_DoneStreamSubscription.new = function(onDone) {
    this[_state] = 0;
    this[_onDone] = onDone;
    this[_zone$] = async.Zone.current;
    this[_schedule]();
  }).prototype = _DoneStreamSubscription.prototype;
  _DoneStreamSubscription.prototype[dart.isStreamSubscription] = true;
  dart.addTypeTests(_DoneStreamSubscription);
  _DoneStreamSubscription.prototype[_is__DoneStreamSubscription_default] = true;
  _DoneStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
  dart.setMethodSignature(_DoneStreamSubscription, () => ({
    __proto__: dart.getMethods(_DoneStreamSubscription.__proto__),
    [_schedule]: dart.fnType(dart.void, []),
    onData: dart.fnType(dart.void, [dart.fnType(dart.void, [T])]),
    onError: dart.fnType(dart.void, [core.Function]),
    onDone: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
    pause: dart.fnType(dart.void, [], [async.Future]),
    resume: dart.fnType(dart.void, []),
    cancel: dart.fnType(async.Future, []),
    asFuture: dart.gFnType(E => [async.Future$(E), [], [E]]),
    [_sendDone]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_DoneStreamSubscription, () => ({
    __proto__: dart.getGetters(_DoneStreamSubscription.__proto__),
    [_isSent]: core.bool,
    [_isScheduled]: core.bool,
    isPaused: core.bool
  }));
  dart.setLibraryUri(_DoneStreamSubscription, "dart:async");
  dart.setFieldSignature(_DoneStreamSubscription, () => ({
    __proto__: dart.getFields(_DoneStreamSubscription.__proto__),
    [_zone$]: dart.finalFieldType(async.Zone),
    [_state]: dart.fieldType(core.int),
    [_onDone]: dart.fieldType(VoidTovoid())
  }));
  return _DoneStreamSubscription;
});
async._DoneStreamSubscription = async._DoneStreamSubscription$();
dart.defineLazy(async._DoneStreamSubscription, {
  /*async._DoneStreamSubscription._DONE_SENT*/get _DONE_SENT() {
    return 1;
  },
  /*async._DoneStreamSubscription._SCHEDULED*/get _SCHEDULED() {
    return 2;
  },
  /*async._DoneStreamSubscription._PAUSED*/get _PAUSED() {
    return 4;
  }
});
dart.addTypeTests(async._DoneStreamSubscription, _is__DoneStreamSubscription_default);
const _source$ = dart.privateName(async, "_source");
const _onListenHandler = dart.privateName(async, "_onListenHandler");
const _onCancelHandler = dart.privateName(async, "_onCancelHandler");
const _cancelSubscription = dart.privateName(async, "_cancelSubscription");
const _pauseSubscription = dart.privateName(async, "_pauseSubscription");
const _resumeSubscription = dart.privateName(async, "_resumeSubscription");
const _isSubscriptionPaused = dart.privateName(async, "_isSubscriptionPaused");
const _is__AsBroadcastStream_default = Symbol('_is__AsBroadcastStream_default');
async._AsBroadcastStream$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let _AsBroadcastStreamControllerOfT = () => (_AsBroadcastStreamControllerOfT = dart.constFn(async._AsBroadcastStreamController$(T)))();
  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
  let _BroadcastSubscriptionWrapperOfT = () => (_BroadcastSubscriptionWrapperOfT = dart.constFn(async._BroadcastSubscriptionWrapper$(T)))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.fnType(dart.void, [StreamSubscriptionOfT()])))();
  class _AsBroadcastStream extends async.Stream$(T) {
    get isBroadcast() {
      return true;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      if (this[_controller] == null || dart.test(this[_controller].isClosed)) {
        return new (_DoneStreamSubscriptionOfT()).new(onDone);
      }
      let t = this[_subscription];
      t == null ? this[_subscription] = this[_source$].listen(dart.bind(this[_controller], 'add'), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.bind(this[_controller], 'close')}) : t;
      cancelOnError = true === cancelOnError;
      return this[_controller][_subscribe](onData, onError, onDone, cancelOnError);
    }
    [_onCancel]() {
      let shutdown = this[_controller] == null || dart.test(this[_controller].isClosed);
      if (this[_onCancelHandler] != null) {
        this[_zone$].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT(), this[_onCancelHandler], new (_BroadcastSubscriptionWrapperOfT()).new(this));
      }
      if (shutdown) {
        if (this[_subscription] != null) {
          this[_subscription].cancel();
          this[_subscription] = null;
        }
      }
    }
    [_onListen]() {
      if (this[_onListenHandler] != null) {
        this[_zone$].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT(), this[_onListenHandler], new (_BroadcastSubscriptionWrapperOfT()).new(this));
      }
    }
    [_cancelSubscription]() {
      if (this[_subscription] == null) return;
      let subscription = this[_subscription];
      this[_subscription] = null;
      this[_controller] = null;
      subscription.cancel();
    }
    [_pauseSubscription](resumeSignal) {
      if (this[_subscription] == null) return;
      this[_subscription].pause(resumeSignal);
    }
    [_resumeSubscription]() {
      if (this[_subscription] == null) return;
      this[_subscription].resume();
    }
    get [_isSubscriptionPaused]() {
      if (this[_subscription] == null) return false;
      return this[_subscription].isPaused;
    }
  }
  (_AsBroadcastStream.new = function(source, onListenHandler, onCancelHandler) {
    this[_controller] = null;
    this[_subscription] = null;
    this[_source$] = source;
    this[_onListenHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT(), onListenHandler);
    this[_onCancelHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT(), onCancelHandler);
    this[_zone$] = async.Zone.current;
    _AsBroadcastStream.__proto__.new.call(this);
    this[_controller] = new (_AsBroadcastStreamControllerOfT()).new(dart.bind(this, _onListen), dart.bind(this, _onCancel));
  }).prototype = _AsBroadcastStream.prototype;
  dart.addTypeTests(_AsBroadcastStream);
  _AsBroadcastStream.prototype[_is__AsBroadcastStream_default] = true;
  dart.setMethodSignature(_AsBroadcastStream, () => ({
    __proto__: dart.getMethods(_AsBroadcastStream.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
    [_onCancel]: dart.fnType(dart.void, []),
    [_onListen]: dart.fnType(dart.void, []),
    [_cancelSubscription]: dart.fnType(dart.void, []),
    [_pauseSubscription]: dart.fnType(dart.void, [async.Future]),
    [_resumeSubscription]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_AsBroadcastStream, () => ({
    __proto__: dart.getGetters(_AsBroadcastStream.__proto__),
    [_isSubscriptionPaused]: core.bool
  }));
  dart.setLibraryUri(_AsBroadcastStream, "dart:async");
  dart.setFieldSignature(_AsBroadcastStream, () => ({
    __proto__: dart.getFields(_AsBroadcastStream.__proto__),
    [_source$]: dart.finalFieldType(StreamOfT()),
    [_onListenHandler]: dart.finalFieldType(StreamSubscriptionOfTTovoid()),
    [_onCancelHandler]: dart.finalFieldType(StreamSubscriptionOfTTovoid()),
    [_zone$]: dart.finalFieldType(async.Zone),
    [_controller]: dart.fieldType(_AsBroadcastStreamControllerOfT()),
    [_subscription]: dart.fieldType(StreamSubscriptionOfT())
  }));
  return _AsBroadcastStream;
});
async._AsBroadcastStream = async._AsBroadcastStream$();
dart.addTypeTests(async._AsBroadcastStream, _is__AsBroadcastStream_default);
const _is__BroadcastSubscriptionWrapper_default = Symbol('_is__BroadcastSubscriptionWrapper_default');
async._BroadcastSubscriptionWrapper$ = dart.generic(T => {
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  class _BroadcastSubscriptionWrapper extends core.Object {
    onData(handleData) {
      dart.throw(new core.UnsupportedError.new("Cannot change handlers of asBroadcastStream source subscription."));
    }
    onError(handleError) {
      dart.throw(new core.UnsupportedError.new("Cannot change handlers of asBroadcastStream source subscription."));
    }
    onDone(handleDone) {
      dart.throw(new core.UnsupportedError.new("Cannot change handlers of asBroadcastStream source subscription."));
    }
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      this[_stream][_pauseSubscription](resumeSignal);
    }
    resume() {
      this[_stream][_resumeSubscription]();
    }
    cancel() {
      this[_stream][_cancelSubscription]();
      return async.Future._nullFuture;
    }
    get isPaused() {
      return this[_stream][_isSubscriptionPaused];
    }
    asFuture(E, futureValue) {
      if (futureValue === void 0) futureValue = null;
      dart.throw(new core.UnsupportedError.new("Cannot change handlers of asBroadcastStream source subscription."));
    }
  }
  (_BroadcastSubscriptionWrapper.new = function(stream) {
    this[_stream] = stream;
  }).prototype = _BroadcastSubscriptionWrapper.prototype;
  _BroadcastSubscriptionWrapper.prototype[dart.isStreamSubscription] = true;
  dart.addTypeTests(_BroadcastSubscriptionWrapper);
  _BroadcastSubscriptionWrapper.prototype[_is__BroadcastSubscriptionWrapper_default] = true;
  _BroadcastSubscriptionWrapper[dart.implements] = () => [StreamSubscriptionOfT()];
  dart.setMethodSignature(_BroadcastSubscriptionWrapper, () => ({
    __proto__: dart.getMethods(_BroadcastSubscriptionWrapper.__proto__),
    onData: dart.fnType(dart.void, [dart.fnType(dart.void, [T])]),
    onError: dart.fnType(dart.void, [core.Function]),
    onDone: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
    pause: dart.fnType(dart.void, [], [async.Future]),
    resume: dart.fnType(dart.void, []),
    cancel: dart.fnType(async.Future, []),
    asFuture: dart.gFnType(E => [async.Future$(E), [], [E]])
  }));
  dart.setGetterSignature(_BroadcastSubscriptionWrapper, () => ({
    __proto__: dart.getGetters(_BroadcastSubscriptionWrapper.__proto__),
    isPaused: core.bool
  }));
  dart.setLibraryUri(_BroadcastSubscriptionWrapper, "dart:async");
  dart.setFieldSignature(_BroadcastSubscriptionWrapper, () => ({
    __proto__: dart.getFields(_BroadcastSubscriptionWrapper.__proto__),
    [_stream]: dart.finalFieldType(async._AsBroadcastStream)
  }));
  return _BroadcastSubscriptionWrapper;
});
async._BroadcastSubscriptionWrapper = async._BroadcastSubscriptionWrapper$();
dart.addTypeTests(async._BroadcastSubscriptionWrapper, _is__BroadcastSubscriptionWrapper_default);
const _stateData = dart.privateName(async, "_stateData");
const _initializeOrDone = dart.privateName(async, "_initializeOrDone");
const _is__StreamIterator_default = Symbol('_is__StreamIterator_default');
async._StreamIterator$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
  class _StreamIterator extends core.Object {
    get current() {
      if (this[_subscription] != null && dart.test(this[_isPaused])) {
        return T._check(this[_stateData]);
      }
      return null;
    }
    moveNext() {
      if (this[_subscription] != null) {
        if (dart.test(this[_isPaused])) {
          let future = new (_FutureOfbool()).new();
          this[_stateData] = future;
          this[_isPaused] = false;
          this[_subscription].resume();
          return future;
        }
        dart.throw(new core.StateError.new("Already waiting for next."));
      }
      return this[_initializeOrDone]();
    }
    [_initializeOrDone]() {
      if (!(this[_subscription] == null)) dart.assertFailed(null, "dart:async/stream_impl.dart", 1000, 12, "_subscription == null");
      let stateData = this[_stateData];
      if (stateData != null) {
        let stream = StreamOfT()._check(stateData);
        this[_subscription] = stream.listen(dart.bind(this, _onData$), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
        let future = new (_FutureOfbool()).new();
        this[_stateData] = future;
        return future;
      }
      return async.Future._falseFuture;
    }
    cancel() {
      let subscription = StreamSubscriptionOfT()._check(this[_subscription]);
      let stateData = this[_stateData];
      this[_stateData] = null;
      if (subscription != null) {
        this[_subscription] = null;
        if (!dart.test(this[_isPaused])) {
          let future = _FutureOfbool()._check(stateData);
          future[_asyncComplete](false);
        }
        return subscription.cancel();
      }
      return async.Future._nullFuture;
    }
    [_onData$](data) {
      T._check(data);
      if (!(this[_subscription] != null && !dart.test(this[_isPaused]))) dart.assertFailed(null, "dart:async/stream_impl.dart", 1029, 12, "_subscription != null && !_isPaused");
      let moveNextFuture = _FutureOfbool()._check(this[_stateData]);
      this[_stateData] = data;
      this[_isPaused] = true;
      moveNextFuture[_complete](true);
      if (this[_subscription] != null && dart.test(this[_isPaused])) this[_subscription].pause();
    }
    [_onError](error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (!(this[_subscription] != null && !dart.test(this[_isPaused]))) dart.assertFailed(null, "dart:async/stream_impl.dart", 1038, 12, "_subscription != null && !_isPaused");
      let moveNextFuture = _FutureOfbool()._check(this[_stateData]);
      this[_subscription] = null;
      this[_stateData] = null;
      moveNextFuture[_completeError](error, stackTrace);
    }
    [_onDone]() {
      if (!(this[_subscription] != null && !dart.test(this[_isPaused]))) dart.assertFailed(null, "dart:async/stream_impl.dart", 1046, 12, "_subscription != null && !_isPaused");
      let moveNextFuture = _FutureOfbool()._check(this[_stateData]);
      this[_subscription] = null;
      this[_stateData] = null;
      moveNextFuture[_complete](false);
    }
  }
  (_StreamIterator.new = function(stream) {
    this[_subscription] = null;
    this[_isPaused] = false;
    this[_stateData] = stream != null ? stream : dart.throw(new core.ArgumentError.notNull("stream"));
  }).prototype = _StreamIterator.prototype;
  dart.addTypeTests(_StreamIterator);
  _StreamIterator.prototype[_is__StreamIterator_default] = true;
  _StreamIterator[dart.implements] = () => [StreamIteratorOfT()];
  dart.setMethodSignature(_StreamIterator, () => ({
    __proto__: dart.getMethods(_StreamIterator.__proto__),
    moveNext: dart.fnType(async.Future$(core.bool), []),
    [_initializeOrDone]: dart.fnType(async.Future$(core.bool), []),
    cancel: dart.fnType(async.Future, []),
    [_onData$]: dart.fnType(dart.void, [core.Object]),
    [_onError]: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    [_onDone]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_StreamIterator, () => ({
    __proto__: dart.getGetters(_StreamIterator.__proto__),
    current: T
  }));
  dart.setLibraryUri(_StreamIterator, "dart:async");
  dart.setFieldSignature(_StreamIterator, () => ({
    __proto__: dart.getFields(_StreamIterator.__proto__),
    [_subscription]: dart.fieldType(async.StreamSubscription),
    [_stateData]: dart.fieldType(core.Object),
    [_isPaused]: dart.fieldType(core.bool)
  }));
  return _StreamIterator;
});
async._StreamIterator = async._StreamIterator$();
dart.addTypeTests(async._StreamIterator, _is__StreamIterator_default);
const _is__EmptyStream_default = Symbol('_is__EmptyStream_default');
async._EmptyStream$ = dart.generic(T => {
  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
  class _EmptyStream extends async.Stream$(T) {
    get isBroadcast() {
      return true;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return new (_DoneStreamSubscriptionOfT()).new(onDone);
    }
  }
  (_EmptyStream.new = function() {
    _EmptyStream.__proto__._internal.call(this);
  }).prototype = _EmptyStream.prototype;
  dart.addTypeTests(_EmptyStream);
  _EmptyStream.prototype[_is__EmptyStream_default] = true;
  dart.setMethodSignature(_EmptyStream, () => ({
    __proto__: dart.getMethods(_EmptyStream.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool})
  }));
  dart.setLibraryUri(_EmptyStream, "dart:async");
  return _EmptyStream;
});
async._EmptyStream = async._EmptyStream$();
dart.addTypeTests(async._EmptyStream, _is__EmptyStream_default);
async._runUserCode = function(T, userCode, onSuccess, onError) {
  try {
    onSuccess(userCode());
  } catch (e$) {
    let e = dart.getThrown(e$);
    let s = dart.stackTrace(e$);
    let replacement = async.Zone.current.errorCallback(e, s);
    if (replacement == null) {
      onError(e, s);
    } else {
      let error = async._nonNullError(replacement.error);
      let stackTrace = replacement.stackTrace;
      onError(error, stackTrace);
    }
  }
};
async._cancelAndError = function(subscription, future, error, stackTrace) {
  let cancelFuture = subscription.cancel();
  if (cancelFuture != null && !(cancelFuture == async.Future._nullFuture)) {
    cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid()));
  } else {
    future[_completeError](error, stackTrace);
  }
};
async._cancelAndErrorWithReplacement = function(subscription, future, error, stackTrace) {
  let replacement = async.Zone.current.errorCallback(error, stackTrace);
  if (replacement != null) {
    error = async._nonNullError(replacement.error);
    stackTrace = replacement.stackTrace;
  }
  async._cancelAndError(subscription, future, error, stackTrace);
};
async._cancelAndErrorClosure = function(subscription, future) {
  return dart.fn((error, stackTrace) => {
    async._cancelAndError(subscription, future, error, stackTrace);
  }, dynamicAndStackTraceToNull());
};
async._cancelAndValue = function(subscription, future, value) {
  let cancelFuture = subscription.cancel();
  if (cancelFuture != null && !(cancelFuture == async.Future._nullFuture)) {
    cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid()));
  } else {
    future[_complete](value);
  }
};
const _handleData$ = dart.privateName(async, "_handleData");
const _handleError$ = dart.privateName(async, "_handleError");
const _handleDone = dart.privateName(async, "_handleDone");
const _is__ForwardingStream_default = Symbol('_is__ForwardingStream_default');
async._ForwardingStream$ = dart.generic((S, T) => {
  let _ForwardingStreamSubscriptionOfS$T = () => (_ForwardingStreamSubscriptionOfS$T = dart.constFn(async._ForwardingStreamSubscription$(S, T)))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  class _ForwardingStream extends async.Stream$(T) {
    get isBroadcast() {
      return this[_source$].isBroadcast;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      cancelOnError = true === cancelOnError;
      return this[_createSubscription](onData, onError, onDone, cancelOnError);
    }
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_ForwardingStreamSubscriptionOfS$T()).new(this, onData, onError, onDone, cancelOnError);
    }
    [_handleData$](data, sink) {
      S._check(data);
      _EventSinkOfT()._check(sink);
      sink[_add](T._check(data));
    }
    [_handleError$](error, stackTrace, sink) {
      _EventSinkOfT()._check(sink);
      sink[_addError](error, stackTrace);
    }
    [_handleDone](sink) {
      _EventSinkOfT()._check(sink);
      sink[_close]();
    }
  }
  (_ForwardingStream.new = function(source) {
    this[_source$] = source;
    _ForwardingStream.__proto__.new.call(this);
  }).prototype = _ForwardingStream.prototype;
  dart.addTypeTests(_ForwardingStream);
  _ForwardingStream.prototype[_is__ForwardingStream_default] = true;
  dart.setMethodSignature(_ForwardingStream, () => ({
    __proto__: dart.getMethods(_ForwardingStream.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
    [_createSubscription]: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T]), core.Function, dart.fnType(dart.void, []), core.bool]),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object]),
    [_handleError$]: dart.fnType(dart.void, [dart.dynamic, core.StackTrace, core.Object]),
    [_handleDone]: dart.fnType(dart.void, [core.Object])
  }));
  dart.setGetterSignature(_ForwardingStream, () => ({
    __proto__: dart.getGetters(_ForwardingStream.__proto__),
    isBroadcast: core.bool
  }));
  dart.setLibraryUri(_ForwardingStream, "dart:async");
  dart.setFieldSignature(_ForwardingStream, () => ({
    __proto__: dart.getFields(_ForwardingStream.__proto__),
    [_source$]: dart.finalFieldType(StreamOfS())
  }));
  return _ForwardingStream;
});
async._ForwardingStream = async._ForwardingStream$();
dart.addTypeTests(async._ForwardingStream, _is__ForwardingStream_default);
const _is__ForwardingStreamSubscription_default = Symbol('_is__ForwardingStreamSubscription_default');
async._ForwardingStreamSubscription$ = dart.generic((S, T) => {
  let _ForwardingStreamOfS$T = () => (_ForwardingStreamOfS$T = dart.constFn(async._ForwardingStream$(S, T)))();
  let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
  class _ForwardingStreamSubscription extends async._BufferingStreamSubscription$(T) {
    [_add](data) {
      T._check(data);
      if (dart.test(this[_isClosed])) return;
      super[_add](data);
    }
    [_addError](error, stackTrace) {
      if (dart.test(this[_isClosed])) return;
      super[_addError](error, stackTrace);
    }
    [_onPause]() {
      if (this[_subscription] == null) return;
      this[_subscription].pause();
    }
    [_onResume]() {
      if (this[_subscription] == null) return;
      this[_subscription].resume();
    }
    [_onCancel]() {
      if (this[_subscription] != null) {
        let subscription = this[_subscription];
        this[_subscription] = null;
        return subscription.cancel();
      }
      return null;
    }
    [_handleData$](data) {
      S._check(data);
      this[_stream][_handleData$](data, this);
    }
    [_handleError$](error, stackTrace) {
      this[_stream][_handleError$](error, stackTrace, this);
    }
    [_handleDone]() {
      this[_stream][_handleDone](this);
    }
  }
  (_ForwardingStreamSubscription.new = function(stream, onData, onError, onDone, cancelOnError) {
    this[_subscription] = null;
    this[_stream] = stream;
    _ForwardingStreamSubscription.__proto__.new.call(this, onData, onError, onDone, cancelOnError);
    this[_subscription] = this[_stream][_source$].listen(dart.bind(this, _handleData$), {onError: dart.bind(this, _handleError$), onDone: dart.bind(this, _handleDone)});
  }).prototype = _ForwardingStreamSubscription.prototype;
  dart.addTypeTests(_ForwardingStreamSubscription);
  _ForwardingStreamSubscription.prototype[_is__ForwardingStreamSubscription_default] = true;
  dart.setMethodSignature(_ForwardingStreamSubscription, () => ({
    __proto__: dart.getMethods(_ForwardingStreamSubscription.__proto__),
    [_add]: dart.fnType(dart.void, [core.Object]),
    [_addError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_onPause]: dart.fnType(dart.void, []),
    [_onResume]: dart.fnType(dart.void, []),
    [_onCancel]: dart.fnType(async.Future, []),
    [_handleData$]: dart.fnType(dart.void, [core.Object]),
    [_handleError$]: dart.fnType(dart.void, [dart.dynamic, core.StackTrace]),
    [_handleDone]: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_ForwardingStreamSubscription, "dart:async");
  dart.setFieldSignature(_ForwardingStreamSubscription, () => ({
    __proto__: dart.getFields(_ForwardingStreamSubscription.__proto__),
    [_stream]: dart.finalFieldType(_ForwardingStreamOfS$T()),
    [_subscription]: dart.fieldType(StreamSubscriptionOfS())
  }));
  return _ForwardingStreamSubscription;
});
async._ForwardingStreamSubscription = async._ForwardingStreamSubscription$();
dart.addTypeTests(async._ForwardingStreamSubscription, _is__ForwardingStreamSubscription_default);
async._addErrorWithReplacement = function(sink, error, stackTrace) {
  let replacement = async.Zone.current.errorCallback(error, stackTrace);
  if (replacement != null) {
    error = async._nonNullError(replacement.error);
    stackTrace = replacement.stackTrace;
  }
  sink[_addError](error, stackTrace);
};
const _test = dart.privateName(async, "_test");
const _is__WhereStream_default = Symbol('_is__WhereStream_default');
async._WhereStream$ = dart.generic(T => {
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let TTobool = () => (TTobool = dart.constFn(dart.fnType(core.bool, [T])))();
  class _WhereStream extends async._ForwardingStream$(T, T) {
    [_handleData$](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let satisfies = null;
      try {
        satisfies = this[_test](inputEvent);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        async._addErrorWithReplacement(sink, e, s);
        return;
      }
      if (dart.test(satisfies)) {
        sink[_add](inputEvent);
      }
    }
  }
  (_WhereStream.new = function(source, test) {
    this[_test] = test;
    _WhereStream.__proto__.new.call(this, source);
  }).prototype = _WhereStream.prototype;
  dart.addTypeTests(_WhereStream);
  _WhereStream.prototype[_is__WhereStream_default] = true;
  dart.setMethodSignature(_WhereStream, () => ({
    __proto__: dart.getMethods(_WhereStream.__proto__),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object])
  }));
  dart.setLibraryUri(_WhereStream, "dart:async");
  dart.setFieldSignature(_WhereStream, () => ({
    __proto__: dart.getFields(_WhereStream.__proto__),
    [_test]: dart.finalFieldType(TTobool())
  }));
  return _WhereStream;
});
async._WhereStream = async._WhereStream$();
dart.addTypeTests(async._WhereStream, _is__WhereStream_default);
const _transform = dart.privateName(async, "_transform");
const _is__MapStream_default = Symbol('_is__MapStream_default');
async._MapStream$ = dart.generic((S, T) => {
  let SToT = () => (SToT = dart.constFn(dart.fnType(T, [S])))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  class _MapStream extends async._ForwardingStream$(S, T) {
    [_handleData$](inputEvent, sink) {
      S._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let outputEvent = null;
      try {
        outputEvent = this[_transform](inputEvent);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        async._addErrorWithReplacement(sink, e, s);
        return;
      }
      sink[_add](outputEvent);
    }
  }
  (_MapStream.new = function(source, transform) {
    this[_transform] = transform;
    _MapStream.__proto__.new.call(this, source);
  }).prototype = _MapStream.prototype;
  dart.addTypeTests(_MapStream);
  _MapStream.prototype[_is__MapStream_default] = true;
  dart.setMethodSignature(_MapStream, () => ({
    __proto__: dart.getMethods(_MapStream.__proto__),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object])
  }));
  dart.setLibraryUri(_MapStream, "dart:async");
  dart.setFieldSignature(_MapStream, () => ({
    __proto__: dart.getFields(_MapStream.__proto__),
    [_transform]: dart.finalFieldType(SToT())
  }));
  return _MapStream;
});
async._MapStream = async._MapStream$();
dart.addTypeTests(async._MapStream, _is__MapStream_default);
const _expand = dart.privateName(async, "_expand");
const _is__ExpandStream_default = Symbol('_is__ExpandStream_default');
async._ExpandStream$ = dart.generic((S, T) => {
  let SToIterableOfT = () => (SToIterableOfT = dart.constFn(dart.fnType(IterableOfT(), [S])))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
  class _ExpandStream extends async._ForwardingStream$(S, T) {
    [_handleData$](inputEvent, sink) {
      S._check(inputEvent);
      _EventSinkOfT()._check(sink);
      try {
        for (let value of this[_expand](inputEvent)) {
          sink[_add](value);
        }
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        async._addErrorWithReplacement(sink, e, s);
      }
    }
  }
  (_ExpandStream.new = function(source, expand) {
    this[_expand] = expand;
    _ExpandStream.__proto__.new.call(this, source);
  }).prototype = _ExpandStream.prototype;
  dart.addTypeTests(_ExpandStream);
  _ExpandStream.prototype[_is__ExpandStream_default] = true;
  dart.setMethodSignature(_ExpandStream, () => ({
    __proto__: dart.getMethods(_ExpandStream.__proto__),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object])
  }));
  dart.setLibraryUri(_ExpandStream, "dart:async");
  dart.setFieldSignature(_ExpandStream, () => ({
    __proto__: dart.getFields(_ExpandStream.__proto__),
    [_expand]: dart.finalFieldType(SToIterableOfT())
  }));
  return _ExpandStream;
});
async._ExpandStream = async._ExpandStream$();
dart.addTypeTests(async._ExpandStream, _is__ExpandStream_default);
const _is__HandleErrorStream_default = Symbol('_is__HandleErrorStream_default');
async._HandleErrorStream$ = dart.generic(T => {
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  class _HandleErrorStream extends async._ForwardingStream$(T, T) {
    [_handleError$](error, stackTrace, sink) {
      _EventSinkOfT()._check(sink);
      let matches = true;
      if (this[_test] != null) {
        try {
          matches = this[_test](error);
        } catch (e$) {
          let e = dart.getThrown(e$);
          let s = dart.stackTrace(e$);
          async._addErrorWithReplacement(sink, e, s);
          return;
        }
      }
      if (dart.test(matches)) {
        try {
          async._invokeErrorHandler(this[_transform], error, stackTrace);
        } catch (e$0) {
          let e = dart.getThrown(e$0);
          let s = dart.stackTrace(e$0);
          if (core.identical(e, error)) {
            sink[_addError](error, stackTrace);
          } else {
            async._addErrorWithReplacement(sink, e, s);
          }
          return;
        }
      } else {
        sink[_addError](error, stackTrace);
      }
    }
  }
  (_HandleErrorStream.new = function(source, onError, test) {
    this[_transform] = onError;
    this[_test] = test;
    _HandleErrorStream.__proto__.new.call(this, source);
  }).prototype = _HandleErrorStream.prototype;
  dart.addTypeTests(_HandleErrorStream);
  _HandleErrorStream.prototype[_is__HandleErrorStream_default] = true;
  dart.setMethodSignature(_HandleErrorStream, () => ({
    __proto__: dart.getMethods(_HandleErrorStream.__proto__),
    [_handleError$]: dart.fnType(dart.void, [core.Object, core.StackTrace, core.Object])
  }));
  dart.setLibraryUri(_HandleErrorStream, "dart:async");
  dart.setFieldSignature(_HandleErrorStream, () => ({
    __proto__: dart.getFields(_HandleErrorStream.__proto__),
    [_transform]: dart.finalFieldType(core.Function),
    [_test]: dart.finalFieldType(dynamicTobool())
  }));
  return _HandleErrorStream;
});
async._HandleErrorStream = async._HandleErrorStream$();
dart.addTypeTests(async._HandleErrorStream, _is__HandleErrorStream_default);
const _count = dart.privateName(async, "_count");
const _is__TakeStream_default = Symbol('_is__TakeStream_default');
async._TakeStream$ = dart.generic(T => {
  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  class _TakeStream extends async._ForwardingStream$(T, T) {
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      if (this[_count] === 0) {
        this[_source$].listen(null).cancel();
        return new (_DoneStreamSubscriptionOfT()).new(onDone);
      }
      return new (_StateStreamSubscriptionOfT()).new(this, onData, onError, onDone, cancelOnError, this[_count]);
    }
    [_handleData$](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let subscription = _StateStreamSubscriptionOfT()._check(sink);
      let count = subscription[_count];
      if (dart.notNull(count) > 0) {
        sink[_add](inputEvent);
        count = dart.notNull(count) - 1;
        subscription[_count] = count;
        if (count === 0) {
          sink[_close]();
        }
      }
    }
  }
  (_TakeStream.new = function(source, count) {
    this[_count] = count;
    _TakeStream.__proto__.new.call(this, source);
    core.ArgumentError.checkNotNull(count, "count");
  }).prototype = _TakeStream.prototype;
  dart.addTypeTests(_TakeStream);
  _TakeStream.prototype[_is__TakeStream_default] = true;
  dart.setMethodSignature(_TakeStream, () => ({
    __proto__: dart.getMethods(_TakeStream.__proto__),
    [_createSubscription]: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T]), core.Function, dart.fnType(dart.void, []), core.bool]),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object])
  }));
  dart.setLibraryUri(_TakeStream, "dart:async");
  dart.setFieldSignature(_TakeStream, () => ({
    __proto__: dart.getFields(_TakeStream.__proto__),
    [_count]: dart.finalFieldType(core.int)
  }));
  return _TakeStream;
});
async._TakeStream = async._TakeStream$();
dart.addTypeTests(async._TakeStream, _is__TakeStream_default);
const _sharedState = dart.privateName(async, "_sharedState");
const _flag = dart.privateName(async, "_flag");
const _value = dart.privateName(async, "_value");
const _is__StateStreamSubscription_default = Symbol('_is__StateStreamSubscription_default');
async._StateStreamSubscription$ = dart.generic(T => {
  class _StateStreamSubscription extends async._ForwardingStreamSubscription$(T, T) {
    get [_flag]() {
      return core.bool._check(this[_sharedState]);
    }
    set [_flag](flag) {
      this[_sharedState] = flag;
    }
    get [_count]() {
      return core.int._check(this[_sharedState]);
    }
    set [_count](count) {
      this[_sharedState] = count;
    }
    get [_value]() {
      return this[_sharedState];
    }
    set [_value](value) {
      this[_sharedState] = value;
    }
  }
  (_StateStreamSubscription.new = function(stream, onData, onError, onDone, cancelOnError, sharedState) {
    this[_sharedState] = sharedState;
    _StateStreamSubscription.__proto__.new.call(this, stream, onData, onError, onDone, cancelOnError);
  }).prototype = _StateStreamSubscription.prototype;
  dart.addTypeTests(_StateStreamSubscription);
  _StateStreamSubscription.prototype[_is__StateStreamSubscription_default] = true;
  dart.setGetterSignature(_StateStreamSubscription, () => ({
    __proto__: dart.getGetters(_StateStreamSubscription.__proto__),
    [_flag]: core.bool,
    [_count]: core.int,
    [_value]: core.Object
  }));
  dart.setSetterSignature(_StateStreamSubscription, () => ({
    __proto__: dart.getSetters(_StateStreamSubscription.__proto__),
    [_flag]: core.bool,
    [_count]: core.int,
    [_value]: core.Object
  }));
  dart.setLibraryUri(_StateStreamSubscription, "dart:async");
  dart.setFieldSignature(_StateStreamSubscription, () => ({
    __proto__: dart.getFields(_StateStreamSubscription.__proto__),
    [_sharedState]: dart.fieldType(dart.dynamic)
  }));
  return _StateStreamSubscription;
});
async._StateStreamSubscription = async._StateStreamSubscription$();
dart.addTypeTests(async._StateStreamSubscription, _is__StateStreamSubscription_default);
const _is__TakeWhileStream_default = Symbol('_is__TakeWhileStream_default');
async._TakeWhileStream$ = dart.generic(T => {
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let TTobool = () => (TTobool = dart.constFn(dart.fnType(core.bool, [T])))();
  class _TakeWhileStream extends async._ForwardingStream$(T, T) {
    [_handleData$](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let satisfies = null;
      try {
        satisfies = this[_test](inputEvent);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        async._addErrorWithReplacement(sink, e, s);
        sink[_close]();
        return;
      }
      if (dart.test(satisfies)) {
        sink[_add](inputEvent);
      } else {
        sink[_close]();
      }
    }
  }
  (_TakeWhileStream.new = function(source, test) {
    this[_test] = test;
    _TakeWhileStream.__proto__.new.call(this, source);
  }).prototype = _TakeWhileStream.prototype;
  dart.addTypeTests(_TakeWhileStream);
  _TakeWhileStream.prototype[_is__TakeWhileStream_default] = true;
  dart.setMethodSignature(_TakeWhileStream, () => ({
    __proto__: dart.getMethods(_TakeWhileStream.__proto__),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object])
  }));
  dart.setLibraryUri(_TakeWhileStream, "dart:async");
  dart.setFieldSignature(_TakeWhileStream, () => ({
    __proto__: dart.getFields(_TakeWhileStream.__proto__),
    [_test]: dart.finalFieldType(TTobool())
  }));
  return _TakeWhileStream;
});
async._TakeWhileStream = async._TakeWhileStream$();
dart.addTypeTests(async._TakeWhileStream, _is__TakeWhileStream_default);
const _is__SkipStream_default = Symbol('_is__SkipStream_default');
async._SkipStream$ = dart.generic(T => {
  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  class _SkipStream extends async._ForwardingStream$(T, T) {
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_StateStreamSubscriptionOfT()).new(this, onData, onError, onDone, cancelOnError, this[_count]);
    }
    [_handleData$](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let subscription = _StateStreamSubscriptionOfT()._check(sink);
      let count = subscription[_count];
      if (dart.notNull(count) > 0) {
        subscription[_count] = dart.notNull(count) - 1;
        return;
      }
      sink[_add](inputEvent);
    }
  }
  (_SkipStream.new = function(source, count) {
    this[_count] = count;
    _SkipStream.__proto__.new.call(this, source);
    core.ArgumentError.checkNotNull(count, "count");
    core.RangeError.checkNotNegative(count, "count");
  }).prototype = _SkipStream.prototype;
  dart.addTypeTests(_SkipStream);
  _SkipStream.prototype[_is__SkipStream_default] = true;
  dart.setMethodSignature(_SkipStream, () => ({
    __proto__: dart.getMethods(_SkipStream.__proto__),
    [_createSubscription]: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T]), core.Function, dart.fnType(dart.void, []), core.bool]),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object])
  }));
  dart.setLibraryUri(_SkipStream, "dart:async");
  dart.setFieldSignature(_SkipStream, () => ({
    __proto__: dart.getFields(_SkipStream.__proto__),
    [_count]: dart.finalFieldType(core.int)
  }));
  return _SkipStream;
});
async._SkipStream = async._SkipStream$();
dart.addTypeTests(async._SkipStream, _is__SkipStream_default);
const _is__SkipWhileStream_default = Symbol('_is__SkipWhileStream_default');
async._SkipWhileStream$ = dart.generic(T => {
  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let TTobool = () => (TTobool = dart.constFn(dart.fnType(core.bool, [T])))();
  class _SkipWhileStream extends async._ForwardingStream$(T, T) {
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_StateStreamSubscriptionOfT()).new(this, onData, onError, onDone, cancelOnError, false);
    }
    [_handleData$](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let subscription = _StateStreamSubscriptionOfT()._check(sink);
      let hasFailed = subscription[_flag];
      if (dart.test(hasFailed)) {
        sink[_add](inputEvent);
        return;
      }
      let satisfies = null;
      try {
        satisfies = this[_test](inputEvent);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        async._addErrorWithReplacement(sink, e, s);
        subscription[_flag] = true;
        return;
      }
      if (!dart.test(satisfies)) {
        subscription[_flag] = true;
        sink[_add](inputEvent);
      }
    }
  }
  (_SkipWhileStream.new = function(source, test) {
    this[_test] = test;
    _SkipWhileStream.__proto__.new.call(this, source);
  }).prototype = _SkipWhileStream.prototype;
  dart.addTypeTests(_SkipWhileStream);
  _SkipWhileStream.prototype[_is__SkipWhileStream_default] = true;
  dart.setMethodSignature(_SkipWhileStream, () => ({
    __proto__: dart.getMethods(_SkipWhileStream.__proto__),
    [_createSubscription]: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T]), core.Function, dart.fnType(dart.void, []), core.bool]),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object])
  }));
  dart.setLibraryUri(_SkipWhileStream, "dart:async");
  dart.setFieldSignature(_SkipWhileStream, () => ({
    __proto__: dart.getFields(_SkipWhileStream.__proto__),
    [_test]: dart.finalFieldType(TTobool())
  }));
  return _SkipWhileStream;
});
async._SkipWhileStream = async._SkipWhileStream$();
dart.addTypeTests(async._SkipWhileStream, _is__SkipWhileStream_default);
const _equals$ = dart.privateName(async, "_equals");
const _is__DistinctStream_default = Symbol('_is__DistinctStream_default');
async._DistinctStream$ = dart.generic(T => {
  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
  let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.fnType(core.bool, [T, T])))();
  class _DistinctStream extends async._ForwardingStream$(T, T) {
    [_createSubscription](onData, onError, onDone, cancelOnError) {
      return new (_StateStreamSubscriptionOfT()).new(this, onData, onError, onDone, cancelOnError, async._DistinctStream._SENTINEL);
    }
    [_handleData$](inputEvent, sink) {
      T._check(inputEvent);
      _EventSinkOfT()._check(sink);
      let subscription = _StateStreamSubscriptionOfT()._check(sink);
      let previous = subscription[_value];
      if (core.identical(previous, async._DistinctStream._SENTINEL)) {
        subscription[_value] = inputEvent;
        sink[_add](inputEvent);
      } else {
        let previousEvent = T._check(previous);
        let isEqual = null;
        try {
          if (this[_equals$] == null) {
            isEqual = dart.equals(previousEvent, inputEvent);
          } else {
            isEqual = this[_equals$](previousEvent, inputEvent);
          }
        } catch (e$) {
          let e = dart.getThrown(e$);
          let s = dart.stackTrace(e$);
          async._addErrorWithReplacement(sink, e, s);
          return;
        }
        if (!dart.test(isEqual)) {
          sink[_add](inputEvent);
          subscription[_value] = inputEvent;
        }
      }
    }
  }
  (_DistinctStream.new = function(source, equals) {
    this[_equals$] = equals;
    _DistinctStream.__proto__.new.call(this, source);
  }).prototype = _DistinctStream.prototype;
  dart.addTypeTests(_DistinctStream);
  _DistinctStream.prototype[_is__DistinctStream_default] = true;
  dart.setMethodSignature(_DistinctStream, () => ({
    __proto__: dart.getMethods(_DistinctStream.__proto__),
    [_createSubscription]: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T]), core.Function, dart.fnType(dart.void, []), core.bool]),
    [_handleData$]: dart.fnType(dart.void, [core.Object, core.Object])
  }));
  dart.setLibraryUri(_DistinctStream, "dart:async");
  dart.setFieldSignature(_DistinctStream, () => ({
    __proto__: dart.getFields(_DistinctStream.__proto__),
    [_equals$]: dart.finalFieldType(TAndTTobool())
  }));
  return _DistinctStream;
});
async._DistinctStream = async._DistinctStream$();
dart.defineLazy(async._DistinctStream, {
  /*async._DistinctStream._SENTINEL*/get _SENTINEL() {
    return new core.Object.new();
  }
});
dart.addTypeTests(async._DistinctStream, _is__DistinctStream_default);
const _is__EventSinkWrapper_default = Symbol('_is__EventSinkWrapper_default');
async._EventSinkWrapper$ = dart.generic(T => {
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _EventSinkWrapper extends core.Object {
    add(data) {
      T._check(data);
      this[_sink][_add](data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_sink][_addError](error, stackTrace);
    }
    close() {
      this[_sink][_close]();
    }
  }
  (_EventSinkWrapper.new = function(sink) {
    this[_sink] = sink;
  }).prototype = _EventSinkWrapper.prototype;
  dart.addTypeTests(_EventSinkWrapper);
  _EventSinkWrapper.prototype[_is__EventSinkWrapper_default] = true;
  _EventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
  dart.setMethodSignature(_EventSinkWrapper, () => ({
    __proto__: dart.getMethods(_EventSinkWrapper.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_EventSinkWrapper, "dart:async");
  dart.setFieldSignature(_EventSinkWrapper, () => ({
    __proto__: dart.getFields(_EventSinkWrapper.__proto__),
    [_sink]: dart.fieldType(async._EventSink)
  }));
  return _EventSinkWrapper;
});
async._EventSinkWrapper = async._EventSinkWrapper$();
dart.addTypeTests(async._EventSinkWrapper, _is__EventSinkWrapper_default);
const _transformerSink = dart.privateName(async, "_transformerSink");
const _isSubscribed = dart.privateName(async, "_isSubscribed");
const _is__SinkTransformerStreamSubscription_default = Symbol('_is__SinkTransformerStreamSubscription_default');
async._SinkTransformerStreamSubscription$ = dart.generic((S, T) => {
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
  let _EventSinkWrapperOfT = () => (_EventSinkWrapperOfT = dart.constFn(async._EventSinkWrapper$(T)))();
  class _SinkTransformerStreamSubscription extends async._BufferingStreamSubscription$(T) {
    get [_isSubscribed]() {
      return this[_subscription] != null;
    }
    [_add](data) {
      T._check(data);
      if (dart.test(this[_isClosed])) {
        dart.throw(new core.StateError.new("Stream is already closed"));
      }
      super[_add](data);
    }
    [_addError](error, stackTrace) {
      if (dart.test(this[_isClosed])) {
        dart.throw(new core.StateError.new("Stream is already closed"));
      }
      super[_addError](error, stackTrace);
    }
    [_close]() {
      if (dart.test(this[_isClosed])) {
        dart.throw(new core.StateError.new("Stream is already closed"));
      }
      super[_close]();
    }
    [_onPause]() {
      if (dart.test(this[_isSubscribed])) this[_subscription].pause();
    }
    [_onResume]() {
      if (dart.test(this[_isSubscribed])) this[_subscription].resume();
    }
    [_onCancel]() {
      if (dart.test(this[_isSubscribed])) {
        let subscription = this[_subscription];
        this[_subscription] = null;
        return subscription.cancel();
      }
      return null;
    }
    [_handleData$](data) {
      S._check(data);
      try {
        this[_transformerSink].add(data);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        this[_addError](e, s);
      }
    }
    [_handleError$](error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      try {
        this[_transformerSink].addError(error, stackTrace);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        if (core.identical(e, error)) {
          this[_addError](error, stackTrace);
        } else {
          this[_addError](e, s);
        }
      }
    }
    [_handleDone]() {
      try {
        this[_subscription] = null;
        this[_transformerSink].close();
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        this[_addError](e, s);
      }
    }
  }
  (_SinkTransformerStreamSubscription.new = function(source, mapper, onData, onError, onDone, cancelOnError) {
    this[_transformerSink] = null;
    this[_subscription] = null;
    _SinkTransformerStreamSubscription.__proto__.new.call(this, onData, onError, onDone, cancelOnError);
    let eventSink = new (_EventSinkWrapperOfT()).new(this);
    this[_transformerSink] = mapper(eventSink);
    this[_subscription] = source.listen(dart.bind(this, _handleData$), {onError: dart.bind(this, _handleError$), onDone: dart.bind(this, _handleDone)});
  }).prototype = _SinkTransformerStreamSubscription.prototype;
  dart.addTypeTests(_SinkTransformerStreamSubscription);
  _SinkTransformerStreamSubscription.prototype[_is__SinkTransformerStreamSubscription_default] = true;
  dart.setMethodSignature(_SinkTransformerStreamSubscription, () => ({
    __proto__: dart.getMethods(_SinkTransformerStreamSubscription.__proto__),
    [_add]: dart.fnType(dart.void, [core.Object]),
    [_addError]: dart.fnType(dart.void, [core.Object, core.StackTrace]),
    [_close]: dart.fnType(dart.void, []),
    [_onPause]: dart.fnType(dart.void, []),
    [_onResume]: dart.fnType(dart.void, []),
    [_onCancel]: dart.fnType(async.Future, []),
    [_handleData$]: dart.fnType(dart.void, [core.Object]),
    [_handleError$]: dart.fnType(dart.void, [dart.dynamic], [core.StackTrace]),
    [_handleDone]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_SinkTransformerStreamSubscription, () => ({
    __proto__: dart.getGetters(_SinkTransformerStreamSubscription.__proto__),
    [_isSubscribed]: core.bool
  }));
  dart.setLibraryUri(_SinkTransformerStreamSubscription, "dart:async");
  dart.setFieldSignature(_SinkTransformerStreamSubscription, () => ({
    __proto__: dart.getFields(_SinkTransformerStreamSubscription.__proto__),
    [_transformerSink]: dart.fieldType(EventSinkOfS()),
    [_subscription]: dart.fieldType(StreamSubscriptionOfS())
  }));
  return _SinkTransformerStreamSubscription;
});
async._SinkTransformerStreamSubscription = async._SinkTransformerStreamSubscription$();
dart.addTypeTests(async._SinkTransformerStreamSubscription, _is__SinkTransformerStreamSubscription_default);
const _sinkMapper = dart.privateName(async, "_sinkMapper");
const _is__StreamSinkTransformer_default = Symbol('_is__StreamSinkTransformer_default');
async._StreamSinkTransformer$ = dart.generic((S, T) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _BoundSinkStreamOfS$T = () => (_BoundSinkStreamOfS$T = dart.constFn(async._BoundSinkStream$(S, T)))();
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let EventSinkOfTToEventSinkOfS = () => (EventSinkOfTToEventSinkOfS = dart.constFn(dart.fnType(EventSinkOfS(), [EventSinkOfT()])))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _StreamSinkTransformer extends async.StreamTransformerBase$(S, T) {
    bind(stream) {
      StreamOfS()._check(stream);
      return new (_BoundSinkStreamOfS$T()).new(stream, this[_sinkMapper]);
    }
  }
  (_StreamSinkTransformer.new = function(sinkMapper) {
    this[_sinkMapper] = sinkMapper;
    _StreamSinkTransformer.__proto__.new.call(this);
  }).prototype = _StreamSinkTransformer.prototype;
  dart.addTypeTests(_StreamSinkTransformer);
  _StreamSinkTransformer.prototype[_is__StreamSinkTransformer_default] = true;
  dart.setMethodSignature(_StreamSinkTransformer, () => ({
    __proto__: dart.getMethods(_StreamSinkTransformer.__proto__),
    bind: dart.fnType(async.Stream$(T), [core.Object])
  }));
  dart.setLibraryUri(_StreamSinkTransformer, "dart:async");
  dart.setFieldSignature(_StreamSinkTransformer, () => ({
    __proto__: dart.getFields(_StreamSinkTransformer.__proto__),
    [_sinkMapper]: dart.finalFieldType(EventSinkOfTToEventSinkOfS())
  }));
  return _StreamSinkTransformer;
});
async._StreamSinkTransformer = async._StreamSinkTransformer$();
dart.addTypeTests(async._StreamSinkTransformer, _is__StreamSinkTransformer_default);
const _is__BoundSinkStream_default = Symbol('_is__BoundSinkStream_default');
async._BoundSinkStream$ = dart.generic((S, T) => {
  let _SinkTransformerStreamSubscriptionOfS$T = () => (_SinkTransformerStreamSubscriptionOfS$T = dart.constFn(async._SinkTransformerStreamSubscription$(S, T)))();
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let EventSinkOfTToEventSinkOfS = () => (EventSinkOfTToEventSinkOfS = dart.constFn(dart.fnType(EventSinkOfS(), [EventSinkOfT()])))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _BoundSinkStream extends async.Stream$(T) {
    get isBroadcast() {
      return this[_stream].isBroadcast;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      cancelOnError = true === cancelOnError;
      let subscription = new (_SinkTransformerStreamSubscriptionOfS$T()).new(this[_stream], this[_sinkMapper], onData, onError, onDone, cancelOnError);
      return subscription;
    }
  }
  (_BoundSinkStream.new = function(stream, sinkMapper) {
    this[_stream] = stream;
    this[_sinkMapper] = sinkMapper;
    _BoundSinkStream.__proto__.new.call(this);
  }).prototype = _BoundSinkStream.prototype;
  dart.addTypeTests(_BoundSinkStream);
  _BoundSinkStream.prototype[_is__BoundSinkStream_default] = true;
  dart.setMethodSignature(_BoundSinkStream, () => ({
    __proto__: dart.getMethods(_BoundSinkStream.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool})
  }));
  dart.setGetterSignature(_BoundSinkStream, () => ({
    __proto__: dart.getGetters(_BoundSinkStream.__proto__),
    isBroadcast: core.bool
  }));
  dart.setLibraryUri(_BoundSinkStream, "dart:async");
  dart.setFieldSignature(_BoundSinkStream, () => ({
    __proto__: dart.getFields(_BoundSinkStream.__proto__),
    [_sinkMapper]: dart.finalFieldType(EventSinkOfTToEventSinkOfS()),
    [_stream]: dart.finalFieldType(StreamOfS())
  }));
  return _BoundSinkStream;
});
async._BoundSinkStream = async._BoundSinkStream$();
dart.addTypeTests(async._BoundSinkStream, _is__BoundSinkStream_default);
const _is__HandlerEventSink_default = Symbol('_is__HandlerEventSink_default');
async._HandlerEventSink$ = dart.generic((S, T) => {
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.fnType(dart.void, [S, EventSinkOfT()])))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.fnType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
  let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.fnType(dart.void, [EventSinkOfT()])))();
  class _HandlerEventSink extends core.Object {
    get [_isClosed]() {
      return this[_sink] == null;
    }
    add(data) {
      S._check(data);
      if (dart.test(this[_isClosed])) {
        dart.throw(new core.StateError.new("Sink is closed"));
      }
      if (this[_handleData$] != null) {
        this[_handleData$](data, this[_sink]);
      } else {
        this[_sink].add(T.as(data));
      }
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (dart.test(this[_isClosed])) {
        dart.throw(new core.StateError.new("Sink is closed"));
      }
      if (this[_handleError$] != null) {
        this[_handleError$](error, stackTrace, this[_sink]);
      } else {
        this[_sink].addError(error, stackTrace);
      }
    }
    close() {
      if (dart.test(this[_isClosed])) return;
      let sink = this[_sink];
      this[_sink] = null;
      if (this[_handleDone] != null) {
        this[_handleDone](sink);
      } else {
        sink.close();
      }
    }
  }
  (_HandlerEventSink.new = function(handleData, handleError, handleDone, sink) {
    this[_handleData$] = handleData;
    this[_handleError$] = handleError;
    this[_handleDone] = handleDone;
    this[_sink] = sink;
    if (this[_sink] == null) {
      dart.throw(new core.ArgumentError.new("The provided sink must not be null."));
    }
  }).prototype = _HandlerEventSink.prototype;
  dart.addTypeTests(_HandlerEventSink);
  _HandlerEventSink.prototype[_is__HandlerEventSink_default] = true;
  _HandlerEventSink[dart.implements] = () => [EventSinkOfS()];
  dart.setMethodSignature(_HandlerEventSink, () => ({
    __proto__: dart.getMethods(_HandlerEventSink.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_HandlerEventSink, () => ({
    __proto__: dart.getGetters(_HandlerEventSink.__proto__),
    [_isClosed]: core.bool
  }));
  dart.setLibraryUri(_HandlerEventSink, "dart:async");
  dart.setFieldSignature(_HandlerEventSink, () => ({
    __proto__: dart.getFields(_HandlerEventSink.__proto__),
    [_handleData$]: dart.finalFieldType(SAndEventSinkOfTTovoid()),
    [_handleError$]: dart.finalFieldType(ObjectAndStackTraceAndEventSinkOfTTovoid()),
    [_handleDone]: dart.finalFieldType(EventSinkOfTTovoid()),
    [_sink]: dart.fieldType(EventSinkOfT())
  }));
  return _HandlerEventSink;
});
async._HandlerEventSink = async._HandlerEventSink$();
dart.addTypeTests(async._HandlerEventSink, _is__HandlerEventSink_default);
const _is__StreamHandlerTransformer_default = Symbol('_is__StreamHandlerTransformer_default');
async._StreamHandlerTransformer$ = dart.generic((S, T) => {
  let _HandlerEventSinkOfS$T = () => (_HandlerEventSinkOfS$T = dart.constFn(async._HandlerEventSink$(S, T)))();
  let EventSinkOfTTo_HandlerEventSinkOfS$T = () => (EventSinkOfTTo_HandlerEventSinkOfS$T = dart.constFn(dart.fnType(_HandlerEventSinkOfS$T(), [EventSinkOfT()])))();
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _StreamHandlerTransformer extends async._StreamSinkTransformer$(S, T) {
    bind(stream) {
      StreamOfS()._check(stream);
      return super.bind(stream);
    }
  }
  (_StreamHandlerTransformer.new = function(opts) {
    let handleData = opts && 'handleData' in opts ? opts.handleData : null;
    let handleError = opts && 'handleError' in opts ? opts.handleError : null;
    let handleDone = opts && 'handleDone' in opts ? opts.handleDone : null;
    _StreamHandlerTransformer.__proto__.new.call(this, dart.fn(outputSink => new (_HandlerEventSinkOfS$T()).new(handleData, handleError, handleDone, outputSink), EventSinkOfTTo_HandlerEventSinkOfS$T()));
  }).prototype = _StreamHandlerTransformer.prototype;
  dart.addTypeTests(_StreamHandlerTransformer);
  _StreamHandlerTransformer.prototype[_is__StreamHandlerTransformer_default] = true;
  dart.setMethodSignature(_StreamHandlerTransformer, () => ({
    __proto__: dart.getMethods(_StreamHandlerTransformer.__proto__),
    bind: dart.fnType(async.Stream$(T), [core.Object])
  }));
  dart.setLibraryUri(_StreamHandlerTransformer, "dart:async");
  return _StreamHandlerTransformer;
});
async._StreamHandlerTransformer = async._StreamHandlerTransformer$();
dart.addTypeTests(async._StreamHandlerTransformer, _is__StreamHandlerTransformer_default);
const _bind = dart.privateName(async, "_bind");
const _is__StreamBindTransformer_default = Symbol('_is__StreamBindTransformer_default');
async._StreamBindTransformer$ = dart.generic((S, T) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let StreamOfSToStreamOfT = () => (StreamOfSToStreamOfT = dart.constFn(dart.fnType(StreamOfT(), [StreamOfS()])))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class _StreamBindTransformer extends async.StreamTransformerBase$(S, T) {
    bind(stream) {
      StreamOfS()._check(stream);
      return this[_bind](stream);
    }
  }
  (_StreamBindTransformer.new = function(bind) {
    this[_bind] = bind;
    _StreamBindTransformer.__proto__.new.call(this);
  }).prototype = _StreamBindTransformer.prototype;
  dart.addTypeTests(_StreamBindTransformer);
  _StreamBindTransformer.prototype[_is__StreamBindTransformer_default] = true;
  dart.setMethodSignature(_StreamBindTransformer, () => ({
    __proto__: dart.getMethods(_StreamBindTransformer.__proto__),
    bind: dart.fnType(async.Stream$(T), [core.Object])
  }));
  dart.setLibraryUri(_StreamBindTransformer, "dart:async");
  dart.setFieldSignature(_StreamBindTransformer, () => ({
    __proto__: dart.getFields(_StreamBindTransformer.__proto__),
    [_bind]: dart.finalFieldType(StreamOfSToStreamOfT())
  }));
  return _StreamBindTransformer;
});
async._StreamBindTransformer = async._StreamBindTransformer$();
dart.addTypeTests(async._StreamBindTransformer, _is__StreamBindTransformer_default);
const _is__StreamSubscriptionTransformer_default = Symbol('_is__StreamSubscriptionTransformer_default');
async._StreamSubscriptionTransformer$ = dart.generic((S, T) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let _BoundSubscriptionStreamOfS$T = () => (_BoundSubscriptionStreamOfS$T = dart.constFn(async._BoundSubscriptionStream$(S, T)))();
  let StreamOfSAndboolToStreamSubscriptionOfT = () => (StreamOfSAndboolToStreamSubscriptionOfT = dart.constFn(dart.fnType(StreamSubscriptionOfT(), [StreamOfS(), core.bool])))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  class _StreamSubscriptionTransformer extends async.StreamTransformerBase$(S, T) {
    bind(stream) {
      StreamOfS()._check(stream);
      return new (_BoundSubscriptionStreamOfS$T()).new(stream, this[_onListen]);
    }
  }
  (_StreamSubscriptionTransformer.new = function(onListen) {
    this[_onListen] = onListen;
    _StreamSubscriptionTransformer.__proto__.new.call(this);
  }).prototype = _StreamSubscriptionTransformer.prototype;
  dart.addTypeTests(_StreamSubscriptionTransformer);
  _StreamSubscriptionTransformer.prototype[_is__StreamSubscriptionTransformer_default] = true;
  dart.setMethodSignature(_StreamSubscriptionTransformer, () => ({
    __proto__: dart.getMethods(_StreamSubscriptionTransformer.__proto__),
    bind: dart.fnType(async.Stream$(T), [core.Object])
  }));
  dart.setLibraryUri(_StreamSubscriptionTransformer, "dart:async");
  dart.setFieldSignature(_StreamSubscriptionTransformer, () => ({
    __proto__: dart.getFields(_StreamSubscriptionTransformer.__proto__),
    [_onListen]: dart.finalFieldType(StreamOfSAndboolToStreamSubscriptionOfT())
  }));
  return _StreamSubscriptionTransformer;
});
async._StreamSubscriptionTransformer = async._StreamSubscriptionTransformer$();
dart.addTypeTests(async._StreamSubscriptionTransformer, _is__StreamSubscriptionTransformer_default);
const _is__BoundSubscriptionStream_default = Symbol('_is__BoundSubscriptionStream_default');
async._BoundSubscriptionStream$ = dart.generic((S, T) => {
  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
  let StreamOfSAndboolToStreamSubscriptionOfT = () => (StreamOfSAndboolToStreamSubscriptionOfT = dart.constFn(dart.fnType(StreamSubscriptionOfT(), [StreamOfS(), core.bool])))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  class _BoundSubscriptionStream extends async.Stream$(T) {
    get isBroadcast() {
      return this[_stream].isBroadcast;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      cancelOnError = true === cancelOnError;
      let result = this[_onListen](this[_stream], cancelOnError);
      result.onData(onData);
      result.onError(onError);
      result.onDone(onDone);
      return result;
    }
  }
  (_BoundSubscriptionStream.new = function(stream, onListen) {
    this[_stream] = stream;
    this[_onListen] = onListen;
    _BoundSubscriptionStream.__proto__.new.call(this);
  }).prototype = _BoundSubscriptionStream.prototype;
  dart.addTypeTests(_BoundSubscriptionStream);
  _BoundSubscriptionStream.prototype[_is__BoundSubscriptionStream_default] = true;
  dart.setMethodSignature(_BoundSubscriptionStream, () => ({
    __proto__: dart.getMethods(_BoundSubscriptionStream.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool})
  }));
  dart.setGetterSignature(_BoundSubscriptionStream, () => ({
    __proto__: dart.getGetters(_BoundSubscriptionStream.__proto__),
    isBroadcast: core.bool
  }));
  dart.setLibraryUri(_BoundSubscriptionStream, "dart:async");
  dart.setFieldSignature(_BoundSubscriptionStream, () => ({
    __proto__: dart.getFields(_BoundSubscriptionStream.__proto__),
    [_onListen]: dart.finalFieldType(StreamOfSAndboolToStreamSubscriptionOfT()),
    [_stream]: dart.finalFieldType(StreamOfS())
  }));
  return _BoundSubscriptionStream;
});
async._BoundSubscriptionStream = async._BoundSubscriptionStream$();
dart.addTypeTests(async._BoundSubscriptionStream, _is__BoundSubscriptionStream_default);
async.Timer = class Timer extends core.Object {
  static new(duration, callback) {
    if (dart.equals(async.Zone.current, async.Zone.root)) {
      return async.Zone.current.createTimer(duration, callback);
    }
    return async.Zone.current.createTimer(duration, async.Zone.current.bindCallbackGuarded(callback));
  }
  static periodic(duration, callback) {
    if (dart.equals(async.Zone.current, async.Zone.root)) {
      return async.Zone.current.createPeriodicTimer(duration, callback);
    }
    let boundCallback = async.Zone.current.bindUnaryCallbackGuarded(async.Timer, callback);
    return async.Zone.current.createPeriodicTimer(duration, boundCallback);
  }
  static run(callback) {
    async.Timer.new(core.Duration.zero, callback);
  }
  static _createTimer(duration, callback) {
    let milliseconds = duration.inMilliseconds;
    if (dart.notNull(milliseconds) < 0) milliseconds = 0;
    return new _isolate_helper.TimerImpl.new(milliseconds, callback);
  }
  static _createPeriodicTimer(duration, callback) {
    let milliseconds = duration.inMilliseconds;
    if (dart.notNull(milliseconds) < 0) milliseconds = 0;
    return new _isolate_helper.TimerImpl.periodic(milliseconds, callback);
  }
};
(async.Timer[dart.mixinNew] = function() {
}).prototype = async.Timer.prototype;
dart.addTypeTests(async.Timer);
dart.setLibraryUri(async.Timer, "dart:async");
async.AsyncError = class AsyncError extends core.Object {
  get error() {
    return this[error$];
  }
  set error(value) {
    super.error = value;
  }
  get stackTrace() {
    return this[stackTrace$];
  }
  set stackTrace(value) {
    super.stackTrace = value;
  }
  toString() {
    return dart.str(this.error);
  }
};
(async.AsyncError.new = function(error, stackTrace) {
  this[error$] = error;
  this[stackTrace$] = stackTrace;
}).prototype = async.AsyncError.prototype;
dart.addTypeTests(async.AsyncError);
const error$ = Symbol("AsyncError.error");
const stackTrace$ = Symbol("AsyncError.stackTrace");
async.AsyncError[dart.implements] = () => [core.Error];
dart.setLibraryUri(async.AsyncError, "dart:async");
dart.setFieldSignature(async.AsyncError, () => ({
  __proto__: dart.getFields(async.AsyncError.__proto__),
  error: dart.finalFieldType(core.Object),
  stackTrace: dart.finalFieldType(core.StackTrace)
}));
dart.defineExtensionMethods(async.AsyncError, ['toString']);
dart.defineExtensionAccessors(async.AsyncError, ['stackTrace']);
const _is__ZoneFunction_default = Symbol('_is__ZoneFunction_default');
async._ZoneFunction$ = dart.generic(T => {
  class _ZoneFunction extends core.Object {}
  (_ZoneFunction.new = function(zone, func) {
    this.zone = zone;
    this.function = func;
  }).prototype = _ZoneFunction.prototype;
  dart.addTypeTests(_ZoneFunction);
  _ZoneFunction.prototype[_is__ZoneFunction_default] = true;
  dart.setLibraryUri(_ZoneFunction, "dart:async");
  dart.setFieldSignature(_ZoneFunction, () => ({
    __proto__: dart.getFields(_ZoneFunction.__proto__),
    zone: dart.finalFieldType(async._Zone),
    function: dart.finalFieldType(T)
  }));
  return _ZoneFunction;
});
async._ZoneFunction = async._ZoneFunction$();
dart.addTypeTests(async._ZoneFunction, _is__ZoneFunction_default);
async.ZoneSpecification = class ZoneSpecification extends core.Object {
  static new(opts) {
    return new async._ZoneSpecification.new(opts);
  }
  static from(other, opts) {
    let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
    let run = opts && 'run' in opts ? opts.run : null;
    let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
    let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
    let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
    let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
    let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
    let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
    let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
    let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
    let print = opts && 'print' in opts ? opts.print : null;
    let fork = opts && 'fork' in opts ? opts.fork : null;
    return async.ZoneSpecification.new({handleUncaughtError: handleUncaughtError != null ? handleUncaughtError : other.handleUncaughtError, run: run != null ? run : other.run, runUnary: runUnary != null ? runUnary : other.runUnary, runBinary: runBinary != null ? runBinary : other.runBinary, registerCallback: registerCallback != null ? registerCallback : other.registerCallback, registerUnaryCallback: registerUnaryCallback != null ? registerUnaryCallback : other.registerUnaryCallback, registerBinaryCallback: registerBinaryCallback != null ? registerBinaryCallback : other.registerBinaryCallback, errorCallback: errorCallback != null ? errorCallback : other.errorCallback, scheduleMicrotask: scheduleMicrotask != null ? scheduleMicrotask : other.scheduleMicrotask, createTimer: createTimer != null ? createTimer : other.createTimer, createPeriodicTimer: createPeriodicTimer != null ? createPeriodicTimer : other.createPeriodicTimer, print: print != null ? print : other.print, fork: fork != null ? fork : other.fork});
  }
};
(async.ZoneSpecification[dart.mixinNew] = function() {
}).prototype = async.ZoneSpecification.prototype;
dart.addTypeTests(async.ZoneSpecification);
dart.setLibraryUri(async.ZoneSpecification, "dart:async");
async._ZoneSpecification = class _ZoneSpecification extends core.Object {};
(async._ZoneSpecification.new = function(opts) {
  let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
  let run = opts && 'run' in opts ? opts.run : null;
  let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
  let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
  let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
  let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
  let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
  let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
  let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
  let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
  let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
  let print = opts && 'print' in opts ? opts.print : null;
  let fork = opts && 'fork' in opts ? opts.fork : null;
  this.handleUncaughtError = handleUncaughtError;
  this.run = run;
  this.runUnary = runUnary;
  this.runBinary = runBinary;
  this.registerCallback = registerCallback;
  this.registerUnaryCallback = registerUnaryCallback;
  this.registerBinaryCallback = registerBinaryCallback;
  this.errorCallback = errorCallback;
  this.scheduleMicrotask = scheduleMicrotask;
  this.createTimer = createTimer;
  this.createPeriodicTimer = createPeriodicTimer;
  this.print = print;
  this.fork = fork;
}).prototype = async._ZoneSpecification.prototype;
dart.addTypeTests(async._ZoneSpecification);
async._ZoneSpecification[dart.implements] = () => [async.ZoneSpecification];
dart.setLibraryUri(async._ZoneSpecification, "dart:async");
dart.setFieldSignature(async._ZoneSpecification, () => ({
  __proto__: dart.getFields(async._ZoneSpecification.__proto__),
  handleUncaughtError: dart.finalFieldType(ZoneAndZoneDelegateAndZone__Tovoid()),
  run: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToR()),
  runUnary: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToR$()),
  runBinary: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToR$0()),
  registerCallback: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToFn()),
  registerUnaryCallback: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToFn$()),
  registerBinaryCallback: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToFn$0()),
  errorCallback: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToAsyncError()),
  scheduleMicrotask: dart.finalFieldType(ZoneAndZoneDelegateAndZone__Tovoid$()),
  createTimer: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToTimer()),
  createPeriodicTimer: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToTimer$()),
  print: dart.finalFieldType(ZoneAndZoneDelegateAndZone__Tovoid$0()),
  fork: dart.finalFieldType(ZoneAndZoneDelegateAndZone__ToZone())
}));
async.ZoneDelegate = class ZoneDelegate extends core.Object {};
(async.ZoneDelegate.new = function() {
}).prototype = async.ZoneDelegate.prototype;
dart.addTypeTests(async.ZoneDelegate);
dart.setLibraryUri(async.ZoneDelegate, "dart:async");
async.Zone = class Zone extends core.Object {
  static get current() {
    return async.Zone._current;
  }
  static _enter(zone) {
    if (!(zone != null)) dart.assertFailed(null, "dart:async/zone.dart", 658, 12, "zone != null");
    if (!!(zone == async.Zone._current)) dart.assertFailed(null, "dart:async/zone.dart", 659, 12, "!identical(zone, _current)");
    let previous = async.Zone._current;
    async.Zone._current = zone;
    return previous;
  }
  static _leave(previous) {
    if (!(previous != null)) dart.assertFailed(null, "dart:async/zone.dart", 671, 12, "previous != null");
    async.Zone._current = previous;
  }
};
(async.Zone.__ = function() {
}).prototype = async.Zone.prototype;
dart.addTypeTests(async.Zone);
dart.setLibraryUri(async.Zone, "dart:async");
dart.defineLazy(async.Zone, {
  /*async.Zone.root*/get root() {
    return async._rootZone;
  },
  /*async.Zone._current*/get _current() {
    return async._rootZone;
  },
  set _current(_) {}
});
const _delegate = dart.privateName(async, "_delegate");
async._parentDelegate = function(zone) {
  if (zone.parent == null) return null;
  return zone.parent[_delegate];
};
const _delegationTarget = dart.privateName(async, "_delegationTarget");
const _handleUncaughtError = dart.privateName(async, "_handleUncaughtError");
const _run = dart.privateName(async, "_run");
const _runUnary = dart.privateName(async, "_runUnary");
const _runBinary = dart.privateName(async, "_runBinary");
const _registerCallback = dart.privateName(async, "_registerCallback");
const _registerUnaryCallback = dart.privateName(async, "_registerUnaryCallback");
const _registerBinaryCallback = dart.privateName(async, "_registerBinaryCallback");
const _errorCallback = dart.privateName(async, "_errorCallback");
const _createTimer = dart.privateName(async, "_createTimer");
const _createPeriodicTimer = dart.privateName(async, "_createPeriodicTimer");
const _print = dart.privateName(async, "_print");
const _fork = dart.privateName(async, "_fork");
async._ZoneDelegate = class _ZoneDelegate extends core.Object {
  handleUncaughtError(zone, error, stackTrace) {
    let implementation = this[_delegationTarget][_handleUncaughtError];
    let implZone = implementation.zone;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, error, stackTrace);
  }
  run(R, zone, f) {
    let implementation = this[_delegationTarget][_run];
    let implZone = implementation.zone;
    let handler = ZoneAndZoneDelegateAndZone__ToR()._check(implementation.function);
    return handler(R, implZone, async._parentDelegate(implZone), zone, f);
  }
  runUnary(R, T, zone, f, arg) {
    let implementation = this[_delegationTarget][_runUnary];
    let implZone = implementation.zone;
    let handler = ZoneAndZoneDelegateAndZone__ToR$()._check(implementation.function);
    return handler(R, T, implZone, async._parentDelegate(implZone), zone, f, arg);
  }
  runBinary(R, T1, T2, zone, f, arg1, arg2) {
    let implementation = this[_delegationTarget][_runBinary];
    let implZone = implementation.zone;
    let handler = ZoneAndZoneDelegateAndZone__ToR$0()._check(implementation.function);
    return handler(R, T1, T2, implZone, async._parentDelegate(implZone), zone, f, arg1, arg2);
  }
  registerCallback(R, zone, f) {
    let implementation = this[_delegationTarget][_registerCallback];
    let implZone = implementation.zone;
    let handler = ZoneAndZoneDelegateAndZone__ToFn()._check(implementation.function);
    return handler(R, implZone, async._parentDelegate(implZone), zone, f);
  }
  registerUnaryCallback(R, T, zone, f) {
    let implementation = this[_delegationTarget][_registerUnaryCallback];
    let implZone = implementation.zone;
    let handler = ZoneAndZoneDelegateAndZone__ToFn$()._check(implementation.function);
    return handler(R, T, implZone, async._parentDelegate(implZone), zone, f);
  }
  registerBinaryCallback(R, T1, T2, zone, f) {
    let implementation = this[_delegationTarget][_registerBinaryCallback];
    let implZone = implementation.zone;
    let handler = ZoneAndZoneDelegateAndZone__ToFn$0()._check(implementation.function);
    return handler(R, T1, T2, implZone, async._parentDelegate(implZone), zone, f);
  }
  errorCallback(zone, error, stackTrace) {
    let implementation = this[_delegationTarget][_errorCallback];
    let implZone = implementation.zone;
    if (implZone === async._rootZone) return null;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, error, stackTrace);
  }
  scheduleMicrotask(zone, f) {
    let implementation = this[_delegationTarget][_scheduleMicrotask];
    let implZone = implementation.zone;
    let handler = implementation.function;
    handler(implZone, async._parentDelegate(implZone), zone, f);
  }
  createTimer(zone, duration, f) {
    let implementation = this[_delegationTarget][_createTimer];
    let implZone = implementation.zone;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, duration, f);
  }
  createPeriodicTimer(zone, period, f) {
    let implementation = this[_delegationTarget][_createPeriodicTimer];
    let implZone = implementation.zone;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, period, f);
  }
  print(zone, line) {
    let implementation = this[_delegationTarget][_print];
    let implZone = implementation.zone;
    let handler = implementation.function;
    handler(implZone, async._parentDelegate(implZone), zone, line);
  }
  fork(zone, specification, zoneValues) {
    let implementation = this[_delegationTarget][_fork];
    let implZone = implementation.zone;
    let handler = implementation.function;
    return handler(implZone, async._parentDelegate(implZone), zone, specification, zoneValues);
  }
};
(async._ZoneDelegate.new = function(delegationTarget) {
  this[_delegationTarget] = delegationTarget;
}).prototype = async._ZoneDelegate.prototype;
dart.addTypeTests(async._ZoneDelegate);
async._ZoneDelegate[dart.implements] = () => [async.ZoneDelegate];
dart.setMethodSignature(async._ZoneDelegate, () => ({
  __proto__: dart.getMethods(async._ZoneDelegate.__proto__),
  handleUncaughtError: dart.fnType(dart.void, [async.Zone, dart.dynamic, core.StackTrace]),
  run: dart.gFnType(R => [R, [async.Zone, dart.fnType(R, [])]]),
  runUnary: dart.gFnType((R, T) => [R, [async.Zone, dart.fnType(R, [T]), T]]),
  runBinary: dart.gFnType((R, T1, T2) => [R, [async.Zone, dart.fnType(R, [T1, T2]), T1, T2]]),
  registerCallback: dart.gFnType(R => [dart.fnType(R, []), [async.Zone, dart.fnType(R, [])]]),
  registerUnaryCallback: dart.gFnType((R, T) => [dart.fnType(R, [T]), [async.Zone, dart.fnType(R, [T])]]),
  registerBinaryCallback: dart.gFnType((R, T1, T2) => [dart.fnType(R, [T1, T2]), [async.Zone, dart.fnType(R, [T1, T2])]]),
  errorCallback: dart.fnType(async.AsyncError, [async.Zone, core.Object, core.StackTrace]),
  scheduleMicrotask: dart.fnType(dart.void, [async.Zone, dart.fnType(dart.dynamic, [])]),
  createTimer: dart.fnType(async.Timer, [async.Zone, core.Duration, dart.fnType(dart.void, [])]),
  createPeriodicTimer: dart.fnType(async.Timer, [async.Zone, core.Duration, dart.fnType(dart.void, [async.Timer])]),
  print: dart.fnType(dart.void, [async.Zone, core.String]),
  fork: dart.fnType(async.Zone, [async.Zone, async.ZoneSpecification, core.Map])
}));
dart.setLibraryUri(async._ZoneDelegate, "dart:async");
dart.setFieldSignature(async._ZoneDelegate, () => ({
  __proto__: dart.getFields(async._ZoneDelegate.__proto__),
  [_delegationTarget]: dart.finalFieldType(async._Zone)
}));
async._Zone = class _Zone extends core.Object {
  inSameErrorZone(otherZone) {
    return this === otherZone || this.errorZone == otherZone.errorZone;
  }
};
(async._Zone.new = function() {
}).prototype = async._Zone.prototype;
dart.addTypeTests(async._Zone);
async._Zone[dart.implements] = () => [async.Zone];
dart.setMethodSignature(async._Zone, () => ({
  __proto__: dart.getMethods(async._Zone.__proto__),
  inSameErrorZone: dart.fnType(core.bool, [async.Zone])
}));
dart.setLibraryUri(async._Zone, "dart:async");
const _map$ = dart.privateName(async, "_map");
const _delegateCache = dart.privateName(async, "_delegateCache");
async._CustomZone = class _CustomZone extends async._Zone {
  get [_delegate]() {
    if (this[_delegateCache] != null) return this[_delegateCache];
    this[_delegateCache] = new async._ZoneDelegate.new(this);
    return this[_delegateCache];
  }
  get errorZone() {
    return this[_handleUncaughtError].zone;
  }
  runGuarded(f) {
    try {
      this.run(dart.void, f);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      this.handleUncaughtError(e, s);
    }
  }
  runUnaryGuarded(T, f, arg) {
    try {
      this.runUnary(dart.void, T, f, arg);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      this.handleUncaughtError(e, s);
    }
  }
  runBinaryGuarded(T1, T2, f, arg1, arg2) {
    try {
      this.runBinary(dart.void, T1, T2, f, arg1, arg2);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      this.handleUncaughtError(e, s);
    }
  }
  bindCallback(R, f) {
    let registered = this.registerCallback(R, f);
    return dart.fn(() => this.run(R, registered), dart.fnType(R, []));
  }
  bindUnaryCallback(R, T, f) {
    let registered = this.registerUnaryCallback(R, T, f);
    return dart.fn(arg => this.runUnary(R, T, registered, arg), dart.fnType(R, [T]));
  }
  bindBinaryCallback(R, T1, T2, f) {
    let registered = this.registerBinaryCallback(R, T1, T2, f);
    return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2, registered, arg1, arg2), dart.fnType(R, [T1, T2]));
  }
  bindCallbackGuarded(f) {
    let registered = this.registerCallback(dart.void, f);
    return dart.fn(() => this.runGuarded(registered), VoidTovoid());
  }
  bindUnaryCallbackGuarded(T, f) {
    let registered = this.registerUnaryCallback(dart.void, T, f);
    return dart.fn(arg => this.runUnaryGuarded(T, registered, arg), dart.fnType(dart.void, [T]));
  }
  bindBinaryCallbackGuarded(T1, T2, f) {
    let registered = this.registerBinaryCallback(dart.void, T1, T2, f);
    return dart.fn((arg1, arg2) => this.runBinaryGuarded(T1, T2, registered, arg1, arg2), dart.fnType(dart.void, [T1, T2]));
  }
  _get(key) {
    let result = this[_map$][$_get](key);
    if (result != null || dart.test(this[_map$][$containsKey](key))) return result;
    if (this.parent != null) {
      let value = this.parent._get(key);
      if (value != null) {
        this[_map$][$_set](key, value);
      }
      return value;
    }
    if (!this._equals(async._rootZone)) dart.assertFailed(null, "dart:async/zone.dart", 992, 12, "this == _rootZone");
    return null;
  }
  handleUncaughtError(error, stackTrace) {
    let implementation = this[_handleUncaughtError];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1000, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, error, stackTrace);
  }
  fork(opts) {
    let specification = opts && 'specification' in opts ? opts.specification : null;
    let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
    let implementation = this[_fork];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1009, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, specification, zoneValues);
  }
  run(R, f) {
    let implementation = this[_run];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1018, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = ZoneAndZoneDelegateAndZone__ToR()._check(implementation.function);
    return handler(R, implementation.zone, parentDelegate, this, f);
  }
  runUnary(R, T, f, arg) {
    let implementation = this[_runUnary];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1026, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = ZoneAndZoneDelegateAndZone__ToR$()._check(implementation.function);
    return handler(R, T, implementation.zone, parentDelegate, this, f, arg);
  }
  runBinary(R, T1, T2, f, arg1, arg2) {
    let implementation = this[_runBinary];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1034, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = ZoneAndZoneDelegateAndZone__ToR$0()._check(implementation.function);
    return handler(R, T1, T2, implementation.zone, parentDelegate, this, f, arg1, arg2);
  }
  registerCallback(R, callback) {
    let implementation = this[_registerCallback];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1042, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = ZoneAndZoneDelegateAndZone__ToFn()._check(implementation.function);
    return handler(R, implementation.zone, parentDelegate, this, callback);
  }
  registerUnaryCallback(R, T, callback) {
    let implementation = this[_registerUnaryCallback];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1050, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = ZoneAndZoneDelegateAndZone__ToFn$()._check(implementation.function);
    return handler(R, T, implementation.zone, parentDelegate, this, callback);
  }
  registerBinaryCallback(R, T1, T2, callback) {
    let implementation = this[_registerBinaryCallback];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1059, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = ZoneAndZoneDelegateAndZone__ToFn$0()._check(implementation.function);
    return handler(R, T1, T2, implementation.zone, parentDelegate, this, callback);
  }
  errorCallback(error, stackTrace) {
    let implementation = this[_errorCallback];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1067, 12, "implementation != null");
    let implementationZone = implementation.zone;
    if (implementationZone === async._rootZone) return null;
    let parentDelegate = async._parentDelegate(async._Zone._check(implementationZone));
    let handler = implementation.function;
    return handler(implementationZone, parentDelegate, this, error, stackTrace);
  }
  scheduleMicrotask(f) {
    let implementation = this[_scheduleMicrotask];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1077, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, f);
  }
  createTimer(duration, f) {
    let implementation = this[_createTimer];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1085, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, duration, f);
  }
  createPeriodicTimer(duration, f) {
    let implementation = this[_createPeriodicTimer];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1093, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, duration, f);
  }
  print(line) {
    let implementation = this[_print];
    if (!(implementation != null)) dart.assertFailed(null, "dart:async/zone.dart", 1101, 12, "implementation != null");
    let parentDelegate = async._parentDelegate(implementation.zone);
    let handler = implementation.function;
    return handler(implementation.zone, parentDelegate, this, line);
  }
};
(async._CustomZone.new = function(parent, specification, map) {
  this[_run] = null;
  this[_runUnary] = null;
  this[_runBinary] = null;
  this[_registerCallback] = null;
  this[_registerUnaryCallback] = null;
  this[_registerBinaryCallback] = null;
  this[_errorCallback] = null;
  this[_scheduleMicrotask] = null;
  this[_createTimer] = null;
  this[_createPeriodicTimer] = null;
  this[_print] = null;
  this[_fork] = null;
  this[_handleUncaughtError] = null;
  this[_delegateCache] = null;
  this.parent = parent;
  this[_map$] = map;
  async._CustomZone.__proto__.new.call(this);
  this[_run] = specification.run != null ? new (_ZoneFunctionOfFunction()).new(this, specification.run) : this.parent[_run];
  this[_runUnary] = specification.runUnary != null ? new (_ZoneFunctionOfFunction()).new(this, specification.runUnary) : this.parent[_runUnary];
  this[_runBinary] = specification.runBinary != null ? new (_ZoneFunctionOfFunction()).new(this, specification.runBinary) : this.parent[_runBinary];
  this[_registerCallback] = specification.registerCallback != null ? new (_ZoneFunctionOfFunction()).new(this, specification.registerCallback) : this.parent[_registerCallback];
  this[_registerUnaryCallback] = specification.registerUnaryCallback != null ? new (_ZoneFunctionOfFunction()).new(this, specification.registerUnaryCallback) : this.parent[_registerUnaryCallback];
  this[_registerBinaryCallback] = specification.registerBinaryCallback != null ? new (_ZoneFunctionOfFunction()).new(this, specification.registerBinaryCallback) : this.parent[_registerBinaryCallback];
  this[_errorCallback] = specification.errorCallback != null ? new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToAsyncError()).new(this, specification.errorCallback) : this.parent[_errorCallback];
  this[_scheduleMicrotask] = specification.scheduleMicrotask != null ? new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid()).new(this, specification.scheduleMicrotask) : this.parent[_scheduleMicrotask];
  this[_createTimer] = specification.createTimer != null ? new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer()).new(this, specification.createTimer) : this.parent[_createTimer];
  this[_createPeriodicTimer] = specification.createPeriodicTimer != null ? new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer$()).new(this, specification.createPeriodicTimer) : this.parent[_createPeriodicTimer];
  this[_print] = specification.print != null ? new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$()).new(this, specification.print) : this.parent[_print];
  this[_fork] = specification.fork != null ? new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToZone()).new(this, specification.fork) : this.parent[_fork];
  this[_handleUncaughtError] = specification.handleUncaughtError != null ? new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$0()).new(this, specification.handleUncaughtError) : this.parent[_handleUncaughtError];
}).prototype = async._CustomZone.prototype;
dart.addTypeTests(async._CustomZone);
dart.setMethodSignature(async._CustomZone, () => ({
  __proto__: dart.getMethods(async._CustomZone.__proto__),
  runGuarded: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
  runUnaryGuarded: dart.gFnType(T => [dart.void, [dart.fnType(dart.void, [T]), T]]),
  runBinaryGuarded: dart.gFnType((T1, T2) => [dart.void, [dart.fnType(dart.void, [T1, T2]), T1, T2]]),
  bindCallback: dart.gFnType(R => [dart.fnType(R, []), [dart.fnType(R, [])]]),
  bindUnaryCallback: dart.gFnType((R, T) => [dart.fnType(R, [T]), [dart.fnType(R, [T])]]),
  bindBinaryCallback: dart.gFnType((R, T1, T2) => [dart.fnType(R, [T1, T2]), [dart.fnType(R, [T1, T2])]]),
  bindCallbackGuarded: dart.fnType(dart.fnType(dart.void, []), [dart.fnType(dart.void, [])]),
  bindUnaryCallbackGuarded: dart.gFnType(T => [dart.fnType(dart.void, [T]), [dart.fnType(dart.void, [T])]]),
  bindBinaryCallbackGuarded: dart.gFnType((T1, T2) => [dart.fnType(dart.void, [T1, T2]), [dart.fnType(dart.void, [T1, T2])]]),
  _get: dart.fnType(dart.dynamic, [core.Object]),
  handleUncaughtError: dart.fnType(dart.void, [dart.dynamic, core.StackTrace]),
  fork: dart.fnType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
  run: dart.gFnType(R => [R, [dart.fnType(R, [])]]),
  runUnary: dart.gFnType((R, T) => [R, [dart.fnType(R, [T]), T]]),
  runBinary: dart.gFnType((R, T1, T2) => [R, [dart.fnType(R, [T1, T2]), T1, T2]]),
  registerCallback: dart.gFnType(R => [dart.fnType(R, []), [dart.fnType(R, [])]]),
  registerUnaryCallback: dart.gFnType((R, T) => [dart.fnType(R, [T]), [dart.fnType(R, [T])]]),
  registerBinaryCallback: dart.gFnType((R, T1, T2) => [dart.fnType(R, [T1, T2]), [dart.fnType(R, [T1, T2])]]),
  errorCallback: dart.fnType(async.AsyncError, [core.Object, core.StackTrace]),
  scheduleMicrotask: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
  createTimer: dart.fnType(async.Timer, [core.Duration, dart.fnType(dart.void, [])]),
  createPeriodicTimer: dart.fnType(async.Timer, [core.Duration, dart.fnType(dart.void, [async.Timer])]),
  print: dart.fnType(dart.void, [core.String])
}));
dart.setGetterSignature(async._CustomZone, () => ({
  __proto__: dart.getGetters(async._CustomZone.__proto__),
  [_delegate]: async.ZoneDelegate,
  errorZone: async.Zone
}));
dart.setLibraryUri(async._CustomZone, "dart:async");
dart.setFieldSignature(async._CustomZone, () => ({
  __proto__: dart.getFields(async._CustomZone.__proto__),
  [_run]: dart.fieldType(_ZoneFunctionOfFunction()),
  [_runUnary]: dart.fieldType(_ZoneFunctionOfFunction()),
  [_runBinary]: dart.fieldType(_ZoneFunctionOfFunction()),
  [_registerCallback]: dart.fieldType(_ZoneFunctionOfFunction()),
  [_registerUnaryCallback]: dart.fieldType(_ZoneFunctionOfFunction()),
  [_registerBinaryCallback]: dart.fieldType(_ZoneFunctionOfFunction()),
  [_errorCallback]: dart.fieldType(_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToAsyncError()),
  [_scheduleMicrotask]: dart.fieldType(_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid()),
  [_createTimer]: dart.fieldType(_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer()),
  [_createPeriodicTimer]: dart.fieldType(_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer$()),
  [_print]: dart.fieldType(_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$()),
  [_fork]: dart.fieldType(_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToZone()),
  [_handleUncaughtError]: dart.fieldType(_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$0()),
  [_delegateCache]: dart.fieldType(async.ZoneDelegate),
  parent: dart.finalFieldType(async._Zone),
  [_map$]: dart.finalFieldType(core.Map)
}));
async._rootHandleUncaughtError = function(self, parent, zone, error, stackTrace) {
  async._schedulePriorityAsyncCallback(dart.fn(() => {
    let t = error;
    t == null ? error = new core.NullThrownError.new() : t;
    if (stackTrace == null) dart.throw(error);
    async._rethrow(error, stackTrace);
  }, VoidToNull()));
};
async._rethrow = function(error, stackTrace) {
  throw dart.createErrorWithStack(error, stackTrace);
};
async._rootRun = function(R, self, parent, zone, f) {
  if (dart.equals(async.Zone._current, zone)) return f();
  let old = async.Zone._enter(zone);
  try {
    return f();
  } finally {
    async.Zone._leave(old);
  }
};
async._rootRunUnary = function(R, T, self, parent, zone, f, arg) {
  if (dart.equals(async.Zone._current, zone)) return f(arg);
  let old = async.Zone._enter(zone);
  try {
    return f(arg);
  } finally {
    async.Zone._leave(old);
  }
};
async._rootRunBinary = function(R, T1, T2, self, parent, zone, f, arg1, arg2) {
  if (dart.equals(async.Zone._current, zone)) return f(arg1, arg2);
  let old = async.Zone._enter(zone);
  try {
    return f(arg1, arg2);
  } finally {
    async.Zone._leave(old);
  }
};
async._rootRegisterCallback = function(R, self, parent, zone, f) {
  return f;
};
async._rootRegisterUnaryCallback = function(R, T, self, parent, zone, f) {
  return f;
};
async._rootRegisterBinaryCallback = function(R, T1, T2, self, parent, zone, f) {
  return f;
};
async._rootErrorCallback = function(self, parent, zone, error, stackTrace) {
  return null;
};
async._rootScheduleMicrotask = function(self, parent, zone, f) {
  if (!(async._rootZone === zone)) {
    let hasErrorHandler = !dart.test(async._rootZone.inSameErrorZone(zone));
    if (hasErrorHandler) {
      f = zone.bindCallbackGuarded(f);
    } else {
      f = zone.bindCallback(dart.void, f);
    }
    zone = async._rootZone;
  }
  async._scheduleAsyncCallback(f);
};
async._rootCreateTimer = function(self, parent, zone, duration, callback) {
  if (!(async._rootZone === zone)) {
    callback = zone.bindCallback(dart.void, callback);
  }
  return async.Timer._createTimer(duration, callback);
};
async._rootCreatePeriodicTimer = function(self, parent, zone, duration, callback) {
  if (!(async._rootZone === zone)) {
    callback = zone.bindUnaryCallback(dart.dynamic, async.Timer, callback);
  }
  return async.Timer._createPeriodicTimer(duration, callback);
};
async._rootPrint = function(self, parent, zone, line) {
  _internal.printToConsole(line);
};
async._printToZone = function(line) {
  async.Zone.current.print(line);
};
let const$18;
async._rootFork = function(self, parent, zone, specification, zoneValues) {
  _internal.printToZone = dart.fn(async._printToZone, StringTovoid());
  if (specification == null) {
    specification = const$18 || (const$18 = dart.const(async.ZoneSpecification.new()));
  } else if (!async._ZoneSpecification.is(specification)) {
    dart.throw(new core.ArgumentError.new("ZoneSpecifications must be instantiated" + " with the provided constructor."));
  }
  let valueMap = null;
  if (zoneValues == null) {
    if (async._Zone.is(zone)) {
      valueMap = zone[_map$];
    } else {
      valueMap = new _js_helper.LinkedMap.new();
    }
  } else {
    valueMap = collection.HashMap.from(zoneValues);
  }
  return new async._CustomZone.new(async._Zone._check(zone), specification, valueMap);
};
let const$19;
let const$20;
let const$21;
let const$22;
let const$23;
let const$24;
let const$25;
let const$26;
let const$27;
let const$28;
let const$29;
let const$30;
let const$31;
async._RootZone = class _RootZone extends async._Zone {
  get [_run]() {
    return const$19 || (const$19 = dart.const(new (_ZoneFunctionOfFunction()).new(async._rootZone, dart.fn(async._rootRun, ZoneAndZoneDelegateAndZone__ToR()))));
  }
  get [_runUnary]() {
    return const$20 || (const$20 = dart.const(new (_ZoneFunctionOfFunction()).new(async._rootZone, dart.fn(async._rootRunUnary, ZoneAndZoneDelegateAndZone__ToR$()))));
  }
  get [_runBinary]() {
    return const$21 || (const$21 = dart.const(new (_ZoneFunctionOfFunction()).new(async._rootZone, dart.fn(async._rootRunBinary, ZoneAndZoneDelegateAndZone__ToR$0()))));
  }
  get [_registerCallback]() {
    return const$22 || (const$22 = dart.const(new (_ZoneFunctionOfFunction()).new(async._rootZone, dart.fn(async._rootRegisterCallback, ZoneAndZoneDelegateAndZone__ToFn()))));
  }
  get [_registerUnaryCallback]() {
    return const$23 || (const$23 = dart.const(new (_ZoneFunctionOfFunction()).new(async._rootZone, dart.fn(async._rootRegisterUnaryCallback, ZoneAndZoneDelegateAndZone__ToFn$()))));
  }
  get [_registerBinaryCallback]() {
    return const$24 || (const$24 = dart.const(new (_ZoneFunctionOfFunction()).new(async._rootZone, dart.fn(async._rootRegisterBinaryCallback, ZoneAndZoneDelegateAndZone__ToFn$0()))));
  }
  get [_errorCallback]() {
    return const$25 || (const$25 = dart.const(new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToAsyncError()).new(async._rootZone, dart.fn(async._rootErrorCallback, ZoneAndZoneDelegateAndZone__ToAsyncError()))));
  }
  get [_scheduleMicrotask]() {
    return const$26 || (const$26 = dart.const(new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid()).new(async._rootZone, dart.fn(async._rootScheduleMicrotask, ZoneAndZoneDelegateAndZone__Tovoid$()))));
  }
  get [_createTimer]() {
    return const$27 || (const$27 = dart.const(new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer()).new(async._rootZone, dart.fn(async._rootCreateTimer, ZoneAndZoneDelegateAndZone__ToTimer()))));
  }
  get [_createPeriodicTimer]() {
    return const$28 || (const$28 = dart.const(new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToTimer$()).new(async._rootZone, dart.fn(async._rootCreatePeriodicTimer, ZoneAndZoneDelegateAndZone__ToTimer$()))));
  }
  get [_print]() {
    return const$29 || (const$29 = dart.const(new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$()).new(async._rootZone, dart.fn(async._rootPrint, ZoneAndZoneDelegateAndZone__Tovoid$0()))));
  }
  get [_fork]() {
    return const$30 || (const$30 = dart.const(new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__ToZone()).new(async._rootZone, dart.fn(async._rootFork, ZoneAndZoneDelegateAndZone__ToZone()))));
  }
  get [_handleUncaughtError]() {
    return const$31 || (const$31 = dart.const(new (_ZoneFunctionOfZoneAndZoneDelegateAndZone__Tovoid$0()).new(async._rootZone, dart.fn(async._rootHandleUncaughtError, ZoneAndZoneDelegateAndZone__Tovoid$1()))));
  }
  get parent() {
    return null;
  }
  get [_map$]() {
    return async._RootZone._rootMap;
  }
  get [_delegate]() {
    if (async._RootZone._rootDelegate != null) return async._RootZone._rootDelegate;
    return async._RootZone._rootDelegate = new async._ZoneDelegate.new(this);
  }
  get errorZone() {
    return this;
  }
  runGuarded(f) {
    try {
      if (async._rootZone === async.Zone._current) {
        f();
        return;
      }
      async._rootRun(dart.void, null, null, this, f);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      this.handleUncaughtError(e, s);
    }
  }
  runUnaryGuarded(T, f, arg) {
    try {
      if (async._rootZone === async.Zone._current) {
        f(arg);
        return;
      }
      async._rootRunUnary(dart.void, T, null, null, this, f, arg);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      this.handleUncaughtError(e, s);
    }
  }
  runBinaryGuarded(T1, T2, f, arg1, arg2) {
    try {
      if (async._rootZone === async.Zone._current) {
        f(arg1, arg2);
        return;
      }
      async._rootRunBinary(dart.void, T1, T2, null, null, this, f, arg1, arg2);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      this.handleUncaughtError(e, s);
    }
  }
  bindCallback(R, f) {
    return dart.fn(() => this.run(R, f), dart.fnType(R, []));
  }
  bindUnaryCallback(R, T, f) {
    return dart.fn(arg => this.runUnary(R, T, f, arg), dart.fnType(R, [T]));
  }
  bindBinaryCallback(R, T1, T2, f) {
    return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2, f, arg1, arg2), dart.fnType(R, [T1, T2]));
  }
  bindCallbackGuarded(f) {
    return dart.fn(() => this.runGuarded(f), VoidTovoid());
  }
  bindUnaryCallbackGuarded(T, f) {
    return dart.fn(arg => this.runUnaryGuarded(T, f, arg), dart.fnType(dart.void, [T]));
  }
  bindBinaryCallbackGuarded(T1, T2, f) {
    return dart.fn((arg1, arg2) => this.runBinaryGuarded(T1, T2, f, arg1, arg2), dart.fnType(dart.void, [T1, T2]));
  }
  _get(key) {
    return null;
  }
  handleUncaughtError(error, stackTrace) {
    async._rootHandleUncaughtError(null, null, this, error, stackTrace);
  }
  fork(opts) {
    let specification = opts && 'specification' in opts ? opts.specification : null;
    let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
    return async._rootFork(null, null, this, specification, zoneValues);
  }
  run(R, f) {
    if (async.Zone._current === async._rootZone) return f();
    return async._rootRun(R, null, null, this, f);
  }
  runUnary(R, T, f, arg) {
    if (async.Zone._current === async._rootZone) return f(arg);
    return async._rootRunUnary(R, T, null, null, this, f, arg);
  }
  runBinary(R, T1, T2, f, arg1, arg2) {
    if (async.Zone._current === async._rootZone) return f(arg1, arg2);
    return async._rootRunBinary(R, T1, T2, null, null, this, f, arg1, arg2);
  }
  registerCallback(R, f) {
    return f;
  }
  registerUnaryCallback(R, T, f) {
    return f;
  }
  registerBinaryCallback(R, T1, T2, f) {
    return f;
  }
  errorCallback(error, stackTrace) {
    return null;
  }
  scheduleMicrotask(f) {
    async._rootScheduleMicrotask(null, null, this, f);
  }
  createTimer(duration, f) {
    return async.Timer._createTimer(duration, f);
  }
  createPeriodicTimer(duration, f) {
    return async.Timer._createPeriodicTimer(duration, f);
  }
  print(line) {
    _internal.printToConsole(line);
  }
};
(async._RootZone.new = function() {
  async._RootZone.__proto__.new.call(this);
}).prototype = async._RootZone.prototype;
dart.addTypeTests(async._RootZone);
dart.setMethodSignature(async._RootZone, () => ({
  __proto__: dart.getMethods(async._RootZone.__proto__),
  runGuarded: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
  runUnaryGuarded: dart.gFnType(T => [dart.void, [dart.fnType(dart.void, [T]), T]]),
  runBinaryGuarded: dart.gFnType((T1, T2) => [dart.void, [dart.fnType(dart.void, [T1, T2]), T1, T2]]),
  bindCallback: dart.gFnType(R => [dart.fnType(R, []), [dart.fnType(R, [])]]),
  bindUnaryCallback: dart.gFnType((R, T) => [dart.fnType(R, [T]), [dart.fnType(R, [T])]]),
  bindBinaryCallback: dart.gFnType((R, T1, T2) => [dart.fnType(R, [T1, T2]), [dart.fnType(R, [T1, T2])]]),
  bindCallbackGuarded: dart.fnType(dart.fnType(dart.void, []), [dart.fnType(dart.void, [])]),
  bindUnaryCallbackGuarded: dart.gFnType(T => [dart.fnType(dart.void, [T]), [dart.fnType(dart.void, [T])]]),
  bindBinaryCallbackGuarded: dart.gFnType((T1, T2) => [dart.fnType(dart.void, [T1, T2]), [dart.fnType(dart.void, [T1, T2])]]),
  _get: dart.fnType(dart.dynamic, [core.Object]),
  handleUncaughtError: dart.fnType(dart.void, [dart.dynamic, core.StackTrace]),
  fork: dart.fnType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
  run: dart.gFnType(R => [R, [dart.fnType(R, [])]]),
  runUnary: dart.gFnType((R, T) => [R, [dart.fnType(R, [T]), T]]),
  runBinary: dart.gFnType((R, T1, T2) => [R, [dart.fnType(R, [T1, T2]), T1, T2]]),
  registerCallback: dart.gFnType(R => [dart.fnType(R, []), [dart.fnType(R, [])]]),
  registerUnaryCallback: dart.gFnType((R, T) => [dart.fnType(R, [T]), [dart.fnType(R, [T])]]),
  registerBinaryCallback: dart.gFnType((R, T1, T2) => [dart.fnType(R, [T1, T2]), [dart.fnType(R, [T1, T2])]]),
  errorCallback: dart.fnType(async.AsyncError, [core.Object, core.StackTrace]),
  scheduleMicrotask: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
  createTimer: dart.fnType(async.Timer, [core.Duration, dart.fnType(dart.void, [])]),
  createPeriodicTimer: dart.fnType(async.Timer, [core.Duration, dart.fnType(dart.void, [async.Timer])]),
  print: dart.fnType(dart.void, [core.String])
}));
dart.setGetterSignature(async._RootZone, () => ({
  __proto__: dart.getGetters(async._RootZone.__proto__),
  [_run]: async._ZoneFunction$(core.Function),
  [_runUnary]: async._ZoneFunction$(core.Function),
  [_runBinary]: async._ZoneFunction$(core.Function),
  [_registerCallback]: async._ZoneFunction$(core.Function),
  [_registerUnaryCallback]: async._ZoneFunction$(core.Function),
  [_registerBinaryCallback]: async._ZoneFunction$(core.Function),
  [_errorCallback]: async._ZoneFunction$(dart.fnType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])),
  [_scheduleMicrotask]: async._ZoneFunction$(dart.fnType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, dart.fnType(dart.void, [])])),
  [_createTimer]: async._ZoneFunction$(dart.fnType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, dart.fnType(dart.void, [])])),
  [_createPeriodicTimer]: async._ZoneFunction$(dart.fnType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, dart.fnType(dart.void, [async.Timer])])),
  [_print]: async._ZoneFunction$(dart.fnType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])),
  [_fork]: async._ZoneFunction$(dart.fnType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map])),
  [_handleUncaughtError]: async._ZoneFunction$(dart.fnType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])),
  parent: async._Zone,
  [_map$]: core.Map,
  [_delegate]: async.ZoneDelegate,
  errorZone: async.Zone
}));
dart.setLibraryUri(async._RootZone, "dart:async");
dart.defineLazy(async._RootZone, {
  /*async._RootZone._rootMap*/get _rootMap() {
    return new _js_helper.LinkedMap.new();
  },
  /*async._RootZone._rootDelegate*/get _rootDelegate() {
    return null;
  },
  set _rootDelegate(_) {}
});
dart.defineLazy(async, {
  /*async._rootZone*/get _rootZone() {
    return dart.const(new async._RootZone.new());
  }
});
async.runZoned = function(R, body, opts) {
  let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
  let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
  let onError = opts && 'onError' in opts ? opts.onError : null;
  if (onError == null) {
    return async._runZoned(R, body, zoneValues, zoneSpecification);
  }
  let unaryOnError = null;
  let binaryOnError = null;
  if (ObjectAndStackTraceTovoid().is(onError)) {
    binaryOnError = onError;
  } else if (ObjectTovoid().is(onError)) {
    unaryOnError = onError;
  } else {
    dart.throw(new core.ArgumentError.new("onError callback must take either an Object " + "(the error), or both an Object (the error) and a StackTrace."));
  }
  let errorHandler = (self, parent, zone, error, stackTrace) => {
    try {
      if (binaryOnError != null) {
        self.parent.runBinary(dart.void, core.Object, core.StackTrace, binaryOnError, error, stackTrace);
      } else {
        if (!(unaryOnError != null)) dart.assertFailed(null, "dart:async/zone.dart", 1483, 16, "unaryOnError != null");
        self.parent.runUnary(dart.void, core.Object, unaryOnError, error);
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      if (core.identical(e, error)) {
        parent.handleUncaughtError(zone, error, stackTrace);
      } else {
        parent.handleUncaughtError(zone, e, s);
      }
    }
  };
  dart.fn(errorHandler, ZoneAndZoneDelegateAndZone__ToNull());
  if (zoneSpecification == null) {
    zoneSpecification = async.ZoneSpecification.new({handleUncaughtError: errorHandler});
  } else {
    zoneSpecification = async.ZoneSpecification.from(zoneSpecification, {handleUncaughtError: errorHandler});
  }
  try {
    return async._runZoned(R, body, zoneValues, zoneSpecification);
  } catch (e$) {
    let e = dart.getThrown(e$);
    let stackTrace = dart.stackTrace(e$);
    if (binaryOnError != null) {
      binaryOnError(e, stackTrace);
    } else {
      if (!(unaryOnError != null)) dart.assertFailed(null, "dart:async/zone.dart", 1507, 14, "unaryOnError != null");
      unaryOnError(e);
    }
  }
  return null;
};
async._runZoned = function(R, body, zoneValues, specification) {
  return async.Zone.current.fork({specification: specification, zoneValues: zoneValues}).run(R, body);
};
const _map$0 = dart.privateName(collection, "_map");
const _keyMap$ = dart.privateName(collection, "_keyMap");
const _modifications$ = dart.privateName(collection, "_modifications");
const _newSet = dart.privateName(collection, "_newSet");
const _newSimilarSet = dart.privateName(collection, "_newSimilarSet");
const _is__SetBase_default = Symbol('_is__SetBase_default');
collection._SetBase$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let FollowedByIterableOfE = () => (FollowedByIterableOfE = dart.constFn(_internal.FollowedByIterable$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.fnType(E, [E, E])))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.fnType(E, [])))();
  class _SetBase extends core.Object {
    cast(R) {
      return core.Set.castFrom(E, R, this, {newSet: dart.bind(this, _newSimilarSet)});
    }
    difference(other) {
      let result = this[_newSet]();
      for (let element of this) {
        if (!dart.test(other.contains(element))) result.add(element);
      }
      return result;
    }
    intersection(other) {
      let result = this[_newSet]();
      for (let element of this) {
        if (dart.test(other.contains(element))) result.add(element);
      }
      return result;
    }
    toSet() {
      let _ = this[_newSet]();
      _.addAll(this);
      return _;
    }
    get isEmpty() {
      return this[$length] === 0;
    }
    get isNotEmpty() {
      return this[$length] !== 0;
    }
    followedBy(other) {
      IterableOfE()._check(other);
      return FollowedByIterableOfE().firstEfficient(this, other);
    }
    whereType(T) {
      return new (_internal.WhereTypeIterable$(T)).new(this);
    }
    clear() {
      this.removeAll(this.toList());
    }
    addAll(elements) {
      IterableOfE()._check(elements);
      for (let element of elements)
        this.add(element);
    }
    removeAll(elements) {
      for (let element of elements)
        this.remove(element);
    }
    retainAll(elements) {
      let toRemove = this.toSet();
      for (let o of elements) {
        toRemove.remove(o);
      }
      this.removeAll(toRemove);
    }
    removeWhere(test) {
      let toRemove = [];
      for (let element of this) {
        if (dart.test(test(element))) toRemove[$add](element);
      }
      this.removeAll(toRemove);
    }
    retainWhere(test) {
      let toRemove = [];
      for (let element of this) {
        if (!dart.test(test(element))) toRemove[$add](element);
      }
      this.removeAll(toRemove);
    }
    containsAll(other) {
      for (let o of other) {
        if (!dart.test(this.contains(o))) return false;
      }
      return true;
    }
    union(other) {
      SetOfE()._check(other);
      let _ = this.toSet();
      _.addAll(other);
      return _;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = dart.test(growable) ? (() => {
        let _ = JSArrayOfE().of([]);
        _[$length] = this[$length];
        return _;
      })() : ListOfE().new(this[$length]);
      let i = 0;
      for (let element of this)
        result[$_set](i++, element);
      return result;
    }
    map(T, f) {
      return new (_internal.EfficientLengthMappedIterable$(E, T)).new(this, f);
    }
    get single() {
      if (dart.notNull(this[$length]) > 1) dart.throw(_internal.IterableElementError.tooMany());
      let it = this.iterator;
      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
      let result = it.current;
      return result;
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, "{", "}");
    }
    where(f) {
      return new (WhereIterableOfE()).new(this, f);
    }
    expand(T, f) {
      return new (_internal.ExpandIterable$(E, T)).new(this, f);
    }
    forEach(f) {
      for (let element of this)
        f(element);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let value = iterator.current;
      while (dart.test(iterator.moveNext())) {
        value = combine(value, iterator.current);
      }
      return value;
    }
    fold(T, initialValue, combine) {
      let value = initialValue;
      for (let element of this)
        value = combine(value, element);
      return value;
    }
    every(f) {
      for (let element of this) {
        if (!dart.test(f(element))) return false;
      }
      return true;
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) return "";
      let buffer = new core.StringBuffer.new();
      if (separator == null || separator === "") {
        do {
          buffer.write(iterator.current);
        } while (dart.test(iterator.moveNext()));
      } else {
        buffer.write(iterator.current);
        while (dart.test(iterator.moveNext())) {
          buffer.write(separator);
          buffer.write(iterator.current);
        }
      }
      return buffer.toString();
    }
    any(test) {
      for (let element of this) {
        if (dart.test(test(element))) return true;
      }
      return false;
    }
    take(n) {
      return TakeIterableOfE().new(this, n);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE()).new(this, test);
    }
    skip(n) {
      return SkipIterableOfE().new(this, n);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE()).new(this, test);
    }
    get first() {
      let it = this.iterator;
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      return it.current;
    }
    get last() {
      let it = this.iterator;
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = null;
      do {
        result = it.current;
      } while (dart.test(it.moveNext()));
      return result;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      for (let element of this) {
        if (dart.test(test(element))) return element;
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          if (foundMatching) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      core.ArgumentError.checkNotNull(index, "index");
      core.RangeError.checkNotNegative(index, "index");
      let elementIndex = 0;
      for (let element of this) {
        if (index === elementIndex) return element;
        elementIndex++;
      }
      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
    }
  }
  (_SetBase.new = function() {
  }).prototype = _SetBase.prototype;
  dart.addTypeTests(_SetBase);
  _SetBase.prototype[_is__SetBase_default] = true;
  _SetBase[dart.implements] = () => [SetOfE()];
  dart.setMethodSignature(_SetBase, () => ({
    __proto__: dart.getMethods(_SetBase.__proto__),
    cast: dart.gFnType(R => [core.Set$(R), []]),
    [$cast]: dart.gFnType(R => [core.Set$(R), []]),
    difference: dart.fnType(core.Set$(E), [core.Set$(core.Object)]),
    intersection: dart.fnType(core.Set$(E), [core.Set$(core.Object)]),
    toSet: dart.fnType(core.Set$(E), []),
    [$toSet]: dart.fnType(core.Set$(E), []),
    followedBy: dart.fnType(core.Iterable$(E), [core.Object]),
    [$followedBy]: dart.fnType(core.Iterable$(E), [core.Object]),
    whereType: dart.gFnType(T => [core.Iterable$(T), []]),
    [$whereType]: dart.gFnType(T => [core.Iterable$(T), []]),
    clear: dart.fnType(dart.void, []),
    addAll: dart.fnType(dart.void, [core.Object]),
    removeAll: dart.fnType(dart.void, [core.Iterable$(core.Object)]),
    retainAll: dart.fnType(dart.void, [core.Iterable$(core.Object)]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    containsAll: dart.fnType(core.bool, [core.Iterable$(core.Object)]),
    union: dart.fnType(core.Set$(E), [core.Object]),
    toList: dart.fnType(core.List$(E), [], {growable: core.bool}),
    [$toList]: dart.fnType(core.List$(E), [], {growable: core.bool}),
    map: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    [$map]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, []),
    where: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$where]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    expand: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    [$expand]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    reduce: dart.fnType(E, [core.Object]),
    [$reduce]: dart.fnType(E, [core.Object]),
    fold: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    [$fold]: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    every: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$every]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    join: dart.fnType(core.String, [], [core.String]),
    [$join]: dart.fnType(core.String, [], [core.String]),
    any: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$any]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    take: dart.fnType(core.Iterable$(E), [core.int]),
    [$take]: dart.fnType(core.Iterable$(E), [core.int]),
    takeWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$takeWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    skip: dart.fnType(core.Iterable$(E), [core.int]),
    [$skip]: dart.fnType(core.Iterable$(E), [core.int]),
    skipWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$skipWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    firstWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$firstWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    lastWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    singleWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$singleWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int])
  }));
  dart.setGetterSignature(_SetBase, () => ({
    __proto__: dart.getGetters(_SetBase.__proto__),
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    single: E,
    [$single]: E,
    first: E,
    [$first]: E,
    last: E,
    [$last]: E
  }));
  dart.setLibraryUri(_SetBase, "dart:collection");
  dart.defineExtensionMethods(_SetBase, [
    'cast',
    'toSet',
    'followedBy',
    'whereType',
    'toList',
    'map',
    'toString',
    'where',
    'expand',
    'forEach',
    'reduce',
    'fold',
    'every',
    'join',
    'any',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt'
  ]);
  dart.defineExtensionAccessors(_SetBase, [
    'isEmpty',
    'isNotEmpty',
    'single',
    'first',
    'last'
  ]);
  return _SetBase;
});
collection._SetBase = collection._SetBase$();
dart.addTypeTests(collection._SetBase, _is__SetBase_default);
const _is__InternalSet_default = Symbol('_is__InternalSet_default');
collection._InternalSet$ = dart.generic(E => {
  let DartIteratorOfE = () => (DartIteratorOfE = dart.constFn(_js_helper.DartIterator$(E)))();
  class _InternalSet extends collection._SetBase$(E) {
    get length() {
      return this[_map$0].size;
    }
    get isEmpty() {
      return this[_map$0].size == 0;
    }
    get isNotEmpty() {
      return this[_map$0].size != 0;
    }
    get iterator() {
      return new (DartIteratorOfE()).new(this[Symbol.iterator]());
    }
    [Symbol.iterator]() {
      let self = this;
      let iterator = self[_map$0].values();
      let modifications = self[_modifications$];
      return {
        next() {
          if (modifications != self[_modifications$]) {
            throw new core.ConcurrentModificationError.new(self);
          }
          return iterator.next();
        }
      };
    }
  }
  (_InternalSet.new = function() {
    _InternalSet.__proto__.new.call(this);
  }).prototype = _InternalSet.prototype;
  dart.addTypeTests(_InternalSet);
  _InternalSet.prototype[_is__InternalSet_default] = true;
  dart.setMethodSignature(_InternalSet, () => ({
    __proto__: dart.getMethods(_InternalSet.__proto__),
    [Symbol.iterator]: dart.fnType(dart.dynamic, [])
  }));
  dart.setGetterSignature(_InternalSet, () => ({
    __proto__: dart.getGetters(_InternalSet.__proto__),
    length: core.int,
    [$length]: core.int,
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(_InternalSet, "dart:collection");
  dart.defineExtensionAccessors(_InternalSet, ['length', 'isEmpty', 'isNotEmpty', 'iterator']);
  return _InternalSet;
});
collection._InternalSet = collection._InternalSet$();
dart.addTypeTests(collection._InternalSet, _is__InternalSet_default);
const _is__HashSet_default = Symbol('_is__HashSet_default');
collection._HashSet$ = dart.generic(E => {
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
  class _HashSet extends collection._InternalSet$(E) {
    [_newSet]() {
      return new (_HashSetOfE()).new();
    }
    [_newSimilarSet](R) {
      return new (collection._HashSet$(R)).new();
    }
    contains(key) {
      if (key == null) {
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        let k = key;
        let buckets = this[_keyMap$].get(k[$hashCode] & 0x3ffffff);
        if (buckets != null) {
          for (let i = 0, n = buckets.length; i < n; i++) {
            k = buckets[i];
            if (k[$_equals](key)) return true;
          }
        }
        return false;
      }
      return this[_map$0].has(key);
    }
    lookup(key) {
      if (key == null) return null;
      if (key[$_equals] !== dart.identityEquals) {
        let k = key;
        let buckets = this[_keyMap$].get(k[$hashCode] & 0x3ffffff);
        if (buckets != null) {
          for (let i = 0, n = buckets.length; i < n; i++) {
            k = buckets[i];
            if (k[$_equals](key)) return k;
          }
        }
        return null;
      }
      return this[_map$0].has(key) ? key : null;
    }
    add(key) {
      E._check(key);
      let map = this[_map$0];
      if (key == null) {
        if (dart.test(map.has(null))) return false;
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        let keyMap = this[_keyMap$];
        let k = key;
        let hash = k[$hashCode] & 0x3ffffff;
        let buckets = keyMap.get(hash);
        if (buckets == null) {
          keyMap.set(hash, [key]);
        } else {
          for (let i = 0, n = buckets.length; i < n; i++) {
            k = buckets[i];
            if (k[$_equals](key)) return false;
          }
          buckets.push(key);
        }
      } else if (dart.test(map.has(key))) {
        return false;
      }
      map.add(key);
      this[_modifications$] = this[_modifications$] + 1 & 67108863;
      return true;
    }
    addAll(objects) {
      IterableOfE()._check(objects);
      let map = this[_map$0];
      let length = map.size;
      for (let key of objects) {
        if (key == null) {
          key = null;
        } else if (key[$_equals] !== dart.identityEquals) {
          key = _js_helper.putLinkedMapKey(key, this[_keyMap$]);
        }
        map.add(key);
      }
      if (length !== map.size) {
        this[_modifications$] = this[_modifications$] + 1 & 67108863;
      }
    }
    remove(key) {
      if (key == null) {
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        let k = key;
        let hash = k[$hashCode] & 0x3ffffff;
        let buckets = this[_keyMap$].get(hash);
        if (buckets == null) return false;
        for (let i = 0, n = buckets.length;;) {
          k = buckets[i];
          if (k[$_equals](key)) {
            key = k;
            if (n === 1) {
              this[_keyMap$].delete(hash);
            } else {
              buckets.splice(i, 1);
            }
            break;
          }
          if (++i >= n) return false;
        }
      }
      let map = this[_map$0];
      if (map.delete(key)) {
        this[_modifications$] = this[_modifications$] + 1 & 67108863;
        return true;
      }
      return false;
    }
    clear() {
      let map = this[_map$0];
      if (map.size > 0) {
        map.clear();
        this[_keyMap$].clear();
        this[_modifications$] = this[_modifications$] + 1 & 67108863;
      }
    }
  }
  (_HashSet.new = function() {
    this[_map$0] = new Set();
    this[_keyMap$] = new Map();
    this[_modifications$] = 0;
    _HashSet.__proto__.new.call(this);
  }).prototype = _HashSet.prototype;
  dart.addTypeTests(_HashSet);
  _HashSet.prototype[_is__HashSet_default] = true;
  _HashSet[dart.implements] = () => [HashSetOfE(), LinkedHashSetOfE()];
  dart.setMethodSignature(_HashSet, () => ({
    __proto__: dart.getMethods(_HashSet.__proto__),
    [_newSet]: dart.fnType(core.Set$(E), []),
    [_newSimilarSet]: dart.gFnType(R => [core.Set$(R), []]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    lookup: dart.fnType(E, [core.Object]),
    add: dart.fnType(core.bool, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object])
  }));
  dart.setLibraryUri(_HashSet, "dart:collection");
  dart.setFieldSignature(_HashSet, () => ({
    __proto__: dart.getFields(_HashSet.__proto__),
    [_map$0]: dart.finalFieldType(dart.dynamic),
    [_keyMap$]: dart.finalFieldType(dart.dynamic),
    [_modifications$]: dart.fieldType(core.int)
  }));
  dart.defineExtensionMethods(_HashSet, ['contains']);
  return _HashSet;
});
collection._HashSet = collection._HashSet$();
dart.addTypeTests(collection._HashSet, _is__HashSet_default);
const _is__ImmutableSet_default = Symbol('_is__ImmutableSet_default');
collection._ImmutableSet$ = dart.generic(E => {
  class _ImmutableSet extends collection._HashSet$(E) {
    add(other) {
      return dart.throw(collection._ImmutableSet._unsupported());
    }
    addAll(other) {
      return dart.throw(collection._ImmutableSet._unsupported());
    }
    clear() {
      return dart.throw(collection._ImmutableSet._unsupported());
    }
    remove(key) {
      return dart.throw(collection._ImmutableSet._unsupported());
    }
    static _unsupported() {
      return new core.UnsupportedError.new("Cannot modify unmodifiable set");
    }
  }
  (_ImmutableSet.from = function(entries) {
    _ImmutableSet.__proto__.new.call(this);
    let map = this[_map$0];
    for (let key of entries) {
      if (key == null) {
        key = null;
      } else if (key[$_equals] !== dart.identityEquals) {
        key = _js_helper.putLinkedMapKey(key, this[_keyMap$]);
      }
      map.add(key);
    }
  }).prototype = _ImmutableSet.prototype;
  dart.addTypeTests(_ImmutableSet);
  _ImmutableSet.prototype[_is__ImmutableSet_default] = true;
  dart.setMethodSignature(_ImmutableSet, () => ({
    __proto__: dart.getMethods(_ImmutableSet.__proto__),
    add: dart.fnType(core.bool, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object])
  }));
  dart.setLibraryUri(_ImmutableSet, "dart:collection");
  return _ImmutableSet;
});
collection._ImmutableSet = collection._ImmutableSet$();
dart.addTypeTests(collection._ImmutableSet, _is__ImmutableSet_default);
const _is__IdentityHashSet_default = Symbol('_is__IdentityHashSet_default');
collection._IdentityHashSet$ = dart.generic(E => {
  let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
  class _IdentityHashSet extends collection._InternalSet$(E) {
    [_newSet]() {
      return new (_IdentityHashSetOfE()).new();
    }
    [_newSimilarSet](R) {
      return new (collection._IdentityHashSet$(R)).new();
    }
    contains(element) {
      return this[_map$0].has(element);
    }
    lookup(element) {
      return E._check(dart.test(this[_map$0].has(element)) ? element : null);
    }
    add(element) {
      E._check(element);
      let map = this[_map$0];
      if (map.has(element)) return false;
      map.add(element);
      this[_modifications$] = this[_modifications$] + 1 & 67108863;
      return true;
    }
    addAll(objects) {
      IterableOfE()._check(objects);
      let map = this[_map$0];
      let length = map.size;
      for (let key of objects) {
        map.add(key);
      }
      if (length !== map.size) {
        this[_modifications$] = this[_modifications$] + 1 & 67108863;
      }
    }
    remove(element) {
      if (this[_map$0].delete(element)) {
        this[_modifications$] = this[_modifications$] + 1 & 67108863;
        return true;
      }
      return false;
    }
    clear() {
      let map = this[_map$0];
      if (map.size > 0) {
        map.clear();
        this[_modifications$] = this[_modifications$] + 1 & 67108863;
      }
    }
  }
  (_IdentityHashSet.new = function() {
    this[_map$0] = new Set();
    this[_modifications$] = 0;
    _IdentityHashSet.__proto__.new.call(this);
  }).prototype = _IdentityHashSet.prototype;
  dart.addTypeTests(_IdentityHashSet);
  _IdentityHashSet.prototype[_is__IdentityHashSet_default] = true;
  _IdentityHashSet[dart.implements] = () => [HashSetOfE(), LinkedHashSetOfE()];
  dart.setMethodSignature(_IdentityHashSet, () => ({
    __proto__: dart.getMethods(_IdentityHashSet.__proto__),
    [_newSet]: dart.fnType(core.Set$(E), []),
    [_newSimilarSet]: dart.gFnType(R => [core.Set$(R), []]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    lookup: dart.fnType(E, [core.Object]),
    add: dart.fnType(core.bool, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object])
  }));
  dart.setLibraryUri(_IdentityHashSet, "dart:collection");
  dart.setFieldSignature(_IdentityHashSet, () => ({
    __proto__: dart.getFields(_IdentityHashSet.__proto__),
    [_map$0]: dart.finalFieldType(dart.dynamic),
    [_modifications$]: dart.fieldType(core.int)
  }));
  dart.defineExtensionMethods(_IdentityHashSet, ['contains']);
  return _IdentityHashSet;
});
collection._IdentityHashSet = collection._IdentityHashSet$();
dart.addTypeTests(collection._IdentityHashSet, _is__IdentityHashSet_default);
const _validKey$ = dart.privateName(collection, "_validKey");
const _equals$0 = dart.privateName(collection, "_equals");
const _hashCode$ = dart.privateName(collection, "_hashCode");
const _is__CustomHashSet_default = Symbol('_is__CustomHashSet_default');
collection._CustomHashSet$ = dart.generic(E => {
  let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
  let EAndETobool = () => (EAndETobool = dart.constFn(dart.fnType(core.bool, [E, E])))();
  let EToint = () => (EToint = dart.constFn(dart.fnType(core.int, [E])))();
  class _CustomHashSet extends collection._InternalSet$(E) {
    [_newSet]() {
      return new (_CustomHashSetOfE()).new(this[_equals$0], this[_hashCode$]);
    }
    [_newSimilarSet](R) {
      return new (collection._HashSet$(R)).new();
    }
    contains(key) {
      if (E.is(key)) {
        let buckets = this[_keyMap$].get(this[_hashCode$](key) & 0x3ffffff);
        if (buckets != null) {
          let equals = this[_equals$0];
          for (let i = 0, n = buckets.length; i < n; i++) {
            let k = buckets[i];
            if (dart.test(equals(k, key))) return true;
          }
        }
      }
      return false;
    }
    lookup(key) {
      if (E.is(key)) {
        let buckets = this[_keyMap$].get(this[_hashCode$](key) & 0x3ffffff);
        if (buckets != null) {
          let equals = this[_equals$0];
          for (let i = 0, n = buckets.length; i < n; i++) {
            let k = buckets[i];
            if (dart.test(equals(k, key))) return k;
          }
        }
      }
      return null;
    }
    add(key) {
      E._check(key);
      let keyMap = this[_keyMap$];
      let hash = this[_hashCode$](key) & 0x3ffffff;
      let buckets = keyMap.get(hash);
      if (buckets == null) {
        keyMap.set(hash, [key]);
      } else {
        let equals = this[_equals$0];
        for (let i = 0, n = buckets.length; i < n; i++) {
          let k = buckets[i];
          if (dart.test(equals(k, key))) return false;
        }
        buckets.push(key);
      }
      this[_map$0].add(key);
      this[_modifications$] = this[_modifications$] + 1 & 67108863;
      return true;
    }
    addAll(objects) {
      IterableOfE()._check(objects);
      for (let element of objects)
        this.add(element);
    }
    remove(key) {
      if (E.is(key)) {
        let hash = this[_hashCode$](key) & 0x3ffffff;
        let keyMap = this[_keyMap$];
        let buckets = keyMap.get(hash);
        if (buckets == null) return false;
        let equals = this[_equals$0];
        for (let i = 0, n = buckets.length; i < n; i++) {
          let k = buckets[i];
          if (dart.test(equals(k, key))) {
            if (n === 1) {
              keyMap.delete(hash);
            } else {
              buckets.splice(i, 1);
            }
            this[_map$0].delete(k);
            this[_modifications$] = this[_modifications$] + 1 & 67108863;
            return true;
          }
        }
      }
      return false;
    }
    clear() {
      let map = this[_map$0];
      if (map.size > 0) {
        map.clear();
        this[_keyMap$].clear();
        this[_modifications$] = this[_modifications$] + 1 & 67108863;
      }
    }
  }
  (_CustomHashSet.new = function(equals, hashCode) {
    this[_modifications$] = 0;
    this[_map$0] = new Set();
    this[_keyMap$] = new Map();
    this[_equals$0] = equals;
    this[_hashCode$] = hashCode;
    _CustomHashSet.__proto__.new.call(this);
  }).prototype = _CustomHashSet.prototype;
  dart.addTypeTests(_CustomHashSet);
  _CustomHashSet.prototype[_is__CustomHashSet_default] = true;
  _CustomHashSet[dart.implements] = () => [HashSetOfE(), LinkedHashSetOfE()];
  dart.setMethodSignature(_CustomHashSet, () => ({
    __proto__: dart.getMethods(_CustomHashSet.__proto__),
    [_newSet]: dart.fnType(core.Set$(E), []),
    [_newSimilarSet]: dart.gFnType(R => [core.Set$(R), []]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    lookup: dart.fnType(E, [core.Object]),
    add: dart.fnType(core.bool, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object])
  }));
  dart.setLibraryUri(_CustomHashSet, "dart:collection");
  dart.setFieldSignature(_CustomHashSet, () => ({
    __proto__: dart.getFields(_CustomHashSet.__proto__),
    [_equals$0]: dart.fieldType(EAndETobool()),
    [_hashCode$]: dart.fieldType(EToint()),
    [_modifications$]: dart.fieldType(core.int),
    [_map$0]: dart.finalFieldType(dart.dynamic),
    [_keyMap$]: dart.finalFieldType(dart.dynamic)
  }));
  dart.defineExtensionMethods(_CustomHashSet, ['contains']);
  return _CustomHashSet;
});
collection._CustomHashSet = collection._CustomHashSet$();
dart.addTypeTests(collection._CustomHashSet, _is__CustomHashSet_default);
const _is__CustomKeyHashSet_default = Symbol('_is__CustomKeyHashSet_default');
collection._CustomKeyHashSet$ = dart.generic(E => {
  let _CustomKeyHashSetOfE = () => (_CustomKeyHashSetOfE = dart.constFn(collection._CustomKeyHashSet$(E)))();
  class _CustomKeyHashSet extends collection._CustomHashSet$(E) {
    [_newSet]() {
      return new (_CustomKeyHashSetOfE()).new(this[_equals$0], this[_hashCode$], this[_validKey$]);
    }
    [_newSimilarSet](R) {
      return new (collection._HashSet$(R)).new();
    }
    contains(element) {
      if (!dart.test(this[_validKey$](element))) return false;
      return super.contains(element);
    }
    lookup(element) {
      if (!dart.test(this[_validKey$](element))) return null;
      return super.lookup(element);
    }
    remove(element) {
      if (!dart.test(this[_validKey$](element))) return false;
      return super.remove(element);
    }
  }
  (_CustomKeyHashSet.new = function(equals, hashCode, validKey) {
    this[_validKey$] = validKey;
    _CustomKeyHashSet.__proto__.new.call(this, equals, hashCode);
  }).prototype = _CustomKeyHashSet.prototype;
  dart.addTypeTests(_CustomKeyHashSet);
  _CustomKeyHashSet.prototype[_is__CustomKeyHashSet_default] = true;
  dart.setLibraryUri(_CustomKeyHashSet, "dart:collection");
  dart.setFieldSignature(_CustomKeyHashSet, () => ({
    __proto__: dart.getFields(_CustomKeyHashSet.__proto__),
    [_validKey$]: dart.fieldType(ObjectTobool())
  }));
  dart.defineExtensionMethods(_CustomKeyHashSet, ['contains']);
  return _CustomKeyHashSet;
});
collection._CustomKeyHashSet = collection._CustomKeyHashSet$();
dart.addTypeTests(collection._CustomKeyHashSet, _is__CustomKeyHashSet_default);
const _source$0 = dart.privateName(collection, "_source");
const _is_UnmodifiableListView_default = Symbol('_is_UnmodifiableListView_default');
collection.UnmodifiableListView$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) {
    cast(R) {
      return new (collection.UnmodifiableListView$(R)).new(core.Iterable$(R)._check(this[_source$0][$cast](R)));
    }
    get length() {
      return this[_source$0][$length];
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      return this[_source$0][$elementAt](index);
    }
  }
  (UnmodifiableListView.new = function(source) {
    this[_source$0] = source;
  }).prototype = UnmodifiableListView.prototype;
  dart.addTypeTests(UnmodifiableListView);
  UnmodifiableListView.prototype[_is_UnmodifiableListView_default] = true;
  dart.setMethodSignature(UnmodifiableListView, () => ({
    __proto__: dart.getMethods(UnmodifiableListView.__proto__),
    _get: dart.fnType(E, [core.int]),
    [$_get]: dart.fnType(E, [core.int])
  }));
  dart.setGetterSignature(UnmodifiableListView, () => ({
    __proto__: dart.getGetters(UnmodifiableListView.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(UnmodifiableListView, "dart:collection");
  dart.setFieldSignature(UnmodifiableListView, () => ({
    __proto__: dart.getFields(UnmodifiableListView.__proto__),
    [_source$0]: dart.finalFieldType(IterableOfE())
  }));
  dart.defineExtensionMethods(UnmodifiableListView, ['cast', '_get']);
  dart.defineExtensionAccessors(UnmodifiableListView, ['length']);
  return UnmodifiableListView;
});
collection.UnmodifiableListView = collection.UnmodifiableListView$();
dart.addTypeTests(collection.UnmodifiableListView, _is_UnmodifiableListView_default);
collection._defaultEquals = function(a, b) {
  return dart.equals(a, b);
};
collection._defaultHashCode = function(a) {
  return dart.hashCode(a);
};
const _is_HashMap_default = Symbol('_is_HashMap_default');
collection.HashMap$ = dart.generic((K, V) => {
  let IdentityMapOfK$V = () => (IdentityMapOfK$V = dart.constFn(_js_helper.IdentityMap$(K, V)))();
  let LinkedMapOfK$V = () => (LinkedMapOfK$V = dart.constFn(_js_helper.LinkedMap$(K, V)))();
  let CustomHashMapOfK$V = () => (CustomHashMapOfK$V = dart.constFn(_js_helper.CustomHashMap$(K, V)))();
  let CustomKeyHashMapOfK$V = () => (CustomKeyHashMapOfK$V = dart.constFn(_js_helper.CustomKeyHashMap$(K, V)))();
  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  class HashMap extends core.Object {
    static new(opts) {
      let equals = opts && 'equals' in opts ? opts.equals : null;
      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      if (isValidKey == null) {
        if (hashCode == null) {
          if (equals == null) {
            if (dart.wrapType(K) === dart.wrapType(core.String) || dart.wrapType(K) === dart.wrapType(core.int)) {
              return new (IdentityMapOfK$V()).new();
            }
            return new (LinkedMapOfK$V()).new();
          }
          hashCode = dart.hashCode;
        } else if (dart.fn(core.identityHashCode, ObjectToint()) === hashCode && dart.fn(core.identical, ObjectAndObjectTobool()) === equals) {
          return new (IdentityMapOfK$V()).new();
        }
        return new (CustomHashMapOfK$V()).new(equals != null ? equals : dart.equals, hashCode);
      }
      return new (CustomKeyHashMapOfK$V()).new(equals != null ? equals : dart.equals, hashCode != null ? hashCode : dart.hashCode, isValidKey);
    }
    static identity() {
      return new (IdentityMapOfK$V()).new();
    }
    static from(other) {
      let result = new (LinkedMapOfK$V()).new();
      other[$forEach](dart.fn((k, v) => {
        result[$_set](K._check(k), V._check(v));
      }, dynamicAnddynamicToNull()));
      return HashMapOfK$V()._check(result);
    }
    static of(other) {
      let _ = new (LinkedMapOfK$V()).new();
      _.addAll(other);
      return _;
    }
    static fromIterable(iterable, opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let value = opts && 'value' in opts ? opts.value : null;
      let map = new (LinkedMapOfK$V()).new();
      collection.MapBase._fillMapWithMappedIterable(map, iterable, key, value);
      return HashMapOfK$V()._check(map);
    }
    static fromIterables(keys, values) {
      let map = new (LinkedMapOfK$V()).new();
      collection.MapBase._fillMapWithIterables(map, keys, values);
      return HashMapOfK$V()._check(map);
    }
    static fromEntries(entries) {
      let _ = new (LinkedMapOfK$V()).new();
      _.addEntries(entries);
      return _;
    }
  }
  (HashMap[dart.mixinNew] = function() {
  }).prototype = HashMap.prototype;
  HashMap.prototype[dart.isMap] = true;
  dart.addTypeTests(HashMap);
  HashMap.prototype[_is_HashMap_default] = true;
  HashMap[dart.implements] = () => [MapOfK$V()];
  dart.setLibraryUri(HashMap, "dart:collection");
  return HashMap;
});
collection.HashMap = collection.HashMap$();
dart.addTypeTests(collection.HashMap, _is_HashMap_default);
const _is_HashSet_default = Symbol('_is_HashSet_default');
collection.HashSet$ = dart.generic(E => {
  let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
  let _CustomKeyHashSetOfE = () => (_CustomKeyHashSetOfE = dart.constFn(collection._CustomKeyHashSet$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  class HashSet extends core.Object {
    static new(opts) {
      let equals = opts && 'equals' in opts ? opts.equals : null;
      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      if (isValidKey == null) {
        if (hashCode == null) {
          if (equals == null) {
            if (dart.wrapType(E) === dart.wrapType(core.String) || dart.wrapType(E) === dart.wrapType(core.int)) {
              return new (_IdentityHashSetOfE()).new();
            }
            return new (_HashSetOfE()).new();
          }
          hashCode = dart.hashCode;
        } else if (dart.fn(core.identityHashCode, ObjectToint()) === hashCode && dart.fn(core.identical, ObjectAndObjectTobool()) === equals) {
          return new (_IdentityHashSetOfE()).new();
        }
        return new (_CustomHashSetOfE()).new(equals != null ? equals : dart.equals, hashCode != null ? hashCode : dart.hashCode);
      }
      return new (_CustomKeyHashSetOfE()).new(equals != null ? equals : dart.equals, hashCode != null ? hashCode : dart.hashCode, isValidKey);
    }
    static identity() {
      return new (_IdentityHashSetOfE()).new();
    }
    static from(elements) {
      let result = new (_HashSetOfE()).new();
      for (let e of elements) {
        result.add(E._check(e));
      }
      return result;
    }
    static of(elements) {
      let _ = new (_HashSetOfE()).new();
      _.addAll(elements);
      return _;
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
  }
  (HashSet[dart.mixinNew] = function() {
  }).prototype = HashSet.prototype;
  dart.addTypeTests(HashSet);
  HashSet.prototype[_is_HashSet_default] = true;
  HashSet[dart.implements] = () => [SetOfE()];
  dart.setLibraryUri(HashSet, "dart:collection");
  return HashSet;
});
collection.HashSet = collection.HashSet$();
dart.addTypeTests(collection.HashSet, _is_HashSet_default);
const _is_IterableMixin_default = Symbol('_is_IterableMixin_default');
collection.IterableMixin$ = dart.generic(E => {
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
  let FollowedByIterableOfE = () => (FollowedByIterableOfE = dart.constFn(_internal.FollowedByIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.fnType(E, [E, E])))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.fnType(E, [])))();
  class IterableMixin extends core.Object {
    cast(R) {
      return core.Iterable.castFrom(E, R, this);
    }
    map(T, f) {
      return _internal.MappedIterable$(E, T).new(this, f);
    }
    where(f) {
      return new (WhereIterableOfE()).new(this, f);
    }
    whereType(T) {
      return new (_internal.WhereTypeIterable$(T)).new(this);
    }
    expand(T, f) {
      return new (_internal.ExpandIterable$(E, T)).new(this, f);
    }
    followedBy(other) {
      IterableOfE()._check(other);
      let self = this;
      if (EfficientLengthIterableOfE().is(self)) {
        return FollowedByIterableOfE().firstEfficient(self, other);
      }
      return new (FollowedByIterableOfE()).new(this, other);
    }
    contains(element) {
      for (let e of this) {
        if (dart.equals(e, element)) return true;
      }
      return false;
    }
    forEach(f) {
      for (let element of this)
        f(element);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let value = iterator.current;
      while (dart.test(iterator.moveNext())) {
        value = combine(value, iterator.current);
      }
      return value;
    }
    fold(T, initialValue, combine) {
      let value = initialValue;
      for (let element of this)
        value = combine(value, element);
      return value;
    }
    every(f) {
      for (let element of this) {
        if (!dart.test(f(element))) return false;
      }
      return true;
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) return "";
      let buffer = new core.StringBuffer.new();
      if (separator == null || separator === "") {
        do {
          buffer.write(dart.str(iterator.current));
        } while (dart.test(iterator.moveNext()));
      } else {
        buffer.write(dart.str(iterator.current));
        while (dart.test(iterator.moveNext())) {
          buffer.write(separator);
          buffer.write(dart.str(iterator.current));
        }
      }
      return buffer.toString();
    }
    any(test) {
      for (let element of this) {
        if (dart.test(test(element))) return true;
      }
      return false;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return ListOfE().from(this, {growable: growable});
    }
    toSet() {
      return SetOfE().from(this);
    }
    get length() {
      if (!!_internal.EfficientLengthIterable.is(this)) dart.assertFailed(null, "dart:collection/iterable.dart", 103, 12, "this is! EfficientLengthIterable");
      let count = 0;
      let it = this[$iterator];
      while (dart.test(it.moveNext())) {
        count++;
      }
      return count;
    }
    get isEmpty() {
      return !dart.test(this[$iterator].moveNext());
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    take(count) {
      return TakeIterableOfE().new(this, count);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE()).new(this, test);
    }
    skip(count) {
      return SkipIterableOfE().new(this, count);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE()).new(this, test);
    }
    get first() {
      let it = this[$iterator];
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      return it.current;
    }
    get last() {
      let it = this[$iterator];
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = null;
      do {
        result = it.current;
      } while (dart.test(it.moveNext()));
      return result;
    }
    get single() {
      let it = this[$iterator];
      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
      let result = it.current;
      if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
      return result;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      for (let element of this) {
        if (dart.test(test(element))) return element;
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          if (foundMatching) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      core.ArgumentError.checkNotNull(index, "index");
      core.RangeError.checkNotNegative(index, "index");
      let elementIndex = 0;
      for (let element of this) {
        if (index === elementIndex) return element;
        elementIndex++;
      }
      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
    }
    toString() {
      return collection.IterableBase.iterableToShortString(this, "(", ")");
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
  }
  (IterableMixin.new = function() {
  }).prototype = IterableMixin.prototype;
  IterableMixin.prototype[dart.isIterable] = true;
  dart.addTypeTests(IterableMixin);
  IterableMixin.prototype[_is_IterableMixin_default] = true;
  IterableMixin[dart.implements] = () => [IterableOfE()];
  dart.setMethodSignature(IterableMixin, () => ({
    __proto__: dart.getMethods(IterableMixin.__proto__),
    cast: dart.gFnType(R => [core.Iterable$(R), []]),
    [$cast]: dart.gFnType(R => [core.Iterable$(R), []]),
    map: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    [$map]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    where: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$where]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    whereType: dart.gFnType(T => [core.Iterable$(T), []]),
    [$whereType]: dart.gFnType(T => [core.Iterable$(T), []]),
    expand: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    [$expand]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    followedBy: dart.fnType(core.Iterable$(E), [core.Object]),
    [$followedBy]: dart.fnType(core.Iterable$(E), [core.Object]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    reduce: dart.fnType(E, [core.Object]),
    [$reduce]: dart.fnType(E, [core.Object]),
    fold: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    [$fold]: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    every: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$every]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    join: dart.fnType(core.String, [], [core.String]),
    [$join]: dart.fnType(core.String, [], [core.String]),
    any: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$any]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    toList: dart.fnType(core.List$(E), [], {growable: core.bool}),
    [$toList]: dart.fnType(core.List$(E), [], {growable: core.bool}),
    toSet: dart.fnType(core.Set$(E), []),
    [$toSet]: dart.fnType(core.Set$(E), []),
    take: dart.fnType(core.Iterable$(E), [core.int]),
    [$take]: dart.fnType(core.Iterable$(E), [core.int]),
    takeWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$takeWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    skip: dart.fnType(core.Iterable$(E), [core.int]),
    [$skip]: dart.fnType(core.Iterable$(E), [core.int]),
    skipWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$skipWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    firstWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$firstWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    lastWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    singleWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$singleWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int]),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, [])
  }));
  dart.setGetterSignature(IterableMixin, () => ({
    __proto__: dart.getGetters(IterableMixin.__proto__),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    first: E,
    [$first]: E,
    last: E,
    [$last]: E,
    single: E,
    [$single]: E
  }));
  dart.setLibraryUri(IterableMixin, "dart:collection");
  dart.defineExtensionMethods(IterableMixin, [
    'cast',
    'map',
    'where',
    'whereType',
    'expand',
    'followedBy',
    'contains',
    'forEach',
    'reduce',
    'fold',
    'every',
    'join',
    'any',
    'toList',
    'toSet',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'toString'
  ]);
  dart.defineExtensionAccessors(IterableMixin, [
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single'
  ]);
  return IterableMixin;
});
collection.IterableMixin = collection.IterableMixin$();
dart.addTypeTests(collection.IterableMixin, _is_IterableMixin_default);
dart.defineLazy(collection, {
  /*collection._toStringVisiting*/get _toStringVisiting() {
    return [];
  }
});
collection._isToStringVisiting = function(o) {
  for (let i = 0; i < dart.notNull(collection._toStringVisiting[$length]); i++) {
    if (core.identical(o, collection._toStringVisiting[$_get](i))) return true;
  }
  return false;
};
collection._iterablePartsToStrings = function(iterable, parts) {
  let lengthLimit = 80;
  let headCount = 3;
  let tailCount = 2;
  let maxCount = 100;
  let overhead = 2;
  let ellipsisSize = 3;
  let length = 0;
  let count = 0;
  let it = iterable[$iterator];
  while (length < lengthLimit || count < headCount) {
    if (!dart.test(it.moveNext())) return;
    let next = dart.str(it.current);
    parts[$add](next);
    length = length + (next.length + overhead);
    count++;
  }
  let penultimateString = null;
  let ultimateString = null;
  let penultimate = null;
  let ultimate = null;
  if (!dart.test(it.moveNext())) {
    if (count <= headCount + tailCount) return;
    ultimateString = parts[$removeLast]();
    penultimateString = parts[$removeLast]();
  } else {
    penultimate = it.current;
    count++;
    if (!dart.test(it.moveNext())) {
      if (count <= headCount + 1) {
        parts[$add](dart.str(penultimate));
        return;
      }
      ultimateString = dart.str(penultimate);
      penultimateString = parts[$removeLast]();
      length = length + (ultimateString.length + overhead);
    } else {
      ultimate = it.current;
      count++;
      if (!(count < maxCount)) dart.assertFailed(null, "dart:collection/iterable.dart", 351, 14, "count < maxCount");
      while (dart.test(it.moveNext())) {
        penultimate = ultimate;
        ultimate = it.current;
        count++;
        if (count > maxCount) {
          while (length > lengthLimit - ellipsisSize - overhead && count > headCount) {
            length = length - (parts[$removeLast]().length + overhead);
            count--;
          }
          parts[$add]("...");
          return;
        }
      }
      penultimateString = dart.str(penultimate);
      ultimateString = dart.str(ultimate);
      length = length + (ultimateString.length + penultimateString.length + 2 * overhead);
    }
  }
  let elision = null;
  if (count > dart.notNull(parts[$length]) + tailCount) {
    elision = "...";
    length = length + (ellipsisSize + overhead);
  }
  while (length > lengthLimit && dart.notNull(parts[$length]) > headCount) {
    length = length - (parts[$removeLast]().length + overhead);
    if (elision == null) {
      elision = "...";
      length = length + (ellipsisSize + overhead);
    }
  }
  if (elision != null) {
    parts[$add](elision);
  }
  parts[$add](penultimateString);
  parts[$add](ultimateString);
};
const _iterator$0 = dart.privateName(collection, "_iterator");
const _state$ = dart.privateName(collection, "_state");
const _move = dart.privateName(collection, "_move");
const _is_HasNextIterator_default = Symbol('_is_HasNextIterator_default');
collection.HasNextIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class HasNextIterator extends core.Object {
    get hasNext() {
      if (this[_state$] === 2) this[_move]();
      return this[_state$] === 0;
    }
    next() {
      if (!dart.test(this.hasNext)) dart.throw(new core.StateError.new("No more elements"));
      if (!(this[_state$] === 0)) dart.assertFailed(null, "dart:collection/iterator.dart", 30, 12, "_state == _HAS_NEXT_AND_NEXT_IN_CURRENT");
      let result = this[_iterator$0].current;
      this[_move]();
      return result;
    }
    [_move]() {
      if (dart.test(this[_iterator$0].moveNext())) {
        this[_state$] = 0;
      } else {
        this[_state$] = 1;
      }
    }
  }
  (HasNextIterator.new = function(iterator) {
    this[_state$] = 2;
    this[_iterator$0] = iterator;
  }).prototype = HasNextIterator.prototype;
  dart.addTypeTests(HasNextIterator);
  HasNextIterator.prototype[_is_HasNextIterator_default] = true;
  dart.setMethodSignature(HasNextIterator, () => ({
    __proto__: dart.getMethods(HasNextIterator.__proto__),
    next: dart.fnType(E, []),
    [_move]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(HasNextIterator, () => ({
    __proto__: dart.getGetters(HasNextIterator.__proto__),
    hasNext: core.bool
  }));
  dart.setLibraryUri(HasNextIterator, "dart:collection");
  dart.setFieldSignature(HasNextIterator, () => ({
    __proto__: dart.getFields(HasNextIterator.__proto__),
    [_iterator$0]: dart.fieldType(IteratorOfE()),
    [_state$]: dart.fieldType(core.int)
  }));
  return HasNextIterator;
});
collection.HasNextIterator = collection.HasNextIterator$();
dart.defineLazy(collection.HasNextIterator, {
  /*collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT*/get _HAS_NEXT_AND_NEXT_IN_CURRENT() {
    return 0;
  },
  /*collection.HasNextIterator._NO_NEXT*/get _NO_NEXT() {
    return 1;
  },
  /*collection.HasNextIterator._NOT_MOVED_YET*/get _NOT_MOVED_YET() {
    return 2;
  }
});
dart.addTypeTests(collection.HasNextIterator, _is_HasNextIterator_default);
const _is_LinkedHashMap_default = Symbol('_is_LinkedHashMap_default');
collection.LinkedHashMap$ = dart.generic((K, V) => {
  let IdentityMapOfK$V = () => (IdentityMapOfK$V = dart.constFn(_js_helper.IdentityMap$(K, V)))();
  let LinkedMapOfK$V = () => (LinkedMapOfK$V = dart.constFn(_js_helper.LinkedMap$(K, V)))();
  let CustomHashMapOfK$V = () => (CustomHashMapOfK$V = dart.constFn(_js_helper.CustomHashMap$(K, V)))();
  let CustomKeyHashMapOfK$V = () => (CustomKeyHashMapOfK$V = dart.constFn(_js_helper.CustomKeyHashMap$(K, V)))();
  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  class LinkedHashMap extends core.Object {
    static new(opts) {
      let equals = opts && 'equals' in opts ? opts.equals : null;
      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      if (isValidKey == null) {
        if (hashCode == null) {
          if (equals == null) {
            if (dart.wrapType(K) === dart.wrapType(core.String) || dart.wrapType(K) === dart.wrapType(core.int)) {
              return new (IdentityMapOfK$V()).new();
            }
            return new (LinkedMapOfK$V()).new();
          }
          hashCode = dart.hashCode;
        } else if (dart.fn(core.identityHashCode, ObjectToint()) === hashCode && dart.fn(core.identical, ObjectAndObjectTobool()) === equals) {
          return new (IdentityMapOfK$V()).new();
        }
        return new (CustomHashMapOfK$V()).new(equals != null ? equals : dart.equals, hashCode);
      }
      return new (CustomKeyHashMapOfK$V()).new(equals != null ? equals : dart.equals, hashCode != null ? hashCode : dart.hashCode, isValidKey);
    }
    static identity() {
      return new (IdentityMapOfK$V()).new();
    }
    static from(other) {
      let result = new (LinkedMapOfK$V()).new();
      other[$forEach](dart.fn((k, v) => {
        result._set(K._check(k), V._check(v));
      }, dynamicAnddynamicToNull()));
      return result;
    }
    static of(other) {
      let _ = new (LinkedMapOfK$V()).new();
      _.addAll(other);
      return _;
    }
    static fromIterable(iterable, opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let value = opts && 'value' in opts ? opts.value : null;
      let map = new (LinkedMapOfK$V()).new();
      collection.MapBase._fillMapWithMappedIterable(map, iterable, key, value);
      return map;
    }
    static fromIterables(keys, values) {
      let map = new (LinkedMapOfK$V()).new();
      collection.MapBase._fillMapWithIterables(map, keys, values);
      return map;
    }
    static fromEntries(entries) {
      return LinkedHashMapOfK$V()._check((() => {
        let _ = new (LinkedMapOfK$V()).new();
        _[$addEntries](entries);
        return _;
      })());
    }
  }
  (LinkedHashMap[dart.mixinNew] = function() {
  }).prototype = LinkedHashMap.prototype;
  LinkedHashMap.prototype[dart.isMap] = true;
  dart.addTypeTests(LinkedHashMap);
  LinkedHashMap.prototype[_is_LinkedHashMap_default] = true;
  LinkedHashMap[dart.implements] = () => [MapOfK$V()];
  dart.setLibraryUri(LinkedHashMap, "dart:collection");
  return LinkedHashMap;
});
collection.LinkedHashMap = collection.LinkedHashMap$();
dart.addTypeTests(collection.LinkedHashMap, _is_LinkedHashMap_default);
const _is_LinkedHashSet_default = Symbol('_is_LinkedHashSet_default');
collection.LinkedHashSet$ = dart.generic(E => {
  let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
  let _CustomKeyHashSetOfE = () => (_CustomKeyHashSetOfE = dart.constFn(collection._CustomKeyHashSet$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  class LinkedHashSet extends core.Object {
    static new(opts) {
      let equals = opts && 'equals' in opts ? opts.equals : null;
      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      if (isValidKey == null) {
        if (hashCode == null) {
          if (equals == null) {
            if (dart.wrapType(E) === dart.wrapType(core.String) || dart.wrapType(E) === dart.wrapType(core.int)) {
              return new (_IdentityHashSetOfE()).new();
            }
            return new (_HashSetOfE()).new();
          }
          hashCode = dart.hashCode;
        } else if (dart.fn(core.identityHashCode, ObjectToint()) === hashCode && dart.fn(core.identical, ObjectAndObjectTobool()) === equals) {
          return new (_IdentityHashSetOfE()).new();
        }
        return new (_CustomHashSetOfE()).new(equals != null ? equals : dart.equals, hashCode != null ? hashCode : dart.hashCode);
      }
      return new (_CustomKeyHashSetOfE()).new(equals != null ? equals : dart.equals, hashCode != null ? hashCode : dart.hashCode, isValidKey);
    }
    static identity() {
      return new (_IdentityHashSetOfE()).new();
    }
    static from(elements) {
      let result = new (_HashSetOfE()).new();
      for (let element of elements) {
        result.add(E._check(element));
      }
      return result;
    }
    static of(elements) {
      let _ = new (_HashSetOfE()).new();
      _.addAll(elements);
      return _;
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
  }
  (LinkedHashSet[dart.mixinNew] = function() {
  }).prototype = LinkedHashSet.prototype;
  dart.addTypeTests(LinkedHashSet);
  LinkedHashSet.prototype[_is_LinkedHashSet_default] = true;
  LinkedHashSet[dart.implements] = () => [SetOfE()];
  dart.setLibraryUri(LinkedHashSet, "dart:collection");
  return LinkedHashSet;
});
collection.LinkedHashSet = collection.LinkedHashSet$();
dart.addTypeTests(collection.LinkedHashSet, _is_LinkedHashSet_default);
const _modificationCount = dart.privateName(collection, "_modificationCount");
const _length$0 = dart.privateName(collection, "_length");
const _first$ = dart.privateName(collection, "_first");
const _insertBefore = dart.privateName(collection, "_insertBefore");
const _list$ = dart.privateName(collection, "_list");
const _unlink = dart.privateName(collection, "_unlink");
const _next$0 = dart.privateName(collection, "_next");
const _previous$0 = dart.privateName(collection, "_previous");
const _is_LinkedList_default$ = Symbol('_is_LinkedList_default');
collection.LinkedList$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
  class LinkedList extends core.Iterable$(E) {
    addFirst(entry) {
      E._check(entry);
      this[_insertBefore](this[_first$], entry, {updateFirst: true});
      this[_first$] = entry;
    }
    add(entry) {
      E._check(entry);
      this[_insertBefore](this[_first$], entry, {updateFirst: false});
    }
    addAll(entries) {
      IterableOfE()._check(entries);
      entries[$forEach](dart.bind(this, 'add'));
    }
    remove(entry) {
      E._check(entry);
      if (!dart.equals(entry[_list$], this)) return false;
      this[_unlink](entry);
      return true;
    }
    get iterator() {
      return new (_LinkedListIteratorOfE()).new(this);
    }
    get length() {
      return this[_length$0];
    }
    clear() {
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      if (dart.test(this.isEmpty)) return;
      let next = this[_first$];
      do {
        let entry = next;
        next = entry[_next$0];
        entry[_next$0] = entry[_previous$0] = entry[_list$] = null;
      } while (!(next == this[_first$]));
      this[_first$] = null;
      this[_length$0] = 0;
    }
    get first() {
      if (dart.test(this.isEmpty)) {
        dart.throw(new core.StateError.new("No such element"));
      }
      return this[_first$];
    }
    get last() {
      if (dart.test(this.isEmpty)) {
        dart.throw(new core.StateError.new("No such element"));
      }
      return this[_first$][_previous$0];
    }
    get single() {
      if (dart.test(this.isEmpty)) {
        dart.throw(new core.StateError.new("No such element"));
      }
      if (dart.notNull(this[_length$0]) > 1) {
        dart.throw(new core.StateError.new("Too many elements"));
      }
      return this[_first$];
    }
    forEach(action) {
      let modificationCount = this[_modificationCount];
      if (dart.test(this.isEmpty)) return;
      let current = this[_first$];
      do {
        action(current);
        if (modificationCount != this[_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
        current = current[_next$0];
      } while (!(current == this[_first$]));
    }
    get isEmpty() {
      return this[_length$0] === 0;
    }
    [_insertBefore](entry, newEntry, opts) {
      E._check(entry);
      E._check(newEntry);
      let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
      if (newEntry.list != null) {
        dart.throw(new core.StateError.new("LinkedListEntry is already in a LinkedList"));
      }
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      newEntry[_list$] = this;
      if (dart.test(this.isEmpty)) {
        if (!(entry == null)) dart.assertFailed(null, "dart:collection/linked_list.dart", 139, 14, "entry == null");
        newEntry[_previous$0] = newEntry[_next$0] = newEntry;
        this[_first$] = newEntry;
        this[_length$0] = dart.notNull(this[_length$0]) + 1;
        return;
      }
      let predecessor = entry[_previous$0];
      let successor = entry;
      newEntry[_previous$0] = predecessor;
      newEntry[_next$0] = successor;
      predecessor[_next$0] = newEntry;
      successor[_previous$0] = newEntry;
      if (dart.test(updateFirst) && entry == this[_first$]) {
        this[_first$] = newEntry;
      }
      this[_length$0] = dart.notNull(this[_length$0]) + 1;
    }
    [_unlink](entry) {
      E._check(entry);
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      entry[_next$0][_previous$0] = entry[_previous$0];
      let next = entry[_previous$0][_next$0] = entry[_next$0];
      this[_length$0] = dart.notNull(this[_length$0]) - 1;
      entry[_list$] = entry[_next$0] = entry[_previous$0] = null;
      if (dart.test(this.isEmpty)) {
        this[_first$] = null;
      } else if (entry == this[_first$]) {
        this[_first$] = next;
      }
    }
  }
  (LinkedList.new = function() {
    this[_modificationCount] = 0;
    this[_length$0] = 0;
    this[_first$] = null;
    LinkedList.__proto__.new.call(this);
  }).prototype = LinkedList.prototype;
  dart.addTypeTests(LinkedList);
  LinkedList.prototype[_is_LinkedList_default$] = true;
  dart.setMethodSignature(LinkedList, () => ({
    __proto__: dart.getMethods(LinkedList.__proto__),
    addFirst: dart.fnType(dart.void, [core.Object]),
    add: dart.fnType(dart.void, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [_insertBefore]: dart.fnType(dart.void, [core.Object, core.Object], {updateFirst: core.bool}),
    [_unlink]: dart.fnType(dart.void, [core.Object])
  }));
  dart.setGetterSignature(LinkedList, () => ({
    __proto__: dart.getGetters(LinkedList.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(LinkedList, "dart:collection");
  dart.setFieldSignature(LinkedList, () => ({
    __proto__: dart.getFields(LinkedList.__proto__),
    [_modificationCount]: dart.fieldType(core.int),
    [_length$0]: dart.fieldType(core.int),
    [_first$]: dart.fieldType(E)
  }));
  dart.defineExtensionMethods(LinkedList, ['forEach']);
  dart.defineExtensionAccessors(LinkedList, [
    'iterator',
    'length',
    'first',
    'last',
    'single',
    'isEmpty'
  ]);
  return LinkedList;
});
collection.LinkedList = collection.LinkedList$();
dart.addTypeTests(collection.LinkedList, _is_LinkedList_default$);
const _visitedFirst = dart.privateName(collection, "_visitedFirst");
const _current$1 = dart.privateName(collection, "_current");
const _is__LinkedListIterator_default$ = Symbol('_is__LinkedListIterator_default');
collection._LinkedListIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
  let LinkedListEntryOfE = () => (LinkedListEntryOfE = dart.constFn(collection.LinkedListEntry$(E)))();
  class _LinkedListIterator extends core.Object {
    get current() {
      return this[_current$1];
    }
    moveNext() {
      if (this[_modificationCount] != this[_list$][_modificationCount]) {
        dart.throw(new core.ConcurrentModificationError.new(this));
      }
      if (dart.test(this[_list$].isEmpty) || dart.test(this[_visitedFirst]) && this[_next$0] == this[_list$].first) {
        this[_current$1] = null;
        return false;
      }
      this[_visitedFirst] = true;
      this[_current$1] = E._check(this[_next$0]);
      this[_next$0] = this[_next$0][_next$0];
      return true;
    }
  }
  (_LinkedListIterator.new = function(list) {
    this[_current$1] = null;
    this[_list$] = list;
    this[_modificationCount] = list[_modificationCount];
    this[_next$0] = list[_first$];
    this[_visitedFirst] = false;
  }).prototype = _LinkedListIterator.prototype;
  dart.addTypeTests(_LinkedListIterator);
  _LinkedListIterator.prototype[_is__LinkedListIterator_default$] = true;
  _LinkedListIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(_LinkedListIterator, () => ({
    __proto__: dart.getMethods(_LinkedListIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(_LinkedListIterator, () => ({
    __proto__: dart.getGetters(_LinkedListIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(_LinkedListIterator, "dart:collection");
  dart.setFieldSignature(_LinkedListIterator, () => ({
    __proto__: dart.getFields(_LinkedListIterator.__proto__),
    [_list$]: dart.finalFieldType(LinkedListOfE()),
    [_modificationCount]: dart.finalFieldType(core.int),
    [_current$1]: dart.fieldType(E),
    [_next$0]: dart.fieldType(LinkedListEntryOfE()),
    [_visitedFirst]: dart.fieldType(core.bool)
  }));
  return _LinkedListIterator;
});
collection._LinkedListIterator = collection._LinkedListIterator$();
dart.addTypeTests(collection._LinkedListIterator, _is__LinkedListIterator_default$);
const _is_LinkedListEntry_default$ = Symbol('_is_LinkedListEntry_default');
collection.LinkedListEntry$ = dart.generic(E => {
  let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
  class LinkedListEntry extends core.Object {
    get list() {
      return this[_list$];
    }
    unlink() {
      this[_list$][_unlink](E._check(this));
    }
    get next() {
      if (this[_list$] == null || this[_list$].first == this[_next$0]) return null;
      return this[_next$0];
    }
    get previous() {
      if (this[_list$] == null || this === this[_list$].first) return null;
      return this[_previous$0];
    }
    insertAfter(entry) {
      E._check(entry);
      this[_list$][_insertBefore](this[_next$0], entry, {updateFirst: false});
    }
    insertBefore(entry) {
      E._check(entry);
      this[_list$][_insertBefore](E._check(this), entry, {updateFirst: true});
    }
  }
  (LinkedListEntry.new = function() {
    this[_list$] = null;
    this[_next$0] = null;
    this[_previous$0] = null;
  }).prototype = LinkedListEntry.prototype;
  dart.addTypeTests(LinkedListEntry);
  LinkedListEntry.prototype[_is_LinkedListEntry_default$] = true;
  dart.setMethodSignature(LinkedListEntry, () => ({
    __proto__: dart.getMethods(LinkedListEntry.__proto__),
    unlink: dart.fnType(dart.void, []),
    insertAfter: dart.fnType(dart.void, [core.Object]),
    insertBefore: dart.fnType(dart.void, [core.Object])
  }));
  dart.setGetterSignature(LinkedListEntry, () => ({
    __proto__: dart.getGetters(LinkedListEntry.__proto__),
    list: collection.LinkedList$(E),
    next: E,
    previous: E
  }));
  dart.setLibraryUri(LinkedListEntry, "dart:collection");
  dart.setFieldSignature(LinkedListEntry, () => ({
    __proto__: dart.getFields(LinkedListEntry.__proto__),
    [_list$]: dart.fieldType(LinkedListOfE()),
    [_next$0]: dart.fieldType(E),
    [_previous$0]: dart.fieldType(E)
  }));
  return LinkedListEntry;
});
collection.LinkedListEntry = collection.LinkedListEntry$();
dart.addTypeTests(collection.LinkedListEntry, _is_LinkedListEntry_default$);
const _is__MapBaseValueIterable_default = Symbol('_is__MapBaseValueIterable_default');
collection._MapBaseValueIterable$ = dart.generic((K, V) => {
  let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  class _MapBaseValueIterable extends _internal.EfficientLengthIterable$(V) {
    get length() {
      return this[_map$0][$length];
    }
    get isEmpty() {
      return this[_map$0][$isEmpty];
    }
    get isNotEmpty() {
      return this[_map$0][$isNotEmpty];
    }
    get first() {
      return this[_map$0][$_get](this[_map$0][$keys][$first]);
    }
    get single() {
      return this[_map$0][$_get](this[_map$0][$keys][$single]);
    }
    get last() {
      return this[_map$0][$_get](this[_map$0][$keys][$last]);
    }
    get iterator() {
      return new (_MapBaseValueIteratorOfK$V()).new(this[_map$0]);
    }
  }
  (_MapBaseValueIterable.new = function(map) {
    this[_map$0] = map;
    _MapBaseValueIterable.__proto__.new.call(this);
  }).prototype = _MapBaseValueIterable.prototype;
  dart.addTypeTests(_MapBaseValueIterable);
  _MapBaseValueIterable.prototype[_is__MapBaseValueIterable_default] = true;
  dart.setGetterSignature(_MapBaseValueIterable, () => ({
    __proto__: dart.getGetters(_MapBaseValueIterable.__proto__),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    first: V,
    [$first]: V,
    single: V,
    [$single]: V,
    last: V,
    [$last]: V,
    iterator: core.Iterator$(V),
    [$iterator]: core.Iterator$(V)
  }));
  dart.setLibraryUri(_MapBaseValueIterable, "dart:collection");
  dart.setFieldSignature(_MapBaseValueIterable, () => ({
    __proto__: dart.getFields(_MapBaseValueIterable.__proto__),
    [_map$0]: dart.finalFieldType(MapOfK$V())
  }));
  dart.defineExtensionAccessors(_MapBaseValueIterable, [
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'single',
    'last',
    'iterator'
  ]);
  return _MapBaseValueIterable;
});
collection._MapBaseValueIterable = collection._MapBaseValueIterable$();
dart.addTypeTests(collection._MapBaseValueIterable, _is__MapBaseValueIterable_default);
const _keys = dart.privateName(collection, "_keys");
const _is__MapBaseValueIterator_default = Symbol('_is__MapBaseValueIterator_default');
collection._MapBaseValueIterator$ = dart.generic((K, V) => {
  let IteratorOfK = () => (IteratorOfK = dart.constFn(core.Iterator$(K)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let IteratorOfV = () => (IteratorOfV = dart.constFn(core.Iterator$(V)))();
  class _MapBaseValueIterator extends core.Object {
    moveNext() {
      if (dart.test(this[_keys].moveNext())) {
        this[_current$1] = this[_map$0][$_get](this[_keys].current);
        return true;
      }
      this[_current$1] = null;
      return false;
    }
    get current() {
      return this[_current$1];
    }
  }
  (_MapBaseValueIterator.new = function(map) {
    this[_current$1] = null;
    this[_map$0] = map;
    this[_keys] = map[$keys][$iterator];
  }).prototype = _MapBaseValueIterator.prototype;
  dart.addTypeTests(_MapBaseValueIterator);
  _MapBaseValueIterator.prototype[_is__MapBaseValueIterator_default] = true;
  _MapBaseValueIterator[dart.implements] = () => [IteratorOfV()];
  dart.setMethodSignature(_MapBaseValueIterator, () => ({
    __proto__: dart.getMethods(_MapBaseValueIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(_MapBaseValueIterator, () => ({
    __proto__: dart.getGetters(_MapBaseValueIterator.__proto__),
    current: V
  }));
  dart.setLibraryUri(_MapBaseValueIterator, "dart:collection");
  dart.setFieldSignature(_MapBaseValueIterator, () => ({
    __proto__: dart.getFields(_MapBaseValueIterator.__proto__),
    [_keys]: dart.finalFieldType(IteratorOfK()),
    [_map$0]: dart.finalFieldType(MapOfK$V()),
    [_current$1]: dart.fieldType(V)
  }));
  return _MapBaseValueIterator;
});
collection._MapBaseValueIterator = collection._MapBaseValueIterator$();
dart.addTypeTests(collection._MapBaseValueIterator, _is__MapBaseValueIterator_default);
const _is_MapView_default = Symbol('_is_MapView_default');
collection.MapView$ = dart.generic((K, V) => {
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let MapEntryOfK$V = () => (MapEntryOfK$V = dart.constFn(core.MapEntry$(K, V)))();
  let IterableOfMapEntryOfK$V = () => (IterableOfMapEntryOfK$V = dart.constFn(core.Iterable$(MapEntryOfK$V())))();
  let KAndVToV = () => (KAndVToV = dart.constFn(dart.fnType(V, [K, V])))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  let VToV = () => (VToV = dart.constFn(dart.fnType(V, [V])))();
  class MapView extends core.Object {
    cast(RK, RV) {
      return core.Map$(RK, RV)._check(this[_map$0][$cast](RK, RV));
    }
    _get(key) {
      return this[_map$0][$_get](key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      this[_map$0][$_set](key, value);
      return value;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      this[_map$0][$addAll](other);
    }
    clear() {
      this[_map$0][$clear]();
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      return this[_map$0][$putIfAbsent](key, ifAbsent);
    }
    containsKey(key) {
      return this[_map$0][$containsKey](key);
    }
    containsValue(value) {
      return this[_map$0][$containsValue](value);
    }
    forEach(action) {
      this[_map$0][$forEach](action);
    }
    get isEmpty() {
      return this[_map$0][$isEmpty];
    }
    get isNotEmpty() {
      return this[_map$0][$isNotEmpty];
    }
    get length() {
      return this[_map$0][$length];
    }
    get keys() {
      return this[_map$0][$keys];
    }
    remove(key) {
      return this[_map$0][$remove](key);
    }
    toString() {
      return dart.toString(this[_map$0]);
    }
    get values() {
      return this[_map$0][$values];
    }
    get entries() {
      return this[_map$0][$entries];
    }
    addEntries(entries) {
      IterableOfMapEntryOfK$V()._check(entries);
      this[_map$0][$addEntries](entries);
    }
    map(K2, V2, transform) {
      return core.Map$(K2, V2)._check(this[_map$0][$map](K2, V2, transform));
    }
    update(key, update, opts) {
      K._check(key);
      VToV()._check(update);
      let ifAbsent = opts && 'ifAbsent' in opts ? opts.ifAbsent : null;
      VoidToV()._check(ifAbsent);
      return this[_map$0][$update](key, update, {ifAbsent: ifAbsent});
    }
    updateAll(update) {
      KAndVToV()._check(update);
      this[_map$0][$updateAll](update);
    }
    removeWhere(test) {
      this[_map$0][$removeWhere](test);
    }
  }
  (MapView.new = function(map) {
    this[_map$0] = map;
  }).prototype = MapView.prototype;
  MapView.prototype[dart.isMap] = true;
  dart.addTypeTests(MapView);
  MapView.prototype[_is_MapView_default] = true;
  MapView[dart.implements] = () => [MapOfK$V()];
  dart.setMethodSignature(MapView, () => ({
    __proto__: dart.getMethods(MapView.__proto__),
    cast: dart.gFnType((RK, RV) => [core.Map$(RK, RV), []]),
    [$cast]: dart.gFnType((RK, RV) => [core.Map$(RK, RV), []]),
    _get: dart.fnType(V, [core.Object]),
    [$_get]: dart.fnType(V, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, []),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    containsKey: dart.fnType(core.bool, [core.Object]),
    [$containsKey]: dart.fnType(core.bool, [core.Object]),
    containsValue: dart.fnType(core.bool, [core.Object]),
    [$containsValue]: dart.fnType(core.bool, [core.Object]),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [K, V])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [K, V])]),
    remove: dart.fnType(V, [core.Object]),
    [$remove]: dart.fnType(V, [core.Object]),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, []),
    addEntries: dart.fnType(dart.void, [core.Object]),
    [$addEntries]: dart.fnType(dart.void, [core.Object]),
    map: dart.gFnType((K2, V2) => [core.Map$(K2, V2), [dart.fnType(core.MapEntry$(K2, V2), [K, V])]]),
    [$map]: dart.gFnType((K2, V2) => [core.Map$(K2, V2), [dart.fnType(core.MapEntry$(K2, V2), [K, V])]]),
    update: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    [$update]: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    updateAll: dart.fnType(dart.void, [core.Object]),
    [$updateAll]: dart.fnType(dart.void, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [K, V])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [K, V])])
  }));
  dart.setGetterSignature(MapView, () => ({
    __proto__: dart.getGetters(MapView.__proto__),
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    length: core.int,
    [$length]: core.int,
    keys: core.Iterable$(K),
    [$keys]: core.Iterable$(K),
    values: core.Iterable$(V),
    [$values]: core.Iterable$(V),
    entries: core.Iterable$(core.MapEntry$(K, V)),
    [$entries]: core.Iterable$(core.MapEntry$(K, V))
  }));
  dart.setLibraryUri(MapView, "dart:collection");
  dart.setFieldSignature(MapView, () => ({
    __proto__: dart.getFields(MapView.__proto__),
    [_map$0]: dart.finalFieldType(MapOfK$V())
  }));
  dart.defineExtensionMethods(MapView, [
    'cast',
    '_get',
    '_set',
    'addAll',
    'clear',
    'putIfAbsent',
    'containsKey',
    'containsValue',
    'forEach',
    'remove',
    'toString',
    'addEntries',
    'map',
    'update',
    'updateAll',
    'removeWhere'
  ]);
  dart.defineExtensionAccessors(MapView, [
    'isEmpty',
    'isNotEmpty',
    'length',
    'keys',
    'values',
    'entries'
  ]);
  return MapView;
});
collection.MapView = collection.MapView$();
dart.addTypeTests(collection.MapView, _is_MapView_default);
const _is_UnmodifiableMapView_default = Symbol('_is_UnmodifiableMapView_default');
collection.UnmodifiableMapView$ = dart.generic((K, V) => {
  const MapView__UnmodifiableMapMixin$ = class MapView__UnmodifiableMapMixin extends collection.MapView$(K, V) {};
  (MapView__UnmodifiableMapMixin$.new = function(map) {
    MapView__UnmodifiableMapMixin$.__proto__.new.call(this, map);
  }).prototype = MapView__UnmodifiableMapMixin$.prototype;
  dart.applyMixin(MapView__UnmodifiableMapMixin$, collection._UnmodifiableMapMixin$(K, V));
  class UnmodifiableMapView extends MapView__UnmodifiableMapMixin$ {
    cast(RK, RV) {
      return new (collection.UnmodifiableMapView$(RK, RV)).new(core.Map$(RK, RV)._check(this[_map$0][$cast](RK, RV)));
    }
  }
  (UnmodifiableMapView.new = function(map) {
    UnmodifiableMapView.__proto__.new.call(this, map);
  }).prototype = UnmodifiableMapView.prototype;
  dart.addTypeTests(UnmodifiableMapView);
  UnmodifiableMapView.prototype[_is_UnmodifiableMapView_default] = true;
  dart.setLibraryUri(UnmodifiableMapView, "dart:collection");
  dart.defineExtensionMethods(UnmodifiableMapView, ['cast']);
  return UnmodifiableMapView;
});
collection.UnmodifiableMapView = collection.UnmodifiableMapView$();
dart.addTypeTests(collection.UnmodifiableMapView, _is_UnmodifiableMapView_default);
const _is_Queue_default = Symbol('_is_Queue_default');
collection.Queue$ = dart.generic(E => {
  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
  class Queue extends core.Object {
    static new() {
      return new (ListQueueOfE()).new();
    }
    static from(elements) {
      return ListQueueOfE().from(elements);
    }
    static of(elements) {
      return ListQueueOfE().of(elements);
    }
    static castFrom(S, T, source) {
      return new (_internal.CastQueue$(S, T)).new(source);
    }
  }
  (Queue[dart.mixinNew] = function() {
  }).prototype = Queue.prototype;
  dart.addTypeTests(Queue);
  Queue.prototype[_is_Queue_default] = true;
  Queue[dart.implements] = () => [EfficientLengthIterableOfE()];
  dart.setLibraryUri(Queue, "dart:collection");
  return Queue;
});
collection.Queue = collection.Queue$();
dart.addTypeTests(collection.Queue, _is_Queue_default);
const _previousLink = dart.privateName(collection, "_previousLink");
const _nextLink = dart.privateName(collection, "_nextLink");
const _link = dart.privateName(collection, "_link");
const _is__DoubleLink_default = Symbol('_is__DoubleLink_default');
collection._DoubleLink$ = dart.generic(Link => {
  class _DoubleLink extends core.Object {
    get [_previousLink]() {
      return this[_previousLink$];
    }
    set [_previousLink](value) {
      this[_previousLink$] = Link._check(value);
    }
    get [_nextLink]() {
      return this[_nextLink$];
    }
    set [_nextLink](value) {
      this[_nextLink$] = Link._check(value);
    }
    [_link](previous, next) {
      Link._check(previous);
      Link._check(next);
      this[_nextLink] = next;
      this[_previousLink] = previous;
      if (previous != null) previous[_nextLink] = Link._check(this);
      if (next != null) next[_previousLink] = Link._check(this);
    }
    [_unlink]() {
      if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
      if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
      this[_nextLink] = null;
      this[_previousLink] = null;
    }
  }
  (_DoubleLink.new = function() {
    this[_previousLink$] = null;
    this[_nextLink$] = null;
  }).prototype = _DoubleLink.prototype;
  dart.addTypeTests(_DoubleLink);
  _DoubleLink.prototype[_is__DoubleLink_default] = true;
  const _previousLink$ = Symbol("_DoubleLink._previousLink");
  const _nextLink$ = Symbol("_DoubleLink._nextLink");
  dart.setMethodSignature(_DoubleLink, () => ({
    __proto__: dart.getMethods(_DoubleLink.__proto__),
    [_link]: dart.fnType(dart.void, [core.Object, core.Object]),
    [_unlink]: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_DoubleLink, "dart:collection");
  dart.setFieldSignature(_DoubleLink, () => ({
    __proto__: dart.getFields(_DoubleLink.__proto__),
    [_previousLink]: dart.fieldType(Link),
    [_nextLink]: dart.fieldType(Link)
  }));
  return _DoubleLink;
});
collection._DoubleLink = collection._DoubleLink$();
dart.addTypeTests(collection._DoubleLink, _is__DoubleLink_default);
const _is_DoubleLinkedQueueEntry_default = Symbol('_is_DoubleLinkedQueueEntry_default');
collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
  class DoubleLinkedQueueEntry extends collection._DoubleLink {
    get element() {
      return this[element$];
    }
    set element(value) {
      this[element$] = E._check(value);
    }
    append(e) {
      E._check(e);
      new (DoubleLinkedQueueEntryOfE()).new(e)[_link](this, this[_nextLink]);
    }
    prepend(e) {
      E._check(e);
      new (DoubleLinkedQueueEntryOfE()).new(e)[_link](this[_previousLink], this);
    }
    remove() {
      this[_unlink]();
      return this.element;
    }
    previousEntry() {
      return this[_previousLink];
    }
    nextEntry() {
      return this[_nextLink];
    }
  }
  (DoubleLinkedQueueEntry.new = function(element) {
    this[element$] = element;
    DoubleLinkedQueueEntry.__proto__.new.call(this);
  }).prototype = DoubleLinkedQueueEntry.prototype;
  dart.addTypeTests(DoubleLinkedQueueEntry);
  DoubleLinkedQueueEntry.prototype[_is_DoubleLinkedQueueEntry_default] = true;
  const element$ = Symbol("DoubleLinkedQueueEntry.element");
  dart.setMethodSignature(DoubleLinkedQueueEntry, () => ({
    __proto__: dart.getMethods(DoubleLinkedQueueEntry.__proto__),
    append: dart.fnType(dart.void, [core.Object]),
    prepend: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(E, []),
    previousEntry: dart.fnType(collection.DoubleLinkedQueueEntry$(E), []),
    nextEntry: dart.fnType(collection.DoubleLinkedQueueEntry$(E), [])
  }));
  dart.setLibraryUri(DoubleLinkedQueueEntry, "dart:collection");
  dart.setFieldSignature(DoubleLinkedQueueEntry, () => ({
    __proto__: dart.getFields(DoubleLinkedQueueEntry.__proto__),
    element: dart.fieldType(E)
  }));
  return DoubleLinkedQueueEntry;
}, E => {
  dart.setBaseClass(collection.DoubleLinkedQueueEntry$(E), collection._DoubleLink$(collection.DoubleLinkedQueueEntry$(E)));
});
collection.DoubleLinkedQueueEntry = collection.DoubleLinkedQueueEntry$();
dart.addTypeTests(collection.DoubleLinkedQueueEntry, _is_DoubleLinkedQueueEntry_default);
const _queue = dart.privateName(collection, "_queue");
const _append = dart.privateName(collection, "_append");
const _prepend = dart.privateName(collection, "_prepend");
const _element = dart.privateName(collection, "_element");
const _asNonSentinelEntry = dart.privateName(collection, "_asNonSentinelEntry");
const _is__DoubleLinkedQueueEntry_default = Symbol('_is__DoubleLinkedQueueEntry_default');
collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
  class _DoubleLinkedQueueEntry extends collection.DoubleLinkedQueueEntry$(E) {
    [_append](e) {
      E._check(e);
      new (_DoubleLinkedQueueElementOfE()).new(e, this[_queue])[_link](this, this[_nextLink]);
    }
    [_prepend](e) {
      E._check(e);
      new (_DoubleLinkedQueueElementOfE()).new(e, this[_queue])[_link](this[_previousLink], this);
    }
    get [_element]() {
      return this.element;
    }
    nextEntry() {
      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_nextLink]);
      return entry[_asNonSentinelEntry]();
    }
    previousEntry() {
      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_previousLink]);
      return entry[_asNonSentinelEntry]();
    }
  }
  (_DoubleLinkedQueueEntry.new = function(element, queue) {
    this[_queue] = queue;
    _DoubleLinkedQueueEntry.__proto__.new.call(this, element);
  }).prototype = _DoubleLinkedQueueEntry.prototype;
  dart.addTypeTests(_DoubleLinkedQueueEntry);
  _DoubleLinkedQueueEntry.prototype[_is__DoubleLinkedQueueEntry_default] = true;
  dart.setMethodSignature(_DoubleLinkedQueueEntry, () => ({
    __proto__: dart.getMethods(_DoubleLinkedQueueEntry.__proto__),
    [_append]: dart.fnType(dart.void, [core.Object]),
    [_prepend]: dart.fnType(dart.void, [core.Object])
  }));
  dart.setGetterSignature(_DoubleLinkedQueueEntry, () => ({
    __proto__: dart.getGetters(_DoubleLinkedQueueEntry.__proto__),
    [_element]: E
  }));
  dart.setLibraryUri(_DoubleLinkedQueueEntry, "dart:collection");
  dart.setFieldSignature(_DoubleLinkedQueueEntry, () => ({
    __proto__: dart.getFields(_DoubleLinkedQueueEntry.__proto__),
    [_queue]: dart.fieldType(DoubleLinkedQueueOfE())
  }));
  return _DoubleLinkedQueueEntry;
});
collection._DoubleLinkedQueueEntry = collection._DoubleLinkedQueueEntry$();
dart.addTypeTests(collection._DoubleLinkedQueueEntry, _is__DoubleLinkedQueueEntry_default);
const _elementCount = dart.privateName(collection, "_elementCount");
const _remove = dart.privateName(collection, "_remove");
const _is__DoubleLinkedQueueElement_default = Symbol('_is__DoubleLinkedQueueElement_default');
collection._DoubleLinkedQueueElement$ = dart.generic(E => {
  class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
    append(e) {
      E._check(e);
      this[_append](e);
      if (this[_queue] != null) {
        let o = this[_queue];
        o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
      }
    }
    prepend(e) {
      E._check(e);
      this[_prepend](e);
      if (this[_queue] != null) {
        let o = this[_queue];
        o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
      }
    }
    [_remove]() {
      this[_queue] = null;
      this[_unlink]();
      return this.element;
    }
    remove() {
      if (this[_queue] != null) {
        let o = this[_queue];
        o[_elementCount] = dart.notNull(o[_elementCount]) - 1;
      }
      return this[_remove]();
    }
    [_asNonSentinelEntry]() {
      return this;
    }
  }
  (_DoubleLinkedQueueElement.new = function(element, queue) {
    _DoubleLinkedQueueElement.__proto__.new.call(this, element, queue);
  }).prototype = _DoubleLinkedQueueElement.prototype;
  dart.addTypeTests(_DoubleLinkedQueueElement);
  _DoubleLinkedQueueElement.prototype[_is__DoubleLinkedQueueElement_default] = true;
  dart.setMethodSignature(_DoubleLinkedQueueElement, () => ({
    __proto__: dart.getMethods(_DoubleLinkedQueueElement.__proto__),
    append: dart.fnType(dart.void, [core.Object]),
    prepend: dart.fnType(dart.void, [core.Object]),
    [_remove]: dart.fnType(E, []),
    [_asNonSentinelEntry]: dart.fnType(collection._DoubleLinkedQueueElement$(E), [])
  }));
  dart.setLibraryUri(_DoubleLinkedQueueElement, "dart:collection");
  return _DoubleLinkedQueueElement;
});
collection._DoubleLinkedQueueElement = collection._DoubleLinkedQueueElement$();
dart.addTypeTests(collection._DoubleLinkedQueueElement, _is__DoubleLinkedQueueElement_default);
const _is__DoubleLinkedQueueSentinel_default = Symbol('_is__DoubleLinkedQueueSentinel_default');
collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
  class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
    [_asNonSentinelEntry]() {
      return null;
    }
    [_remove]() {
      dart.throw(_internal.IterableElementError.noElement());
    }
    get [_element]() {
      dart.throw(_internal.IterableElementError.noElement());
    }
  }
  (_DoubleLinkedQueueSentinel.new = function(queue) {
    _DoubleLinkedQueueSentinel.__proto__.new.call(this, null, queue);
    this[_previousLink] = this;
    this[_nextLink] = this;
  }).prototype = _DoubleLinkedQueueSentinel.prototype;
  dart.addTypeTests(_DoubleLinkedQueueSentinel);
  _DoubleLinkedQueueSentinel.prototype[_is__DoubleLinkedQueueSentinel_default] = true;
  dart.setMethodSignature(_DoubleLinkedQueueSentinel, () => ({
    __proto__: dart.getMethods(_DoubleLinkedQueueSentinel.__proto__),
    [_asNonSentinelEntry]: dart.fnType(collection.DoubleLinkedQueueEntry$(E), []),
    [_remove]: dart.fnType(E, [])
  }));
  dart.setLibraryUri(_DoubleLinkedQueueSentinel, "dart:collection");
  return _DoubleLinkedQueueSentinel;
});
collection._DoubleLinkedQueueSentinel = collection._DoubleLinkedQueueSentinel$();
dart.addTypeTests(collection._DoubleLinkedQueueSentinel, _is__DoubleLinkedQueueSentinel_default);
const _sentinel = dart.privateName(collection, "_sentinel");
const _is_DoubleLinkedQueue_default = Symbol('_is_DoubleLinkedQueue_default');
collection.DoubleLinkedQueue$ = dart.generic(E => {
  let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
  let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
  let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
  class DoubleLinkedQueue extends core.Iterable$(E) {
    static from(elements) {
      let list = new (DoubleLinkedQueueOfE()).new();
      for (let e of elements) {
        list.addLast(E._check(e));
      }
      return DoubleLinkedQueueOfE()._check(list);
    }
    static of(elements) {
      let _ = new (DoubleLinkedQueueOfE()).new();
      _.addAll(elements);
      return _;
    }
    cast(R) {
      return collection.Queue.castFrom(E, R, this);
    }
    get length() {
      return this[_elementCount];
    }
    addLast(value) {
      E._check(value);
      this[_sentinel][_prepend](value);
      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
    }
    addFirst(value) {
      E._check(value);
      this[_sentinel][_append](value);
      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
    }
    add(value) {
      E._check(value);
      this[_sentinel][_prepend](value);
      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      for (let value of iterable) {
        this[_sentinel][_prepend](value);
        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
      }
    }
    removeLast() {
      let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
      let result = lastEntry[_remove]();
      this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
      return result;
    }
    removeFirst() {
      let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
      let result = firstEntry[_remove]();
      this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
      return result;
    }
    remove(o) {
      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
      while (!(entry == this[_sentinel])) {
        let equals = dart.equals(entry[_element], o);
        if (!(this === entry[_queue])) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
        if (equals) {
          entry[_remove]();
          this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
          return true;
        }
        entry = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
      }
      return false;
    }
    [_filter](test, removeMatching) {
      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
      while (!(entry == this[_sentinel])) {
        let matches = test(entry[_element]);
        if (!(this === entry[_queue])) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
        let next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
        if (removeMatching == matches) {
          entry[_remove]();
          this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
        }
        entry = next;
      }
    }
    removeWhere(test) {
      this[_filter](test, true);
    }
    retainWhere(test) {
      this[_filter](test, false);
    }
    get first() {
      let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
      return firstEntry[_element];
    }
    get last() {
      let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
      return lastEntry[_element];
    }
    get single() {
      if (this[_sentinel][_nextLink] == this[_sentinel][_previousLink]) {
        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
        return entry[_element];
      }
      dart.throw(_internal.IterableElementError.tooMany());
    }
    firstEntry() {
      return this[_sentinel].nextEntry();
    }
    lastEntry() {
      return this[_sentinel].previousEntry();
    }
    get isEmpty() {
      return this[_sentinel][_nextLink] == this[_sentinel];
    }
    clear() {
      this[_sentinel][_nextLink] = this[_sentinel];
      this[_sentinel][_previousLink] = this[_sentinel];
      this[_elementCount] = 0;
    }
    forEachEntry(action) {
      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
      while (!(entry == this[_sentinel])) {
        let element = _DoubleLinkedQueueElementOfE()._check(entry);
        let next = _DoubleLinkedQueueEntryOfE()._check(element[_nextLink]);
        action(element);
        if (this === entry[_queue]) {
          next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
        } else if (!(this === next[_queue])) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
        entry = next;
      }
    }
    get iterator() {
      return new (_DoubleLinkedQueueIteratorOfE()).new(this[_sentinel]);
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, "{", "}");
    }
  }
  (DoubleLinkedQueue.new = function() {
    this[_sentinel] = null;
    this[_elementCount] = 0;
    DoubleLinkedQueue.__proto__.new.call(this);
    this[_sentinel] = new (_DoubleLinkedQueueSentinelOfE()).new(this);
  }).prototype = DoubleLinkedQueue.prototype;
  dart.addTypeTests(DoubleLinkedQueue);
  DoubleLinkedQueue.prototype[_is_DoubleLinkedQueue_default] = true;
  DoubleLinkedQueue[dart.implements] = () => [QueueOfE()];
  dart.setMethodSignature(DoubleLinkedQueue, () => ({
    __proto__: dart.getMethods(DoubleLinkedQueue.__proto__),
    cast: dart.gFnType(R => [collection.Queue$(R), []]),
    [$cast]: dart.gFnType(R => [collection.Queue$(R), []]),
    addLast: dart.fnType(dart.void, [core.Object]),
    addFirst: dart.fnType(dart.void, [core.Object]),
    add: dart.fnType(dart.void, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    removeLast: dart.fnType(E, []),
    removeFirst: dart.fnType(E, []),
    remove: dart.fnType(core.bool, [core.Object]),
    [_filter]: dart.fnType(dart.void, [dart.fnType(core.bool, [E]), core.bool]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    firstEntry: dart.fnType(collection.DoubleLinkedQueueEntry$(E), []),
    lastEntry: dart.fnType(collection.DoubleLinkedQueueEntry$(E), []),
    clear: dart.fnType(dart.void, []),
    forEachEntry: dart.fnType(dart.void, [dart.fnType(dart.void, [collection.DoubleLinkedQueueEntry$(E)])])
  }));
  dart.setGetterSignature(DoubleLinkedQueue, () => ({
    __proto__: dart.getGetters(DoubleLinkedQueue.__proto__),
    iterator: collection._DoubleLinkedQueueIterator$(E),
    [$iterator]: collection._DoubleLinkedQueueIterator$(E)
  }));
  dart.setLibraryUri(DoubleLinkedQueue, "dart:collection");
  dart.setFieldSignature(DoubleLinkedQueue, () => ({
    __proto__: dart.getFields(DoubleLinkedQueue.__proto__),
    [_sentinel]: dart.fieldType(_DoubleLinkedQueueSentinelOfE()),
    [_elementCount]: dart.fieldType(core.int)
  }));
  dart.defineExtensionMethods(DoubleLinkedQueue, ['cast', 'toString']);
  dart.defineExtensionAccessors(DoubleLinkedQueue, [
    'length',
    'first',
    'last',
    'single',
    'isEmpty',
    'iterator'
  ]);
  return DoubleLinkedQueue;
});
collection.DoubleLinkedQueue = collection.DoubleLinkedQueue$();
dart.addTypeTests(collection.DoubleLinkedQueue, _is_DoubleLinkedQueue_default);
const _nextEntry = dart.privateName(collection, "_nextEntry");
const _is__DoubleLinkedQueueIterator_default = Symbol('_is__DoubleLinkedQueueIterator_default');
collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
  class _DoubleLinkedQueueIterator extends core.Object {
    moveNext() {
      if (this[_nextEntry] == this[_sentinel]) {
        this[_current$1] = null;
        this[_nextEntry] = null;
        this[_sentinel] = null;
        return false;
      }
      let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
      if (!(this[_sentinel][_queue] == elementEntry[_queue])) {
        dart.throw(new core.ConcurrentModificationError.new(this[_sentinel][_queue]));
      }
      this[_current$1] = elementEntry[_element];
      this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(elementEntry[_nextLink]);
      return true;
    }
    get current() {
      return this[_current$1];
    }
  }
  (_DoubleLinkedQueueIterator.new = function(sentinel) {
    this[_current$1] = null;
    this[_sentinel] = sentinel;
    this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(sentinel[_nextLink]);
  }).prototype = _DoubleLinkedQueueIterator.prototype;
  dart.addTypeTests(_DoubleLinkedQueueIterator);
  _DoubleLinkedQueueIterator.prototype[_is__DoubleLinkedQueueIterator_default] = true;
  _DoubleLinkedQueueIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(_DoubleLinkedQueueIterator, () => ({
    __proto__: dart.getMethods(_DoubleLinkedQueueIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(_DoubleLinkedQueueIterator, () => ({
    __proto__: dart.getGetters(_DoubleLinkedQueueIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(_DoubleLinkedQueueIterator, "dart:collection");
  dart.setFieldSignature(_DoubleLinkedQueueIterator, () => ({
    __proto__: dart.getFields(_DoubleLinkedQueueIterator.__proto__),
    [_sentinel]: dart.fieldType(_DoubleLinkedQueueSentinelOfE()),
    [_nextEntry]: dart.fieldType(_DoubleLinkedQueueEntryOfE()),
    [_current$1]: dart.fieldType(E)
  }));
  return _DoubleLinkedQueueIterator;
});
collection._DoubleLinkedQueueIterator = collection._DoubleLinkedQueueIterator$();
dart.addTypeTests(collection._DoubleLinkedQueueIterator, _is__DoubleLinkedQueueIterator_default);
const _head = dart.privateName(collection, "_head");
const _tail = dart.privateName(collection, "_tail");
const _table = dart.privateName(collection, "_table");
const _checkModification = dart.privateName(collection, "_checkModification");
const _writeToList = dart.privateName(collection, "_writeToList");
const _add$ = dart.privateName(collection, "_add");
const _preGrow = dart.privateName(collection, "_preGrow");
const _filterWhere = dart.privateName(collection, "_filterWhere");
const _grow = dart.privateName(collection, "_grow");
const _is_ListQueue_default = Symbol('_is_ListQueue_default');
collection.ListQueue$ = dart.generic(E => {
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
  let _ListQueueIteratorOfE = () => (_ListQueueIteratorOfE = dart.constFn(collection._ListQueueIterator$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
  class ListQueue extends _internal.ListIterable$(E) {
    static from(elements) {
      if (core.List.is(elements)) {
        let length = elements[$length];
        let queue = new (ListQueueOfE()).new(dart.notNull(length) + 1);
        if (!(dart.notNull(queue[_table][$length]) > dart.notNull(length))) dart.assertFailed(null, "dart:collection/queue.dart", 549, 14, "queue._table.length > length");
        for (let i = 0; i < dart.notNull(length); i++) {
          queue[_table][$_set](i, E._check(elements[$_get](i)));
        }
        queue[_tail] = length;
        return queue;
      } else {
        let capacity = 8;
        if (_internal.EfficientLengthIterable.is(elements)) {
          capacity = elements[$length];
        }
        let result = new (ListQueueOfE()).new(capacity);
        for (let element of elements) {
          result.addLast(E._check(element));
        }
        return result;
      }
    }
    static of(elements) {
      let _ = new (ListQueueOfE()).new();
      _.addAll(elements);
      return _;
    }
    cast(R) {
      return collection.Queue.castFrom(E, R, this);
    }
    get iterator() {
      return new (_ListQueueIteratorOfE()).new(this);
    }
    forEach(f) {
      let modificationCount = this[_modificationCount];
      for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][$length]) - 1) >>> 0) {
        f(this[_table][$_get](i));
        this[_checkModification](modificationCount);
      }
    }
    get isEmpty() {
      return this[_head] == this[_tail];
    }
    get length() {
      return (dart.notNull(this[_tail]) - dart.notNull(this[_head]) & dart.notNull(this[_table][$length]) - 1) >>> 0;
    }
    get first() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      return this[_table][$_get](this[_head]);
    }
    get last() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      return this[_table][$_get]((dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][$length]) - 1) >>> 0);
    }
    get single() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
      return this[_table][$_get](this[_head]);
    }
    elementAt(index) {
      core.RangeError.checkValidIndex(index, this);
      return this[_table][$_get]((dart.notNull(this[_head]) + dart.notNull(index) & dart.notNull(this[_table][$length]) - 1) >>> 0);
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let list = null;
      if (dart.test(growable)) {
        list = JSArrayOfE().of([]);
        list[$length] = this.length;
      } else {
        list = ListOfE().new(this.length);
      }
      this[_writeToList](list);
      return list;
    }
    add(value) {
      E._check(value);
      this[_add$](value);
    }
    addAll(elements) {
      IterableOfE()._check(elements);
      if (ListOfE().is(elements)) {
        let list = elements;
        let addCount = list[$length];
        let length = this.length;
        if (dart.notNull(length) + dart.notNull(addCount) >= dart.notNull(this[_table][$length])) {
          this[_preGrow](dart.notNull(length) + dart.notNull(addCount));
          this[_table][$setRange](length, dart.notNull(length) + dart.notNull(addCount), list, 0);
          this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
        } else {
          let endSpace = dart.notNull(this[_table][$length]) - dart.notNull(this[_tail]);
          if (dart.notNull(addCount) < endSpace) {
            this[_table][$setRange](this[_tail], dart.notNull(this[_tail]) + dart.notNull(addCount), list, 0);
            this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
          } else {
            let preSpace = dart.notNull(addCount) - endSpace;
            this[_table][$setRange](this[_tail], dart.notNull(this[_tail]) + endSpace, list, 0);
            this[_table][$setRange](0, preSpace, list, endSpace);
            this[_tail] = preSpace;
          }
        }
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      } else {
        for (let element of elements)
          this[_add$](element);
      }
    }
    remove(value) {
      for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][$length]) - 1) >>> 0) {
        let element = this[_table][$_get](i);
        if (dart.equals(element, value)) {
          this[_remove](i);
          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
          return true;
        }
      }
      return false;
    }
    [_filterWhere](test, removeMatching) {
      let modificationCount = this[_modificationCount];
      let i = this[_head];
      while (i != this[_tail]) {
        let element = this[_table][$_get](i);
        let remove = removeMatching == test(element);
        this[_checkModification](modificationCount);
        if (remove) {
          i = this[_remove](i);
          modificationCount = this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        } else {
          i = (dart.notNull(i) + 1 & dart.notNull(this[_table][$length]) - 1) >>> 0;
        }
      }
    }
    removeWhere(test) {
      this[_filterWhere](test, true);
    }
    retainWhere(test) {
      this[_filterWhere](test, false);
    }
    clear() {
      if (this[_head] != this[_tail]) {
        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][$length]) - 1) >>> 0) {
          this[_table][$_set](i, null);
        }
        this[_head] = this[_tail] = 0;
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, "{", "}");
    }
    addLast(value) {
      E._check(value);
      this[_add$](value);
    }
    addFirst(value) {
      E._check(value);
      this[_head] = (dart.notNull(this[_head]) - 1 & dart.notNull(this[_table][$length]) - 1) >>> 0;
      this[_table][$_set](this[_head], value);
      if (this[_head] == this[_tail]) this[_grow]();
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
    }
    removeFirst() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      let result = this[_table][$_get](this[_head]);
      this[_table][$_set](this[_head], null);
      this[_head] = (dart.notNull(this[_head]) + 1 & dart.notNull(this[_table][$length]) - 1) >>> 0;
      return result;
    }
    removeLast() {
      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      this[_tail] = (dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][$length]) - 1) >>> 0;
      let result = this[_table][$_get](this[_tail]);
      this[_table][$_set](this[_tail], null);
      return result;
    }
    static _isPowerOf2(number) {
      return (dart.notNull(number) & dart.notNull(number) - 1) === 0;
    }
    static _nextPowerOf2(number) {
      if (!(dart.notNull(number) > 0)) dart.assertFailed(null, "dart:collection/queue.dart", 759, 12, "number > 0");
      number = (dart.notNull(number) << 1 >>> 0) - 1;
      for (;;) {
        let nextNumber = (dart.notNull(number) & dart.notNull(number) - 1) >>> 0;
        if (nextNumber === 0) return number;
        number = nextNumber;
      }
    }
    [_checkModification](expectedModificationCount) {
      if (expectedModificationCount != this[_modificationCount]) {
        dart.throw(new core.ConcurrentModificationError.new(this));
      }
    }
    [_add$](element) {
      E._check(element);
      this[_table][$_set](this[_tail], element);
      this[_tail] = (dart.notNull(this[_tail]) + 1 & dart.notNull(this[_table][$length]) - 1) >>> 0;
      if (this[_head] == this[_tail]) this[_grow]();
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
    }
    [_remove](offset) {
      let mask = dart.notNull(this[_table][$length]) - 1;
      let startDistance = (dart.notNull(offset) - dart.notNull(this[_head]) & mask) >>> 0;
      let endDistance = (dart.notNull(this[_tail]) - dart.notNull(offset) & mask) >>> 0;
      if (startDistance < endDistance) {
        let i = offset;
        while (i != this[_head]) {
          let prevOffset = (dart.notNull(i) - 1 & mask) >>> 0;
          this[_table][$_set](i, this[_table][$_get](prevOffset));
          i = prevOffset;
        }
        this[_table][$_set](this[_head], null);
        this[_head] = (dart.notNull(this[_head]) + 1 & mask) >>> 0;
        return (dart.notNull(offset) + 1 & mask) >>> 0;
      } else {
        this[_tail] = (dart.notNull(this[_tail]) - 1 & mask) >>> 0;
        let i = offset;
        while (i != this[_tail]) {
          let nextOffset = (dart.notNull(i) + 1 & mask) >>> 0;
          this[_table][$_set](i, this[_table][$_get](nextOffset));
          i = nextOffset;
        }
        this[_table][$_set](this[_tail], null);
        return offset;
      }
    }
    [_grow]() {
      let newTable = ListOfE().new(dart.notNull(this[_table][$length]) * 2);
      let split = dart.notNull(this[_table][$length]) - dart.notNull(this[_head]);
      newTable[$setRange](0, split, this[_table], this[_head]);
      newTable[$setRange](split, split + dart.notNull(this[_head]), this[_table], 0);
      this[_head] = 0;
      this[_tail] = this[_table][$length];
      this[_table] = newTable;
    }
    [_writeToList](target) {
      ListOfE()._check(target);
      if (!(dart.notNull(target[$length]) >= dart.notNull(this.length))) dart.assertFailed(null, "dart:collection/queue.dart", 831, 12, "target.length >= length");
      if (dart.notNull(this[_head]) <= dart.notNull(this[_tail])) {
        let length = dart.notNull(this[_tail]) - dart.notNull(this[_head]);
        target[$setRange](0, length, this[_table], this[_head]);
        return length;
      } else {
        let firstPartSize = dart.notNull(this[_table][$length]) - dart.notNull(this[_head]);
        target[$setRange](0, firstPartSize, this[_table], this[_head]);
        target[$setRange](firstPartSize, firstPartSize + dart.notNull(this[_tail]), this[_table], 0);
        return dart.notNull(this[_tail]) + firstPartSize;
      }
    }
    [_preGrow](newElementCount) {
      if (!(dart.notNull(newElementCount) >= dart.notNull(this.length))) dart.assertFailed(null, "dart:collection/queue.dart", 846, 12, "newElementCount >= length");
      newElementCount = dart.notNull(newElementCount) + newElementCount[$rightShift](1);
      let newCapacity = collection.ListQueue._nextPowerOf2(newElementCount);
      let newTable = ListOfE().new(newCapacity);
      this[_tail] = this[_writeToList](newTable);
      this[_table] = newTable;
      this[_head] = 0;
    }
  }
  (ListQueue.new = function(initialCapacity) {
    if (initialCapacity === void 0) initialCapacity = null;
    this[_table] = null;
    this[_modificationCount] = 0;
    this[_head] = 0;
    this[_tail] = 0;
    ListQueue.__proto__.new.call(this);
    if (initialCapacity == null || dart.notNull(initialCapacity) < 8) {
      initialCapacity = 8;
    } else if (!dart.test(collection.ListQueue._isPowerOf2(initialCapacity))) {
      initialCapacity = collection.ListQueue._nextPowerOf2(initialCapacity);
    }
    if (!dart.test(collection.ListQueue._isPowerOf2(initialCapacity))) dart.assertFailed(null, "dart:collection/queue.dart", 528, 12, "_isPowerOf2(initialCapacity)");
    this[_table] = ListOfE().new(initialCapacity);
  }).prototype = ListQueue.prototype;
  dart.addTypeTests(ListQueue);
  ListQueue.prototype[_is_ListQueue_default] = true;
  ListQueue[dart.implements] = () => [QueueOfE()];
  dart.setMethodSignature(ListQueue, () => ({
    __proto__: dart.getMethods(ListQueue.__proto__),
    cast: dart.gFnType(R => [collection.Queue$(R), []]),
    [$cast]: dart.gFnType(R => [collection.Queue$(R), []]),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int]),
    add: dart.fnType(dart.void, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    [_filterWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E]), core.bool]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    clear: dart.fnType(dart.void, []),
    addLast: dart.fnType(dart.void, [core.Object]),
    addFirst: dart.fnType(dart.void, [core.Object]),
    removeFirst: dart.fnType(E, []),
    removeLast: dart.fnType(E, []),
    [_checkModification]: dart.fnType(dart.void, [core.int]),
    [_add$]: dart.fnType(dart.void, [core.Object]),
    [_remove]: dart.fnType(core.int, [core.int]),
    [_grow]: dart.fnType(dart.void, []),
    [_writeToList]: dart.fnType(core.int, [core.Object]),
    [_preGrow]: dart.fnType(dart.void, [core.int])
  }));
  dart.setGetterSignature(ListQueue, () => ({
    __proto__: dart.getGetters(ListQueue.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(ListQueue, "dart:collection");
  dart.setFieldSignature(ListQueue, () => ({
    __proto__: dart.getFields(ListQueue.__proto__),
    [_table]: dart.fieldType(ListOfE()),
    [_head]: dart.fieldType(core.int),
    [_tail]: dart.fieldType(core.int),
    [_modificationCount]: dart.fieldType(core.int)
  }));
  dart.defineExtensionMethods(ListQueue, [
    'cast',
    'forEach',
    'elementAt',
    'toList',
    'toString'
  ]);
  dart.defineExtensionAccessors(ListQueue, [
    'iterator',
    'isEmpty',
    'length',
    'first',
    'last',
    'single'
  ]);
  return ListQueue;
});
collection.ListQueue = collection.ListQueue$();
dart.defineLazy(collection.ListQueue, {
  /*collection.ListQueue._INITIAL_CAPACITY*/get _INITIAL_CAPACITY() {
    return 8;
  }
});
dart.addTypeTests(collection.ListQueue, _is_ListQueue_default);
const _end = dart.privateName(collection, "_end");
const _position = dart.privateName(collection, "_position");
const _is__ListQueueIterator_default = Symbol('_is__ListQueueIterator_default');
collection._ListQueueIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
  class _ListQueueIterator extends core.Object {
    get current() {
      return this[_current$1];
    }
    moveNext() {
      this[_queue][_checkModification](this[_modificationCount]);
      if (this[_position] == this[_end]) {
        this[_current$1] = null;
        return false;
      }
      this[_current$1] = this[_queue][_table][$_get](this[_position]);
      this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][$length]) - 1) >>> 0;
      return true;
    }
  }
  (_ListQueueIterator.new = function(queue) {
    this[_current$1] = null;
    this[_queue] = queue;
    this[_end] = queue[_tail];
    this[_modificationCount] = queue[_modificationCount];
    this[_position] = queue[_head];
  }).prototype = _ListQueueIterator.prototype;
  dart.addTypeTests(_ListQueueIterator);
  _ListQueueIterator.prototype[_is__ListQueueIterator_default] = true;
  _ListQueueIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(_ListQueueIterator, () => ({
    __proto__: dart.getMethods(_ListQueueIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(_ListQueueIterator, () => ({
    __proto__: dart.getGetters(_ListQueueIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(_ListQueueIterator, "dart:collection");
  dart.setFieldSignature(_ListQueueIterator, () => ({
    __proto__: dart.getFields(_ListQueueIterator.__proto__),
    [_queue]: dart.finalFieldType(ListQueueOfE()),
    [_end]: dart.finalFieldType(core.int),
    [_modificationCount]: dart.finalFieldType(core.int),
    [_position]: dart.fieldType(core.int),
    [_current$1]: dart.fieldType(E)
  }));
  return _ListQueueIterator;
});
collection._ListQueueIterator = collection._ListQueueIterator$();
dart.addTypeTests(collection._ListQueueIterator, _is__ListQueueIterator_default);
const _is_SetMixin_default = Symbol('_is_SetMixin_default');
collection.SetMixin$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let FollowedByIterableOfE = () => (FollowedByIterableOfE = dart.constFn(_internal.FollowedByIterable$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
  let EAndEToE = () => (EAndEToE = dart.constFn(dart.fnType(E, [E, E])))();
  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
  let VoidToE = () => (VoidToE = dart.constFn(dart.fnType(E, [])))();
  class SetMixin extends core.Object {
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
    get isEmpty() {
      return this.length === 0;
    }
    get isNotEmpty() {
      return this.length !== 0;
    }
    cast(R) {
      return core.Set.castFrom(E, R, this);
    }
    followedBy(other) {
      IterableOfE()._check(other);
      return FollowedByIterableOfE().firstEfficient(this, other);
    }
    whereType(T) {
      return new (_internal.WhereTypeIterable$(T)).new(this);
    }
    clear() {
      this.removeAll(this.toList());
    }
    addAll(elements) {
      IterableOfE()._check(elements);
      for (let element of elements)
        this.add(element);
    }
    removeAll(elements) {
      for (let element of elements)
        this.remove(element);
    }
    retainAll(elements) {
      let toRemove = this.toSet();
      for (let o of elements) {
        toRemove.remove(o);
      }
      this.removeAll(toRemove);
    }
    removeWhere(test) {
      let toRemove = [];
      for (let element of this) {
        if (dart.test(test(element))) toRemove[$add](element);
      }
      this.removeAll(toRemove);
    }
    retainWhere(test) {
      let toRemove = [];
      for (let element of this) {
        if (!dart.test(test(element))) toRemove[$add](element);
      }
      this.removeAll(toRemove);
    }
    containsAll(other) {
      for (let o of other) {
        if (!dart.test(this.contains(o))) return false;
      }
      return true;
    }
    union(other) {
      SetOfE()._check(other);
      let _ = this.toSet();
      _.addAll(other);
      return _;
    }
    intersection(other) {
      let result = this.toSet();
      for (let element of this) {
        if (!dart.test(other.contains(element))) result.remove(element);
      }
      return result;
    }
    difference(other) {
      let result = this.toSet();
      for (let element of this) {
        if (dart.test(other.contains(element))) result.remove(element);
      }
      return result;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = dart.test(growable) ? (() => {
        let _ = JSArrayOfE().of([]);
        _[$length] = this.length;
        return _;
      })() : ListOfE().new(this.length);
      let i = 0;
      for (let element of this)
        result[$_set](i++, element);
      return result;
    }
    map(T, f) {
      return new (_internal.EfficientLengthMappedIterable$(E, T)).new(this, f);
    }
    get single() {
      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
      let it = this.iterator;
      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
      let result = it.current;
      return result;
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, "{", "}");
    }
    where(f) {
      return new (WhereIterableOfE()).new(this, f);
    }
    expand(T, f) {
      return new (_internal.ExpandIterable$(E, T)).new(this, f);
    }
    forEach(f) {
      for (let element of this)
        f(element);
    }
    reduce(combine) {
      EAndEToE()._check(combine);
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let value = iterator.current;
      while (dart.test(iterator.moveNext())) {
        value = combine(value, iterator.current);
      }
      return value;
    }
    fold(T, initialValue, combine) {
      let value = initialValue;
      for (let element of this)
        value = combine(value, element);
      return value;
    }
    every(f) {
      for (let element of this) {
        if (!dart.test(f(element))) return false;
      }
      return true;
    }
    join(separator) {
      if (separator === void 0) separator = "";
      let iterator = this.iterator;
      if (!dart.test(iterator.moveNext())) return "";
      let buffer = new core.StringBuffer.new();
      if (separator == null || separator === "") {
        do {
          buffer.write(iterator.current);
        } while (dart.test(iterator.moveNext()));
      } else {
        buffer.write(iterator.current);
        while (dart.test(iterator.moveNext())) {
          buffer.write(separator);
          buffer.write(iterator.current);
        }
      }
      return buffer.toString();
    }
    any(test) {
      for (let element of this) {
        if (dart.test(test(element))) return true;
      }
      return false;
    }
    take(n) {
      return TakeIterableOfE().new(this, n);
    }
    takeWhile(test) {
      return new (TakeWhileIterableOfE()).new(this, test);
    }
    skip(n) {
      return SkipIterableOfE().new(this, n);
    }
    skipWhile(test) {
      return new (SkipWhileIterableOfE()).new(this, test);
    }
    get first() {
      let it = this.iterator;
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      return it.current;
    }
    get last() {
      let it = this.iterator;
      if (!dart.test(it.moveNext())) {
        dart.throw(_internal.IterableElementError.noElement());
      }
      let result = null;
      do {
        result = it.current;
      } while (dart.test(it.moveNext()));
      return result;
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      for (let element of this) {
        if (dart.test(test(element))) return element;
      }
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    singleWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      VoidToE()._check(orElse);
      let result = null;
      let foundMatching = false;
      for (let element of this) {
        if (dart.test(test(element))) {
          if (foundMatching) {
            dart.throw(_internal.IterableElementError.tooMany());
          }
          result = element;
          foundMatching = true;
        }
      }
      if (foundMatching) return result;
      if (orElse != null) return orElse();
      dart.throw(_internal.IterableElementError.noElement());
    }
    elementAt(index) {
      core.ArgumentError.checkNotNull(index, "index");
      core.RangeError.checkNotNegative(index, "index");
      let elementIndex = 0;
      for (let element of this) {
        if (index === elementIndex) return element;
        elementIndex++;
      }
      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
    }
  }
  (SetMixin.new = function() {
  }).prototype = SetMixin.prototype;
  dart.addTypeTests(SetMixin);
  SetMixin.prototype[_is_SetMixin_default] = true;
  SetMixin[dart.implements] = () => [SetOfE()];
  dart.setMethodSignature(SetMixin, () => ({
    __proto__: dart.getMethods(SetMixin.__proto__),
    cast: dart.gFnType(R => [core.Set$(R), []]),
    [$cast]: dart.gFnType(R => [core.Set$(R), []]),
    followedBy: dart.fnType(core.Iterable$(E), [core.Object]),
    [$followedBy]: dart.fnType(core.Iterable$(E), [core.Object]),
    whereType: dart.gFnType(T => [core.Iterable$(T), []]),
    [$whereType]: dart.gFnType(T => [core.Iterable$(T), []]),
    clear: dart.fnType(dart.void, []),
    addAll: dart.fnType(dart.void, [core.Object]),
    removeAll: dart.fnType(dart.void, [core.Iterable$(core.Object)]),
    retainAll: dart.fnType(dart.void, [core.Iterable$(core.Object)]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    containsAll: dart.fnType(core.bool, [core.Iterable$(core.Object)]),
    union: dart.fnType(core.Set$(E), [core.Object]),
    intersection: dart.fnType(core.Set$(E), [core.Set$(core.Object)]),
    difference: dart.fnType(core.Set$(E), [core.Set$(core.Object)]),
    toList: dart.fnType(core.List$(E), [], {growable: core.bool}),
    [$toList]: dart.fnType(core.List$(E), [], {growable: core.bool}),
    map: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    [$map]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [E])]]),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, []),
    where: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$where]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    expand: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    [$expand]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [E])]]),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [E])]),
    reduce: dart.fnType(E, [core.Object]),
    [$reduce]: dart.fnType(E, [core.Object]),
    fold: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    [$fold]: dart.gFnType(T => [T, [T, dart.fnType(T, [T, E])]]),
    every: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$every]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    join: dart.fnType(core.String, [], [core.String]),
    [$join]: dart.fnType(core.String, [], [core.String]),
    any: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    [$any]: dart.fnType(core.bool, [dart.fnType(core.bool, [E])]),
    take: dart.fnType(core.Iterable$(E), [core.int]),
    [$take]: dart.fnType(core.Iterable$(E), [core.int]),
    takeWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$takeWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    skip: dart.fnType(core.Iterable$(E), [core.int]),
    [$skip]: dart.fnType(core.Iterable$(E), [core.int]),
    skipWhile: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    [$skipWhile]: dart.fnType(core.Iterable$(E), [dart.fnType(core.bool, [E])]),
    firstWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$firstWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    lastWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$lastWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    singleWhere: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    [$singleWhere]: dart.fnType(E, [dart.fnType(core.bool, [E])], {orElse: core.Object}),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int])
  }));
  dart.setGetterSignature(SetMixin, () => ({
    __proto__: dart.getGetters(SetMixin.__proto__),
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    single: E,
    [$single]: E,
    first: E,
    [$first]: E,
    last: E,
    [$last]: E
  }));
  dart.setLibraryUri(SetMixin, "dart:collection");
  dart.defineExtensionMethods(SetMixin, [
    'cast',
    'followedBy',
    'whereType',
    'toList',
    'map',
    'toString',
    'where',
    'expand',
    'forEach',
    'reduce',
    'fold',
    'every',
    'join',
    'any',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt'
  ]);
  dart.defineExtensionAccessors(SetMixin, [
    'isEmpty',
    'isNotEmpty',
    'single',
    'first',
    'last'
  ]);
  return SetMixin;
});
collection.SetMixin = collection.SetMixin$();
dart.addTypeTests(collection.SetMixin, _is_SetMixin_default);
const _is_SetBase_default = Symbol('_is_SetBase_default');
collection.SetBase$ = dart.generic(E => {
  const Object_SetMixin$ = class Object_SetMixin extends core.Object {};
  (Object_SetMixin$.new = function() {
  }).prototype = Object_SetMixin$.prototype;
  dart.applyMixin(Object_SetMixin$, collection.SetMixin$(E));
  class SetBase extends Object_SetMixin$ {
    static setToString(set) {
      return collection.IterableBase.iterableToFullString(set, "{", "}");
    }
  }
  (SetBase.new = function() {
  }).prototype = SetBase.prototype;
  dart.addTypeTests(SetBase);
  SetBase.prototype[_is_SetBase_default] = true;
  dart.setLibraryUri(SetBase, "dart:collection");
  return SetBase;
});
collection.SetBase = collection.SetBase$();
dart.addTypeTests(collection.SetBase, _is_SetBase_default);
const _is__UnmodifiableSet_default = Symbol('_is__UnmodifiableSet_default');
collection._UnmodifiableSet$ = dart.generic(E => {
  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let MapOfE$Null = () => (MapOfE$Null = dart.constFn(core.Map$(E, core.Null)))();
  class _UnmodifiableSet extends collection._SetBase$(E) {
    [_newSet]() {
      return new (_HashSetOfE()).new();
    }
    [_newSimilarSet](R) {
      return new (collection._HashSet$(R)).new();
    }
    contains(element) {
      return this[_map$0][$containsKey](element);
    }
    get iterator() {
      return this[_map$0][$keys][$iterator];
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
    get length() {
      return this[_map$0][$length];
    }
    lookup(element) {
      for (let key of this[_map$0][$keys]) {
        if (dart.equals(key, element)) return key;
      }
      return null;
    }
    add(value) {
      E._check(value);
      dart.throw(new core.UnsupportedError.new("Cannot change unmodifiable set"));
    }
    clear() {
      dart.throw(new core.UnsupportedError.new("Cannot change unmodifiable set"));
    }
    addAll(elements) {
      IterableOfE()._check(elements);
      dart.throw(new core.UnsupportedError.new("Cannot change unmodifiable set"));
    }
    removeAll(elements) {
      dart.throw(new core.UnsupportedError.new("Cannot change unmodifiable set"));
    }
    retainAll(elements) {
      dart.throw(new core.UnsupportedError.new("Cannot change unmodifiable set"));
    }
    removeWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot change unmodifiable set"));
    }
    retainWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot change unmodifiable set"));
    }
    remove(value) {
      dart.throw(new core.UnsupportedError.new("Cannot change unmodifiable set"));
    }
  }
  (_UnmodifiableSet.new = function(map) {
    this[_map$0] = map;
    _UnmodifiableSet.__proto__.new.call(this);
  }).prototype = _UnmodifiableSet.prototype;
  dart.addTypeTests(_UnmodifiableSet);
  _UnmodifiableSet.prototype[_is__UnmodifiableSet_default] = true;
  dart.setMethodSignature(_UnmodifiableSet, () => ({
    __proto__: dart.getMethods(_UnmodifiableSet.__proto__),
    [_newSet]: dart.fnType(core.Set$(E), []),
    [_newSimilarSet]: dart.gFnType(R => [core.Set$(R), []]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    lookup: dart.fnType(E, [core.Object]),
    add: dart.fnType(core.bool, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object])
  }));
  dart.setGetterSignature(_UnmodifiableSet, () => ({
    __proto__: dart.getGetters(_UnmodifiableSet.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(_UnmodifiableSet, "dart:collection");
  dart.setFieldSignature(_UnmodifiableSet, () => ({
    __proto__: dart.getFields(_UnmodifiableSet.__proto__),
    [_map$0]: dart.finalFieldType(MapOfE$Null())
  }));
  dart.defineExtensionMethods(_UnmodifiableSet, ['contains']);
  dart.defineExtensionAccessors(_UnmodifiableSet, ['iterator', 'length']);
  return _UnmodifiableSet;
});
collection._UnmodifiableSet = collection._UnmodifiableSet$();
dart.addTypeTests(collection._UnmodifiableSet, _is__UnmodifiableSet_default);
const _is__SplayTreeNode_default = Symbol('_is__SplayTreeNode_default');
collection._SplayTreeNode$ = dart.generic(K => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  class _SplayTreeNode extends core.Object {}
  (_SplayTreeNode.new = function(key) {
    this.left = null;
    this.right = null;
    this.key = key;
  }).prototype = _SplayTreeNode.prototype;
  dart.addTypeTests(_SplayTreeNode);
  _SplayTreeNode.prototype[_is__SplayTreeNode_default] = true;
  dart.setLibraryUri(_SplayTreeNode, "dart:collection");
  dart.setFieldSignature(_SplayTreeNode, () => ({
    __proto__: dart.getFields(_SplayTreeNode.__proto__),
    key: dart.finalFieldType(K),
    left: dart.fieldType(_SplayTreeNodeOfK()),
    right: dart.fieldType(_SplayTreeNodeOfK())
  }));
  return _SplayTreeNode;
});
collection._SplayTreeNode = collection._SplayTreeNode$();
dart.addTypeTests(collection._SplayTreeNode, _is__SplayTreeNode_default);
const _is__SplayTreeMapNode_default = Symbol('_is__SplayTreeMapNode_default');
collection._SplayTreeMapNode$ = dart.generic((K, V) => {
  class _SplayTreeMapNode extends collection._SplayTreeNode$(K) {}
  (_SplayTreeMapNode.new = function(key, value) {
    this.value = value;
    _SplayTreeMapNode.__proto__.new.call(this, key);
  }).prototype = _SplayTreeMapNode.prototype;
  dart.addTypeTests(_SplayTreeMapNode);
  _SplayTreeMapNode.prototype[_is__SplayTreeMapNode_default] = true;
  dart.setLibraryUri(_SplayTreeMapNode, "dart:collection");
  dart.setFieldSignature(_SplayTreeMapNode, () => ({
    __proto__: dart.getFields(_SplayTreeMapNode.__proto__),
    value: dart.fieldType(V)
  }));
  return _SplayTreeMapNode;
});
collection._SplayTreeMapNode = collection._SplayTreeMapNode$();
dart.addTypeTests(collection._SplayTreeMapNode, _is__SplayTreeMapNode_default);
const _count$ = dart.privateName(collection, "_count");
const _splayCount = dart.privateName(collection, "_splayCount");
const _root = dart.privateName(collection, "_root");
const _dummy = dart.privateName(collection, "_dummy");
const _compare = dart.privateName(collection, "_compare");
const _splay = dart.privateName(collection, "_splay");
const _splayMin = dart.privateName(collection, "_splayMin");
const _splayMax = dart.privateName(collection, "_splayMax");
const _addNewRoot = dart.privateName(collection, "_addNewRoot");
const _last = dart.privateName(collection, "_last");
const _clear = dart.privateName(collection, "_clear");
const _is__SplayTree_default = Symbol('_is__SplayTree_default');
collection._SplayTree$ = dart.generic((K, Node) => {
  class _SplayTree extends core.Object {
    [_splay](key) {
      K._check(key);
      if (this[_root] == null) return -1;
      let left = this[_dummy];
      let right = this[_dummy];
      let current = this[_root];
      let comp = null;
      while (true) {
        comp = this[_compare](current.key, key);
        if (dart.notNull(comp) > 0) {
          if (current.left == null) break;
          comp = this[_compare](current.left.key, key);
          if (dart.notNull(comp) > 0) {
            let tmp = current.left;
            current.left = tmp.right;
            tmp.right = current;
            current = Node._check(tmp);
            if (current.left == null) break;
          }
          right.left = current;
          right = current;
          current = Node._check(current.left);
        } else if (dart.notNull(comp) < 0) {
          if (current.right == null) break;
          comp = this[_compare](current.right.key, key);
          if (dart.notNull(comp) < 0) {
            let tmp = Node._check(current.right);
            current.right = tmp.left;
            tmp.left = current;
            current = tmp;
            if (current.right == null) break;
          }
          left.right = current;
          left = current;
          current = Node._check(current.right);
        } else {
          break;
        }
      }
      left.right = current.left;
      right.left = current.right;
      current.left = this[_dummy].right;
      current.right = this[_dummy].left;
      this[_root] = current;
      this[_dummy].right = null;
      this[_dummy].left = null;
      this[_splayCount] = dart.notNull(this[_splayCount]) + 1;
      return comp;
    }
    [_splayMin](node) {
      Node._check(node);
      let current = node;
      while (current.left != null) {
        let left = Node._check(current.left);
        current.left = left.right;
        left.right = current;
        current = left;
      }
      return current;
    }
    [_splayMax](node) {
      Node._check(node);
      let current = node;
      while (current.right != null) {
        let right = Node._check(current.right);
        current.right = right.left;
        right.left = current;
        current = right;
      }
      return current;
    }
    [_remove](key) {
      K._check(key);
      if (this[_root] == null) return null;
      let comp = this[_splay](key);
      if (comp !== 0) return null;
      let result = this[_root];
      this[_count$] = dart.notNull(this[_count$]) - 1;
      if (this[_root].left == null) {
        this[_root] = Node._check(this[_root].right);
      } else {
        let right = Node._check(this[_root].right);
        this[_root] = this[_splayMax](Node._check(this[_root].left));
        this[_root].right = right;
      }
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      return result;
    }
    [_addNewRoot](node, comp) {
      Node._check(node);
      this[_count$] = dart.notNull(this[_count$]) + 1;
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      if (this[_root] == null) {
        this[_root] = node;
        return;
      }
      if (dart.notNull(comp) < 0) {
        node.left = this[_root];
        node.right = this[_root].right;
        this[_root].right = null;
      } else {
        node.right = this[_root];
        node.left = this[_root].left;
        this[_root].left = null;
      }
      this[_root] = node;
    }
    get [_first$]() {
      if (this[_root] == null) return null;
      this[_root] = this[_splayMin](this[_root]);
      return this[_root];
    }
    get [_last]() {
      if (this[_root] == null) return null;
      this[_root] = this[_splayMax](this[_root]);
      return this[_root];
    }
    [_clear]() {
      this[_root] = null;
      this[_count$] = 0;
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
    }
  }
  (_SplayTree.new = function() {
    this[_count$] = 0;
    this[_modificationCount] = 0;
    this[_splayCount] = 0;
  }).prototype = _SplayTree.prototype;
  dart.addTypeTests(_SplayTree);
  _SplayTree.prototype[_is__SplayTree_default] = true;
  dart.setMethodSignature(_SplayTree, () => ({
    __proto__: dart.getMethods(_SplayTree.__proto__),
    [_splay]: dart.fnType(core.int, [core.Object]),
    [_splayMin]: dart.fnType(Node, [core.Object]),
    [_splayMax]: dart.fnType(Node, [core.Object]),
    [_remove]: dart.fnType(Node, [core.Object]),
    [_addNewRoot]: dart.fnType(dart.void, [core.Object, core.int]),
    [_clear]: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_SplayTree, () => ({
    __proto__: dart.getGetters(_SplayTree.__proto__),
    [_first$]: Node,
    [_last]: Node
  }));
  dart.setLibraryUri(_SplayTree, "dart:collection");
  dart.setFieldSignature(_SplayTree, () => ({
    __proto__: dart.getFields(_SplayTree.__proto__),
    [_count$]: dart.fieldType(core.int),
    [_modificationCount]: dart.fieldType(core.int),
    [_splayCount]: dart.fieldType(core.int)
  }));
  return _SplayTree;
});
collection._SplayTree = collection._SplayTree$();
dart.addTypeTests(collection._SplayTree, _is__SplayTree_default);
const _is__TypeTest_default = Symbol('_is__TypeTest_default');
collection._TypeTest$ = dart.generic(T => {
  class _TypeTest extends core.Object {
    test(v) {
      return T.is(v);
    }
  }
  (_TypeTest.new = function() {
  }).prototype = _TypeTest.prototype;
  dart.addTypeTests(_TypeTest);
  _TypeTest.prototype[_is__TypeTest_default] = true;
  dart.setMethodSignature(_TypeTest, () => ({
    __proto__: dart.getMethods(_TypeTest.__proto__),
    test: dart.fnType(core.bool, [dart.dynamic])
  }));
  dart.setLibraryUri(_TypeTest, "dart:collection");
  return _TypeTest;
});
collection._TypeTest = collection._TypeTest$();
dart.addTypeTests(collection._TypeTest, _is__TypeTest_default);
collection._dynamicCompare = function(a, b) {
  return core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b));
};
collection._defaultCompare = function(K) {
  let compare = dart.fn(core.Comparable.compare, ComparableAndComparableToint());
  if (dart.fnType(core.int, [K, K]).is(compare)) {
    return compare;
  }
  return dart.fn(collection._dynamicCompare, dynamicAnddynamicToint());
};
const _comparator = dart.privateName(collection, "_comparator");
const _is_SplayTreeMap_default = Symbol('_is_SplayTreeMap_default');
collection.SplayTreeMap$ = dart.generic((K, V) => {
  let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
  let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.fnType(core.Null, [K, V])))();
  let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
  let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
  let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
  let KAndKToint = () => (KAndKToint = dart.constFn(dart.fnType(core.int, [K, K])))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  const _SplayTree_MapMixin$ = class _SplayTree_MapMixin extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {};
  (_SplayTree_MapMixin$.new = function() {
    _SplayTree_MapMixin$.__proto__.new.call(this);
  }).prototype = _SplayTree_MapMixin$.prototype;
  dart.applyMixin(_SplayTree_MapMixin$, collection.MapMixin$(K, V));
  class SplayTreeMap extends _SplayTree_MapMixin$ {
    static from(other, compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      let result = new (SplayTreeMapOfK$V()).new(compare, isValidKey);
      other[$forEach](dart.fn((k, v) => {
        result._set(K._check(k), V._check(v));
      }, dynamicAnddynamicToNull()));
      return result;
    }
    static of(other, compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      let _ = new (SplayTreeMapOfK$V()).new(compare, isValidKey);
      _.addAll(other);
      return _;
    }
    static fromIterable(iterable, opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let value = opts && 'value' in opts ? opts.value : null;
      let compare = opts && 'compare' in opts ? opts.compare : null;
      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
      let map = new (SplayTreeMapOfK$V()).new(compare, isValidKey);
      collection.MapBase._fillMapWithMappedIterable(map, iterable, key, value);
      return map;
    }
    static fromIterables(keys, values, compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      let map = new (SplayTreeMapOfK$V()).new(compare, isValidKey);
      collection.MapBase._fillMapWithIterables(map, keys, values);
      return map;
    }
    [_compare](key1, key2) {
      K._check(key1);
      K._check(key2);
      return this[_comparator](key1, key2);
    }
    _get(key) {
      if (!dart.test(this[_validKey$](key))) return null;
      if (this[_root] != null) {
        let comp = this[_splay](K._check(key));
        if (comp === 0) {
          return this[_root].value;
        }
      }
      return null;
    }
    remove(key) {
      if (!dart.test(this[_validKey$](key))) return null;
      let mapRoot = this[_remove](K._check(key));
      if (mapRoot != null) return mapRoot.value;
      return null;
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      if (key == null) dart.throw(new core.ArgumentError.new(key));
      let comp = this[_splay](key);
      if (comp === 0) {
        this[_root].value = value;
        return value;
      }
      this[_addNewRoot](new (_SplayTreeMapNodeOfK$V()).new(key, value), comp);
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      if (key == null) dart.throw(new core.ArgumentError.new(key));
      let comp = this[_splay](key);
      if (comp === 0) {
        return this[_root].value;
      }
      let modificationCount = this[_modificationCount];
      let splayCount = this[_splayCount];
      let value = ifAbsent();
      if (modificationCount != this[_modificationCount]) {
        dart.throw(new core.ConcurrentModificationError.new(this));
      }
      if (splayCount != this[_splayCount]) {
        comp = this[_splay](key);
        if (!(comp !== 0)) dart.assertFailed(null, "dart:collection/splay_tree.dart", 383, 14, "comp != 0");
      }
      this[_addNewRoot](new (_SplayTreeMapNodeOfK$V()).new(key, value), comp);
      return value;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      other[$forEach](dart.fn((key, value) => {
        this._set(key, value);
      }, KAndVToNull()));
    }
    get isEmpty() {
      return this[_root] == null;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    forEach(f) {
      let nodes = new (_SplayTreeNodeIteratorOfK()).new(this);
      while (dart.test(nodes.moveNext())) {
        let node = _SplayTreeMapNodeOfK$V()._check(nodes.current);
        f(node.key, node.value);
      }
    }
    get length() {
      return this[_count$];
    }
    clear() {
      this[_clear]();
    }
    containsKey(key) {
      return dart.test(this[_validKey$](key)) && this[_splay](K._check(key)) === 0;
    }
    containsValue(value) {
      let initialSplayCount = this[_splayCount];
      const visit = node => {
        while (node != null) {
          if (dart.equals(node.value, value)) return true;
          if (initialSplayCount != this[_splayCount]) {
            dart.throw(new core.ConcurrentModificationError.new(this));
          }
          if (node.right != null && dart.test(visit(collection._SplayTreeMapNode._check(node.right)))) return true;
          node = collection._SplayTreeMapNode._check(node.left);
        }
        return false;
      };
      dart.fn(visit, _SplayTreeMapNodeTobool());
      return visit(this[_root]);
    }
    get keys() {
      return new (_SplayTreeKeyIterableOfK()).new(this);
    }
    get values() {
      return new (_SplayTreeValueIterableOfK$V()).new(this);
    }
    firstKey() {
      if (this[_root] == null) return null;
      return this[_first$].key;
    }
    lastKey() {
      if (this[_root] == null) return null;
      return this[_last].key;
    }
    lastKeyBefore(key) {
      K._check(key);
      if (key == null) dart.throw(new core.ArgumentError.new(key));
      if (this[_root] == null) return null;
      let comp = this[_splay](key);
      if (dart.notNull(comp) < 0) return this[_root].key;
      let node = this[_root].left;
      if (node == null) return null;
      while (node.right != null) {
        node = node.right;
      }
      return node.key;
    }
    firstKeyAfter(key) {
      K._check(key);
      if (key == null) dart.throw(new core.ArgumentError.new(key));
      if (this[_root] == null) return null;
      let comp = this[_splay](key);
      if (dart.notNull(comp) > 0) return this[_root].key;
      let node = this[_root].right;
      if (node == null) return null;
      while (node.left != null) {
        node = node.left;
      }
      return node.key;
    }
  }
  (SplayTreeMap.new = function(compare, isValidKey) {
    if (compare === void 0) compare = null;
    if (isValidKey === void 0) isValidKey = null;
    this[_root] = null;
    this[_dummy] = new (_SplayTreeMapNodeOfK$V()).new(null, null);
    let l = compare;
    this[_comparator] = l != null ? l : collection._defaultCompare(K);
    let l$ = isValidKey;
    this[_validKey$] = l$ != null ? l$ : dart.fn(v => K.is(v), dynamicTobool());
    SplayTreeMap.__proto__.new.call(this);
  }).prototype = SplayTreeMap.prototype;
  (SplayTreeMap._internal = function() {
    this[_root] = null;
    this[_dummy] = new (_SplayTreeMapNodeOfK$V()).new(null, null);
    this[_comparator] = null;
    this[_validKey$] = null;
    SplayTreeMap.__proto__.new.call(this);
  }).prototype = SplayTreeMap.prototype;
  dart.addTypeTests(SplayTreeMap);
  SplayTreeMap.prototype[_is_SplayTreeMap_default] = true;
  dart.setMethodSignature(SplayTreeMap, () => ({
    __proto__: dart.getMethods(SplayTreeMap.__proto__),
    [_compare]: dart.fnType(core.int, [core.Object, core.Object]),
    _get: dart.fnType(V, [core.Object]),
    [$_get]: dart.fnType(V, [core.Object]),
    remove: dart.fnType(V, [core.Object]),
    [$remove]: dart.fnType(V, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, []),
    firstKey: dart.fnType(K, []),
    lastKey: dart.fnType(K, []),
    lastKeyBefore: dart.fnType(K, [core.Object]),
    firstKeyAfter: dart.fnType(K, [core.Object])
  }));
  dart.setGetterSignature(SplayTreeMap, () => ({
    __proto__: dart.getGetters(SplayTreeMap.__proto__),
    keys: core.Iterable$(K),
    [$keys]: core.Iterable$(K)
  }));
  dart.setLibraryUri(SplayTreeMap, "dart:collection");
  dart.setFieldSignature(SplayTreeMap, () => ({
    __proto__: dart.getFields(SplayTreeMap.__proto__),
    [_root]: dart.fieldType(_SplayTreeMapNodeOfK$V()),
    [_dummy]: dart.finalFieldType(_SplayTreeMapNodeOfK$V()),
    [_comparator]: dart.fieldType(KAndKToint()),
    [_validKey$]: dart.fieldType(dynamicTobool())
  }));
  dart.defineExtensionMethods(SplayTreeMap, [
    '_get',
    'remove',
    '_set',
    'putIfAbsent',
    'addAll',
    'forEach',
    'clear',
    'containsKey',
    'containsValue'
  ]);
  dart.defineExtensionAccessors(SplayTreeMap, [
    'isEmpty',
    'isNotEmpty',
    'length',
    'keys',
    'values'
  ]);
  return SplayTreeMap;
});
collection.SplayTreeMap = collection.SplayTreeMap$();
dart.addTypeTests(collection.SplayTreeMap, _is_SplayTreeMap_default);
const _tree = dart.privateName(collection, "_tree");
const _workList = dart.privateName(collection, "_workList");
const _currentNode = dart.privateName(collection, "_currentNode");
const _findLeftMostDescendent = dart.privateName(collection, "_findLeftMostDescendent");
const _getValue = dart.privateName(collection, "_getValue");
const _rebuildWorkList = dart.privateName(collection, "_rebuildWorkList");
const _is__SplayTreeIterator_default = Symbol('_is__SplayTreeIterator_default');
collection._SplayTreeIterator$ = dart.generic((K, T) => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  let JSArrayOf_SplayTreeNodeOfK = () => (JSArrayOf_SplayTreeNodeOfK = dart.constFn(_interceptors.JSArray$(_SplayTreeNodeOfK())))();
  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
  let ListOf_SplayTreeNodeOfK = () => (ListOf_SplayTreeNodeOfK = dart.constFn(core.List$(_SplayTreeNodeOfK())))();
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  class _SplayTreeIterator extends core.Object {
    get current() {
      if (this[_currentNode] == null) return null;
      return this[_getValue](this[_currentNode]);
    }
    [_findLeftMostDescendent](node) {
      _SplayTreeNodeOfK()._check(node);
      while (node != null) {
        this[_workList][$add](node);
        node = node.left;
      }
    }
    [_rebuildWorkList](currentNode) {
      _SplayTreeNodeOfK()._check(currentNode);
      if (!dart.test(this[_workList][$isNotEmpty])) dart.assertFailed(null, "dart:collection/splay_tree.dart", 555, 12, "_workList.isNotEmpty");
      this[_workList][$clear]();
      if (currentNode == null) {
        this[_findLeftMostDescendent](this[_tree][_root]);
      } else {
        this[_tree][_splay](currentNode.key);
        this[_findLeftMostDescendent](this[_tree][_root].right);
        if (!dart.test(this[_workList][$isNotEmpty])) dart.assertFailed(null, "dart:collection/splay_tree.dart", 562, 14, "_workList.isNotEmpty");
      }
    }
    moveNext() {
      if (this[_modificationCount] != this[_tree][_modificationCount]) {
        dart.throw(new core.ConcurrentModificationError.new(this[_tree]));
      }
      if (dart.test(this[_workList][$isEmpty])) {
        this[_currentNode] = null;
        return false;
      }
      if (this[_tree][_splayCount] != this[_splayCount] && this[_currentNode] != null) {
        this[_rebuildWorkList](this[_currentNode]);
      }
      this[_currentNode] = this[_workList][$removeLast]();
      this[_findLeftMostDescendent](this[_currentNode].right);
      return true;
    }
  }
  (_SplayTreeIterator.new = function(tree) {
    this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
    this[_currentNode] = null;
    this[_tree] = tree;
    this[_modificationCount] = tree[_modificationCount];
    this[_splayCount] = tree[_splayCount];
    this[_findLeftMostDescendent](tree[_root]);
  }).prototype = _SplayTreeIterator.prototype;
  (_SplayTreeIterator.startAt = function(tree, startKey) {
    this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
    this[_splayCount] = null;
    this[_currentNode] = null;
    this[_tree] = tree;
    this[_modificationCount] = tree[_modificationCount];
    if (tree[_root] == null) return;
    let compare = tree[_splay](startKey);
    this[_splayCount] = tree[_splayCount];
    if (dart.notNull(compare) < 0) {
      this[_findLeftMostDescendent](tree[_root].right);
    } else {
      this[_workList][$add](tree[_root]);
    }
  }).prototype = _SplayTreeIterator.prototype;
  dart.addTypeTests(_SplayTreeIterator);
  _SplayTreeIterator.prototype[_is__SplayTreeIterator_default] = true;
  _SplayTreeIterator[dart.implements] = () => [IteratorOfT()];
  dart.setMethodSignature(_SplayTreeIterator, () => ({
    __proto__: dart.getMethods(_SplayTreeIterator.__proto__),
    [_findLeftMostDescendent]: dart.fnType(dart.void, [core.Object]),
    [_rebuildWorkList]: dart.fnType(dart.void, [core.Object]),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(_SplayTreeIterator, () => ({
    __proto__: dart.getGetters(_SplayTreeIterator.__proto__),
    current: T
  }));
  dart.setLibraryUri(_SplayTreeIterator, "dart:collection");
  dart.setFieldSignature(_SplayTreeIterator, () => ({
    __proto__: dart.getFields(_SplayTreeIterator.__proto__),
    [_tree]: dart.finalFieldType(_SplayTreeOfK$_SplayTreeNodeOfK()),
    [_workList]: dart.finalFieldType(ListOf_SplayTreeNodeOfK()),
    [_modificationCount]: dart.fieldType(core.int),
    [_splayCount]: dart.fieldType(core.int),
    [_currentNode]: dart.fieldType(_SplayTreeNodeOfK())
  }));
  return _SplayTreeIterator;
});
collection._SplayTreeIterator = collection._SplayTreeIterator$();
dart.addTypeTests(collection._SplayTreeIterator, _is__SplayTreeIterator_default);
const _copyNode = dart.privateName(collection, "_copyNode");
const _is__SplayTreeKeyIterable_default = Symbol('_is__SplayTreeKeyIterable_default');
collection._SplayTreeKeyIterable$ = dart.generic(K => {
  let _SplayTreeKeyIteratorOfK = () => (_SplayTreeKeyIteratorOfK = dart.constFn(collection._SplayTreeKeyIterator$(K)))();
  let KAndKToint = () => (KAndKToint = dart.constFn(dart.fnType(core.int, [K, K])))();
  let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
  class _SplayTreeKeyIterable extends _internal.EfficientLengthIterable$(K) {
    get length() {
      return this[_tree][_count$];
    }
    get isEmpty() {
      return this[_tree][_count$] === 0;
    }
    get iterator() {
      return new (_SplayTreeKeyIteratorOfK()).new(this[_tree]);
    }
    toSet() {
      let set = new (SplayTreeSetOfK()).new(KAndKToint()._check(this[_tree][_comparator]), this[_tree][_validKey$]);
      set[_count$] = this[_tree][_count$];
      set[_root] = set[_copyNode](this[_tree][_root]);
      return set;
    }
  }
  (_SplayTreeKeyIterable.new = function(tree) {
    this[_tree] = tree;
    _SplayTreeKeyIterable.__proto__.new.call(this);
  }).prototype = _SplayTreeKeyIterable.prototype;
  dart.addTypeTests(_SplayTreeKeyIterable);
  _SplayTreeKeyIterable.prototype[_is__SplayTreeKeyIterable_default] = true;
  dart.setGetterSignature(_SplayTreeKeyIterable, () => ({
    __proto__: dart.getGetters(_SplayTreeKeyIterable.__proto__),
    length: core.int,
    [$length]: core.int,
    iterator: core.Iterator$(K),
    [$iterator]: core.Iterator$(K)
  }));
  dart.setLibraryUri(_SplayTreeKeyIterable, "dart:collection");
  dart.setFieldSignature(_SplayTreeKeyIterable, () => ({
    __proto__: dart.getFields(_SplayTreeKeyIterable.__proto__),
    [_tree]: dart.fieldType(_SplayTreeOfK$_SplayTreeNodeOfK())
  }));
  dart.defineExtensionMethods(_SplayTreeKeyIterable, ['toSet']);
  dart.defineExtensionAccessors(_SplayTreeKeyIterable, ['length', 'isEmpty', 'iterator']);
  return _SplayTreeKeyIterable;
});
collection._SplayTreeKeyIterable = collection._SplayTreeKeyIterable$();
dart.addTypeTests(collection._SplayTreeKeyIterable, _is__SplayTreeKeyIterable_default);
const _is__SplayTreeValueIterable_default = Symbol('_is__SplayTreeValueIterable_default');
collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
  let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
  let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
  class _SplayTreeValueIterable extends _internal.EfficientLengthIterable$(V) {
    get length() {
      return this[_map$0][_count$];
    }
    get isEmpty() {
      return this[_map$0][_count$] === 0;
    }
    get iterator() {
      return new (_SplayTreeValueIteratorOfK$V()).new(this[_map$0]);
    }
  }
  (_SplayTreeValueIterable.new = function(map) {
    this[_map$0] = map;
    _SplayTreeValueIterable.__proto__.new.call(this);
  }).prototype = _SplayTreeValueIterable.prototype;
  dart.addTypeTests(_SplayTreeValueIterable);
  _SplayTreeValueIterable.prototype[_is__SplayTreeValueIterable_default] = true;
  dart.setGetterSignature(_SplayTreeValueIterable, () => ({
    __proto__: dart.getGetters(_SplayTreeValueIterable.__proto__),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    iterator: core.Iterator$(V),
    [$iterator]: core.Iterator$(V)
  }));
  dart.setLibraryUri(_SplayTreeValueIterable, "dart:collection");
  dart.setFieldSignature(_SplayTreeValueIterable, () => ({
    __proto__: dart.getFields(_SplayTreeValueIterable.__proto__),
    [_map$0]: dart.fieldType(SplayTreeMapOfK$V())
  }));
  dart.defineExtensionAccessors(_SplayTreeValueIterable, ['length', 'isEmpty', 'iterator']);
  return _SplayTreeValueIterable;
});
collection._SplayTreeValueIterable = collection._SplayTreeValueIterable$();
dart.addTypeTests(collection._SplayTreeValueIterable, _is__SplayTreeValueIterable_default);
const _is__SplayTreeKeyIterator_default = Symbol('_is__SplayTreeKeyIterator_default');
collection._SplayTreeKeyIterator$ = dart.generic(K => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  class _SplayTreeKeyIterator extends collection._SplayTreeIterator$(K, K) {
    [_getValue](node) {
      _SplayTreeNodeOfK()._check(node);
      return node.key;
    }
  }
  (_SplayTreeKeyIterator.new = function(map) {
    _SplayTreeKeyIterator.__proto__.new.call(this, map);
  }).prototype = _SplayTreeKeyIterator.prototype;
  dart.addTypeTests(_SplayTreeKeyIterator);
  _SplayTreeKeyIterator.prototype[_is__SplayTreeKeyIterator_default] = true;
  dart.setMethodSignature(_SplayTreeKeyIterator, () => ({
    __proto__: dart.getMethods(_SplayTreeKeyIterator.__proto__),
    [_getValue]: dart.fnType(K, [core.Object])
  }));
  dart.setLibraryUri(_SplayTreeKeyIterator, "dart:collection");
  return _SplayTreeKeyIterator;
});
collection._SplayTreeKeyIterator = collection._SplayTreeKeyIterator$();
dart.addTypeTests(collection._SplayTreeKeyIterator, _is__SplayTreeKeyIterator_default);
const _is__SplayTreeValueIterator_default = Symbol('_is__SplayTreeValueIterator_default');
collection._SplayTreeValueIterator$ = dart.generic((K, V) => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
  class _SplayTreeValueIterator extends collection._SplayTreeIterator$(K, V) {
    [_getValue](node) {
      _SplayTreeNodeOfK()._check(node);
      let mapNode = _SplayTreeMapNodeOfK$V()._check(node);
      return mapNode.value;
    }
  }
  (_SplayTreeValueIterator.new = function(map) {
    _SplayTreeValueIterator.__proto__.new.call(this, map);
  }).prototype = _SplayTreeValueIterator.prototype;
  dart.addTypeTests(_SplayTreeValueIterator);
  _SplayTreeValueIterator.prototype[_is__SplayTreeValueIterator_default] = true;
  dart.setMethodSignature(_SplayTreeValueIterator, () => ({
    __proto__: dart.getMethods(_SplayTreeValueIterator.__proto__),
    [_getValue]: dart.fnType(V, [core.Object])
  }));
  dart.setLibraryUri(_SplayTreeValueIterator, "dart:collection");
  return _SplayTreeValueIterator;
});
collection._SplayTreeValueIterator = collection._SplayTreeValueIterator$();
dart.addTypeTests(collection._SplayTreeValueIterator, _is__SplayTreeValueIterator_default);
const _is__SplayTreeNodeIterator_default = Symbol('_is__SplayTreeNodeIterator_default');
collection._SplayTreeNodeIterator$ = dart.generic(K => {
  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
  class _SplayTreeNodeIterator extends collection._SplayTreeIterator$(K, collection._SplayTreeNode$(K)) {
    [_getValue](node) {
      _SplayTreeNodeOfK()._check(node);
      return node;
    }
  }
  (_SplayTreeNodeIterator.new = function(tree) {
    _SplayTreeNodeIterator.__proto__.new.call(this, tree);
  }).prototype = _SplayTreeNodeIterator.prototype;
  (_SplayTreeNodeIterator.startAt = function(tree, startKey) {
    _SplayTreeNodeIterator.__proto__.startAt.call(this, tree, startKey);
  }).prototype = _SplayTreeNodeIterator.prototype;
  dart.addTypeTests(_SplayTreeNodeIterator);
  _SplayTreeNodeIterator.prototype[_is__SplayTreeNodeIterator_default] = true;
  dart.setMethodSignature(_SplayTreeNodeIterator, () => ({
    __proto__: dart.getMethods(_SplayTreeNodeIterator.__proto__),
    [_getValue]: dart.fnType(collection._SplayTreeNode$(K), [core.Object])
  }));
  dart.setLibraryUri(_SplayTreeNodeIterator, "dart:collection");
  return _SplayTreeNodeIterator;
});
collection._SplayTreeNodeIterator = collection._SplayTreeNodeIterator$();
dart.addTypeTests(collection._SplayTreeNodeIterator, _is__SplayTreeNodeIterator_default);
const _clone$ = dart.privateName(collection, "_clone");
const _is_SplayTreeSet_default = Symbol('_is_SplayTreeSet_default');
collection.SplayTreeSet$ = dart.generic(E => {
  let _SplayTreeNodeOfE = () => (_SplayTreeNodeOfE = dart.constFn(collection._SplayTreeNode$(E)))();
  let SplayTreeSetOfE = () => (SplayTreeSetOfE = dart.constFn(collection.SplayTreeSet$(E)))();
  let _SplayTreeKeyIteratorOfE = () => (_SplayTreeKeyIteratorOfE = dart.constFn(collection._SplayTreeKeyIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
  let EAndEToint = () => (EAndEToint = dart.constFn(dart.fnType(core.int, [E, E])))();
  const _SplayTree_IterableMixin$ = class _SplayTree_IterableMixin extends collection._SplayTree$(E, collection._SplayTreeNode$(E)) {};
  (_SplayTree_IterableMixin$.new = function() {
    _SplayTree_IterableMixin$.__proto__.new.call(this);
  }).prototype = _SplayTree_IterableMixin$.prototype;
  dart.applyMixin(_SplayTree_IterableMixin$, collection.IterableMixin$(E));
  const _SplayTree_SetMixin$ = class _SplayTree_SetMixin extends _SplayTree_IterableMixin$ {};
  (_SplayTree_SetMixin$.new = function() {
    _SplayTree_SetMixin$.__proto__.new.call(this);
  }).prototype = _SplayTree_SetMixin$.prototype;
  dart.applyMixin(_SplayTree_SetMixin$, collection.SetMixin$(E));
  class SplayTreeSet extends _SplayTree_SetMixin$ {
    get [_root]() {
      return this[_root$];
    }
    set [_root](value) {
      this[_root$] = _SplayTreeNodeOfE()._check(value);
    }
    static from(elements, compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      let result = new (SplayTreeSetOfE()).new(compare, isValidKey);
      for (let element of elements) {
        let e = E._check(element);
        result.add(e);
      }
      return result;
    }
    static of(elements, compare, isValidKey) {
      if (compare === void 0) compare = null;
      if (isValidKey === void 0) isValidKey = null;
      let _ = new (SplayTreeSetOfE()).new(compare, isValidKey);
      _.addAll(elements);
      return _;
    }
    [_newSet](T) {
      return new (collection.SplayTreeSet$(T)).new(dart.fn((a, b) => this[_comparator](E.as(a), E.as(b)), dart.fnType(core.int, [T, T])), this[_validKey$]);
    }
    cast(R) {
      return core.Set.castFrom(E, R, this, {newSet: dart.bind(this, _newSet)});
    }
    [_compare](e1, e2) {
      E._check(e1);
      E._check(e2);
      return this[_comparator](e1, e2);
    }
    get iterator() {
      return new (_SplayTreeKeyIteratorOfE()).new(this);
    }
    get length() {
      return this[_count$];
    }
    get isEmpty() {
      return this[_root] == null;
    }
    get isNotEmpty() {
      return this[_root] != null;
    }
    get first() {
      if (this[_count$] === 0) dart.throw(_internal.IterableElementError.noElement());
      return this[_first$].key;
    }
    get last() {
      if (this[_count$] === 0) dart.throw(_internal.IterableElementError.noElement());
      return this[_last].key;
    }
    get single() {
      if (this[_count$] === 0) dart.throw(_internal.IterableElementError.noElement());
      if (dart.notNull(this[_count$]) > 1) dart.throw(_internal.IterableElementError.tooMany());
      return this[_root].key;
    }
    contains(element) {
      return dart.test(this[_validKey$](element)) && this[_splay](E._check(element)) === 0;
    }
    add(element) {
      E._check(element);
      let compare = this[_splay](element);
      if (compare === 0) return false;
      this[_addNewRoot](new (_SplayTreeNodeOfE()).new(element), compare);
      return true;
    }
    remove(object) {
      if (!dart.test(this[_validKey$](object))) return false;
      return this[_remove](E._check(object)) != null;
    }
    addAll(elements) {
      IterableOfE()._check(elements);
      for (let element of elements) {
        let compare = this[_splay](element);
        if (compare !== 0) {
          this[_addNewRoot](new (_SplayTreeNodeOfE()).new(element), compare);
        }
      }
    }
    removeAll(elements) {
      for (let element of elements) {
        if (dart.test(this[_validKey$](element))) this[_remove](E._check(element));
      }
    }
    retainAll(elements) {
      let retainSet = new (SplayTreeSetOfE()).new(this[_comparator], this[_validKey$]);
      let modificationCount = this[_modificationCount];
      for (let object of elements) {
        if (modificationCount != this[_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError.new(this));
        }
        if (dart.test(this[_validKey$](object)) && this[_splay](E._check(object)) === 0) {
          retainSet.add(this[_root].key);
        }
      }
      if (retainSet[_count$] != this[_count$]) {
        this[_root] = retainSet[_root];
        this[_count$] = retainSet[_count$];
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
    }
    lookup(object) {
      if (!dart.test(this[_validKey$](object))) return null;
      let comp = this[_splay](E._check(object));
      if (comp !== 0) return null;
      return this[_root].key;
    }
    intersection(other) {
      let result = new (SplayTreeSetOfE()).new(this[_comparator], this[_validKey$]);
      for (let element of this) {
        if (dart.test(other.contains(element))) result.add(element);
      }
      return result;
    }
    difference(other) {
      let result = new (SplayTreeSetOfE()).new(this[_comparator], this[_validKey$]);
      for (let element of this) {
        if (!dart.test(other.contains(element))) result.add(element);
      }
      return result;
    }
    union(other) {
      SetOfE()._check(other);
      let _ = this[_clone$]();
      _.addAll(other);
      return _;
    }
    [_clone$]() {
      let set = new (SplayTreeSetOfE()).new(this[_comparator], this[_validKey$]);
      set[_count$] = this[_count$];
      set[_root] = this[_copyNode](this[_root]);
      return set;
    }
    [_copyNode](node) {
      _SplayTreeNodeOfE()._check(node);
      if (node == null) return null;
      let _ = new (_SplayTreeNodeOfE()).new(node.key);
      _.left = this[_copyNode](node.left);
      _.right = this[_copyNode](node.right);
      return _;
    }
    clear() {
      this[_clear]();
    }
    toSet() {
      return this[_clone$]();
    }
    toString() {
      return collection.IterableBase.iterableToFullString(this, "{", "}");
    }
  }
  (SplayTreeSet.new = function(compare, isValidKey) {
    if (compare === void 0) compare = null;
    if (isValidKey === void 0) isValidKey = null;
    this[_root$] = null;
    this[_dummy] = new (_SplayTreeNodeOfE()).new(null);
    let l = compare;
    this[_comparator] = l != null ? l : collection._defaultCompare(E);
    let l$ = isValidKey;
    this[_validKey$] = l$ != null ? l$ : dart.fn(v => E.is(v), dynamicTobool());
    SplayTreeSet.__proto__.new.call(this);
  }).prototype = SplayTreeSet.prototype;
  dart.addTypeTests(SplayTreeSet);
  SplayTreeSet.prototype[_is_SplayTreeSet_default] = true;
  const _root$ = Symbol("SplayTreeSet._root");
  dart.setMethodSignature(SplayTreeSet, () => ({
    __proto__: dart.getMethods(SplayTreeSet.__proto__),
    [_newSet]: dart.gFnType(T => [core.Set$(T), []]),
    [_compare]: dart.fnType(core.int, [core.Object, core.Object]),
    contains: dart.fnType(core.bool, [core.Object]),
    [$contains]: dart.fnType(core.bool, [core.Object]),
    add: dart.fnType(core.bool, [core.Object]),
    remove: dart.fnType(core.bool, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    lookup: dart.fnType(E, [core.Object]),
    union: dart.fnType(core.Set$(E), [core.Object]),
    [_clone$]: dart.fnType(collection.SplayTreeSet$(E), []),
    [_copyNode]: dart.fnType(collection._SplayTreeNode$(E), [core.Object]),
    toSet: dart.fnType(core.Set$(E), []),
    [$toSet]: dart.fnType(core.Set$(E), [])
  }));
  dart.setGetterSignature(SplayTreeSet, () => ({
    __proto__: dart.getGetters(SplayTreeSet.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(SplayTreeSet, "dart:collection");
  dart.setFieldSignature(SplayTreeSet, () => ({
    __proto__: dart.getFields(SplayTreeSet.__proto__),
    [_root]: dart.fieldType(_SplayTreeNodeOfE()),
    [_dummy]: dart.finalFieldType(_SplayTreeNodeOfE()),
    [_comparator]: dart.fieldType(EAndEToint()),
    [_validKey$]: dart.fieldType(dynamicTobool())
  }));
  dart.defineExtensionMethods(SplayTreeSet, ['cast', 'contains', 'toSet', 'toString']);
  dart.defineExtensionAccessors(SplayTreeSet, [
    'iterator',
    'length',
    'isEmpty',
    'isNotEmpty',
    'first',
    'last',
    'single'
  ]);
  return SplayTreeSet;
});
collection.SplayTreeSet = collection.SplayTreeSet$();
dart.addTypeTests(collection.SplayTreeSet, _is_SplayTreeSet_default);
const _processed = dart.privateName(convert, "_processed");
const _computeKeys = dart.privateName(convert, "_computeKeys");
const _original = dart.privateName(convert, "_original");
convert._convertJsonToDart = function(json, reviver) {
  if (!(reviver != null)) dart.assertFailed(null, "dart:convert", 86, 10, "reviver != null");
  function walk(e) {
    if (e == null || typeof e != "object") {
      return e;
    }
    if (Object.getPrototypeOf(e) === Array.prototype) {
      for (let i = 0; i < e.length; i++) {
        let item = e[i];
        e[i] = reviver(i, walk(item));
      }
      return e;
    }
    let map = new convert._JsonMap.new(e);
    let processed = map[_processed];
    let keys = map[_computeKeys]();
    for (let i = 0; i < dart.notNull(keys[$length]); i++) {
      let key = keys[$_get](i);
      let revived = reviver(key, walk(e[key]));
      processed[key] = revived;
    }
    map[_original] = processed;
    return map;
  }
  dart.fn(walk, dynamicTodynamic());
  return reviver(null, walk(json));
};
convert._convertJsonToDartLazy = function(object) {
  if (object == null) return null;
  if (typeof object != "object") {
    return object;
  }
  if (Object.getPrototypeOf(object) !== Array.prototype) {
    return new convert._JsonMap.new(object);
  }
  for (let i = 0; i < object.length; i++) {
    let item = object[i];
    object[i] = convert._convertJsonToDartLazy(item);
  }
  return object;
};
const _data = dart.privateName(convert, "_data");
const _isUpgraded = dart.privateName(convert, "_isUpgraded");
const _upgradedMap = dart.privateName(convert, "_upgradedMap");
const _process$ = dart.privateName(convert, "_process");
const _upgrade = dart.privateName(convert, "_upgrade");
core.String = class String extends core.Object {
  static fromCharCodes(charCodes, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (_interceptors.JSArray.is(charCodes)) {
      return core.String._stringFromJSArray(charCodes, start, end);
    }
    if (_native_typed_data.NativeUint8List.is(charCodes)) {
      return core.String._stringFromUint8List(charCodes, start, end);
    }
    return core.String._stringFromIterable(charCodes, start, end);
  }
  static fromCharCode(charCode) {
    return _js_helper.Primitives.stringFromCharCode(charCode);
  }
  static fromEnvironment(name, opts) {
    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
    dart.throw(new core.UnsupportedError.new("String.fromEnvironment can only be used as a const constructor"));
  }
  static _stringFromJSArray(list, start, endOrNull) {
    let len = core.int._check(dart.dload(list, 'length'));
    let end = core.RangeError.checkValidRange(start, endOrNull, len);
    if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(len)) {
      list = dart.dsend(list, 'sublist', [start, end]);
    }
    return _js_helper.Primitives.stringFromCharCodes(JSArrayOfint()._check(list));
  }
  static _stringFromUint8List(charCodes, start, endOrNull) {
    let len = charCodes[$length];
    let end = core.RangeError.checkValidRange(start, endOrNull, len);
    return _js_helper.Primitives.stringFromNativeUint8List(charCodes, start, end);
  }
  static _stringFromIterable(charCodes, start, end) {
    if (dart.notNull(start) < 0) dart.throw(new core.RangeError.range(start, 0, charCodes[$length]));
    if (end != null && dart.notNull(end) < dart.notNull(start)) {
      dart.throw(new core.RangeError.range(end, start, charCodes[$length]));
    }
    let it = charCodes[$iterator];
    for (let i = 0; i < dart.notNull(start); i++) {
      if (!dart.test(it.moveNext())) {
        dart.throw(new core.RangeError.range(start, 0, i));
      }
    }
    let list = JSArrayOfint().of([]);
    if (end == null) {
      while (dart.test(it.moveNext()))
        list[$add](it.current);
    } else {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        if (!dart.test(it.moveNext())) {
          dart.throw(new core.RangeError.range(end, start, i));
        }
        list[$add](it.current);
      }
    }
    return _js_helper.Primitives.stringFromCharCodes(JSArrayOfint()._check(list));
  }
};
(core.String[dart.mixinNew] = function() {
}).prototype = core.String.prototype;
core.String.is = function is_String(o) {
  return typeof o == "string";
};
core.String.as = function as_String(o) {
  if (typeof o == "string" || o == null) return o;
  return dart.as(o, core.String, false);
};
core.String._check = function check_String(o) {
  if (typeof o == "string" || o == null) return o;
  return dart.as(o, core.String, true);
};
core.String[dart.implements] = () => [ComparableOfString(), core.Pattern];
dart.setLibraryUri(core.String, "dart:core");
convert._JsonMap = class _JsonMap extends collection.MapBase$(core.String, dart.dynamic) {
  _get(key) {
    if (dart.test(this[_isUpgraded])) {
      return this[_upgradedMap][$_get](key);
    } else if (!(typeof key == 'string')) {
      return null;
    } else {
      let result = convert._JsonMap._getProperty(this[_processed], core.String._check(key));
      if (dart.test(convert._JsonMap._isUnprocessed(result))) result = this[_process$](core.String._check(key));
      return result;
    }
  }
  get length() {
    return dart.test(this[_isUpgraded]) ? this[_upgradedMap][$length] : this[_computeKeys]()[$length];
  }
  get isEmpty() {
    return this.length === 0;
  }
  get isNotEmpty() {
    return dart.notNull(this.length) > 0;
  }
  get keys() {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][$keys];
    return new convert._JsonMapKeyIterable.new(this);
  }
  get values() {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][$values];
    return MappedIterableOfString$dynamic().new(this[_computeKeys](), dart.fn(each => this._get(each), dynamicTodynamic()));
  }
  _set(key, value) {
    core.String._check(key);
    if (dart.test(this[_isUpgraded])) {
      this[_upgradedMap][$_set](key, value);
    } else if (dart.test(this.containsKey(key))) {
      let processed = this[_processed];
      convert._JsonMap._setProperty(processed, key, value);
      let original = this[_original];
      if (!core.identical(original, processed)) {
        convert._JsonMap._setProperty(original, key, null);
      }
    } else {
      this[_upgrade]()[$_set](key, value);
    }
    return value;
  }
  addAll(other) {
    MapOfString$dynamic()._check(other);
    other[$forEach](dart.fn((key, value) => {
      this._set(key, value);
    }, StringAnddynamicToNull()));
  }
  containsValue(value) {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][$containsValue](value);
    let keys = this[_computeKeys]();
    for (let i = 0; i < dart.notNull(keys[$length]); i++) {
      let key = keys[$_get](i);
      if (dart.equals(this._get(key), value)) return true;
    }
    return false;
  }
  containsKey(key) {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][$containsKey](key);
    if (!(typeof key == 'string')) return false;
    return convert._JsonMap._hasProperty(this[_original], core.String._check(key));
  }
  putIfAbsent(key, ifAbsent) {
    core.String._check(key);
    if (dart.test(this.containsKey(key))) return this._get(key);
    let value = ifAbsent();
    this._set(key, value);
    return value;
  }
  remove(key) {
    if (!dart.test(this[_isUpgraded]) && !dart.test(this.containsKey(key))) return null;
    return this[_upgrade]()[$remove](key);
  }
  clear() {
    if (dart.test(this[_isUpgraded])) {
      this[_upgradedMap][$clear]();
    } else {
      if (this[_data] != null) {
        dart.dsend(this[_data], 'clear', []);
      }
      this[_original] = this[_processed] = null;
      this[_data] = new _js_helper.LinkedMap.new();
    }
  }
  forEach(f) {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][$forEach](f);
    let keys = this[_computeKeys]();
    for (let i = 0; i < dart.notNull(keys[$length]); i++) {
      let key = keys[$_get](i);
      let value = convert._JsonMap._getProperty(this[_processed], key);
      if (dart.test(convert._JsonMap._isUnprocessed(value))) {
        value = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
        convert._JsonMap._setProperty(this[_processed], key, value);
      }
      f(key, value);
      if (!core.identical(keys, this[_data])) {
        dart.throw(new core.ConcurrentModificationError.new(this));
      }
    }
  }
  get [_isUpgraded]() {
    return this[_processed] == null;
  }
  get [_upgradedMap]() {
    if (!dart.test(this[_isUpgraded])) dart.assertFailed(null, "dart:convert", 295, 12, "_isUpgraded");
    return this[_data];
  }
  [_computeKeys]() {
    if (!!dart.test(this[_isUpgraded])) dart.assertFailed(null, "dart:convert", 303, 12, "!_isUpgraded");
    let keys = core.List._check(this[_data]);
    if (keys == null) {
      keys = this[_data] = convert._JsonMap._getPropertyNames(this[_original]);
    }
    return keys;
  }
  [_upgrade]() {
    if (dart.test(this[_isUpgraded])) return this[_upgradedMap];
    let result = new (IdentityMapOfString$dynamic()).new();
    let keys = this[_computeKeys]();
    for (let i = 0; i < dart.notNull(keys[$length]); i++) {
      let key = keys[$_get](i);
      result[$_set](key, this._get(key));
    }
    if (dart.test(keys[$isEmpty])) {
      keys[$add](null);
    } else {
      keys[$clear]();
    }
    this[_original] = this[_processed] = null;
    this[_data] = result;
    if (!dart.test(this[_isUpgraded])) dart.assertFailed(null, "dart:convert", 336, 12, "_isUpgraded");
    return result;
  }
  [_process$](key) {
    if (!dart.test(convert._JsonMap._hasProperty(this[_original], key))) return null;
    let result = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
    return convert._JsonMap._setProperty(this[_processed], key, result);
  }
  static _hasProperty(object, key) {
    return Object.prototype.hasOwnProperty.call(object, key);
  }
  static _getProperty(object, key) {
    return object[key];
  }
  static _setProperty(object, key, value) {
    return object[key] = value;
  }
  static _getPropertyNames(object) {
    return Object.keys(object);
  }
  static _isUnprocessed(object) {
    return typeof object == "undefined";
  }
  static _newJavaScriptObject() {
    return Object.create(null);
  }
};
(convert._JsonMap.new = function(original) {
  this[_processed] = convert._JsonMap._newJavaScriptObject();
  this[_data] = null;
  this[_original] = original;
}).prototype = convert._JsonMap.prototype;
dart.addTypeTests(convert._JsonMap);
dart.setMethodSignature(convert._JsonMap, () => ({
  __proto__: dart.getMethods(convert._JsonMap.__proto__),
  _get: dart.fnType(dart.dynamic, [core.Object]),
  [$_get]: dart.fnType(dart.dynamic, [core.Object]),
  _set: dart.fnType(dart.void, [core.Object, dart.dynamic]),
  [$_set]: dart.fnType(dart.void, [core.Object, dart.dynamic]),
  addAll: dart.fnType(dart.void, [core.Object]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  containsValue: dart.fnType(core.bool, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [core.Object]),
  containsKey: dart.fnType(core.bool, [core.Object]),
  [$containsKey]: dart.fnType(core.bool, [core.Object]),
  putIfAbsent: dart.fnType(dart.dynamic, [core.Object, dart.fnType(dart.dynamic, [])]),
  [$putIfAbsent]: dart.fnType(dart.dynamic, [core.Object, dart.fnType(dart.dynamic, [])]),
  remove: dart.fnType(dart.dynamic, [core.Object]),
  [$remove]: dart.fnType(dart.dynamic, [core.Object]),
  clear: dart.fnType(dart.void, []),
  [$clear]: dart.fnType(dart.void, []),
  forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, dart.dynamic])]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, dart.dynamic])]),
  [_computeKeys]: dart.fnType(core.List$(core.String), []),
  [_upgrade]: dart.fnType(core.Map$(core.String, dart.dynamic), []),
  [_process$]: dart.fnType(dart.dynamic, [core.String])
}));
dart.setGetterSignature(convert._JsonMap, () => ({
  __proto__: dart.getGetters(convert._JsonMap.__proto__),
  length: core.int,
  [$length]: core.int,
  isEmpty: core.bool,
  [$isEmpty]: core.bool,
  isNotEmpty: core.bool,
  [$isNotEmpty]: core.bool,
  keys: core.Iterable$(core.String),
  [$keys]: core.Iterable$(core.String),
  values: core.Iterable,
  [$values]: core.Iterable,
  [_isUpgraded]: core.bool,
  [_upgradedMap]: core.Map$(core.String, dart.dynamic)
}));
dart.setLibraryUri(convert._JsonMap, "dart:convert");
dart.setFieldSignature(convert._JsonMap, () => ({
  __proto__: dart.getFields(convert._JsonMap.__proto__),
  [_original]: dart.fieldType(dart.dynamic),
  [_processed]: dart.fieldType(dart.dynamic),
  [_data]: dart.fieldType(dart.dynamic)
}));
dart.defineExtensionMethods(convert._JsonMap, [
  '_get',
  '_set',
  'addAll',
  'containsValue',
  'containsKey',
  'putIfAbsent',
  'remove',
  'clear',
  'forEach'
]);
dart.defineExtensionAccessors(convert._JsonMap, [
  'length',
  'isEmpty',
  'isNotEmpty',
  'keys',
  'values'
]);
const _parent = dart.privateName(convert, "_parent");
convert._JsonMapKeyIterable = class _JsonMapKeyIterable extends _internal.ListIterable$(core.String) {
  get length() {
    return this[_parent].length;
  }
  elementAt(index) {
    return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[$elementAt](index) : this[_parent][_computeKeys]()[$_get](index);
  }
  get iterator() {
    return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[$iterator] : this[_parent][_computeKeys]()[$iterator];
  }
  contains(key) {
    return this[_parent].containsKey(key);
  }
};
(convert._JsonMapKeyIterable.new = function(parent) {
  this[_parent] = parent;
  convert._JsonMapKeyIterable.__proto__.new.call(this);
}).prototype = convert._JsonMapKeyIterable.prototype;
dart.addTypeTests(convert._JsonMapKeyIterable);
dart.setMethodSignature(convert._JsonMapKeyIterable, () => ({
  __proto__: dart.getMethods(convert._JsonMapKeyIterable.__proto__),
  elementAt: dart.fnType(core.String, [core.int]),
  [$elementAt]: dart.fnType(core.String, [core.int]),
  contains: dart.fnType(core.bool, [core.Object]),
  [$contains]: dart.fnType(core.bool, [core.Object])
}));
dart.setGetterSignature(convert._JsonMapKeyIterable, () => ({
  __proto__: dart.getGetters(convert._JsonMapKeyIterable.__proto__),
  length: core.int,
  [$length]: core.int,
  iterator: core.Iterator$(core.String),
  [$iterator]: core.Iterator$(core.String)
}));
dart.setLibraryUri(convert._JsonMapKeyIterable, "dart:convert");
dart.setFieldSignature(convert._JsonMapKeyIterable, () => ({
  __proto__: dart.getFields(convert._JsonMapKeyIterable.__proto__),
  [_parent]: dart.finalFieldType(convert._JsonMap)
}));
dart.defineExtensionMethods(convert._JsonMapKeyIterable, ['elementAt', 'contains']);
dart.defineExtensionAccessors(convert._JsonMapKeyIterable, ['length', 'iterator']);
const _reviver = dart.privateName(convert, "_reviver");
const _sink$ = dart.privateName(convert, "_sink");
const _stringSink = dart.privateName(convert, "_stringSink");
convert.StringConversionSinkMixin = class StringConversionSinkMixin extends core.Object {
  add(str) {
    core.String._check(str);
    this.addSlice(str, 0, str.length, false);
  }
  asUtf8Sink(allowMalformed) {
    return new convert._Utf8ConversionSink.new(this, allowMalformed);
  }
  asStringSink() {
    return new convert._StringConversionSinkAsStringSinkAdapter.new(this);
  }
};
(convert.StringConversionSinkMixin.new = function() {
}).prototype = convert.StringConversionSinkMixin.prototype;
dart.addTypeTests(convert.StringConversionSinkMixin);
convert.StringConversionSinkMixin[dart.implements] = () => [convert.StringConversionSink];
dart.setMethodSignature(convert.StringConversionSinkMixin, () => ({
  __proto__: dart.getMethods(convert.StringConversionSinkMixin.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  asUtf8Sink: dart.fnType(convert.ByteConversionSink, [core.bool]),
  asStringSink: dart.fnType(convert.ClosableStringSink, [])
}));
dart.setLibraryUri(convert.StringConversionSinkMixin, "dart:convert");
convert.StringConversionSinkBase = class StringConversionSinkBase extends convert.StringConversionSinkMixin {};
(convert.StringConversionSinkBase.new = function() {
}).prototype = convert.StringConversionSinkBase.prototype;
dart.addTypeTests(convert.StringConversionSinkBase);
dart.setLibraryUri(convert.StringConversionSinkBase, "dart:convert");
const _is__StringSinkConversionSink_default = Symbol('_is__StringSinkConversionSink_default');
convert._StringSinkConversionSink$ = dart.generic(TStringSink => {
  class _StringSinkConversionSink extends convert.StringConversionSinkBase {
    close() {}
    addSlice(str, start, end, isLast) {
      if (start !== 0 || end !== str.length) {
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          this[_stringSink].writeCharCode(str[$codeUnitAt](i));
        }
      } else {
        this[_stringSink].write(str);
      }
      if (dart.test(isLast)) this.close();
    }
    add(str) {
      core.String._check(str);
      this[_stringSink].write(str);
    }
    asUtf8Sink(allowMalformed) {
      return new convert._Utf8StringSinkAdapter.new(this, this[_stringSink], allowMalformed);
    }
    asStringSink() {
      return convert.ClosableStringSink.fromStringSink(this[_stringSink], dart.bind(this, 'close'));
    }
  }
  (_StringSinkConversionSink.new = function(stringSink) {
    this[_stringSink] = stringSink;
  }).prototype = _StringSinkConversionSink.prototype;
  dart.addTypeTests(_StringSinkConversionSink);
  _StringSinkConversionSink.prototype[_is__StringSinkConversionSink_default] = true;
  dart.setMethodSignature(_StringSinkConversionSink, () => ({
    __proto__: dart.getMethods(_StringSinkConversionSink.__proto__),
    close: dart.fnType(dart.void, []),
    addSlice: dart.fnType(dart.void, [core.String, core.int, core.int, core.bool]),
    add: dart.fnType(dart.void, [core.Object]),
    asUtf8Sink: dart.fnType(convert.ByteConversionSink, [core.bool]),
    asStringSink: dart.fnType(convert.ClosableStringSink, [])
  }));
  dart.setLibraryUri(_StringSinkConversionSink, "dart:convert");
  dart.setFieldSignature(_StringSinkConversionSink, () => ({
    __proto__: dart.getFields(_StringSinkConversionSink.__proto__),
    [_stringSink]: dart.fieldType(TStringSink)
  }));
  return _StringSinkConversionSink;
});
convert._StringSinkConversionSink = convert._StringSinkConversionSink$();
dart.addTypeTests(convert._StringSinkConversionSink, _is__StringSinkConversionSink_default);
core.StringSink = class StringSink extends core.Object {};
(core.StringSink.new = function() {
}).prototype = core.StringSink.prototype;
dart.addTypeTests(core.StringSink);
dart.setLibraryUri(core.StringSink, "dart:core");
convert._JsonDecoderSink = class _JsonDecoderSink extends convert._StringSinkConversionSink$(core.StringSink) {
  close() {
    super.close();
    let buffer = core.StringBuffer._check(this[_stringSink]);
    let accumulated = dart.toString(buffer);
    buffer.clear();
    let decoded = convert._parseJson(accumulated, this[_reviver]);
    this[_sink$].add(decoded);
    this[_sink$].close();
  }
};
(convert._JsonDecoderSink.new = function(reviver, sink) {
  this[_reviver] = reviver;
  this[_sink$] = sink;
  convert._JsonDecoderSink.__proto__.new.call(this, new core.StringBuffer.new(""));
}).prototype = convert._JsonDecoderSink.prototype;
dart.addTypeTests(convert._JsonDecoderSink);
dart.setMethodSignature(convert._JsonDecoderSink, () => ({
  __proto__: dart.getMethods(convert._JsonDecoderSink.__proto__),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._JsonDecoderSink, "dart:convert");
dart.setFieldSignature(convert._JsonDecoderSink, () => ({
  __proto__: dart.getFields(convert._JsonDecoderSink.__proto__),
  [_reviver]: dart.finalFieldType(ObjectAndObjectTodynamic()),
  [_sink$]: dart.finalFieldType(SinkOfObject())
}));
dart.defineLazy(convert, {
  /*convert.ascii*/get ascii() {
    return dart.const(new convert.AsciiCodec.new());
  },
  /*convert._asciiMask*/get _asciiMask() {
    return 127;
  }
});
const _allowInvalid = dart.privateName(convert, "_allowInvalid");
let const$32;
let const$33;
let const$34;
let const$35;
let const$36;
const _is_Codec_default = Symbol('_is_Codec_default');
convert.Codec$ = dart.generic((S, T) => {
  let _InvertedCodecOfT$S = () => (_InvertedCodecOfT$S = dart.constFn(convert._InvertedCodec$(T, S)))();
  class Codec extends core.Object {
    encode(input) {
      S._check(input);
      return this.encoder.convert(input);
    }
    decode(encoded) {
      T._check(encoded);
      return this.decoder.convert(encoded);
    }
    fuse(R, other) {
      convert.Codec$(T, R)._check(other);
      return new (convert._FusedCodec$(S, T, R)).new(this, other);
    }
    get inverted() {
      return new (_InvertedCodecOfT$S()).new(this);
    }
  }
  (Codec.new = function() {
  }).prototype = Codec.prototype;
  dart.addTypeTests(Codec);
  Codec.prototype[_is_Codec_default] = true;
  dart.setMethodSignature(Codec, () => ({
    __proto__: dart.getMethods(Codec.__proto__),
    encode: dart.fnType(T, [core.Object]),
    decode: dart.fnType(S, [core.Object]),
    fuse: dart.gFnType(R => [convert.Codec$(S, R), [core.Object]])
  }));
  dart.setGetterSignature(Codec, () => ({
    __proto__: dart.getGetters(Codec.__proto__),
    inverted: convert.Codec$(T, S)
  }));
  dart.setLibraryUri(Codec, "dart:convert");
  return Codec;
});
convert.Codec = convert.Codec$();
dart.addTypeTests(convert.Codec, _is_Codec_default);
core.List$ = dart.generic(E => {
  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
  class List extends core.Object {
    static new(_length) {
      let list = null;
      if (_length === void 0) {
        list = [];
      } else {
        let length = _length;
        if (_length == null || length < 0) {
          dart.throw(new core.ArgumentError.new("Length must be a non-negative integer: " + dart.str(_length)));
        }
        list = new Array(length);
        list.fill(null);
        _interceptors.JSArray.markFixedList(list);
      }
      return JSArrayOfE().of(list);
    }
    static filled(length, fill, opts) {
      if (length == null) dart.argumentError(length);
      let growable = opts && 'growable' in opts ? opts.growable : false;
      let list = JSArrayOfE().of(new Array(length));
      list.fill(fill);
      if (!dart.test(growable)) _interceptors.JSArray.markFixedList(list);
      return list;
    }
    static from(elements, opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let list = JSArrayOfE().of([]);
      if (IterableOfE().is(elements)) {
        for (let e of elements) {
          list[$add](e);
        }
      } else {
        for (let e of elements) {
          list[$add](E.as(e));
        }
      }
      if (!dart.test(growable)) _interceptors.JSArray.markFixedList(list);
      return list;
    }
    static of(elements, opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return ListOfE().from(elements, {growable: growable});
    }
    static generate(length, generator, opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      let result = null;
      if (dart.test(growable)) {
        result = JSArrayOfE().of([]);
        result[$length] = length;
      } else {
        result = ListOfE().new(length);
      }
      for (let i = 0; i < dart.notNull(length); i++) {
        result[$_set](i, generator(i));
      }
      return result;
    }
    static unmodifiable(elements) {
      let list = ListOfE().from(elements);
      _interceptors.JSArray.markUnmodifiableList(list);
      return list;
    }
    static castFrom(S, T, source) {
      return new (_internal.CastList$(S, T)).new(source);
    }
    static copyRange(T, target, at, source, start, end) {
      if (start === void 0) start = null;
      if (end === void 0) end = null;
      let t = start;
      t == null ? start = 0 : t;
      end = core.RangeError.checkValidRange(start, end, source[$length]);
      let length = dart.notNull(end) - dart.notNull(start);
      if (dart.notNull(target[$length]) < dart.notNull(at) + length) {
        dart.throw(new core.ArgumentError.value(target, "target", "Not big enough to hold " + dart.str(length) + " elements at position " + dart.str(at)));
      }
      if (!(source == target) || dart.notNull(start) >= dart.notNull(at)) {
        for (let i = 0; i < length; i++) {
          target[$_set](dart.notNull(at) + i, source[$_get](dart.notNull(start) + i));
        }
      } else {
        for (let i = length; --i >= 0;) {
          target[$_set](dart.notNull(at) + i, source[$_get](dart.notNull(start) + i));
        }
      }
    }
    static writeIterable(T, target, at, source) {
      core.RangeError.checkValueInInterval(at, 0, target[$length], "at");
      let index = at;
      let targetLength = target[$length];
      for (let element of source) {
        if (index == targetLength) {
          dart.throw(new core.IndexError.new(targetLength, target));
        }
        target[$_set](index, element);
        index = dart.notNull(index) + 1;
      }
    }
  }
  (List[dart.mixinNew] = function() {
  }).prototype = List.prototype;
  dart.addTypeTests(List);
  List.prototype[dart.isList] = true;
  List[dart.implements] = () => [EfficientLengthIterableOfE()];
  dart.setLibraryUri(List, "dart:core");
  return List;
});
core.List = core.List$();
dart.addTypeTests(core.List, dart.isList);
convert.Encoding = class Encoding extends convert.Codec$(core.String, core.List$(core.int)) {
  decodeStream(byteStream) {
    return FutureOfString()._check(FutureOfStringBuffer()._check(StreamOfString()._check(byteStream.transform(core.String, this.decoder)).fold(core.StringBuffer, new core.StringBuffer.new(), dart.fn((buffer, string) => {
      buffer.write(string);
      return buffer;
    }, StringBufferAndStringToStringBuffer()))).then(core.String, dart.fn(buffer => dart.toString(buffer), StringBufferToString())));
  }
  static getByName(name) {
    if (name == null) return null;
    name = name[$toLowerCase]();
    return convert.Encoding._nameToEncoding[$_get](name);
  }
};
(convert.Encoding.new = function() {
  convert.Encoding.__proto__.new.call(this);
}).prototype = convert.Encoding.prototype;
dart.addTypeTests(convert.Encoding);
dart.setMethodSignature(convert.Encoding, () => ({
  __proto__: dart.getMethods(convert.Encoding.__proto__),
  decodeStream: dart.fnType(async.Future$(core.String), [async.Stream$(core.List$(core.int))])
}));
dart.setLibraryUri(convert.Encoding, "dart:convert");
dart.defineLazy(convert.Encoding, {
  /*convert.Encoding._nameToEncoding*/get _nameToEncoding() {
    return new (IdentityMapOfString$Encoding()).from(["iso_8859-1:1987", convert.latin1, "iso-ir-100", convert.latin1, "iso_8859-1", convert.latin1, "iso-8859-1", convert.latin1, "latin1", convert.latin1, "l1", convert.latin1, "ibm819", convert.latin1, "cp819", convert.latin1, "csisolatin1", convert.latin1, "iso-ir-6", convert.ascii, "ansi_x3.4-1968", convert.ascii, "ansi_x3.4-1986", convert.ascii, "iso_646.irv:1991", convert.ascii, "iso646-us", convert.ascii, "us-ascii", convert.ascii, "us", convert.ascii, "ibm367", convert.ascii, "cp367", convert.ascii, "csascii", convert.ascii, "ascii", convert.ascii, "csutf8", convert.utf8, "utf-8", convert.utf8]);
  }
});
convert.AsciiCodec = class AsciiCodec extends convert.Encoding {
  get name() {
    return "us-ascii";
  }
  encode(source) {
    core.String._check(source);
    return this.encoder.convert(source);
  }
  decode(bytes, opts) {
    ListOfint()._check(bytes);
    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
    let t = allowInvalid;
    t == null ? allowInvalid = this[_allowInvalid] : t;
    if (dart.test(allowInvalid)) {
      return (const$32 || (const$32 = dart.const(new convert.AsciiDecoder.new({allowInvalid: true})))).convert(bytes);
    } else {
      return (const$33 || (const$33 = dart.const(new convert.AsciiDecoder.new({allowInvalid: false})))).convert(bytes);
    }
  }
  get encoder() {
    return const$34 || (const$34 = dart.const(new convert.AsciiEncoder.new()));
  }
  get decoder() {
    return dart.test(this[_allowInvalid]) ? const$35 || (const$35 = dart.const(new convert.AsciiDecoder.new({allowInvalid: true}))) : const$36 || (const$36 = dart.const(new convert.AsciiDecoder.new({allowInvalid: false})));
  }
};
(convert.AsciiCodec.new = function(opts) {
  let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
  this[_allowInvalid] = allowInvalid;
  convert.AsciiCodec.__proto__.new.call(this);
}).prototype = convert.AsciiCodec.prototype;
dart.addTypeTests(convert.AsciiCodec);
dart.setMethodSignature(convert.AsciiCodec, () => ({
  __proto__: dart.getMethods(convert.AsciiCodec.__proto__),
  encode: dart.fnType(typed_data.Uint8List, [core.Object]),
  decode: dart.fnType(core.String, [core.Object], {allowInvalid: core.bool})
}));
dart.setGetterSignature(convert.AsciiCodec, () => ({
  __proto__: dart.getGetters(convert.AsciiCodec.__proto__),
  name: core.String,
  encoder: convert.AsciiEncoder,
  decoder: convert.AsciiDecoder
}));
dart.setLibraryUri(convert.AsciiCodec, "dart:convert");
dart.setFieldSignature(convert.AsciiCodec, () => ({
  __proto__: dart.getFields(convert.AsciiCodec.__proto__),
  [_allowInvalid]: dart.finalFieldType(core.bool)
}));
const _subsetMask = dart.privateName(convert, "_subsetMask");
convert._UnicodeSubsetEncoder = class _UnicodeSubsetEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
  convert(string, start, end) {
    core.String._check(string);
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let stringLength = string.length;
    end = core.RangeError.checkValidRange(start, end, stringLength);
    let length = dart.notNull(end) - dart.notNull(start);
    let result = typed_data.Uint8List.new(length);
    for (let i = 0; i < length; i++) {
      let codeUnit = string[$codeUnitAt](dart.notNull(start) + i);
      if ((codeUnit & ~dart.notNull(this[_subsetMask])) !== 0) {
        dart.throw(new core.ArgumentError.value(string, "string", "Contains invalid characters."));
      }
      result[$_set](i, codeUnit);
    }
    return result;
  }
  startChunkedConversion(sink) {
    SinkOfListOfint()._check(sink);
    return new convert._UnicodeSubsetEncoderSink.new(this[_subsetMask], convert.ByteConversionSink.is(sink) ? sink : convert.ByteConversionSink.from(sink));
  }
  bind(stream) {
    StreamOfString()._check(stream);
    return super.bind(stream);
  }
};
(convert._UnicodeSubsetEncoder.new = function(subsetMask) {
  this[_subsetMask] = subsetMask;
  convert._UnicodeSubsetEncoder.__proto__.new.call(this);
}).prototype = convert._UnicodeSubsetEncoder.prototype;
dart.addTypeTests(convert._UnicodeSubsetEncoder);
dart.setMethodSignature(convert._UnicodeSubsetEncoder, () => ({
  __proto__: dart.getMethods(convert._UnicodeSubsetEncoder.__proto__),
  convert: dart.fnType(typed_data.Uint8List, [core.Object], [core.int, core.int]),
  startChunkedConversion: dart.fnType(convert.StringConversionSink, [core.Object]),
  bind: dart.fnType(async.Stream$(core.List$(core.int)), [core.Object])
}));
dart.setLibraryUri(convert._UnicodeSubsetEncoder, "dart:convert");
dart.setFieldSignature(convert._UnicodeSubsetEncoder, () => ({
  __proto__: dart.getFields(convert._UnicodeSubsetEncoder.__proto__),
  [_subsetMask]: dart.finalFieldType(core.int)
}));
convert.AsciiEncoder = class AsciiEncoder extends convert._UnicodeSubsetEncoder {};
(convert.AsciiEncoder.new = function() {
  convert.AsciiEncoder.__proto__.new.call(this, 127);
}).prototype = convert.AsciiEncoder.prototype;
dart.addTypeTests(convert.AsciiEncoder);
dart.setLibraryUri(convert.AsciiEncoder, "dart:convert");
convert._UnicodeSubsetEncoderSink = class _UnicodeSubsetEncoderSink extends convert.StringConversionSinkBase {
  close() {
    this[_sink$].close();
  }
  addSlice(source, start, end, isLast) {
    core.RangeError.checkValidRange(start, end, source.length);
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let codeUnit = source[$codeUnitAt](i);
      if ((codeUnit & ~dart.notNull(this[_subsetMask])) !== 0) {
        dart.throw(new core.ArgumentError.new("Source contains invalid character with code point: " + dart.str(codeUnit) + "."));
      }
    }
    this[_sink$].add(source[$codeUnits][$sublist](start, end));
    if (dart.test(isLast)) {
      this.close();
    }
  }
};
(convert._UnicodeSubsetEncoderSink.new = function(subsetMask, sink) {
  this[_subsetMask] = subsetMask;
  this[_sink$] = sink;
}).prototype = convert._UnicodeSubsetEncoderSink.prototype;
dart.addTypeTests(convert._UnicodeSubsetEncoderSink);
dart.setMethodSignature(convert._UnicodeSubsetEncoderSink, () => ({
  __proto__: dart.getMethods(convert._UnicodeSubsetEncoderSink.__proto__),
  close: dart.fnType(dart.void, []),
  addSlice: dart.fnType(dart.void, [core.String, core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._UnicodeSubsetEncoderSink, "dart:convert");
dart.setFieldSignature(convert._UnicodeSubsetEncoderSink, () => ({
  __proto__: dart.getFields(convert._UnicodeSubsetEncoderSink.__proto__),
  [_sink$]: dart.finalFieldType(convert.ByteConversionSink),
  [_subsetMask]: dart.finalFieldType(core.int)
}));
const _convertInvalid = dart.privateName(convert, "_convertInvalid");
convert._UnicodeSubsetDecoder = class _UnicodeSubsetDecoder extends convert.Converter$(core.List$(core.int), core.String) {
  convert(bytes, start, end) {
    ListOfint()._check(bytes);
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let byteCount = bytes[$length];
    core.RangeError.checkValidRange(start, end, byteCount);
    let t = end;
    t == null ? end = byteCount : t;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let byte = bytes[$_get](i);
      if ((dart.notNull(byte) & ~dart.notNull(this[_subsetMask])) !== 0) {
        if (!dart.test(this[_allowInvalid])) {
          dart.throw(new core.FormatException.new("Invalid value in input: " + dart.str(byte)));
        }
        return this[_convertInvalid](bytes, start, end);
      }
    }
    return core.String.fromCharCodes(bytes, start, end);
  }
  [_convertInvalid](bytes, start, end) {
    let buffer = new core.StringBuffer.new();
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let value = bytes[$_get](i);
      if ((dart.notNull(value) & ~dart.notNull(this[_subsetMask])) !== 0) value = 65533;
      buffer.writeCharCode(value);
    }
    return buffer.toString();
  }
  bind(stream) {
    StreamOfListOfint()._check(stream);
    return super.bind(stream);
  }
};
(convert._UnicodeSubsetDecoder.new = function(allowInvalid, subsetMask) {
  this[_allowInvalid] = allowInvalid;
  this[_subsetMask] = subsetMask;
  convert._UnicodeSubsetDecoder.__proto__.new.call(this);
}).prototype = convert._UnicodeSubsetDecoder.prototype;
dart.addTypeTests(convert._UnicodeSubsetDecoder);
dart.setMethodSignature(convert._UnicodeSubsetDecoder, () => ({
  __proto__: dart.getMethods(convert._UnicodeSubsetDecoder.__proto__),
  convert: dart.fnType(core.String, [core.Object], [core.int, core.int]),
  [_convertInvalid]: dart.fnType(core.String, [core.List$(core.int), core.int, core.int]),
  bind: dart.fnType(async.Stream$(core.String), [core.Object])
}));
dart.setLibraryUri(convert._UnicodeSubsetDecoder, "dart:convert");
dart.setFieldSignature(convert._UnicodeSubsetDecoder, () => ({
  __proto__: dart.getFields(convert._UnicodeSubsetDecoder.__proto__),
  [_allowInvalid]: dart.finalFieldType(core.bool),
  [_subsetMask]: dart.finalFieldType(core.int)
}));
convert.AsciiDecoder = class AsciiDecoder extends convert._UnicodeSubsetDecoder {
  startChunkedConversion(sink) {
    SinkOfString()._check(sink);
    let stringSink = null;
    if (convert.StringConversionSink.is(sink)) {
      stringSink = sink;
    } else {
      stringSink = convert.StringConversionSink.from(sink);
    }
    if (dart.test(this[_allowInvalid])) {
      return new convert._ErrorHandlingAsciiDecoderSink.new(stringSink.asUtf8Sink(false));
    } else {
      return new convert._SimpleAsciiDecoderSink.new(stringSink);
    }
  }
};
(convert.AsciiDecoder.new = function(opts) {
  let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
  convert.AsciiDecoder.__proto__.new.call(this, allowInvalid, 127);
}).prototype = convert.AsciiDecoder.prototype;
dart.addTypeTests(convert.AsciiDecoder);
dart.setMethodSignature(convert.AsciiDecoder, () => ({
  __proto__: dart.getMethods(convert.AsciiDecoder.__proto__),
  startChunkedConversion: dart.fnType(convert.ByteConversionSink, [core.Object])
}));
dart.setLibraryUri(convert.AsciiDecoder, "dart:convert");
const _utf8Sink = dart.privateName(convert, "_utf8Sink");
let const$37;
const _is_ChunkedConversionSink_default = Symbol('_is_ChunkedConversionSink_default');
convert.ChunkedConversionSink$ = dart.generic(T => {
  let _SimpleCallbackSinkOfT = () => (_SimpleCallbackSinkOfT = dart.constFn(convert._SimpleCallbackSink$(T)))();
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  class ChunkedConversionSink extends core.Object {
    static withCallback(callback) {
      return new (_SimpleCallbackSinkOfT()).new(callback);
    }
  }
  (ChunkedConversionSink.new = function() {
  }).prototype = ChunkedConversionSink.prototype;
  dart.addTypeTests(ChunkedConversionSink);
  ChunkedConversionSink.prototype[_is_ChunkedConversionSink_default] = true;
  ChunkedConversionSink[dart.implements] = () => [SinkOfT()];
  dart.setLibraryUri(ChunkedConversionSink, "dart:convert");
  return ChunkedConversionSink;
});
convert.ChunkedConversionSink = convert.ChunkedConversionSink$();
dart.addTypeTests(convert.ChunkedConversionSink, _is_ChunkedConversionSink_default);
convert.ByteConversionSink = class ByteConversionSink extends convert.ChunkedConversionSink$(core.List$(core.int)) {
  static withCallback(callback) {
    return new convert._ByteCallbackSink.new(callback);
  }
  static from(sink) {
    return new convert._ByteAdapterSink.new(sink);
  }
};
(convert.ByteConversionSink.new = function() {
  convert.ByteConversionSink.__proto__.new.call(this);
}).prototype = convert.ByteConversionSink.prototype;
dart.addTypeTests(convert.ByteConversionSink);
dart.setLibraryUri(convert.ByteConversionSink, "dart:convert");
convert.ByteConversionSinkBase = class ByteConversionSinkBase extends convert.ByteConversionSink {
  addSlice(chunk, start, end, isLast) {
    this.add(chunk[$sublist](start, end));
    if (dart.test(isLast)) this.close();
  }
};
(convert.ByteConversionSinkBase.new = function() {
  convert.ByteConversionSinkBase.__proto__.new.call(this);
}).prototype = convert.ByteConversionSinkBase.prototype;
dart.addTypeTests(convert.ByteConversionSinkBase);
dart.setMethodSignature(convert.ByteConversionSinkBase, () => ({
  __proto__: dart.getMethods(convert.ByteConversionSinkBase.__proto__),
  addSlice: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert.ByteConversionSinkBase, "dart:convert");
convert._ErrorHandlingAsciiDecoderSink = class _ErrorHandlingAsciiDecoderSink extends convert.ByteConversionSinkBase {
  close() {
    this[_utf8Sink].close();
  }
  add(source) {
    ListOfint()._check(source);
    this.addSlice(source, 0, source[$length], false);
  }
  addSlice(source, start, end, isLast) {
    core.RangeError.checkValidRange(start, end, source[$length]);
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      if ((dart.notNull(source[$_get](i)) & ~127) !== 0) {
        if (dart.notNull(i) > dart.notNull(start)) this[_utf8Sink].addSlice(source, start, i, false);
        this[_utf8Sink].add(const$37 || (const$37 = dart.constList([239, 191, 189], core.int)));
        start = dart.notNull(i) + 1;
      }
    }
    if (dart.notNull(start) < dart.notNull(end)) {
      this[_utf8Sink].addSlice(source, start, end, isLast);
    } else if (dart.test(isLast)) {
      this.close();
    }
  }
};
(convert._ErrorHandlingAsciiDecoderSink.new = function(utf8Sink) {
  this[_utf8Sink] = utf8Sink;
  convert._ErrorHandlingAsciiDecoderSink.__proto__.new.call(this);
}).prototype = convert._ErrorHandlingAsciiDecoderSink.prototype;
dart.addTypeTests(convert._ErrorHandlingAsciiDecoderSink);
dart.setMethodSignature(convert._ErrorHandlingAsciiDecoderSink, () => ({
  __proto__: dart.getMethods(convert._ErrorHandlingAsciiDecoderSink.__proto__),
  close: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [core.Object])
}));
dart.setLibraryUri(convert._ErrorHandlingAsciiDecoderSink, "dart:convert");
dart.setFieldSignature(convert._ErrorHandlingAsciiDecoderSink, () => ({
  __proto__: dart.getFields(convert._ErrorHandlingAsciiDecoderSink.__proto__),
  [_utf8Sink]: dart.fieldType(convert.ByteConversionSink)
}));
convert._SimpleAsciiDecoderSink = class _SimpleAsciiDecoderSink extends convert.ByteConversionSinkBase {
  close() {
    this[_sink$].close();
  }
  add(source) {
    ListOfint()._check(source);
    for (let i = 0; i < dart.notNull(source[$length]); i++) {
      if ((dart.notNull(source[$_get](i)) & ~127) !== 0) {
        dart.throw(new core.FormatException.new("Source contains non-ASCII bytes."));
      }
    }
    this[_sink$].add(core.String.fromCharCodes(source));
  }
  addSlice(source, start, end, isLast) {
    let length = source[$length];
    core.RangeError.checkValidRange(start, end, length);
    if (dart.notNull(start) < dart.notNull(end)) {
      if (start !== 0 || end != length) {
        source = source[$sublist](start, end);
      }
      this.add(source);
    }
    if (dart.test(isLast)) this.close();
  }
};
(convert._SimpleAsciiDecoderSink.new = function(sink) {
  this[_sink$] = sink;
  convert._SimpleAsciiDecoderSink.__proto__.new.call(this);
}).prototype = convert._SimpleAsciiDecoderSink.prototype;
dart.addTypeTests(convert._SimpleAsciiDecoderSink);
dart.setMethodSignature(convert._SimpleAsciiDecoderSink, () => ({
  __proto__: dart.getMethods(convert._SimpleAsciiDecoderSink.__proto__),
  close: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [core.Object])
}));
dart.setLibraryUri(convert._SimpleAsciiDecoderSink, "dart:convert");
dart.setFieldSignature(convert._SimpleAsciiDecoderSink, () => ({
  __proto__: dart.getFields(convert._SimpleAsciiDecoderSink.__proto__),
  [_sink$]: dart.fieldType(core.Sink)
}));
dart.defineLazy(convert, {
  /*convert.base64*/get base64() {
    return dart.const(new convert.Base64Codec.new());
  },
  /*convert.base64Url*/get base64Url() {
    return dart.const(new convert.Base64Codec.urlSafe());
  }
});
convert.base64Encode = function(bytes) {
  return convert.base64.encode(bytes);
};
convert.base64UrlEncode = function(bytes) {
  return convert.base64Url.encode(bytes);
};
convert.base64Decode = function(source) {
  return convert.base64.decode(source);
};
dart.defineLazy(convert, {
  /*convert._paddingChar*/get _paddingChar() {
    return 61;
  }
});
const _encoder = dart.privateName(convert, "_encoder");
let const$38;
let const$39;
let const$40;
convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
  get encoder() {
    return this[_encoder];
  }
  get decoder() {
    return const$40 || (const$40 = dart.const(new convert.Base64Decoder.new()));
  }
  decode(encoded) {
    core.String._check(encoded);
    return this.decoder.convert(encoded);
  }
  normalize(source, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    end = core.RangeError.checkValidRange(start, end, source.length);
    let percent = 37;
    let equals = 61;
    let buffer = null;
    let sliceStart = start;
    let alphabet = convert._Base64Encoder._base64Alphabet;
    let inverseAlphabet = convert._Base64Decoder._inverseAlphabet;
    let firstPadding = -1;
    let firstPaddingSourceIndex = -1;
    let paddingCount = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end);) {
      let sliceEnd = i;
      let char = source[$codeUnitAt]((() => {
        let x = i;
        i = dart.notNull(x) + 1;
        return x;
      })());
      let originalChar = char;
      if (char === percent) {
        if (dart.notNull(i) + 2 <= dart.notNull(end)) {
          char = _internal.parseHexByte(source, i);
          i = dart.notNull(i) + 2;
          if (char === percent) char = -1;
        } else {
          char = -1;
        }
      }
      if (0 <= dart.notNull(char) && dart.notNull(char) <= 127) {
        let value = inverseAlphabet[$_get](char);
        if (dart.notNull(value) >= 0) {
          char = alphabet[$codeUnitAt](value);
          if (char == originalChar) continue;
        } else if (value === convert._Base64Decoder._padding) {
          if (firstPadding < 0) {
            firstPadding = (() => {
              let l = buffer == null ? null : buffer.length;
              return l != null ? l : 0;
            })() + (dart.notNull(sliceEnd) - dart.notNull(sliceStart));
            firstPaddingSourceIndex = sliceEnd;
          }
          paddingCount++;
          if (originalChar === equals) continue;
        }
        if (value !== convert._Base64Decoder._invalid) {
          let t = buffer;
          t == null ? buffer = new core.StringBuffer.new() : t;
          buffer.write(source[$substring](sliceStart, sliceEnd));
          buffer.writeCharCode(char);
          sliceStart = i;
          continue;
        }
      }
      dart.throw(new core.FormatException.new("Invalid base64 data", source, sliceEnd));
    }
    if (buffer != null) {
      buffer.write(source[$substring](sliceStart, end));
      if (firstPadding >= 0) {
        convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, buffer.length);
      } else {
        let endLength = (dart.notNull(buffer.length) - 1)[$modulo](4) + 1;
        if (endLength === 1) {
          dart.throw(new core.FormatException.new("Invalid base64 encoding length ", source, end));
        }
        while (endLength < 4) {
          buffer.write("=");
          endLength++;
        }
      }
      return source[$replaceRange](start, end, dart.toString(buffer));
    }
    let length = dart.notNull(end) - dart.notNull(start);
    if (firstPadding >= 0) {
      convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, length);
    } else {
      let endLength = length[$modulo](4);
      if (endLength === 1) {
        dart.throw(new core.FormatException.new("Invalid base64 encoding length ", source, end));
      }
      if (endLength > 1) {
        source = source[$replaceRange](end, end, endLength === 2 ? "==" : "=");
      }
    }
    return source;
  }
  static _checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, length) {
    if (length[$modulo](4) !== 0) {
      dart.throw(new core.FormatException.new("Invalid base64 padding, padded length must be multiple of four, " + ("is " + dart.str(length)), source, sourceEnd));
    }
    if (dart.notNull(firstPadding) + dart.notNull(paddingCount) !== length) {
      dart.throw(new core.FormatException.new("Invalid base64 padding, '=' not at the end", source, sourceIndex));
    }
    if (dart.notNull(paddingCount) > 2) {
      dart.throw(new core.FormatException.new("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
    }
  }
};
(convert.Base64Codec.new = function() {
  this[_encoder] = const$38 || (const$38 = dart.const(new convert.Base64Encoder.new()));
  convert.Base64Codec.__proto__.new.call(this);
}).prototype = convert.Base64Codec.prototype;
(convert.Base64Codec.urlSafe = function() {
  this[_encoder] = const$39 || (const$39 = dart.const(new convert.Base64Encoder.urlSafe()));
  convert.Base64Codec.__proto__.new.call(this);
}).prototype = convert.Base64Codec.prototype;
dart.addTypeTests(convert.Base64Codec);
dart.setMethodSignature(convert.Base64Codec, () => ({
  __proto__: dart.getMethods(convert.Base64Codec.__proto__),
  decode: dart.fnType(typed_data.Uint8List, [core.Object]),
  normalize: dart.fnType(core.String, [core.String], [core.int, core.int])
}));
dart.setGetterSignature(convert.Base64Codec, () => ({
  __proto__: dart.getGetters(convert.Base64Codec.__proto__),
  encoder: convert.Base64Encoder,
  decoder: convert.Base64Decoder
}));
dart.setLibraryUri(convert.Base64Codec, "dart:convert");
dart.setFieldSignature(convert.Base64Codec, () => ({
  __proto__: dart.getFields(convert.Base64Codec.__proto__),
  [_encoder]: dart.finalFieldType(convert.Base64Encoder)
}));
const _urlSafe = dart.privateName(convert, "_urlSafe");
convert.Base64Encoder = class Base64Encoder extends convert.Converter$(core.List$(core.int), core.String) {
  convert(input) {
    ListOfint()._check(input);
    if (dart.test(input[$isEmpty])) return "";
    let encoder = new convert._Base64Encoder.new(this[_urlSafe]);
    let buffer = encoder.encode(input, 0, input[$length], true);
    return core.String.fromCharCodes(buffer);
  }
  startChunkedConversion(sink) {
    SinkOfString()._check(sink);
    if (convert.StringConversionSink.is(sink)) {
      return new convert._Utf8Base64EncoderSink.new(sink.asUtf8Sink(false), this[_urlSafe]);
    }
    return new convert._AsciiBase64EncoderSink.new(sink, this[_urlSafe]);
  }
};
(convert.Base64Encoder.new = function() {
  this[_urlSafe] = false;
  convert.Base64Encoder.__proto__.new.call(this);
}).prototype = convert.Base64Encoder.prototype;
(convert.Base64Encoder.urlSafe = function() {
  this[_urlSafe] = true;
  convert.Base64Encoder.__proto__.new.call(this);
}).prototype = convert.Base64Encoder.prototype;
dart.addTypeTests(convert.Base64Encoder);
dart.setMethodSignature(convert.Base64Encoder, () => ({
  __proto__: dart.getMethods(convert.Base64Encoder.__proto__),
  convert: dart.fnType(core.String, [core.Object]),
  startChunkedConversion: dart.fnType(convert.ByteConversionSink, [core.Object])
}));
dart.setLibraryUri(convert.Base64Encoder, "dart:convert");
dart.setFieldSignature(convert.Base64Encoder, () => ({
  __proto__: dart.getFields(convert.Base64Encoder.__proto__),
  [_urlSafe]: dart.finalFieldType(core.bool)
}));
const _alphabet = dart.privateName(convert, "_alphabet");
const _state$0 = dart.privateName(convert, "_state");
convert._Base64Encoder = class _Base64Encoder extends core.Object {
  static _encodeState(count, bits) {
    if (!(dart.notNull(count) <= 3)) dart.assertFailed(null, "dart:convert/base64.dart", 279, 12, "count <= _countMask");
    return (dart.notNull(bits) << 2 | dart.notNull(count)) >>> 0;
  }
  static _stateBits(state) {
    return state[$rightShift](2);
  }
  static _stateCount(state) {
    return dart.notNull(state) & 3;
  }
  createBuffer(bufferLength) {
    return typed_data.Uint8List.new(bufferLength);
  }
  encode(bytes, start, end, isLast) {
    if (!(0 <= dart.notNull(start))) dart.assertFailed(null, "dart:convert/base64.dart", 304, 12, "0 <= start");
    if (!(dart.notNull(start) <= dart.notNull(end))) dart.assertFailed(null, "dart:convert/base64.dart", 305, 12, "start <= end");
    if (!(bytes == null || dart.notNull(end) <= dart.notNull(bytes[$length]))) dart.assertFailed(null, "dart:convert/base64.dart", 306, 12, "bytes == null || end <= bytes.length");
    let length = dart.notNull(end) - dart.notNull(start);
    let count = convert._Base64Encoder._stateCount(this[_state$0]);
    let byteCount = dart.notNull(count) + length;
    let fullChunks = (byteCount / 3)[$truncate]();
    let partialChunkLength = byteCount - fullChunks * 3;
    let bufferLength = fullChunks * 4;
    if (dart.test(isLast) && partialChunkLength > 0) {
      bufferLength = bufferLength + 4;
    }
    let output = this.createBuffer(bufferLength);
    this[_state$0] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state$0]);
    if (bufferLength > 0) return output;
    return null;
  }
  static encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
    let bits = convert._Base64Encoder._stateBits(state);
    let expectedChars = 3 - dart.notNull(convert._Base64Encoder._stateCount(state));
    let byteOr = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let byte = bytes[$_get](i);
      byteOr = (byteOr | dart.notNull(byte)) >>> 0;
      bits = (dart.notNull(bits) << 8 | dart.notNull(byte)) & 16777215;
      expectedChars--;
      if (expectedChars === 0) {
        output[$_set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[$codeUnitAt](dart.notNull(bits) >> 18 & 63));
        output[$_set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[$codeUnitAt](dart.notNull(bits) >> 12 & 63));
        output[$_set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[$codeUnitAt](dart.notNull(bits) >> 6 & 63));
        output[$_set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[$codeUnitAt](dart.notNull(bits) & 63));
        expectedChars = 3;
        bits = 0;
      }
    }
    if (byteOr >= 0 && byteOr <= 255) {
      if (dart.test(isLast) && expectedChars < 3) {
        convert._Base64Encoder.writeFinalChunk(alphabet, output, outputIndex, 3 - expectedChars, bits);
        return 0;
      }
      return convert._Base64Encoder._encodeState(3 - expectedChars, bits);
    }
    let i = start;
    while (dart.notNull(i) < dart.notNull(end)) {
      let byte = bytes[$_get](i);
      if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) break;
      i = dart.notNull(i) + 1;
    }
    dart.throw(new core.ArgumentError.value(bytes, "Not a byte value at index " + dart.str(i) + ": 0x" + bytes[$_get](i)[$toRadixString](16)));
  }
  static writeFinalChunk(alphabet, output, outputIndex, count, bits) {
    if (!(dart.notNull(count) > 0)) dart.assertFailed(null, "dart:convert/base64.dart", 375, 12, "count > 0");
    if (count === 1) {
      output[$_set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[$codeUnitAt](dart.notNull(bits) >> 2 & 63));
      output[$_set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[$codeUnitAt](dart.notNull(bits) << 4 & 63));
      output[$_set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), 61);
      output[$_set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), 61);
    } else {
      if (!(count === 2)) dart.assertFailed(null, "dart:convert/base64.dart", 382, 14, "count == 2");
      output[$_set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[$codeUnitAt](dart.notNull(bits) >> 10 & 63));
      output[$_set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[$codeUnitAt](dart.notNull(bits) >> 4 & 63));
      output[$_set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), alphabet[$codeUnitAt](dart.notNull(bits) << 2 & 63));
      output[$_set]((() => {
        let x = outputIndex;
        outputIndex = dart.notNull(x) + 1;
        return x;
      })(), 61);
    }
  }
};
(convert._Base64Encoder.new = function(urlSafe) {
  this[_state$0] = 0;
  this[_alphabet] = dart.test(urlSafe) ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
}).prototype = convert._Base64Encoder.prototype;
dart.addTypeTests(convert._Base64Encoder);
dart.setMethodSignature(convert._Base64Encoder, () => ({
  __proto__: dart.getMethods(convert._Base64Encoder.__proto__),
  createBuffer: dart.fnType(typed_data.Uint8List, [core.int]),
  encode: dart.fnType(typed_data.Uint8List, [core.List$(core.int), core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._Base64Encoder, "dart:convert");
dart.setFieldSignature(convert._Base64Encoder, () => ({
  __proto__: dart.getFields(convert._Base64Encoder.__proto__),
  [_state$0]: dart.fieldType(core.int),
  [_alphabet]: dart.finalFieldType(core.String)
}));
dart.defineLazy(convert._Base64Encoder, {
  /*convert._Base64Encoder._base64Alphabet*/get _base64Alphabet() {
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  },
  /*convert._Base64Encoder._base64UrlAlphabet*/get _base64UrlAlphabet() {
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  },
  /*convert._Base64Encoder._valueShift*/get _valueShift() {
    return 2;
  },
  /*convert._Base64Encoder._countMask*/get _countMask() {
    return 3;
  },
  /*convert._Base64Encoder._sixBitMask*/get _sixBitMask() {
    return 63;
  }
});
convert._BufferCachingBase64Encoder = class _BufferCachingBase64Encoder extends convert._Base64Encoder {
  createBuffer(bufferLength) {
    if (this.bufferCache == null || dart.notNull(this.bufferCache[$length]) < dart.notNull(bufferLength)) {
      this.bufferCache = typed_data.Uint8List.new(bufferLength);
    }
    return typed_data.Uint8List.view(this.bufferCache[$buffer], 0, bufferLength);
  }
};
(convert._BufferCachingBase64Encoder.new = function(urlSafe) {
  this.bufferCache = null;
  convert._BufferCachingBase64Encoder.__proto__.new.call(this, urlSafe);
}).prototype = convert._BufferCachingBase64Encoder.prototype;
dart.addTypeTests(convert._BufferCachingBase64Encoder);
dart.setLibraryUri(convert._BufferCachingBase64Encoder, "dart:convert");
dart.setFieldSignature(convert._BufferCachingBase64Encoder, () => ({
  __proto__: dart.getFields(convert._BufferCachingBase64Encoder.__proto__),
  bufferCache: dart.fieldType(typed_data.Uint8List)
}));
const _add$0 = dart.privateName(convert, "_add");
convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
  add(source) {
    ListOfint()._check(source);
    this[_add$0](source, 0, source[$length], false);
  }
  close() {
    this[_add$0](null, 0, 0, true);
  }
  addSlice(source, start, end, isLast) {
    if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
    core.RangeError.checkValidRange(start, end, source[$length]);
    this[_add$0](source, start, end, isLast);
  }
};
(convert._Base64EncoderSink.new = function() {
  convert._Base64EncoderSink.__proto__.new.call(this);
}).prototype = convert._Base64EncoderSink.prototype;
dart.addTypeTests(convert._Base64EncoderSink);
dart.setMethodSignature(convert._Base64EncoderSink, () => ({
  __proto__: dart.getMethods(convert._Base64EncoderSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._Base64EncoderSink, "dart:convert");
convert._AsciiBase64EncoderSink = class _AsciiBase64EncoderSink extends convert._Base64EncoderSink {
  [_add$0](source, start, end, isLast) {
    let buffer = this[_encoder].encode(source, start, end, isLast);
    if (buffer != null) {
      let string = core.String.fromCharCodes(buffer);
      this[_sink$].add(string);
    }
    if (dart.test(isLast)) {
      this[_sink$].close();
    }
  }
};
(convert._AsciiBase64EncoderSink.new = function(sink, urlSafe) {
  this[_sink$] = sink;
  this[_encoder] = new convert._BufferCachingBase64Encoder.new(urlSafe);
  convert._AsciiBase64EncoderSink.__proto__.new.call(this);
}).prototype = convert._AsciiBase64EncoderSink.prototype;
dart.addTypeTests(convert._AsciiBase64EncoderSink);
dart.setMethodSignature(convert._AsciiBase64EncoderSink, () => ({
  __proto__: dart.getMethods(convert._AsciiBase64EncoderSink.__proto__),
  [_add$0]: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._AsciiBase64EncoderSink, "dart:convert");
dart.setFieldSignature(convert._AsciiBase64EncoderSink, () => ({
  __proto__: dart.getFields(convert._AsciiBase64EncoderSink.__proto__),
  [_sink$]: dart.finalFieldType(SinkOfString()),
  [_encoder]: dart.finalFieldType(convert._Base64Encoder)
}));
convert._Utf8Base64EncoderSink = class _Utf8Base64EncoderSink extends convert._Base64EncoderSink {
  [_add$0](source, start, end, isLast) {
    let buffer = this[_encoder].encode(source, start, end, isLast);
    if (buffer != null) {
      this[_sink$].addSlice(buffer, 0, buffer[$length], isLast);
    }
  }
};
(convert._Utf8Base64EncoderSink.new = function(sink, urlSafe) {
  this[_sink$] = sink;
  this[_encoder] = new convert._Base64Encoder.new(urlSafe);
  convert._Utf8Base64EncoderSink.__proto__.new.call(this);
}).prototype = convert._Utf8Base64EncoderSink.prototype;
dart.addTypeTests(convert._Utf8Base64EncoderSink);
dart.setMethodSignature(convert._Utf8Base64EncoderSink, () => ({
  __proto__: dart.getMethods(convert._Utf8Base64EncoderSink.__proto__),
  [_add$0]: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._Utf8Base64EncoderSink, "dart:convert");
dart.setFieldSignature(convert._Utf8Base64EncoderSink, () => ({
  __proto__: dart.getFields(convert._Utf8Base64EncoderSink.__proto__),
  [_sink$]: dart.finalFieldType(convert.ByteConversionSink),
  [_encoder]: dart.finalFieldType(convert._Base64Encoder)
}));
convert.Base64Decoder = class Base64Decoder extends convert.Converter$(core.String, core.List$(core.int)) {
  convert(input, start, end) {
    core.String._check(input);
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    end = core.RangeError.checkValidRange(start, end, input.length);
    if (start == end) return typed_data.Uint8List.new(0);
    let decoder = new convert._Base64Decoder.new();
    let buffer = decoder.decode(input, start, end);
    decoder.close(input, end);
    return buffer;
  }
  startChunkedConversion(sink) {
    SinkOfListOfint()._check(sink);
    return new convert._Base64DecoderSink.new(sink);
  }
};
(convert.Base64Decoder.new = function() {
  convert.Base64Decoder.__proto__.new.call(this);
}).prototype = convert.Base64Decoder.prototype;
dart.addTypeTests(convert.Base64Decoder);
dart.setMethodSignature(convert.Base64Decoder, () => ({
  __proto__: dart.getMethods(convert.Base64Decoder.__proto__),
  convert: dart.fnType(typed_data.Uint8List, [core.Object], [core.int, core.int]),
  startChunkedConversion: dart.fnType(convert.StringConversionSink, [core.Object])
}));
dart.setLibraryUri(convert.Base64Decoder, "dart:convert");
convert._Base64Decoder = class _Base64Decoder extends core.Object {
  static _encodeCharacterState(count, bits) {
    if (!(count === (dart.notNull(count) & 3))) dart.assertFailed(null, "dart:convert/base64.dart", 559, 12, "count == (count & _countMask)");
    return (dart.notNull(bits) << 2 | dart.notNull(count)) >>> 0;
  }
  static _stateCount(state) {
    if (!(dart.notNull(state) >= 0)) dart.assertFailed(null, "dart:convert/base64.dart", 565, 12, "state >= 0");
    return dart.notNull(state) & 3;
  }
  static _stateBits(state) {
    if (!(dart.notNull(state) >= 0)) dart.assertFailed(null, "dart:convert/base64.dart", 571, 12, "state >= 0");
    return state[$rightShift](2);
  }
  static _encodePaddingState(expectedPadding) {
    if (!(dart.notNull(expectedPadding) >= 0)) dart.assertFailed(null, "dart:convert/base64.dart", 577, 12, "expectedPadding >= 0");
    if (!(dart.notNull(expectedPadding) <= 5)) dart.assertFailed(null, "dart:convert/base64.dart", 578, 12, "expectedPadding <= 5");
    return -dart.notNull(expectedPadding) - 1;
  }
  static _statePadding(state) {
    if (!(dart.notNull(state) < 0)) dart.assertFailed(null, "dart:convert/base64.dart", 584, 12, "state < 0");
    return -dart.notNull(state) - 1;
  }
  static _hasSeenPadding(state) {
    return dart.notNull(state) < 0;
  }
  decode(input, start, end) {
    if (!(0 <= dart.notNull(start))) dart.assertFailed(null, "dart:convert/base64.dart", 596, 12, "0 <= start");
    if (!(dart.notNull(start) <= dart.notNull(end))) dart.assertFailed(null, "dart:convert/base64.dart", 597, 12, "start <= end");
    if (!(dart.notNull(end) <= input.length)) dart.assertFailed(null, "dart:convert/base64.dart", 598, 12, "end <= input.length");
    if (dart.test(convert._Base64Decoder._hasSeenPadding(this[_state$0]))) {
      this[_state$0] = convert._Base64Decoder._checkPadding(input, start, end, this[_state$0]);
      return null;
    }
    if (start == end) return typed_data.Uint8List.new(0);
    let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state$0]);
    this[_state$0] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state$0]);
    return buffer;
  }
  close(input, end) {
    if (dart.notNull(this[_state$0]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
      dart.throw(new core.FormatException.new("Missing padding character", input, end));
    }
    if (dart.notNull(this[_state$0]) > 0) {
      dart.throw(new core.FormatException.new("Invalid length, must be multiple of four", input, end));
    }
    this[_state$0] = convert._Base64Decoder._encodePaddingState(0);
  }
  static decodeChunk(input, start, end, output, outIndex, state) {
    if (!!dart.test(convert._Base64Decoder._hasSeenPadding(state))) dart.assertFailed(null, "dart:convert/base64.dart", 628, 12, "!_hasSeenPadding(state)");
    let asciiMask = 127;
    let asciiMax = 127;
    let eightBitMask = 255;
    let bitsPerCharacter = 6;
    let bits = convert._Base64Decoder._stateBits(state);
    let count = convert._Base64Decoder._stateCount(state);
    let charOr = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = input[$codeUnitAt](i);
      charOr = (charOr | char) >>> 0;
      let code = convert._Base64Decoder._inverseAlphabet[$_get]((char & asciiMask) >>> 0);
      if (dart.notNull(code) >= 0) {
        bits = (bits[$leftShift](bitsPerCharacter) | dart.notNull(code)) & 16777215;
        count = dart.notNull(count) + 1 & 3;
        if (count === 0) {
          if (!(dart.notNull(outIndex) + 3 <= dart.notNull(output[$length]))) dart.assertFailed(null, "dart:convert/base64.dart", 649, 18, "outIndex + 3 <= output.length");
          output[$_set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), (bits[$rightShift](16) & eightBitMask) >>> 0);
          output[$_set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), (bits[$rightShift](8) & eightBitMask) >>> 0);
          output[$_set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), (dart.notNull(bits) & eightBitMask) >>> 0);
          bits = 0;
        }
        continue;
      } else if (code === -1 && dart.notNull(count) > 1) {
        if (charOr < 0 || charOr > asciiMax) break;
        if (count === 3) {
          if ((dart.notNull(bits) & 3) !== 0) {
            dart.throw(new core.FormatException.new("Invalid encoding before padding", input, i));
          }
          output[$_set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), bits[$rightShift](10));
          output[$_set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), bits[$rightShift](2));
        } else {
          if ((dart.notNull(bits) & 15) !== 0) {
            dart.throw(new core.FormatException.new("Invalid encoding before padding", input, i));
          }
          output[$_set]((() => {
            let x = outIndex;
            outIndex = dart.notNull(x) + 1;
            return x;
          })(), bits[$rightShift](4));
        }
        let expectedPadding = (3 - dart.notNull(count)) * 3;
        if (char === 37) {
          expectedPadding = expectedPadding + 2;
        }
        state = convert._Base64Decoder._encodePaddingState(expectedPadding);
        return convert._Base64Decoder._checkPadding(input, dart.notNull(i) + 1, end, state);
      }
      dart.throw(new core.FormatException.new("Invalid character", input, i));
    }
    if (charOr >= 0 && charOr <= asciiMax) {
      return convert._Base64Decoder._encodeCharacterState(count, bits);
    }
    let i = null;
    for (i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = input[$codeUnitAt](i);
      if (char < 0 || char > asciiMax) break;
    }
    dart.throw(new core.FormatException.new("Invalid character", input, i));
  }
  static _allocateBuffer(input, start, end, state) {
    if (!(dart.notNull(state) >= 0)) dart.assertFailed(null, "dart:convert/base64.dart", 699, 12, "state >= 0");
    let paddingStart = convert._Base64Decoder._trimPaddingChars(input, start, end);
    let length = dart.notNull(convert._Base64Decoder._stateCount(state)) + (dart.notNull(paddingStart) - dart.notNull(start));
    let bufferLength = length[$rightShift](2) * 3;
    let remainderLength = length & 3;
    if (remainderLength !== 0 && dart.notNull(paddingStart) < dart.notNull(end)) {
      bufferLength = bufferLength + (remainderLength - 1);
    }
    if (bufferLength > 0) return typed_data.Uint8List.new(bufferLength);
    return null;
  }
  static _trimPaddingChars(input, start, end) {
    let padding = 0;
    let index = end;
    let newEnd = end;
    while (dart.notNull(index) > dart.notNull(start) && padding < 2) {
      index = dart.notNull(index) - 1;
      let char = input[$codeUnitAt](index);
      if (char === 61) {
        padding++;
        newEnd = index;
        continue;
      }
      if ((char | 32) === 100) {
        if (index == start) break;
        index = dart.notNull(index) - 1;
        char = input[$codeUnitAt](index);
      }
      if (char === 51) {
        if (index == start) break;
        index = dart.notNull(index) - 1;
        char = input[$codeUnitAt](index);
      }
      if (char === 37) {
        padding++;
        newEnd = index;
        continue;
      }
      break;
    }
    return newEnd;
  }
  static _checkPadding(input, start, end, state) {
    if (!dart.test(convert._Base64Decoder._hasSeenPadding(state))) dart.assertFailed(null, "dart:convert/base64.dart", 780, 12, "_hasSeenPadding(state)");
    if (start == end) return state;
    let expectedPadding = convert._Base64Decoder._statePadding(state);
    if (!(dart.notNull(expectedPadding) >= 0)) dart.assertFailed(null, "dart:convert/base64.dart", 783, 12, "expectedPadding >= 0");
    if (!(dart.notNull(expectedPadding) < 6)) dart.assertFailed(null, "dart:convert/base64.dart", 784, 12, "expectedPadding < 6");
    while (dart.notNull(expectedPadding) > 0) {
      let char = input[$codeUnitAt](start);
      if (expectedPadding === 3) {
        if (char === 61) {
          expectedPadding = dart.notNull(expectedPadding) - 3;
          start = dart.notNull(start) + 1;
          break;
        }
        if (char === 37) {
          expectedPadding = dart.notNull(expectedPadding) - 1;
          start = dart.notNull(start) + 1;
          if (start == end) break;
          char = input[$codeUnitAt](start);
        } else {
          break;
        }
      }
      let expectedPartialPadding = expectedPadding;
      if (dart.notNull(expectedPartialPadding) > 3) {
        expectedPartialPadding = dart.notNull(expectedPartialPadding) - 3;
      }
      if (expectedPartialPadding === 2) {
        if (char !== 51) break;
        start = dart.notNull(start) + 1;
        expectedPadding = dart.notNull(expectedPadding) - 1;
        if (start == end) break;
        char = input[$codeUnitAt](start);
      }
      if ((char | 32) !== 100) break;
      start = dart.notNull(start) + 1;
      expectedPadding = dart.notNull(expectedPadding) - 1;
      if (start == end) break;
    }
    if (start != end) {
      dart.throw(new core.FormatException.new("Invalid padding character", input, start));
    }
    return convert._Base64Decoder._encodePaddingState(expectedPadding);
  }
};
(convert._Base64Decoder.new = function() {
  this[_state$0] = 0;
}).prototype = convert._Base64Decoder.prototype;
dart.addTypeTests(convert._Base64Decoder);
dart.setMethodSignature(convert._Base64Decoder, () => ({
  __proto__: dart.getMethods(convert._Base64Decoder.__proto__),
  decode: dart.fnType(typed_data.Uint8List, [core.String, core.int, core.int]),
  close: dart.fnType(dart.void, [core.String, core.int])
}));
dart.setLibraryUri(convert._Base64Decoder, "dart:convert");
dart.setFieldSignature(convert._Base64Decoder, () => ({
  __proto__: dart.getFields(convert._Base64Decoder.__proto__),
  [_state$0]: dart.fieldType(core.int)
}));
dart.defineLazy(convert._Base64Decoder, {
  /*convert._Base64Decoder._valueShift*/get _valueShift() {
    return 2;
  },
  /*convert._Base64Decoder._countMask*/get _countMask() {
    return 3;
  },
  /*convert._Base64Decoder._invalid*/get _invalid() {
    return -2;
  },
  /*convert._Base64Decoder._padding*/get _padding() {
    return -1;
  },
  /*convert._Base64Decoder.___*/get ___() {
    return -2;
  },
  /*convert._Base64Decoder._p*/get _p() {
    return -1;
  },
  /*convert._Base64Decoder._inverseAlphabet*/get _inverseAlphabet() {
    return typed_data.Int8List.fromList(JSArrayOfint().of([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -1, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2]));
  },
  /*convert._Base64Decoder._char_percent*/get _char_percent() {
    return 37;
  },
  /*convert._Base64Decoder._char_3*/get _char_3() {
    return 51;
  },
  /*convert._Base64Decoder._char_d*/get _char_d() {
    return 100;
  }
});
const _decoder = dart.privateName(convert, "_decoder");
convert._Base64DecoderSink = class _Base64DecoderSink extends convert.StringConversionSinkBase {
  add(string) {
    core.String._check(string);
    if (string[$isEmpty]) return;
    let buffer = this[_decoder].decode(string, 0, string.length);
    if (buffer != null) this[_sink$].add(buffer);
  }
  close() {
    this[_decoder].close(null, null);
    this[_sink$].close();
  }
  addSlice(string, start, end, isLast) {
    end = core.RangeError.checkValidRange(start, end, string.length);
    if (start == end) return;
    let buffer = this[_decoder].decode(string, start, end);
    if (buffer != null) this[_sink$].add(buffer);
    if (dart.test(isLast)) {
      this[_decoder].close(string, end);
      this[_sink$].close();
    }
  }
};
(convert._Base64DecoderSink.new = function(sink) {
  this[_decoder] = new convert._Base64Decoder.new();
  this[_sink$] = sink;
}).prototype = convert._Base64DecoderSink.prototype;
dart.addTypeTests(convert._Base64DecoderSink);
dart.setMethodSignature(convert._Base64DecoderSink, () => ({
  __proto__: dart.getMethods(convert._Base64DecoderSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  close: dart.fnType(dart.void, []),
  addSlice: dart.fnType(dart.void, [core.String, core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._Base64DecoderSink, "dart:convert");
dart.setFieldSignature(convert._Base64DecoderSink, () => ({
  __proto__: dart.getFields(convert._Base64DecoderSink.__proto__),
  [_sink$]: dart.finalFieldType(SinkOfListOfint()),
  [_decoder]: dart.finalFieldType(convert._Base64Decoder)
}));
convert._ByteAdapterSink = class _ByteAdapterSink extends convert.ByteConversionSinkBase {
  add(chunk) {
    ListOfint()._check(chunk);
    this[_sink$].add(chunk);
  }
  close() {
    this[_sink$].close();
  }
};
(convert._ByteAdapterSink.new = function(sink) {
  this[_sink$] = sink;
  convert._ByteAdapterSink.__proto__.new.call(this);
}).prototype = convert._ByteAdapterSink.prototype;
dart.addTypeTests(convert._ByteAdapterSink);
dart.setMethodSignature(convert._ByteAdapterSink, () => ({
  __proto__: dart.getMethods(convert._ByteAdapterSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._ByteAdapterSink, "dart:convert");
dart.setFieldSignature(convert._ByteAdapterSink, () => ({
  __proto__: dart.getFields(convert._ByteAdapterSink.__proto__),
  [_sink$]: dart.finalFieldType(SinkOfListOfint())
}));
const _callback = dart.privateName(convert, "_callback");
const _buffer = dart.privateName(convert, "_buffer");
const _bufferIndex = dart.privateName(convert, "_bufferIndex");
convert._ByteCallbackSink = class _ByteCallbackSink extends convert.ByteConversionSinkBase {
  add(chunk) {
    IterableOfint()._check(chunk);
    let freeCount = dart.notNull(this[_buffer][$length]) - dart.notNull(this[_bufferIndex]);
    if (dart.notNull(chunk[$length]) > freeCount) {
      let oldLength = this[_buffer][$length];
      let newLength = dart.notNull(convert._ByteCallbackSink._roundToPowerOf2(dart.notNull(chunk[$length]) + dart.notNull(oldLength))) * 2;
      let grown = typed_data.Uint8List.new(newLength);
      grown[$setRange](0, this[_buffer][$length], this[_buffer]);
      this[_buffer] = grown;
    }
    this[_buffer][$setRange](this[_bufferIndex], dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[$length]), chunk);
    this[_bufferIndex] = dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[$length]);
  }
  static _roundToPowerOf2(v) {
    if (!(dart.notNull(v) > 0)) dart.assertFailed(null, "dart:convert/byte_conversion.dart", 95, 12, "v > 0");
    v = dart.notNull(v) - 1;
    v = (dart.notNull(v) | v[$rightShift](1)) >>> 0;
    v = (dart.notNull(v) | v[$rightShift](2)) >>> 0;
    v = (dart.notNull(v) | v[$rightShift](4)) >>> 0;
    v = (dart.notNull(v) | v[$rightShift](8)) >>> 0;
    v = (dart.notNull(v) | v[$rightShift](16)) >>> 0;
    v = dart.notNull(v) + 1;
    return v;
  }
  close() {
    this[_callback](this[_buffer][$sublist](0, this[_bufferIndex]));
  }
};
(convert._ByteCallbackSink.new = function(callback) {
  this[_buffer] = typed_data.Uint8List.new(1024);
  this[_bufferIndex] = 0;
  this[_callback] = callback;
  convert._ByteCallbackSink.__proto__.new.call(this);
}).prototype = convert._ByteCallbackSink.prototype;
dart.addTypeTests(convert._ByteCallbackSink);
dart.setMethodSignature(convert._ByteCallbackSink, () => ({
  __proto__: dart.getMethods(convert._ByteCallbackSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._ByteCallbackSink, "dart:convert");
dart.setFieldSignature(convert._ByteCallbackSink, () => ({
  __proto__: dart.getFields(convert._ByteCallbackSink.__proto__),
  [_callback]: dart.finalFieldType(ListOfintTovoid()),
  [_buffer]: dart.fieldType(ListOfint()),
  [_bufferIndex]: dart.fieldType(core.int)
}));
dart.defineLazy(convert._ByteCallbackSink, {
  /*convert._ByteCallbackSink._INITIAL_BUFFER_SIZE*/get _INITIAL_BUFFER_SIZE() {
    return 1024;
  }
});
const _accumulated = dart.privateName(convert, "_accumulated");
const _is__SimpleCallbackSink_default = Symbol('_is__SimpleCallbackSink_default');
convert._SimpleCallbackSink$ = dart.generic(T => {
  let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  let ListOfTTovoid = () => (ListOfTTovoid = dart.constFn(dart.fnType(dart.void, [ListOfT()])))();
  class _SimpleCallbackSink extends convert.ChunkedConversionSink$(T) {
    add(chunk) {
      T._check(chunk);
      this[_accumulated][$add](chunk);
    }
    close() {
      this[_callback](this[_accumulated]);
    }
  }
  (_SimpleCallbackSink.new = function(callback) {
    this[_accumulated] = JSArrayOfT().of([]);
    this[_callback] = callback;
    _SimpleCallbackSink.__proto__.new.call(this);
  }).prototype = _SimpleCallbackSink.prototype;
  dart.addTypeTests(_SimpleCallbackSink);
  _SimpleCallbackSink.prototype[_is__SimpleCallbackSink_default] = true;
  dart.setMethodSignature(_SimpleCallbackSink, () => ({
    __proto__: dart.getMethods(_SimpleCallbackSink.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    close: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_SimpleCallbackSink, "dart:convert");
  dart.setFieldSignature(_SimpleCallbackSink, () => ({
    __proto__: dart.getFields(_SimpleCallbackSink.__proto__),
    [_callback]: dart.finalFieldType(ListOfTTovoid()),
    [_accumulated]: dart.finalFieldType(ListOfT())
  }));
  return _SimpleCallbackSink;
});
convert._SimpleCallbackSink = convert._SimpleCallbackSink$();
dart.addTypeTests(convert._SimpleCallbackSink, _is__SimpleCallbackSink_default);
const _eventSink = dart.privateName(convert, "_eventSink");
const _chunkedSink = dart.privateName(convert, "_chunkedSink");
const _is__ConverterStreamEventSink_default = Symbol('_is__ConverterStreamEventSink_default');
convert._ConverterStreamEventSink$ = dart.generic((S, T) => {
  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
  let SinkOfS = () => (SinkOfS = dart.constFn(core.Sink$(S)))();
  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
  class _ConverterStreamEventSink extends core.Object {
    add(o) {
      S._check(o);
      this[_chunkedSink].add(o);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_eventSink].addError(error, stackTrace);
    }
    close() {
      this[_chunkedSink].close();
    }
  }
  (_ConverterStreamEventSink.new = function(converter, sink) {
    this[_eventSink] = sink;
    this[_chunkedSink] = converter.startChunkedConversion(sink);
  }).prototype = _ConverterStreamEventSink.prototype;
  dart.addTypeTests(_ConverterStreamEventSink);
  _ConverterStreamEventSink.prototype[_is__ConverterStreamEventSink_default] = true;
  _ConverterStreamEventSink[dart.implements] = () => [EventSinkOfS()];
  dart.setMethodSignature(_ConverterStreamEventSink, () => ({
    __proto__: dart.getMethods(_ConverterStreamEventSink.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(_ConverterStreamEventSink, "dart:convert");
  dart.setFieldSignature(_ConverterStreamEventSink, () => ({
    __proto__: dart.getFields(_ConverterStreamEventSink.__proto__),
    [_eventSink]: dart.finalFieldType(EventSinkOfT()),
    [_chunkedSink]: dart.finalFieldType(SinkOfS())
  }));
  return _ConverterStreamEventSink;
});
convert._ConverterStreamEventSink = convert._ConverterStreamEventSink$();
dart.addTypeTests(convert._ConverterStreamEventSink, _is__ConverterStreamEventSink_default);
const _first$0 = dart.privateName(convert, "_first");
const _second$ = dart.privateName(convert, "_second");
const _is__FusedCodec_default = Symbol('_is__FusedCodec_default');
convert._FusedCodec$ = dart.generic((S, M, T) => {
  let ConverterOfS$T = () => (ConverterOfS$T = dart.constFn(convert.Converter$(S, T)))();
  let ConverterOfT$S = () => (ConverterOfT$S = dart.constFn(convert.Converter$(T, S)))();
  let CodecOfS$M = () => (CodecOfS$M = dart.constFn(convert.Codec$(S, M)))();
  let CodecOfM$T = () => (CodecOfM$T = dart.constFn(convert.Codec$(M, T)))();
  class _FusedCodec extends convert.Codec$(S, T) {
    get encoder() {
      return ConverterOfS$T()._check(this[_first$0].encoder.fuse(T, this[_second$].encoder));
    }
    get decoder() {
      return ConverterOfT$S()._check(this[_second$].decoder.fuse(S, this[_first$0].decoder));
    }
  }
  (_FusedCodec.new = function(first, second) {
    this[_first$0] = first;
    this[_second$] = second;
    _FusedCodec.__proto__.new.call(this);
  }).prototype = _FusedCodec.prototype;
  dart.addTypeTests(_FusedCodec);
  _FusedCodec.prototype[_is__FusedCodec_default] = true;
  dart.setGetterSignature(_FusedCodec, () => ({
    __proto__: dart.getGetters(_FusedCodec.__proto__),
    encoder: convert.Converter$(S, T),
    decoder: convert.Converter$(T, S)
  }));
  dart.setLibraryUri(_FusedCodec, "dart:convert");
  dart.setFieldSignature(_FusedCodec, () => ({
    __proto__: dart.getFields(_FusedCodec.__proto__),
    [_first$0]: dart.finalFieldType(CodecOfS$M()),
    [_second$]: dart.finalFieldType(CodecOfM$T())
  }));
  return _FusedCodec;
});
convert._FusedCodec = convert._FusedCodec$();
dart.addTypeTests(convert._FusedCodec, _is__FusedCodec_default);
const _codec = dart.privateName(convert, "_codec");
const _is__InvertedCodec_default = Symbol('_is__InvertedCodec_default');
convert._InvertedCodec$ = dart.generic((T, S) => {
  let CodecOfS$T = () => (CodecOfS$T = dart.constFn(convert.Codec$(S, T)))();
  class _InvertedCodec extends convert.Codec$(T, S) {
    get encoder() {
      return this[_codec].decoder;
    }
    get decoder() {
      return this[_codec].encoder;
    }
    get inverted() {
      return this[_codec];
    }
  }
  (_InvertedCodec.new = function(codec) {
    this[_codec] = codec;
    _InvertedCodec.__proto__.new.call(this);
  }).prototype = _InvertedCodec.prototype;
  dart.addTypeTests(_InvertedCodec);
  _InvertedCodec.prototype[_is__InvertedCodec_default] = true;
  dart.setGetterSignature(_InvertedCodec, () => ({
    __proto__: dart.getGetters(_InvertedCodec.__proto__),
    encoder: convert.Converter$(T, S),
    decoder: convert.Converter$(S, T)
  }));
  dart.setLibraryUri(_InvertedCodec, "dart:convert");
  dart.setFieldSignature(_InvertedCodec, () => ({
    __proto__: dart.getFields(_InvertedCodec.__proto__),
    [_codec]: dart.finalFieldType(CodecOfS$T())
  }));
  return _InvertedCodec;
});
convert._InvertedCodec = convert._InvertedCodec$();
dart.addTypeTests(convert._InvertedCodec, _is__InvertedCodec_default);
const _is__FusedConverter_default = Symbol('_is__FusedConverter_default');
convert._FusedConverter$ = dart.generic((S, M, T) => {
  let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
  let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
  class _FusedConverter extends convert.Converter$(S, T) {
    convert(input) {
      S._check(input);
      return this[_second$].convert(this[_first$0].convert(input));
    }
    startChunkedConversion(sink) {
      SinkOfT()._check(sink);
      return this[_first$0].startChunkedConversion(this[_second$].startChunkedConversion(sink));
    }
  }
  (_FusedConverter.new = function(first, second) {
    this[_first$0] = first;
    this[_second$] = second;
    _FusedConverter.__proto__.new.call(this);
  }).prototype = _FusedConverter.prototype;
  dart.addTypeTests(_FusedConverter);
  _FusedConverter.prototype[_is__FusedConverter_default] = true;
  dart.setMethodSignature(_FusedConverter, () => ({
    __proto__: dart.getMethods(_FusedConverter.__proto__),
    convert: dart.fnType(T, [core.Object]),
    startChunkedConversion: dart.fnType(core.Sink$(S), [core.Object])
  }));
  dart.setLibraryUri(_FusedConverter, "dart:convert");
  dart.setFieldSignature(_FusedConverter, () => ({
    __proto__: dart.getFields(_FusedConverter.__proto__),
    [_first$0]: dart.finalFieldType(ConverterOfS$M()),
    [_second$]: dart.finalFieldType(ConverterOfM$T())
  }));
  return _FusedConverter;
});
convert._FusedConverter = convert._FusedConverter$();
dart.addTypeTests(convert._FusedConverter, _is__FusedConverter_default);
dart.defineLazy(convert, {
  /*convert.htmlEscape*/get htmlEscape() {
    return dart.const(new convert.HtmlEscape.new());
  }
});
const _name$1 = dart.privateName(convert, "_name");
convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
  get escapeLtGt() {
    return this[escapeLtGt$];
  }
  set escapeLtGt(value) {
    super.escapeLtGt = value;
  }
  get escapeQuot() {
    return this[escapeQuot$];
  }
  set escapeQuot(value) {
    super.escapeQuot = value;
  }
  get escapeApos() {
    return this[escapeApos$];
  }
  set escapeApos(value) {
    super.escapeApos = value;
  }
  get escapeSlash() {
    return this[escapeSlash$];
  }
  set escapeSlash(value) {
    super.escapeSlash = value;
  }
  toString() {
    return this[_name$1];
  }
};
(convert.HtmlEscapeMode.__ = function(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
  this[_name$1] = name;
  this[escapeLtGt$] = escapeLtGt;
  this[escapeQuot$] = escapeQuot;
  this[escapeApos$] = escapeApos;
  this[escapeSlash$] = escapeSlash;
}).prototype = convert.HtmlEscapeMode.prototype;
(convert.HtmlEscapeMode.new = function(opts) {
  let name = opts && 'name' in opts ? opts.name : "custom";
  let escapeLtGt = opts && 'escapeLtGt' in opts ? opts.escapeLtGt : false;
  let escapeQuot = opts && 'escapeQuot' in opts ? opts.escapeQuot : false;
  let escapeApos = opts && 'escapeApos' in opts ? opts.escapeApos : false;
  let escapeSlash = opts && 'escapeSlash' in opts ? opts.escapeSlash : false;
  this[escapeLtGt$] = escapeLtGt;
  this[escapeQuot$] = escapeQuot;
  this[escapeApos$] = escapeApos;
  this[escapeSlash$] = escapeSlash;
  this[_name$1] = name;
}).prototype = convert.HtmlEscapeMode.prototype;
dart.addTypeTests(convert.HtmlEscapeMode);
const escapeLtGt$ = Symbol("HtmlEscapeMode.escapeLtGt");
const escapeQuot$ = Symbol("HtmlEscapeMode.escapeQuot");
const escapeApos$ = Symbol("HtmlEscapeMode.escapeApos");
const escapeSlash$ = Symbol("HtmlEscapeMode.escapeSlash");
dart.setLibraryUri(convert.HtmlEscapeMode, "dart:convert");
dart.setFieldSignature(convert.HtmlEscapeMode, () => ({
  __proto__: dart.getFields(convert.HtmlEscapeMode.__proto__),
  [_name$1]: dart.finalFieldType(core.String),
  escapeLtGt: dart.finalFieldType(core.bool),
  escapeQuot: dart.finalFieldType(core.bool),
  escapeApos: dart.finalFieldType(core.bool),
  escapeSlash: dart.finalFieldType(core.bool)
}));
dart.defineExtensionMethods(convert.HtmlEscapeMode, ['toString']);
dart.defineLazy(convert.HtmlEscapeMode, {
  /*convert.HtmlEscapeMode.unknown*/get unknown() {
    return dart.const(new convert.HtmlEscapeMode.__("unknown", true, true, true, true));
  },
  /*convert.HtmlEscapeMode.attribute*/get attribute() {
    return dart.const(new convert.HtmlEscapeMode.__("attribute", true, true, false, false));
  },
  /*convert.HtmlEscapeMode.sqAttribute*/get sqAttribute() {
    return dart.const(new convert.HtmlEscapeMode.__("attribute", true, false, true, false));
  },
  /*convert.HtmlEscapeMode.element*/get element() {
    return dart.const(new convert.HtmlEscapeMode.__("element", true, false, false, false));
  }
});
const _convert = dart.privateName(convert, "_convert");
convert.HtmlEscape = class HtmlEscape extends convert.Converter$(core.String, core.String) {
  get mode() {
    return this[mode$];
  }
  set mode(value) {
    super.mode = value;
  }
  convert(text) {
    core.String._check(text);
    let val = this[_convert](text, 0, text.length);
    return val == null ? text : val;
  }
  [_convert](text, start, end) {
    let result = null;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let ch = text[$_get](i);
      let replacement = null;
      switch (ch) {
        case "&":
        {
          replacement = "&amp;";
          break;
        }
        case "\"":
        {
          if (dart.test(this.mode.escapeQuot)) replacement = "&quot;";
          break;
        }
        case "'":
        {
          if (dart.test(this.mode.escapeApos)) replacement = "&#39;";
          break;
        }
        case "<":
        {
          if (dart.test(this.mode.escapeLtGt)) replacement = "&lt;";
          break;
        }
        case ">":
        {
          if (dart.test(this.mode.escapeLtGt)) replacement = "&gt;";
          break;
        }
        case "/":
        {
          if (dart.test(this.mode.escapeSlash)) replacement = "&#47;";
          break;
        }
      }
      if (replacement != null) {
        let t = result;
        t == null ? result = new core.StringBuffer.new() : t;
        if (dart.notNull(i) > dart.notNull(start)) result.write(text[$substring](start, i));
        result.write(replacement);
        start = dart.notNull(i) + 1;
      }
    }
    if (result == null) return null;
    if (dart.notNull(end) > dart.notNull(start)) result.write(text[$substring](start, end));
    return dart.toString(result);
  }
  startChunkedConversion(sink) {
    SinkOfString()._check(sink);
    return new convert._HtmlEscapeSink.new(this, convert.StringConversionSink.is(sink) ? sink : convert.StringConversionSink.from(sink));
  }
};
(convert.HtmlEscape.new = function(mode) {
  if (mode === void 0) mode = convert.HtmlEscapeMode.unknown;
  this[mode$] = mode;
  convert.HtmlEscape.__proto__.new.call(this);
}).prototype = convert.HtmlEscape.prototype;
dart.addTypeTests(convert.HtmlEscape);
const mode$ = Symbol("HtmlEscape.mode");
dart.setMethodSignature(convert.HtmlEscape, () => ({
  __proto__: dart.getMethods(convert.HtmlEscape.__proto__),
  convert: dart.fnType(core.String, [core.Object]),
  [_convert]: dart.fnType(core.String, [core.String, core.int, core.int]),
  startChunkedConversion: dart.fnType(convert.StringConversionSink, [core.Object])
}));
dart.setLibraryUri(convert.HtmlEscape, "dart:convert");
dart.setFieldSignature(convert.HtmlEscape, () => ({
  __proto__: dart.getFields(convert.HtmlEscape.__proto__),
  mode: dart.finalFieldType(convert.HtmlEscapeMode)
}));
const _escape = dart.privateName(convert, "_escape");
convert._HtmlEscapeSink = class _HtmlEscapeSink extends convert.StringConversionSinkBase {
  addSlice(chunk, start, end, isLast) {
    let val = this[_escape][_convert](chunk, start, end);
    if (val == null) {
      this[_sink$].addSlice(chunk, start, end, isLast);
    } else {
      this[_sink$].add(val);
      if (dart.test(isLast)) this[_sink$].close();
    }
  }
  close() {
    this[_sink$].close();
  }
};
(convert._HtmlEscapeSink.new = function(escape, sink) {
  this[_escape] = escape;
  this[_sink$] = sink;
}).prototype = convert._HtmlEscapeSink.prototype;
dart.addTypeTests(convert._HtmlEscapeSink);
dart.setMethodSignature(convert._HtmlEscapeSink, () => ({
  __proto__: dart.getMethods(convert._HtmlEscapeSink.__proto__),
  addSlice: dart.fnType(dart.void, [core.String, core.int, core.int, core.bool]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._HtmlEscapeSink, "dart:convert");
dart.setFieldSignature(convert._HtmlEscapeSink, () => ({
  __proto__: dart.getFields(convert._HtmlEscapeSink.__proto__),
  [_escape]: dart.finalFieldType(convert.HtmlEscape),
  [_sink$]: dart.finalFieldType(convert.StringConversionSink)
}));
convert.JsonUnsupportedObjectError = class JsonUnsupportedObjectError extends core.Error {
  get unsupportedObject() {
    return this[unsupportedObject$];
  }
  set unsupportedObject(value) {
    super.unsupportedObject = value;
  }
  get cause() {
    return this[cause$];
  }
  set cause(value) {
    super.cause = value;
  }
  get partialResult() {
    return this[partialResult$];
  }
  set partialResult(value) {
    super.partialResult = value;
  }
  toString() {
    let safeString = core.Error.safeToString(this.unsupportedObject);
    let prefix = null;
    if (this.cause != null) {
      prefix = "Converting object to an encodable object failed:";
    } else {
      prefix = "Converting object did not return an encodable object:";
    }
    return dart.str(prefix) + " " + dart.str(safeString);
  }
};
(convert.JsonUnsupportedObjectError.new = function(unsupportedObject, opts) {
  let cause = opts && 'cause' in opts ? opts.cause : null;
  let partialResult = opts && 'partialResult' in opts ? opts.partialResult : null;
  this[unsupportedObject$] = unsupportedObject;
  this[cause$] = cause;
  this[partialResult$] = partialResult;
  convert.JsonUnsupportedObjectError.__proto__.new.call(this);
}).prototype = convert.JsonUnsupportedObjectError.prototype;
dart.addTypeTests(convert.JsonUnsupportedObjectError);
const unsupportedObject$ = Symbol("JsonUnsupportedObjectError.unsupportedObject");
const cause$ = Symbol("JsonUnsupportedObjectError.cause");
const partialResult$ = Symbol("JsonUnsupportedObjectError.partialResult");
dart.setLibraryUri(convert.JsonUnsupportedObjectError, "dart:convert");
dart.setFieldSignature(convert.JsonUnsupportedObjectError, () => ({
  __proto__: dart.getFields(convert.JsonUnsupportedObjectError.__proto__),
  unsupportedObject: dart.finalFieldType(core.Object),
  cause: dart.finalFieldType(core.Object),
  partialResult: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(convert.JsonUnsupportedObjectError, ['toString']);
convert.JsonCyclicError = class JsonCyclicError extends convert.JsonUnsupportedObjectError {
  toString() {
    return "Cyclic error in JSON stringify";
  }
};
(convert.JsonCyclicError.new = function(object) {
  convert.JsonCyclicError.__proto__.new.call(this, object);
}).prototype = convert.JsonCyclicError.prototype;
dart.addTypeTests(convert.JsonCyclicError);
dart.setLibraryUri(convert.JsonCyclicError, "dart:convert");
dart.defineExtensionMethods(convert.JsonCyclicError, ['toString']);
dart.defineLazy(convert, {
  /*convert.json*/get json() {
    return dart.const(new convert.JsonCodec.new());
  }
});
convert.jsonEncode = function(object, opts) {
  let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
  return convert.json.encode(object, {toEncodable: toEncodable});
};
convert.jsonDecode = function(source, opts) {
  let reviver = opts && 'reviver' in opts ? opts.reviver : null;
  return convert.json.decode(source, {reviver: reviver});
};
const _toEncodable = dart.privateName(convert, "_toEncodable");
let const$41;
let const$42;
convert.JsonCodec = class JsonCodec extends convert.Codec$(core.Object, core.String) {
  decode(source, opts) {
    core.String._check(source);
    let reviver = opts && 'reviver' in opts ? opts.reviver : null;
    let t = reviver;
    t == null ? reviver = this[_reviver] : t;
    if (reviver == null) return this.decoder.convert(source);
    return new convert.JsonDecoder.new(reviver).convert(source);
  }
  encode(value, opts) {
    let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
    let t = toEncodable;
    t == null ? toEncodable = this[_toEncodable] : t;
    if (toEncodable == null) return this.encoder.convert(value);
    return new convert.JsonEncoder.new(toEncodable).convert(value);
  }
  get encoder() {
    if (this[_toEncodable] == null) return const$41 || (const$41 = dart.const(new convert.JsonEncoder.new()));
    return new convert.JsonEncoder.new(this[_toEncodable]);
  }
  get decoder() {
    if (this[_reviver] == null) return const$42 || (const$42 = dart.const(new convert.JsonDecoder.new()));
    return new convert.JsonDecoder.new(this[_reviver]);
  }
};
(convert.JsonCodec.new = function(opts) {
  let reviver = opts && 'reviver' in opts ? opts.reviver : null;
  let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
  this[_reviver] = reviver;
  this[_toEncodable] = toEncodable;
  convert.JsonCodec.__proto__.new.call(this);
}).prototype = convert.JsonCodec.prototype;
(convert.JsonCodec.withReviver = function(reviver) {
  convert.JsonCodec.new.call(this, {reviver: reviver});
}).prototype = convert.JsonCodec.prototype;
dart.addTypeTests(convert.JsonCodec);
dart.setMethodSignature(convert.JsonCodec, () => ({
  __proto__: dart.getMethods(convert.JsonCodec.__proto__),
  decode: dart.fnType(dart.dynamic, [core.Object], {reviver: dart.fnType(dart.dynamic, [core.Object, core.Object])}),
  encode: dart.fnType(core.String, [core.Object], {toEncodable: dart.fnType(dart.dynamic, [dart.dynamic])})
}));
dart.setGetterSignature(convert.JsonCodec, () => ({
  __proto__: dart.getGetters(convert.JsonCodec.__proto__),
  encoder: convert.JsonEncoder,
  decoder: convert.JsonDecoder
}));
dart.setLibraryUri(convert.JsonCodec, "dart:convert");
dart.setFieldSignature(convert.JsonCodec, () => ({
  __proto__: dart.getFields(convert.JsonCodec.__proto__),
  [_reviver]: dart.finalFieldType(ObjectAndObjectTodynamic()),
  [_toEncodable]: dart.finalFieldType(dynamicTodynamic())
}));
convert.JsonEncoder = class JsonEncoder extends convert.Converter$(core.Object, core.String) {
  get indent() {
    return this[indent$];
  }
  set indent(value) {
    super.indent = value;
  }
  convert(object) {
    return convert._JsonStringStringifier.stringify(object, this[_toEncodable], this.indent);
  }
  startChunkedConversion(sink) {
    SinkOfString()._check(sink);
    if (convert._Utf8EncoderSink.is(sink)) {
      return new convert._JsonUtf8EncoderSink.new(sink[_sink$], this[_toEncodable], convert.JsonUtf8Encoder._utf8Encode(this.indent), convert.JsonUtf8Encoder._defaultBufferSize);
    }
    return new convert._JsonEncoderSink.new(convert.StringConversionSink.is(sink) ? sink : convert.StringConversionSink.from(sink), this[_toEncodable], this.indent);
  }
  bind(stream) {
    return super.bind(stream);
  }
  fuse(T, other) {
    convert.Converter$(core.String, T)._check(other);
    if (convert.Utf8Encoder.is(other) && ListOfint().is(dart.wrapType(T))) {
      return convert.Converter$(core.Object, T)._check(new convert.JsonUtf8Encoder.new(this.indent, this[_toEncodable]));
    }
    return super.fuse(T, other);
  }
};
(convert.JsonEncoder.new = function(toEncodable) {
  if (toEncodable === void 0) toEncodable = null;
  this[indent$] = null;
  this[_toEncodable] = toEncodable;
  convert.JsonEncoder.__proto__.new.call(this);
}).prototype = convert.JsonEncoder.prototype;
(convert.JsonEncoder.withIndent = function(indent, toEncodable) {
  if (toEncodable === void 0) toEncodable = null;
  this[indent$] = indent;
  this[_toEncodable] = toEncodable;
  convert.JsonEncoder.__proto__.new.call(this);
}).prototype = convert.JsonEncoder.prototype;
dart.addTypeTests(convert.JsonEncoder);
const indent$ = Symbol("JsonEncoder.indent");
dart.setMethodSignature(convert.JsonEncoder, () => ({
  __proto__: dart.getMethods(convert.JsonEncoder.__proto__),
  convert: dart.fnType(core.String, [core.Object]),
  startChunkedConversion: dart.fnType(convert.ChunkedConversionSink$(core.Object), [core.Object]),
  bind: dart.fnType(async.Stream$(core.String), [async.Stream$(core.Object)]),
  fuse: dart.gFnType(T => [convert.Converter$(core.Object, T), [core.Object]])
}));
dart.setLibraryUri(convert.JsonEncoder, "dart:convert");
dart.setFieldSignature(convert.JsonEncoder, () => ({
  __proto__: dart.getFields(convert.JsonEncoder.__proto__),
  indent: dart.finalFieldType(core.String),
  [_toEncodable]: dart.finalFieldType(dynamicTodynamic())
}));
const _indent = dart.privateName(convert, "_indent");
const _bufferSize = dart.privateName(convert, "_bufferSize");
convert.JsonUtf8Encoder = class JsonUtf8Encoder extends convert.Converter$(core.Object, core.List$(core.int)) {
  static _utf8Encode(string) {
    if (string == null) return null;
    if (string[$isEmpty]) return typed_data.Uint8List.new(0);
    checkAscii: {
      for (let i = 0; i < string.length; i++) {
        if (string[$codeUnitAt](i) >= 128) break checkAscii;
      }
      return string[$codeUnits];
    }
    return convert.utf8.encode(string);
  }
  convert(object) {
    let bytes = JSArrayOfListOfint().of([]);
    function addChunk(chunk, start, end) {
      if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(chunk[$length])) {
        let length = dart.notNull(end) - dart.notNull(start);
        chunk = typed_data.Uint8List.view(chunk[$buffer], dart.notNull(chunk[$offsetInBytes]) + dart.notNull(start), length);
      }
      bytes[$add](chunk);
    }
    dart.fn(addChunk, Uint8ListAndintAndintTovoid());
    convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], addChunk);
    if (bytes[$length] === 1) return bytes[$_get](0);
    let length = 0;
    for (let i = 0; i < dart.notNull(bytes[$length]); i++) {
      length = length + dart.notNull(bytes[$_get](i)[$length]);
    }
    let result = typed_data.Uint8List.new(length);
    for (let i = 0, offset = 0; i < dart.notNull(bytes[$length]); i++) {
      let byteList = bytes[$_get](i);
      let end = offset + dart.notNull(byteList[$length]);
      result[$setRange](offset, end, byteList);
      offset = end;
    }
    return result;
  }
  startChunkedConversion(sink) {
    SinkOfListOfint()._check(sink);
    let byteSink = null;
    if (convert.ByteConversionSink.is(sink)) {
      byteSink = sink;
    } else {
      byteSink = convert.ByteConversionSink.from(sink);
    }
    return new convert._JsonUtf8EncoderSink.new(byteSink, this[_toEncodable], this[_indent], this[_bufferSize]);
  }
  bind(stream) {
    return super.bind(stream);
  }
};
(convert.JsonUtf8Encoder.new = function(indent, toEncodable, bufferSize) {
  if (indent === void 0) indent = null;
  if (toEncodable === void 0) toEncodable = null;
  if (bufferSize === void 0) bufferSize = 256;
  this[_indent] = convert.JsonUtf8Encoder._utf8Encode(indent);
  this[_toEncodable] = toEncodable;
  this[_bufferSize] = bufferSize;
  convert.JsonUtf8Encoder.__proto__.new.call(this);
}).prototype = convert.JsonUtf8Encoder.prototype;
dart.addTypeTests(convert.JsonUtf8Encoder);
dart.setMethodSignature(convert.JsonUtf8Encoder, () => ({
  __proto__: dart.getMethods(convert.JsonUtf8Encoder.__proto__),
  convert: dart.fnType(core.List$(core.int), [core.Object]),
  startChunkedConversion: dart.fnType(convert.ChunkedConversionSink$(core.Object), [core.Object]),
  bind: dart.fnType(async.Stream$(core.List$(core.int)), [async.Stream$(core.Object)])
}));
dart.setLibraryUri(convert.JsonUtf8Encoder, "dart:convert");
dart.setFieldSignature(convert.JsonUtf8Encoder, () => ({
  __proto__: dart.getFields(convert.JsonUtf8Encoder.__proto__),
  [_indent]: dart.finalFieldType(ListOfint()),
  [_toEncodable]: dart.finalFieldType(dynamicTodynamic()),
  [_bufferSize]: dart.finalFieldType(core.int)
}));
dart.defineLazy(convert.JsonUtf8Encoder, {
  /*convert.JsonUtf8Encoder._defaultBufferSize*/get _defaultBufferSize() {
    return 256;
  },
  /*convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE*/get DEFAULT_BUFFER_SIZE() {
    return 256;
  }
});
const _isDone = dart.privateName(convert, "_isDone");
convert._JsonEncoderSink = class _JsonEncoderSink extends convert.ChunkedConversionSink$(core.Object) {
  add(o) {
    if (dart.test(this[_isDone])) {
      dart.throw(new core.StateError.new("Only one call to add allowed"));
    }
    this[_isDone] = true;
    let stringSink = this[_sink$].asStringSink();
    convert._JsonStringStringifier.printOn(o, stringSink, this[_toEncodable], this[_indent]);
    stringSink.close();
  }
  close() {}
};
(convert._JsonEncoderSink.new = function(sink, toEncodable, indent) {
  this[_isDone] = false;
  this[_sink$] = sink;
  this[_toEncodable] = toEncodable;
  this[_indent] = indent;
  convert._JsonEncoderSink.__proto__.new.call(this);
}).prototype = convert._JsonEncoderSink.prototype;
dart.addTypeTests(convert._JsonEncoderSink);
dart.setMethodSignature(convert._JsonEncoderSink, () => ({
  __proto__: dart.getMethods(convert._JsonEncoderSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._JsonEncoderSink, "dart:convert");
dart.setFieldSignature(convert._JsonEncoderSink, () => ({
  __proto__: dart.getFields(convert._JsonEncoderSink.__proto__),
  [_indent]: dart.finalFieldType(core.String),
  [_toEncodable]: dart.finalFieldType(dynamicTodynamic()),
  [_sink$]: dart.finalFieldType(convert.StringConversionSink),
  [_isDone]: dart.fieldType(core.bool)
}));
const _addChunk = dart.privateName(convert, "_addChunk");
convert._JsonUtf8EncoderSink = class _JsonUtf8EncoderSink extends convert.ChunkedConversionSink$(core.Object) {
  [_addChunk](chunk, start, end) {
    this[_sink$].addSlice(chunk, start, end, false);
  }
  add(object) {
    if (dart.test(this[_isDone])) {
      dart.throw(new core.StateError.new("Only one call to add allowed"));
    }
    this[_isDone] = true;
    convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], dart.bind(this, _addChunk));
    this[_sink$].close();
  }
  close() {
    if (!dart.test(this[_isDone])) {
      this[_isDone] = true;
      this[_sink$].close();
    }
  }
};
(convert._JsonUtf8EncoderSink.new = function(sink, toEncodable, indent, bufferSize) {
  this[_isDone] = false;
  this[_sink$] = sink;
  this[_toEncodable] = toEncodable;
  this[_indent] = indent;
  this[_bufferSize] = bufferSize;
  convert._JsonUtf8EncoderSink.__proto__.new.call(this);
}).prototype = convert._JsonUtf8EncoderSink.prototype;
dart.addTypeTests(convert._JsonUtf8EncoderSink);
dart.setMethodSignature(convert._JsonUtf8EncoderSink, () => ({
  __proto__: dart.getMethods(convert._JsonUtf8EncoderSink.__proto__),
  [_addChunk]: dart.fnType(dart.void, [typed_data.Uint8List, core.int, core.int]),
  add: dart.fnType(dart.void, [core.Object]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._JsonUtf8EncoderSink, "dart:convert");
dart.setFieldSignature(convert._JsonUtf8EncoderSink, () => ({
  __proto__: dart.getFields(convert._JsonUtf8EncoderSink.__proto__),
  [_sink$]: dart.finalFieldType(convert.ByteConversionSink),
  [_indent]: dart.finalFieldType(ListOfint()),
  [_toEncodable]: dart.finalFieldType(dynamicTodynamic()),
  [_bufferSize]: dart.finalFieldType(core.int),
  [_isDone]: dart.fieldType(core.bool)
}));
convert.JsonDecoder = class JsonDecoder extends convert.Converter$(core.String, core.Object) {
  convert(input) {
    core.String._check(input);
    return convert._parseJson(input, this[_reviver]);
  }
  startChunkedConversion(sink) {
    return new convert._JsonDecoderSink.new(this[_reviver], sink);
  }
  bind(stream) {
    StreamOfString()._check(stream);
    return super.bind(stream);
  }
};
(convert.JsonDecoder.new = function(reviver) {
  if (reviver === void 0) reviver = null;
  this[_reviver] = reviver;
  convert.JsonDecoder.__proto__.new.call(this);
}).prototype = convert.JsonDecoder.prototype;
dart.addTypeTests(convert.JsonDecoder);
dart.setMethodSignature(convert.JsonDecoder, () => ({
  __proto__: dart.getMethods(convert.JsonDecoder.__proto__),
  convert: dart.fnType(dart.dynamic, [core.Object]),
  startChunkedConversion: dart.fnType(convert.StringConversionSink, [core.Sink$(core.Object)]),
  bind: dart.fnType(async.Stream$(core.Object), [core.Object])
}));
dart.setLibraryUri(convert.JsonDecoder, "dart:convert");
dart.setFieldSignature(convert.JsonDecoder, () => ({
  __proto__: dart.getFields(convert.JsonDecoder.__proto__),
  [_reviver]: dart.finalFieldType(ObjectAndObjectTodynamic())
}));
convert._parseJson = function(source, reviver) {
  if (!(typeof source == 'string')) dart.throw(_js_helper.argumentErrorValue(source));
  let parsed = null;
  try {
    parsed = JSON.parse(source);
  } catch (e$) {
    let e = dart.getThrown(e$);
    dart.throw(new core.FormatException.new(String(e)));
  }
  if (reviver == null) {
    return convert._convertJsonToDartLazy(parsed);
  } else {
    return convert._convertJsonToDart(parsed, reviver);
  }
};
convert._defaultToEncodable = function(object) {
  return dart.dsend(object, 'toJson', []);
};
const _seen = dart.privateName(convert, "_seen");
const _checkCycle = dart.privateName(convert, "_checkCycle");
const _removeSeen = dart.privateName(convert, "_removeSeen");
const _partialResult = dart.privateName(convert, "_partialResult");
convert._JsonStringifier = class _JsonStringifier extends core.Object {
  static hexDigit(x) {
    return dart.notNull(x) < 10 ? 48 + dart.notNull(x) : 87 + dart.notNull(x);
  }
  writeStringContent(s) {
    let offset = 0;
    let length = s.length;
    for (let i = 0; i < length; i++) {
      let charCode = s[$codeUnitAt](i);
      if (charCode > 92) continue;
      if (charCode < 32) {
        if (i > offset) this.writeStringSlice(s, offset, i);
        offset = i + 1;
        this.writeCharCode(92);
        switch (charCode) {
          case 8:
          {
            this.writeCharCode(98);
            break;
          }
          case 9:
          {
            this.writeCharCode(116);
            break;
          }
          case 10:
          {
            this.writeCharCode(110);
            break;
          }
          case 12:
          {
            this.writeCharCode(102);
            break;
          }
          case 13:
          {
            this.writeCharCode(114);
            break;
          }
          default:
          {
            this.writeCharCode(117);
            this.writeCharCode(48);
            this.writeCharCode(48);
            this.writeCharCode(convert._JsonStringifier.hexDigit(charCode >> 4 & 15));
            this.writeCharCode(convert._JsonStringifier.hexDigit(charCode & 15));
            break;
          }
        }
      } else if (charCode === 34 || charCode === 92) {
        if (i > offset) this.writeStringSlice(s, offset, i);
        offset = i + 1;
        this.writeCharCode(92);
        this.writeCharCode(charCode);
      }
    }
    if (offset === 0) {
      this.writeString(s);
    } else if (offset < length) {
      this.writeStringSlice(s, offset, length);
    }
  }
  [_checkCycle](object) {
    for (let i = 0; i < dart.notNull(this[_seen][$length]); i++) {
      if (core.identical(object, this[_seen][$_get](i))) {
        dart.throw(new convert.JsonCyclicError.new(object));
      }
    }
    this[_seen][$add](object);
  }
  [_removeSeen](object) {
    if (!dart.test(this[_seen][$isNotEmpty])) dart.assertFailed(null, "dart:convert/json.dart", 643, 12, "_seen.isNotEmpty");
    if (!core.identical(this[_seen][$last], object)) dart.assertFailed(null, "dart:convert/json.dart", 644, 12, "identical(_seen.last, object)");
    this[_seen][$removeLast]();
  }
  writeObject(object) {
    if (dart.test(this.writeJsonValue(object))) return;
    this[_checkCycle](object);
    try {
      let customJson = this[_toEncodable](object);
      if (!dart.test(this.writeJsonValue(customJson))) {
        dart.throw(new convert.JsonUnsupportedObjectError.new(object, {partialResult: this[_partialResult]}));
      }
      this[_removeSeen](object);
    } catch (e$) {
      let e = dart.getThrown(e$);
      dart.throw(new convert.JsonUnsupportedObjectError.new(object, {cause: e, partialResult: this[_partialResult]}));
    }
  }
  writeJsonValue(object) {
    if (typeof object == 'number') {
      if (!object[$isFinite]) return false;
      this.writeNumber(object);
      return true;
    } else if (object === true) {
      this.writeString("true");
      return true;
    } else if (object === false) {
      this.writeString("false");
      return true;
    } else if (object == null) {
      this.writeString("null");
      return true;
    } else if (typeof object == 'string') {
      this.writeString("\"");
      this.writeStringContent(object);
      this.writeString("\"");
      return true;
    } else if (core.List.is(object)) {
      this[_checkCycle](object);
      this.writeList(object);
      this[_removeSeen](object);
      return true;
    } else if (core.Map.is(object)) {
      this[_checkCycle](object);
      let success = this.writeMap(object);
      this[_removeSeen](object);
      return success;
    } else {
      return false;
    }
  }
  writeList(list) {
    this.writeString("[");
    if (dart.test(list[$isNotEmpty])) {
      this.writeObject(list[$_get](0));
      for (let i = 1; i < dart.notNull(list[$length]); i++) {
        this.writeString(",");
        this.writeObject(list[$_get](i));
      }
    }
    this.writeString("]");
  }
  writeMap(map) {
    if (dart.test(map[$isEmpty])) {
      this.writeString("{}");
      return true;
    }
    let keyValueList = core.List.new(dart.notNull(map[$length]) * 2);
    let i = 0;
    let allStringKeys = true;
    map[$forEach](dart.fn((key, value) => {
      if (!(typeof key == 'string')) {
        allStringKeys = false;
      }
      keyValueList[$_set](i++, key);
      keyValueList[$_set](i++, value);
    }, dynamicAnddynamicToNull()));
    if (!allStringKeys) return false;
    this.writeString("{");
    let separator = "\"";
    for (let i = 0; i < dart.notNull(keyValueList[$length]); i = i + 2) {
      this.writeString(separator);
      separator = ",\"";
      this.writeStringContent(core.String._check(keyValueList[$_get](i)));
      this.writeString("\":");
      this.writeObject(keyValueList[$_get](i + 1));
    }
    this.writeString("}");
    return true;
  }
};
(convert._JsonStringifier.new = function(toEncodable) {
  this[_seen] = [];
  let l = toEncodable;
  this[_toEncodable] = l != null ? l : dart.fn(convert._defaultToEncodable, dynamicTodynamic());
}).prototype = convert._JsonStringifier.prototype;
dart.addTypeTests(convert._JsonStringifier);
dart.setMethodSignature(convert._JsonStringifier, () => ({
  __proto__: dart.getMethods(convert._JsonStringifier.__proto__),
  writeStringContent: dart.fnType(dart.void, [core.String]),
  [_checkCycle]: dart.fnType(dart.void, [dart.dynamic]),
  [_removeSeen]: dart.fnType(dart.void, [dart.dynamic]),
  writeObject: dart.fnType(dart.void, [dart.dynamic]),
  writeJsonValue: dart.fnType(core.bool, [dart.dynamic]),
  writeList: dart.fnType(dart.void, [core.List]),
  writeMap: dart.fnType(core.bool, [core.Map])
}));
dart.setLibraryUri(convert._JsonStringifier, "dart:convert");
dart.setFieldSignature(convert._JsonStringifier, () => ({
  __proto__: dart.getFields(convert._JsonStringifier.__proto__),
  [_seen]: dart.finalFieldType(core.List),
  [_toEncodable]: dart.finalFieldType(dynamicTodynamic())
}));
dart.defineLazy(convert._JsonStringifier, {
  /*convert._JsonStringifier.backspace*/get backspace() {
    return 8;
  },
  /*convert._JsonStringifier.tab*/get tab() {
    return 9;
  },
  /*convert._JsonStringifier.newline*/get newline() {
    return 10;
  },
  /*convert._JsonStringifier.carriageReturn*/get carriageReturn() {
    return 13;
  },
  /*convert._JsonStringifier.formFeed*/get formFeed() {
    return 12;
  },
  /*convert._JsonStringifier.quote*/get quote() {
    return 34;
  },
  /*convert._JsonStringifier.char_0*/get char_0() {
    return 48;
  },
  /*convert._JsonStringifier.backslash*/get backslash() {
    return 92;
  },
  /*convert._JsonStringifier.char_b*/get char_b() {
    return 98;
  },
  /*convert._JsonStringifier.char_f*/get char_f() {
    return 102;
  },
  /*convert._JsonStringifier.char_n*/get char_n() {
    return 110;
  },
  /*convert._JsonStringifier.char_r*/get char_r() {
    return 114;
  },
  /*convert._JsonStringifier.char_t*/get char_t() {
    return 116;
  },
  /*convert._JsonStringifier.char_u*/get char_u() {
    return 117;
  }
});
const _indentLevel = dart.privateName(convert, "_indentLevel");
convert._JsonPrettyPrintMixin = class _JsonPrettyPrintMixin extends core.Object {
  writeList(list) {
    if (dart.test(list[$isEmpty])) {
      this.writeString("[]");
    } else {
      this.writeString("[\n");
      this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
      this.writeIndentation(this[_indentLevel]);
      this.writeObject(list[$_get](0));
      for (let i = 1; i < dart.notNull(list[$length]); i++) {
        this.writeString(",\n");
        this.writeIndentation(this[_indentLevel]);
        this.writeObject(list[$_get](i));
      }
      this.writeString("\n");
      this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
      this.writeIndentation(this[_indentLevel]);
      this.writeString("]");
    }
  }
  writeMap(map) {
    if (dart.test(map[$isEmpty])) {
      this.writeString("{}");
      return true;
    }
    let keyValueList = core.List.new(dart.notNull(map[$length]) * 2);
    let i = 0;
    let allStringKeys = true;
    map[$forEach](dart.fn((key, value) => {
      if (!(typeof key == 'string')) {
        allStringKeys = false;
      }
      keyValueList[$_set](i++, key);
      keyValueList[$_set](i++, value);
    }, dynamicAnddynamicToNull()));
    if (!allStringKeys) return false;
    this.writeString("{\n");
    this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
    let separator = "";
    for (let i = 0; i < dart.notNull(keyValueList[$length]); i = i + 2) {
      this.writeString(separator);
      separator = ",\n";
      this.writeIndentation(this[_indentLevel]);
      this.writeString("\"");
      this.writeStringContent(core.String._check(keyValueList[$_get](i)));
      this.writeString("\": ");
      this.writeObject(keyValueList[$_get](i + 1));
    }
    this.writeString("\n");
    this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
    this.writeIndentation(this[_indentLevel]);
    this.writeString("}");
    return true;
  }
};
(convert._JsonPrettyPrintMixin.new = function() {
  this[_indentLevel] = 0;
}).prototype = convert._JsonPrettyPrintMixin.prototype;
dart.addTypeTests(convert._JsonPrettyPrintMixin);
convert._JsonPrettyPrintMixin[dart.implements] = () => [convert._JsonStringifier];
dart.setMethodSignature(convert._JsonPrettyPrintMixin, () => ({
  __proto__: dart.getMethods(convert._JsonPrettyPrintMixin.__proto__),
  writeList: dart.fnType(dart.void, [core.List]),
  writeMap: dart.fnType(core.bool, [core.Map])
}));
dart.setLibraryUri(convert._JsonPrettyPrintMixin, "dart:convert");
dart.setFieldSignature(convert._JsonPrettyPrintMixin, () => ({
  __proto__: dart.getFields(convert._JsonPrettyPrintMixin.__proto__),
  [_indentLevel]: dart.fieldType(core.int)
}));
convert._JsonStringStringifier = class _JsonStringStringifier extends convert._JsonStringifier {
  static stringify(object, toEncodable, indent) {
    let output = new core.StringBuffer.new();
    convert._JsonStringStringifier.printOn(object, output, toEncodable, indent);
    return output.toString();
  }
  static printOn(object, output, toEncodable, indent) {
    let stringifier = null;
    if (indent == null) {
      stringifier = new convert._JsonStringStringifier.new(output, toEncodable);
    } else {
      stringifier = new convert._JsonStringStringifierPretty.new(output, toEncodable, indent);
    }
    stringifier.writeObject(object);
  }
  get [_partialResult]() {
    return core.StringBuffer.is(this[_sink$]) ? dart.toString(this[_sink$]) : null;
  }
  writeNumber(number) {
    this[_sink$].write(dart.toString(number));
  }
  writeString(string) {
    this[_sink$].write(string);
  }
  writeStringSlice(string, start, end) {
    this[_sink$].write(string[$substring](start, end));
  }
  writeCharCode(charCode) {
    this[_sink$].writeCharCode(charCode);
  }
};
(convert._JsonStringStringifier.new = function(sink, _toEncodable) {
  this[_sink$] = sink;
  convert._JsonStringStringifier.__proto__.new.call(this, _toEncodable);
}).prototype = convert._JsonStringStringifier.prototype;
dart.addTypeTests(convert._JsonStringStringifier);
dart.setMethodSignature(convert._JsonStringStringifier, () => ({
  __proto__: dart.getMethods(convert._JsonStringStringifier.__proto__),
  writeNumber: dart.fnType(dart.void, [core.num]),
  writeString: dart.fnType(dart.void, [core.String]),
  writeStringSlice: dart.fnType(dart.void, [core.String, core.int, core.int]),
  writeCharCode: dart.fnType(dart.void, [core.int])
}));
dart.setGetterSignature(convert._JsonStringStringifier, () => ({
  __proto__: dart.getGetters(convert._JsonStringStringifier.__proto__),
  [_partialResult]: core.String
}));
dart.setLibraryUri(convert._JsonStringStringifier, "dart:convert");
dart.setFieldSignature(convert._JsonStringStringifier, () => ({
  __proto__: dart.getFields(convert._JsonStringStringifier.__proto__),
  [_sink$]: dart.finalFieldType(core.StringSink)
}));
const _JsonStringStringifier__JsonPrettyPrintMixin$ = class _JsonStringStringifier__JsonPrettyPrintMixin extends convert._JsonStringStringifier {};
(_JsonStringStringifier__JsonPrettyPrintMixin$.new = function(_sink, _toEncodable) {
  convert._JsonPrettyPrintMixin.new.call(this);
  _JsonStringStringifier__JsonPrettyPrintMixin$.__proto__.new.call(this, _sink, _toEncodable);
}).prototype = _JsonStringStringifier__JsonPrettyPrintMixin$.prototype;
dart.applyMixin(_JsonStringStringifier__JsonPrettyPrintMixin$, convert._JsonPrettyPrintMixin);
convert._JsonStringStringifierPretty = class _JsonStringStringifierPretty extends _JsonStringStringifier__JsonPrettyPrintMixin$ {
  writeIndentation(count) {
    for (let i = 0; i < dart.notNull(count); i++)
      this.writeString(this[_indent]);
  }
};
(convert._JsonStringStringifierPretty.new = function(sink, toEncodable, indent) {
  this[_indent] = indent;
  convert._JsonStringStringifierPretty.__proto__.new.call(this, sink, toEncodable);
}).prototype = convert._JsonStringStringifierPretty.prototype;
dart.addTypeTests(convert._JsonStringStringifierPretty);
dart.setMethodSignature(convert._JsonStringStringifierPretty, () => ({
  __proto__: dart.getMethods(convert._JsonStringStringifierPretty.__proto__),
  writeIndentation: dart.fnType(dart.void, [core.int])
}));
dart.setLibraryUri(convert._JsonStringStringifierPretty, "dart:convert");
dart.setFieldSignature(convert._JsonStringStringifierPretty, () => ({
  __proto__: dart.getFields(convert._JsonStringStringifierPretty.__proto__),
  [_indent]: dart.finalFieldType(core.String)
}));
convert._JsonUtf8Stringifier = class _JsonUtf8Stringifier extends convert._JsonStringifier {
  static stringify(object, indent, toEncodable, bufferSize, addChunk) {
    let stringifier = null;
    if (indent != null) {
      stringifier = new convert._JsonUtf8StringifierPretty.new(toEncodable, indent, bufferSize, addChunk);
    } else {
      stringifier = new convert._JsonUtf8Stringifier.new(toEncodable, bufferSize, addChunk);
    }
    stringifier.writeObject(object);
    stringifier.flush();
  }
  flush() {
    if (dart.notNull(this.index) > 0) {
      this.addChunk(this.buffer, 0, this.index);
    }
    this.buffer = null;
    this.index = 0;
  }
  get [_partialResult]() {
    return null;
  }
  writeNumber(number) {
    this.writeAsciiString(dart.toString(number));
  }
  writeAsciiString(string) {
    for (let i = 0; i < string.length; i++) {
      let char = string[$codeUnitAt](i);
      if (!(char <= 127)) dart.assertFailed(null, "dart:convert/json.dart", 944, 14, "char <= 0x7f");
      this.writeByte(char);
    }
  }
  writeString(string) {
    this.writeStringSlice(string, 0, string.length);
  }
  writeStringSlice(string, start, end) {
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = string[$codeUnitAt](i);
      if (char <= 127) {
        this.writeByte(char);
      } else {
        if ((char & 64512) === 55296 && dart.notNull(i) + 1 < dart.notNull(end)) {
          let nextChar = string[$codeUnitAt](dart.notNull(i) + 1);
          if ((nextChar & 64512) === 56320) {
            char = 65536 + ((char & 1023) << 10) + (nextChar & 1023);
            this.writeFourByteCharCode(char);
            i = dart.notNull(i) + 1;
            continue;
          }
        }
        this.writeMultiByteCharCode(char);
      }
    }
  }
  writeCharCode(charCode) {
    if (dart.notNull(charCode) <= 127) {
      this.writeByte(charCode);
      return;
    }
    this.writeMultiByteCharCode(charCode);
  }
  writeMultiByteCharCode(charCode) {
    if (dart.notNull(charCode) <= 2047) {
      this.writeByte((192 | charCode[$rightShift](6)) >>> 0);
      this.writeByte(128 | dart.notNull(charCode) & 63);
      return;
    }
    if (dart.notNull(charCode) <= 65535) {
      this.writeByte((224 | charCode[$rightShift](12)) >>> 0);
      this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
      this.writeByte(128 | dart.notNull(charCode) & 63);
      return;
    }
    this.writeFourByteCharCode(charCode);
  }
  writeFourByteCharCode(charCode) {
    if (!(dart.notNull(charCode) <= 1114111)) dart.assertFailed(null, "dart:convert/json.dart", 1002, 12, "charCode <= 0x10ffff");
    this.writeByte((240 | charCode[$rightShift](18)) >>> 0);
    this.writeByte(128 | dart.notNull(charCode) >> 12 & 63);
    this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
    this.writeByte(128 | dart.notNull(charCode) & 63);
  }
  writeByte(byte) {
    if (!(dart.notNull(byte) <= 255)) dart.assertFailed(null, "dart:convert/json.dart", 1010, 12, "byte <= 0xff");
    if (this.index == this.buffer[$length]) {
      this.addChunk(this.buffer, 0, this.index);
      this.buffer = typed_data.Uint8List.new(this.bufferSize);
      this.index = 0;
    }
    this.buffer[$_set]((() => {
      let x = this.index;
      this.index = dart.notNull(x) + 1;
      return x;
    })(), byte);
  }
};
(convert._JsonUtf8Stringifier.new = function(toEncodable, bufferSize, addChunk) {
  this.index = 0;
  this.bufferSize = bufferSize;
  this.addChunk = addChunk;
  this.buffer = typed_data.Uint8List.new(bufferSize);
  convert._JsonUtf8Stringifier.__proto__.new.call(this, toEncodable);
}).prototype = convert._JsonUtf8Stringifier.prototype;
dart.addTypeTests(convert._JsonUtf8Stringifier);
dart.setMethodSignature(convert._JsonUtf8Stringifier, () => ({
  __proto__: dart.getMethods(convert._JsonUtf8Stringifier.__proto__),
  flush: dart.fnType(dart.void, []),
  writeNumber: dart.fnType(dart.void, [core.num]),
  writeAsciiString: dart.fnType(dart.void, [core.String]),
  writeString: dart.fnType(dart.void, [core.String]),
  writeStringSlice: dart.fnType(dart.void, [core.String, core.int, core.int]),
  writeCharCode: dart.fnType(dart.void, [core.int]),
  writeMultiByteCharCode: dart.fnType(dart.void, [core.int]),
  writeFourByteCharCode: dart.fnType(dart.void, [core.int]),
  writeByte: dart.fnType(dart.void, [core.int])
}));
dart.setGetterSignature(convert._JsonUtf8Stringifier, () => ({
  __proto__: dart.getGetters(convert._JsonUtf8Stringifier.__proto__),
  [_partialResult]: core.String
}));
dart.setLibraryUri(convert._JsonUtf8Stringifier, "dart:convert");
dart.setFieldSignature(convert._JsonUtf8Stringifier, () => ({
  __proto__: dart.getFields(convert._JsonUtf8Stringifier.__proto__),
  bufferSize: dart.finalFieldType(core.int),
  addChunk: dart.finalFieldType(Uint8ListAndintAndintTovoid()),
  buffer: dart.fieldType(typed_data.Uint8List),
  index: dart.fieldType(core.int)
}));
const _JsonUtf8Stringifier__JsonPrettyPrintMixin$ = class _JsonUtf8Stringifier__JsonPrettyPrintMixin extends convert._JsonUtf8Stringifier {};
(_JsonUtf8Stringifier__JsonPrettyPrintMixin$.new = function(toEncodable, bufferSize, addChunk) {
  convert._JsonPrettyPrintMixin.new.call(this);
  _JsonUtf8Stringifier__JsonPrettyPrintMixin$.__proto__.new.call(this, toEncodable, bufferSize, addChunk);
}).prototype = _JsonUtf8Stringifier__JsonPrettyPrintMixin$.prototype;
dart.applyMixin(_JsonUtf8Stringifier__JsonPrettyPrintMixin$, convert._JsonPrettyPrintMixin);
convert._JsonUtf8StringifierPretty = class _JsonUtf8StringifierPretty extends _JsonUtf8Stringifier__JsonPrettyPrintMixin$ {
  writeIndentation(count) {
    let indent = this.indent;
    let indentLength = indent[$length];
    if (indentLength === 1) {
      let char = indent[$_get](0);
      while (dart.notNull(count) > 0) {
        this.writeByte(char);
        count = dart.notNull(count) - 1;
      }
      return;
    }
    while (dart.notNull(count) > 0) {
      count = dart.notNull(count) - 1;
      let end = dart.notNull(this.index) + dart.notNull(indentLength);
      if (end <= dart.notNull(this.buffer[$length])) {
        this.buffer[$setRange](this.index, end, indent);
        this.index = end;
      } else {
        for (let i = 0; i < dart.notNull(indentLength); i++) {
          this.writeByte(indent[$_get](i));
        }
      }
    }
  }
};
(convert._JsonUtf8StringifierPretty.new = function(toEncodable, indent, bufferSize, addChunk) {
  this.indent = indent;
  convert._JsonUtf8StringifierPretty.__proto__.new.call(this, toEncodable, bufferSize, addChunk);
}).prototype = convert._JsonUtf8StringifierPretty.prototype;
dart.addTypeTests(convert._JsonUtf8StringifierPretty);
dart.setMethodSignature(convert._JsonUtf8StringifierPretty, () => ({
  __proto__: dart.getMethods(convert._JsonUtf8StringifierPretty.__proto__),
  writeIndentation: dart.fnType(dart.void, [core.int])
}));
dart.setLibraryUri(convert._JsonUtf8StringifierPretty, "dart:convert");
dart.setFieldSignature(convert._JsonUtf8StringifierPretty, () => ({
  __proto__: dart.getFields(convert._JsonUtf8StringifierPretty.__proto__),
  indent: dart.finalFieldType(ListOfint())
}));
dart.defineLazy(convert, {
  /*convert.latin1*/get latin1() {
    return dart.const(new convert.Latin1Codec.new());
  },
  /*convert._latin1Mask*/get _latin1Mask() {
    return 255;
  }
});
let const$43;
let const$44;
let const$45;
let const$46;
let const$47;
convert.Latin1Codec = class Latin1Codec extends convert.Encoding {
  get name() {
    return "iso-8859-1";
  }
  encode(source) {
    core.String._check(source);
    return this.encoder.convert(source);
  }
  decode(bytes, opts) {
    ListOfint()._check(bytes);
    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
    let t = allowInvalid;
    t == null ? allowInvalid = this[_allowInvalid] : t;
    if (dart.test(allowInvalid)) {
      return (const$43 || (const$43 = dart.const(new convert.Latin1Decoder.new({allowInvalid: true})))).convert(bytes);
    } else {
      return (const$44 || (const$44 = dart.const(new convert.Latin1Decoder.new({allowInvalid: false})))).convert(bytes);
    }
  }
  get encoder() {
    return const$45 || (const$45 = dart.const(new convert.Latin1Encoder.new()));
  }
  get decoder() {
    return dart.test(this[_allowInvalid]) ? const$46 || (const$46 = dart.const(new convert.Latin1Decoder.new({allowInvalid: true}))) : const$47 || (const$47 = dart.const(new convert.Latin1Decoder.new({allowInvalid: false})));
  }
};
(convert.Latin1Codec.new = function(opts) {
  let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
  this[_allowInvalid] = allowInvalid;
  convert.Latin1Codec.__proto__.new.call(this);
}).prototype = convert.Latin1Codec.prototype;
dart.addTypeTests(convert.Latin1Codec);
dart.setMethodSignature(convert.Latin1Codec, () => ({
  __proto__: dart.getMethods(convert.Latin1Codec.__proto__),
  encode: dart.fnType(typed_data.Uint8List, [core.Object]),
  decode: dart.fnType(core.String, [core.Object], {allowInvalid: core.bool})
}));
dart.setGetterSignature(convert.Latin1Codec, () => ({
  __proto__: dart.getGetters(convert.Latin1Codec.__proto__),
  name: core.String,
  encoder: convert.Latin1Encoder,
  decoder: convert.Latin1Decoder
}));
dart.setLibraryUri(convert.Latin1Codec, "dart:convert");
dart.setFieldSignature(convert.Latin1Codec, () => ({
  __proto__: dart.getFields(convert.Latin1Codec.__proto__),
  [_allowInvalid]: dart.finalFieldType(core.bool)
}));
convert.Latin1Encoder = class Latin1Encoder extends convert._UnicodeSubsetEncoder {};
(convert.Latin1Encoder.new = function() {
  convert.Latin1Encoder.__proto__.new.call(this, 255);
}).prototype = convert.Latin1Encoder.prototype;
dart.addTypeTests(convert.Latin1Encoder);
dart.setLibraryUri(convert.Latin1Encoder, "dart:convert");
convert.Latin1Decoder = class Latin1Decoder extends convert._UnicodeSubsetDecoder {
  startChunkedConversion(sink) {
    SinkOfString()._check(sink);
    let stringSink = null;
    if (convert.StringConversionSink.is(sink)) {
      stringSink = sink;
    } else {
      stringSink = convert.StringConversionSink.from(sink);
    }
    if (!dart.test(this[_allowInvalid])) return new convert._Latin1DecoderSink.new(stringSink);
    return new convert._Latin1AllowInvalidDecoderSink.new(stringSink);
  }
};
(convert.Latin1Decoder.new = function(opts) {
  let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
  convert.Latin1Decoder.__proto__.new.call(this, allowInvalid, 255);
}).prototype = convert.Latin1Decoder.prototype;
dart.addTypeTests(convert.Latin1Decoder);
dart.setMethodSignature(convert.Latin1Decoder, () => ({
  __proto__: dart.getMethods(convert.Latin1Decoder.__proto__),
  startChunkedConversion: dart.fnType(convert.ByteConversionSink, [core.Object])
}));
dart.setLibraryUri(convert.Latin1Decoder, "dart:convert");
const _addSliceToSink = dart.privateName(convert, "_addSliceToSink");
convert._Latin1DecoderSink = class _Latin1DecoderSink extends convert.ByteConversionSinkBase {
  close() {
    this[_sink$].close();
    this[_sink$] = null;
  }
  add(source) {
    ListOfint()._check(source);
    this.addSlice(source, 0, source[$length], false);
  }
  [_addSliceToSink](source, start, end, isLast) {
    this[_sink$].add(core.String.fromCharCodes(source, start, end));
    if (dart.test(isLast)) this.close();
  }
  addSlice(source, start, end, isLast) {
    end = core.RangeError.checkValidRange(start, end, source[$length]);
    if (start == end) return;
    if (!typed_data.Uint8List.is(source)) {
      convert._Latin1DecoderSink._checkValidLatin1(source, start, end);
    }
    this[_addSliceToSink](source, start, end, isLast);
  }
  static _checkValidLatin1(source, start, end) {
    let mask = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      mask = (mask | dart.notNull(source[$_get](i))) >>> 0;
    }
    if (mask >= 0 && mask <= 255) {
      return;
    }
    convert._Latin1DecoderSink._reportInvalidLatin1(source, start, end);
  }
  static _reportInvalidLatin1(source, start, end) {
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = source[$_get](i);
      if (dart.notNull(char) < 0 || dart.notNull(char) > 255) {
        dart.throw(new core.FormatException.new("Source contains non-Latin-1 characters.", source, i));
      }
    }
    if (!false) dart.assertFailed(null, "dart:convert/latin1.dart", 157, 12, "false");
  }
};
(convert._Latin1DecoderSink.new = function(sink) {
  this[_sink$] = sink;
  convert._Latin1DecoderSink.__proto__.new.call(this);
}).prototype = convert._Latin1DecoderSink.prototype;
dart.addTypeTests(convert._Latin1DecoderSink);
dart.setMethodSignature(convert._Latin1DecoderSink, () => ({
  __proto__: dart.getMethods(convert._Latin1DecoderSink.__proto__),
  close: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [core.Object]),
  [_addSliceToSink]: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._Latin1DecoderSink, "dart:convert");
dart.setFieldSignature(convert._Latin1DecoderSink, () => ({
  __proto__: dart.getFields(convert._Latin1DecoderSink.__proto__),
  [_sink$]: dart.fieldType(convert.StringConversionSink)
}));
let const$48;
convert._Latin1AllowInvalidDecoderSink = class _Latin1AllowInvalidDecoderSink extends convert._Latin1DecoderSink {
  addSlice(source, start, end, isLast) {
    core.RangeError.checkValidRange(start, end, source[$length]);
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = source[$_get](i);
      if (dart.notNull(char) > 255 || dart.notNull(char) < 0) {
        if (dart.notNull(i) > dart.notNull(start)) this[_addSliceToSink](source, start, i, false);
        this[_addSliceToSink](const$48 || (const$48 = dart.constList([65533], core.int)), 0, 1, false);
        start = dart.notNull(i) + 1;
      }
    }
    if (dart.notNull(start) < dart.notNull(end)) {
      this[_addSliceToSink](source, start, end, isLast);
    }
    if (dart.test(isLast)) {
      this.close();
    }
  }
};
(convert._Latin1AllowInvalidDecoderSink.new = function(sink) {
  convert._Latin1AllowInvalidDecoderSink.__proto__.new.call(this, sink);
}).prototype = convert._Latin1AllowInvalidDecoderSink.prototype;
dart.addTypeTests(convert._Latin1AllowInvalidDecoderSink);
dart.setLibraryUri(convert._Latin1AllowInvalidDecoderSink, "dart:convert");
dart.defineLazy(convert, {
  /*convert._LF*/get _LF() {
    return 10;
  },
  /*convert._CR*/get _CR() {
    return 13;
  }
});
convert.LineSplitter = class LineSplitter extends async.StreamTransformerBase$(core.String, core.String) {
  static split(lines, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    return new (SyncIterableOfString()).new(() => (function* split(end) {
      end = core.RangeError.checkValidRange(start, end, lines.length);
      let sliceStart = start;
      let char = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let previousChar = char;
        char = lines[$codeUnitAt](i);
        if (char !== 13) {
          if (char !== 10) continue;
          if (previousChar === 13) {
            sliceStart = dart.notNull(i) + 1;
            continue;
          }
        }
        yield lines[$substring](sliceStart, i);
        sliceStart = dart.notNull(i) + 1;
      }
      if (dart.notNull(sliceStart) < dart.notNull(end)) {
        yield lines[$substring](sliceStart, end);
      }
    })(end));
  }
  convert(data) {
    let lines = JSArrayOfString().of([]);
    let end = data.length;
    let sliceStart = 0;
    let char = 0;
    for (let i = 0; i < end; i++) {
      let previousChar = char;
      char = data[$codeUnitAt](i);
      if (char !== 13) {
        if (char !== 10) continue;
        if (previousChar === 13) {
          sliceStart = i + 1;
          continue;
        }
      }
      lines[$add](data[$substring](sliceStart, i));
      sliceStart = i + 1;
    }
    if (sliceStart < end) {
      lines[$add](data[$substring](sliceStart, end));
    }
    return lines;
  }
  startChunkedConversion(sink) {
    return new convert._LineSplitterSink.new(convert.StringConversionSink.is(sink) ? sink : convert.StringConversionSink.from(sink));
  }
  bind(stream) {
    StreamOfString()._check(stream);
    return StreamOfString().eventTransformed(stream, dart.fn(sink => new convert._LineSplitterEventSink.new(sink), EventSinkOfStringTo_LineSplitterEventSink()));
  }
};
(convert.LineSplitter.new = function() {
  convert.LineSplitter.__proto__.new.call(this);
}).prototype = convert.LineSplitter.prototype;
dart.addTypeTests(convert.LineSplitter);
dart.setMethodSignature(convert.LineSplitter, () => ({
  __proto__: dart.getMethods(convert.LineSplitter.__proto__),
  convert: dart.fnType(core.List$(core.String), [core.String]),
  startChunkedConversion: dart.fnType(convert.StringConversionSink, [core.Sink$(core.String)]),
  bind: dart.fnType(async.Stream$(core.String), [core.Object])
}));
dart.setLibraryUri(convert.LineSplitter, "dart:convert");
const _carry = dart.privateName(convert, "_carry");
const _skipLeadingLF = dart.privateName(convert, "_skipLeadingLF");
const _addLines = dart.privateName(convert, "_addLines");
convert._LineSplitterSink = class _LineSplitterSink extends convert.StringConversionSinkBase {
  addSlice(chunk, start, end, isLast) {
    end = core.RangeError.checkValidRange(start, end, chunk.length);
    if (dart.notNull(start) >= dart.notNull(end)) {
      if (dart.test(isLast)) this.close();
      return;
    }
    if (this[_carry] != null) {
      if (!!dart.test(this[_skipLeadingLF])) dart.assertFailed(null, "dart:convert/line_splitter.dart", 114, 14, "!_skipLeadingLF");
      chunk = dart.notNull(this[_carry]) + chunk[$substring](start, end);
      start = 0;
      end = chunk.length;
      this[_carry] = null;
    } else if (dart.test(this[_skipLeadingLF])) {
      if (chunk[$codeUnitAt](start) === 10) {
        start = dart.notNull(start) + 1;
      }
      this[_skipLeadingLF] = false;
    }
    this[_addLines](chunk, start, end);
    if (dart.test(isLast)) this.close();
  }
  close() {
    if (this[_carry] != null) {
      this[_sink$].add(this[_carry]);
      this[_carry] = null;
    }
    this[_sink$].close();
  }
  [_addLines](lines, start, end) {
    let sliceStart = start;
    let char = 0;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let previousChar = char;
      char = lines[$codeUnitAt](i);
      if (char !== 13) {
        if (char !== 10) continue;
        if (previousChar === 13) {
          sliceStart = dart.notNull(i) + 1;
          continue;
        }
      }
      this[_sink$].add(lines[$substring](sliceStart, i));
      sliceStart = dart.notNull(i) + 1;
    }
    if (dart.notNull(sliceStart) < dart.notNull(end)) {
      this[_carry] = lines[$substring](sliceStart, end);
    } else {
      this[_skipLeadingLF] = char === 13;
    }
  }
};
(convert._LineSplitterSink.new = function(sink) {
  this[_carry] = null;
  this[_skipLeadingLF] = false;
  this[_sink$] = sink;
}).prototype = convert._LineSplitterSink.prototype;
dart.addTypeTests(convert._LineSplitterSink);
dart.setMethodSignature(convert._LineSplitterSink, () => ({
  __proto__: dart.getMethods(convert._LineSplitterSink.__proto__),
  addSlice: dart.fnType(dart.void, [core.String, core.int, core.int, core.bool]),
  close: dart.fnType(dart.void, []),
  [_addLines]: dart.fnType(dart.void, [core.String, core.int, core.int])
}));
dart.setLibraryUri(convert._LineSplitterSink, "dart:convert");
dart.setFieldSignature(convert._LineSplitterSink, () => ({
  __proto__: dart.getFields(convert._LineSplitterSink.__proto__),
  [_sink$]: dart.finalFieldType(convert.StringConversionSink),
  [_carry]: dart.fieldType(core.String),
  [_skipLeadingLF]: dart.fieldType(core.bool)
}));
convert._LineSplitterEventSink = class _LineSplitterEventSink extends convert._LineSplitterSink {
  addError(o, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_eventSink].addError(o, stackTrace);
  }
};
(convert._LineSplitterEventSink.new = function(eventSink) {
  this[_eventSink] = eventSink;
  convert._LineSplitterEventSink.__proto__.new.call(this, convert.StringConversionSink.from(eventSink));
}).prototype = convert._LineSplitterEventSink.prototype;
dart.addTypeTests(convert._LineSplitterEventSink);
convert._LineSplitterEventSink[dart.implements] = () => [EventSinkOfString()];
dart.setMethodSignature(convert._LineSplitterEventSink, () => ({
  __proto__: dart.getMethods(convert._LineSplitterEventSink.__proto__),
  addError: dart.fnType(dart.void, [core.Object], [core.StackTrace])
}));
dart.setLibraryUri(convert._LineSplitterEventSink, "dart:convert");
dart.setFieldSignature(convert._LineSplitterEventSink, () => ({
  __proto__: dart.getFields(convert._LineSplitterEventSink.__proto__),
  [_eventSink]: dart.finalFieldType(EventSinkOfString())
}));
convert.StringConversionSink = class StringConversionSink extends convert.ChunkedConversionSink$(core.String) {
  static withCallback(callback) {
    return new convert._StringCallbackSink.new(callback);
  }
  static from(sink) {
    return new convert._StringAdapterSink.new(sink);
  }
  static fromStringSink(sink) {
    return new (_StringSinkConversionSinkOfStringSink()).new(sink);
  }
};
(convert.StringConversionSink.new = function() {
  convert.StringConversionSink.__proto__.new.call(this);
}).prototype = convert.StringConversionSink.prototype;
dart.addTypeTests(convert.StringConversionSink);
dart.setLibraryUri(convert.StringConversionSink, "dart:convert");
convert.ClosableStringSink = class ClosableStringSink extends core.StringSink {
  static fromStringSink(sink, onClose) {
    return new convert._ClosableStringSink.new(sink, onClose);
  }
};
dart.addTypeTests(convert.ClosableStringSink);
dart.setLibraryUri(convert.ClosableStringSink, "dart:convert");
convert._ClosableStringSink = class _ClosableStringSink extends core.Object {
  close() {
    this[_callback]();
  }
  writeCharCode(charCode) {
    this[_sink$].writeCharCode(charCode);
  }
  write(o) {
    this[_sink$].write(o);
  }
  writeln(o) {
    if (o === void 0) o = "";
    this[_sink$].writeln(o);
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    this[_sink$].writeAll(objects, separator);
  }
};
(convert._ClosableStringSink.new = function(sink, callback) {
  this[_sink$] = sink;
  this[_callback] = callback;
}).prototype = convert._ClosableStringSink.prototype;
dart.addTypeTests(convert._ClosableStringSink);
convert._ClosableStringSink[dart.implements] = () => [convert.ClosableStringSink];
dart.setMethodSignature(convert._ClosableStringSink, () => ({
  __proto__: dart.getMethods(convert._ClosableStringSink.__proto__),
  close: dart.fnType(dart.void, []),
  writeCharCode: dart.fnType(dart.void, [core.int]),
  write: dart.fnType(dart.void, [core.Object]),
  writeln: dart.fnType(dart.void, [], [core.Object]),
  writeAll: dart.fnType(dart.void, [core.Iterable], [core.String])
}));
dart.setLibraryUri(convert._ClosableStringSink, "dart:convert");
dart.setFieldSignature(convert._ClosableStringSink, () => ({
  __proto__: dart.getFields(convert._ClosableStringSink.__proto__),
  [_callback]: dart.finalFieldType(VoidTovoid()),
  [_sink$]: dart.finalFieldType(core.StringSink)
}));
const _flush = dart.privateName(convert, "_flush");
convert._StringConversionSinkAsStringSinkAdapter = class _StringConversionSinkAsStringSinkAdapter extends core.Object {
  close() {
    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
    this[_chunkedSink].close();
  }
  writeCharCode(charCode) {
    this[_buffer].writeCharCode(charCode);
    if (dart.notNull(this[_buffer].length) > 16) this[_flush]();
  }
  write(o) {
    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
    this[_chunkedSink].add(dart.toString(o));
  }
  writeln(o) {
    if (o === void 0) o = "";
    this[_buffer].writeln(o);
    if (dart.notNull(this[_buffer].length) > 16) this[_flush]();
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
    let iterator = objects[$iterator];
    if (!dart.test(iterator.moveNext())) return;
    if (separator[$isEmpty]) {
      do {
        this[_chunkedSink].add(dart.toString(iterator.current));
      } while (dart.test(iterator.moveNext()));
    } else {
      this[_chunkedSink].add(dart.toString(iterator.current));
      while (dart.test(iterator.moveNext())) {
        this.write(separator);
        this[_chunkedSink].add(dart.toString(iterator.current));
      }
    }
  }
  [_flush]() {
    let accumulated = dart.toString(this[_buffer]);
    this[_buffer].clear();
    this[_chunkedSink].add(accumulated);
  }
};
(convert._StringConversionSinkAsStringSinkAdapter.new = function(chunkedSink) {
  this[_chunkedSink] = chunkedSink;
  this[_buffer] = new core.StringBuffer.new();
}).prototype = convert._StringConversionSinkAsStringSinkAdapter.prototype;
dart.addTypeTests(convert._StringConversionSinkAsStringSinkAdapter);
convert._StringConversionSinkAsStringSinkAdapter[dart.implements] = () => [convert.ClosableStringSink];
dart.setMethodSignature(convert._StringConversionSinkAsStringSinkAdapter, () => ({
  __proto__: dart.getMethods(convert._StringConversionSinkAsStringSinkAdapter.__proto__),
  close: dart.fnType(dart.void, []),
  writeCharCode: dart.fnType(dart.void, [core.int]),
  write: dart.fnType(dart.void, [core.Object]),
  writeln: dart.fnType(dart.void, [], [core.Object]),
  writeAll: dart.fnType(dart.void, [core.Iterable], [core.String]),
  [_flush]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._StringConversionSinkAsStringSinkAdapter, "dart:convert");
dart.setFieldSignature(convert._StringConversionSinkAsStringSinkAdapter, () => ({
  __proto__: dart.getFields(convert._StringConversionSinkAsStringSinkAdapter.__proto__),
  [_buffer]: dart.fieldType(core.StringBuffer),
  [_chunkedSink]: dart.fieldType(convert.StringConversionSink)
}));
dart.defineLazy(convert._StringConversionSinkAsStringSinkAdapter, {
  /*convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE*/get _MIN_STRING_SIZE() {
    return 16;
  }
});
const _contents = dart.privateName(core, "_contents");
const _writeString = dart.privateName(core, "_writeString");
core.StringBuffer = class StringBuffer extends core.Object {
  get length() {
    return this[_contents].length;
  }
  get isEmpty() {
    return this.length === 0;
  }
  get isNotEmpty() {
    return !dart.test(this.isEmpty);
  }
  write(obj) {
    this[_writeString](dart.str(obj));
  }
  writeCharCode(charCode) {
    this[_writeString](core.String.fromCharCode(charCode));
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    this[_contents] = core.StringBuffer._writeAll(this[_contents], objects, separator);
  }
  writeln(obj) {
    if (obj === void 0) obj = "";
    this[_writeString](dart.str(obj) + "\n");
  }
  clear() {
    this[_contents] = "";
  }
  toString() {
    return _js_helper.Primitives.flattenString(this[_contents]);
  }
  [_writeString](str) {
    this[_contents] = _js_helper.Primitives.stringConcatUnchecked(this[_contents], core.String._check(str));
  }
  static _writeAll(string, objects, separator) {
    let iterator = objects[$iterator];
    if (!dart.test(iterator.moveNext())) return string;
    if (separator[$isEmpty]) {
      do {
        string = core.StringBuffer._writeOne(string, iterator.current);
      } while (dart.test(iterator.moveNext()));
    } else {
      string = core.StringBuffer._writeOne(string, iterator.current);
      while (dart.test(iterator.moveNext())) {
        string = core.StringBuffer._writeOne(string, separator);
        string = core.StringBuffer._writeOne(string, iterator.current);
      }
    }
    return string;
  }
  static _writeOne(string, obj) {
    return _js_helper.Primitives.stringConcatUnchecked(string, dart.str(obj));
  }
};
(core.StringBuffer.new = function(content) {
  if (content === void 0) content = "";
  this[_contents] = dart.str(content);
}).prototype = core.StringBuffer.prototype;
dart.addTypeTests(core.StringBuffer);
core.StringBuffer[dart.implements] = () => [core.StringSink];
dart.setMethodSignature(core.StringBuffer, () => ({
  __proto__: dart.getMethods(core.StringBuffer.__proto__),
  write: dart.fnType(dart.void, [core.Object]),
  writeCharCode: dart.fnType(dart.void, [core.int]),
  writeAll: dart.fnType(dart.void, [core.Iterable], [core.String]),
  writeln: dart.fnType(dart.void, [], [core.Object]),
  clear: dart.fnType(dart.void, []),
  [_writeString]: dart.fnType(dart.void, [dart.dynamic])
}));
dart.setGetterSignature(core.StringBuffer, () => ({
  __proto__: dart.getGetters(core.StringBuffer.__proto__),
  length: core.int,
  isEmpty: core.bool,
  isNotEmpty: core.bool
}));
dart.setLibraryUri(core.StringBuffer, "dart:core");
dart.setFieldSignature(core.StringBuffer, () => ({
  __proto__: dart.getFields(core.StringBuffer.__proto__),
  [_contents]: dart.fieldType(core.String)
}));
dart.defineExtensionMethods(core.StringBuffer, ['toString']);
convert._StringCallbackSink = class _StringCallbackSink extends convert._StringSinkConversionSink$(core.StringBuffer) {
  close() {
    let accumulated = dart.toString(this[_stringSink]);
    this[_stringSink].clear();
    this[_callback](accumulated);
  }
  asUtf8Sink(allowMalformed) {
    return new convert._Utf8StringSinkAdapter.new(this, this[_stringSink], allowMalformed);
  }
};
(convert._StringCallbackSink.new = function(callback) {
  this[_callback] = callback;
  convert._StringCallbackSink.__proto__.new.call(this, new core.StringBuffer.new());
}).prototype = convert._StringCallbackSink.prototype;
dart.addTypeTests(convert._StringCallbackSink);
dart.setMethodSignature(convert._StringCallbackSink, () => ({
  __proto__: dart.getMethods(convert._StringCallbackSink.__proto__),
  close: dart.fnType(dart.void, []),
  asUtf8Sink: dart.fnType(convert.ByteConversionSink, [core.bool])
}));
dart.setLibraryUri(convert._StringCallbackSink, "dart:convert");
dart.setFieldSignature(convert._StringCallbackSink, () => ({
  __proto__: dart.getFields(convert._StringCallbackSink.__proto__),
  [_callback]: dart.finalFieldType(StringTovoid())
}));
convert._StringAdapterSink = class _StringAdapterSink extends convert.StringConversionSinkBase {
  add(str) {
    core.String._check(str);
    this[_sink$].add(str);
  }
  addSlice(str, start, end, isLast) {
    if (start === 0 && end === str.length) {
      this.add(str);
    } else {
      this.add(str[$substring](start, end));
    }
    if (dart.test(isLast)) this.close();
  }
  close() {
    this[_sink$].close();
  }
};
(convert._StringAdapterSink.new = function(sink) {
  this[_sink$] = sink;
}).prototype = convert._StringAdapterSink.prototype;
dart.addTypeTests(convert._StringAdapterSink);
dart.setMethodSignature(convert._StringAdapterSink, () => ({
  __proto__: dart.getMethods(convert._StringAdapterSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  addSlice: dart.fnType(dart.void, [core.String, core.int, core.int, core.bool]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(convert._StringAdapterSink, "dart:convert");
dart.setFieldSignature(convert._StringAdapterSink, () => ({
  __proto__: dart.getFields(convert._StringAdapterSink.__proto__),
  [_sink$]: dart.finalFieldType(SinkOfString())
}));
convert._Utf8StringSinkAdapter = class _Utf8StringSinkAdapter extends convert.ByteConversionSink {
  close() {
    this[_decoder].close();
    if (this[_sink$] != null) this[_sink$].close();
  }
  add(chunk) {
    ListOfint()._check(chunk);
    this.addSlice(chunk, 0, chunk[$length], false);
  }
  addSlice(codeUnits, startIndex, endIndex, isLast) {
    this[_decoder].convert(codeUnits, startIndex, endIndex);
    if (dart.test(isLast)) this.close();
  }
};
(convert._Utf8StringSinkAdapter.new = function(sink, stringSink, allowMalformed) {
  this[_sink$] = sink;
  this[_decoder] = new convert._Utf8Decoder.new(stringSink, allowMalformed);
  convert._Utf8StringSinkAdapter.__proto__.new.call(this);
}).prototype = convert._Utf8StringSinkAdapter.prototype;
dart.addTypeTests(convert._Utf8StringSinkAdapter);
dart.setMethodSignature(convert._Utf8StringSinkAdapter, () => ({
  __proto__: dart.getMethods(convert._Utf8StringSinkAdapter.__proto__),
  close: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [core.Object]),
  addSlice: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._Utf8StringSinkAdapter, "dart:convert");
dart.setFieldSignature(convert._Utf8StringSinkAdapter, () => ({
  __proto__: dart.getFields(convert._Utf8StringSinkAdapter.__proto__),
  [_decoder]: dart.finalFieldType(convert._Utf8Decoder),
  [_sink$]: dart.finalFieldType(core.Sink)
}));
convert._Utf8ConversionSink = class _Utf8ConversionSink extends convert.ByteConversionSink {
  close() {
    this[_decoder].close();
    if (dart.test(this[_buffer].isNotEmpty)) {
      let accumulated = dart.toString(this[_buffer]);
      this[_buffer].clear();
      this[_chunkedSink].addSlice(accumulated, 0, accumulated.length, true);
    } else {
      this[_chunkedSink].close();
    }
  }
  add(chunk) {
    ListOfint()._check(chunk);
    this.addSlice(chunk, 0, chunk[$length], false);
  }
  addSlice(chunk, startIndex, endIndex, isLast) {
    this[_decoder].convert(chunk, startIndex, endIndex);
    if (dart.test(this[_buffer].isNotEmpty)) {
      let accumulated = dart.toString(this[_buffer]);
      this[_chunkedSink].addSlice(accumulated, 0, accumulated.length, isLast);
      this[_buffer].clear();
      return;
    }
    if (dart.test(isLast)) this.close();
  }
};
(convert._Utf8ConversionSink.new = function(sink, allowMalformed) {
  convert._Utf8ConversionSink.__.call(this, sink, new core.StringBuffer.new(), allowMalformed);
}).prototype = convert._Utf8ConversionSink.prototype;
(convert._Utf8ConversionSink.__ = function(chunkedSink, stringBuffer, allowMalformed) {
  this[_chunkedSink] = chunkedSink;
  this[_decoder] = new convert._Utf8Decoder.new(stringBuffer, allowMalformed);
  this[_buffer] = stringBuffer;
  convert._Utf8ConversionSink.__proto__.new.call(this);
}).prototype = convert._Utf8ConversionSink.prototype;
dart.addTypeTests(convert._Utf8ConversionSink);
dart.setMethodSignature(convert._Utf8ConversionSink, () => ({
  __proto__: dart.getMethods(convert._Utf8ConversionSink.__proto__),
  close: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [core.Object]),
  addSlice: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._Utf8ConversionSink, "dart:convert");
dart.setFieldSignature(convert._Utf8ConversionSink, () => ({
  __proto__: dart.getFields(convert._Utf8ConversionSink.__proto__),
  [_decoder]: dart.finalFieldType(convert._Utf8Decoder),
  [_chunkedSink]: dart.finalFieldType(convert.StringConversionSink),
  [_buffer]: dart.finalFieldType(core.StringBuffer)
}));
dart.defineLazy(convert, {
  /*convert.unicodeReplacementCharacterRune*/get unicodeReplacementCharacterRune() {
    return 65533;
  },
  /*convert.unicodeBomCharacterRune*/get unicodeBomCharacterRune() {
    return 65279;
  },
  /*convert.utf8*/get utf8() {
    return dart.const(new convert.Utf8Codec.new());
  }
});
const _allowMalformed = dart.privateName(convert, "_allowMalformed");
let const$49;
convert.Utf8Codec = class Utf8Codec extends convert.Encoding {
  get name() {
    return "utf-8";
  }
  decode(codeUnits, opts) {
    ListOfint()._check(codeUnits);
    let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : null;
    let t = allowMalformed;
    t == null ? allowMalformed = this[_allowMalformed] : t;
    return new convert.Utf8Decoder.new({allowMalformed: allowMalformed}).convert(codeUnits);
  }
  get encoder() {
    return const$49 || (const$49 = dart.const(new convert.Utf8Encoder.new()));
  }
  get decoder() {
    return new convert.Utf8Decoder.new({allowMalformed: this[_allowMalformed]});
  }
};
(convert.Utf8Codec.new = function(opts) {
  let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
  this[_allowMalformed] = allowMalformed;
  convert.Utf8Codec.__proto__.new.call(this);
}).prototype = convert.Utf8Codec.prototype;
dart.addTypeTests(convert.Utf8Codec);
dart.setMethodSignature(convert.Utf8Codec, () => ({
  __proto__: dart.getMethods(convert.Utf8Codec.__proto__),
  decode: dart.fnType(core.String, [core.Object], {allowMalformed: core.bool})
}));
dart.setGetterSignature(convert.Utf8Codec, () => ({
  __proto__: dart.getGetters(convert.Utf8Codec.__proto__),
  name: core.String,
  encoder: convert.Utf8Encoder,
  decoder: convert.Utf8Decoder
}));
dart.setLibraryUri(convert.Utf8Codec, "dart:convert");
dart.setFieldSignature(convert.Utf8Codec, () => ({
  __proto__: dart.getFields(convert.Utf8Codec.__proto__),
  [_allowMalformed]: dart.finalFieldType(core.bool)
}));
const _fillBuffer = dart.privateName(convert, "_fillBuffer");
const _writeSurrogate = dart.privateName(convert, "_writeSurrogate");
convert.Utf8Encoder = class Utf8Encoder extends convert.Converter$(core.String, core.List$(core.int)) {
  convert(string, start, end) {
    core.String._check(string);
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let stringLength = string.length;
    end = core.RangeError.checkValidRange(start, end, stringLength);
    let length = dart.notNull(end) - dart.notNull(start);
    if (length === 0) return typed_data.Uint8List.new(0);
    let encoder = new convert._Utf8Encoder.withBufferSize(length * 3);
    let endPosition = encoder[_fillBuffer](string, start, end);
    if (!(dart.notNull(endPosition) >= dart.notNull(end) - 1)) dart.assertFailed(null, "dart:convert/utf.dart", 87, 12, "endPosition >= end - 1");
    if (endPosition != end) {
      let lastCodeUnit = string[$codeUnitAt](dart.notNull(end) - 1);
      if (!dart.test(convert._isLeadSurrogate(lastCodeUnit))) dart.assertFailed(null, "dart:convert/utf.dart", 93, 14, "_isLeadSurrogate(lastCodeUnit)");
      let wasCombined = encoder[_writeSurrogate](lastCodeUnit, 0);
      if (!!dart.test(wasCombined)) dart.assertFailed(null, "dart:convert/utf.dart", 97, 14, "!wasCombined");
    }
    return encoder[_buffer][$sublist](0, encoder[_bufferIndex]);
  }
  startChunkedConversion(sink) {
    SinkOfListOfint()._check(sink);
    return new convert._Utf8EncoderSink.new(convert.ByteConversionSink.is(sink) ? sink : convert.ByteConversionSink.from(sink));
  }
  bind(stream) {
    StreamOfString()._check(stream);
    return super.bind(stream);
  }
};
(convert.Utf8Encoder.new = function() {
  convert.Utf8Encoder.__proto__.new.call(this);
}).prototype = convert.Utf8Encoder.prototype;
dart.addTypeTests(convert.Utf8Encoder);
dart.setMethodSignature(convert.Utf8Encoder, () => ({
  __proto__: dart.getMethods(convert.Utf8Encoder.__proto__),
  convert: dart.fnType(core.List$(core.int), [core.Object], [core.int, core.int]),
  startChunkedConversion: dart.fnType(convert.StringConversionSink, [core.Object]),
  bind: dart.fnType(async.Stream$(core.List$(core.int)), [core.Object])
}));
dart.setLibraryUri(convert.Utf8Encoder, "dart:convert");
convert._Utf8Encoder = class _Utf8Encoder extends core.Object {
  static _createBuffer(size) {
    return typed_data.Uint8List.new(size);
  }
  [_writeSurrogate](leadingSurrogate, nextCodeUnit) {
    if (dart.test(convert._isTailSurrogate(nextCodeUnit))) {
      let rune = convert._combineSurrogatePair(leadingSurrogate, nextCodeUnit);
      if (!(dart.notNull(rune) > 65535)) dart.assertFailed(null, "dart:convert/utf.dart", 146, 14, "rune > _THREE_BYTE_LIMIT");
      if (!(dart.notNull(rune) <= 1114111)) dart.assertFailed(null, "dart:convert/utf.dart", 147, 14, "rune <= _FOUR_BYTE_LIMIT");
      this[_buffer][$_set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), (240 | rune[$rightShift](18)) >>> 0);
      this[_buffer][$_set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(rune) >> 12 & 63);
      this[_buffer][$_set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(rune) >> 6 & 63);
      this[_buffer][$_set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(rune) & 63);
      return true;
    } else {
      this[_buffer][$_set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), (224 | leadingSurrogate[$rightShift](12)) >>> 0);
      this[_buffer][$_set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(leadingSurrogate) >> 6 & 63);
      this[_buffer][$_set]((() => {
        let x = this[_bufferIndex];
        this[_bufferIndex] = dart.notNull(x) + 1;
        return x;
      })(), 128 | dart.notNull(leadingSurrogate) & 63);
      return false;
    }
  }
  [_fillBuffer](str, start, end) {
    if (start != end && dart.test(convert._isLeadSurrogate(str[$codeUnitAt](dart.notNull(end) - 1)))) {
      end = dart.notNull(end) - 1;
    }
    let stringIndex = null;
    for (stringIndex = start; dart.notNull(stringIndex) < dart.notNull(end); stringIndex = dart.notNull(stringIndex) + 1) {
      let codeUnit = str[$codeUnitAt](stringIndex);
      if (codeUnit <= 127) {
        if (dart.notNull(this[_bufferIndex]) >= dart.notNull(this[_buffer][$length])) break;
        this[_buffer][$_set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), codeUnit);
      } else if (dart.test(convert._isLeadSurrogate(codeUnit))) {
        if (dart.notNull(this[_bufferIndex]) + 3 >= dart.notNull(this[_buffer][$length])) break;
        let nextCodeUnit = str[$codeUnitAt](dart.notNull(stringIndex) + 1);
        let wasCombined = this[_writeSurrogate](codeUnit, nextCodeUnit);
        if (dart.test(wasCombined)) {
          stringIndex = dart.notNull(stringIndex) + 1;
        }
      } else {
        let rune = codeUnit;
        if (rune <= 2047) {
          if (dart.notNull(this[_bufferIndex]) + 1 >= dart.notNull(this[_buffer][$length])) break;
          this[_buffer][$_set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), (192 | rune[$rightShift](6)) >>> 0);
          this[_buffer][$_set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), 128 | rune & 63);
        } else {
          if (!(rune <= 65535)) dart.assertFailed(null, "dart:convert/utf.dart", 200, 18, "rune <= _THREE_BYTE_LIMIT");
          if (dart.notNull(this[_bufferIndex]) + 2 >= dart.notNull(this[_buffer][$length])) break;
          this[_buffer][$_set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), (224 | rune[$rightShift](12)) >>> 0);
          this[_buffer][$_set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), 128 | rune >> 6 & 63);
          this[_buffer][$_set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), 128 | rune & 63);
        }
      }
    }
    return stringIndex;
  }
};
(convert._Utf8Encoder.new = function() {
  convert._Utf8Encoder.withBufferSize.call(this, 1024);
}).prototype = convert._Utf8Encoder.prototype;
(convert._Utf8Encoder.withBufferSize = function(bufferSize) {
  this[_carry] = 0;
  this[_bufferIndex] = 0;
  this[_buffer] = convert._Utf8Encoder._createBuffer(bufferSize);
}).prototype = convert._Utf8Encoder.prototype;
dart.addTypeTests(convert._Utf8Encoder);
dart.setMethodSignature(convert._Utf8Encoder, () => ({
  __proto__: dart.getMethods(convert._Utf8Encoder.__proto__),
  [_writeSurrogate]: dart.fnType(core.bool, [core.int, core.int]),
  [_fillBuffer]: dart.fnType(core.int, [core.String, core.int, core.int])
}));
dart.setLibraryUri(convert._Utf8Encoder, "dart:convert");
dart.setFieldSignature(convert._Utf8Encoder, () => ({
  __proto__: dart.getFields(convert._Utf8Encoder.__proto__),
  [_carry]: dart.fieldType(core.int),
  [_bufferIndex]: dart.fieldType(core.int),
  [_buffer]: dart.finalFieldType(ListOfint())
}));
dart.defineLazy(convert._Utf8Encoder, {
  /*convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE*/get _DEFAULT_BYTE_BUFFER_SIZE() {
    return 1024;
  }
});
const _Utf8Encoder_StringConversionSinkMixin$ = class _Utf8Encoder_StringConversionSinkMixin extends convert._Utf8Encoder {};
(_Utf8Encoder_StringConversionSinkMixin$.new = function() {
  _Utf8Encoder_StringConversionSinkMixin$.__proto__.new.call(this);
}).prototype = _Utf8Encoder_StringConversionSinkMixin$.prototype;
(_Utf8Encoder_StringConversionSinkMixin$.withBufferSize = function(bufferSize) {
  _Utf8Encoder_StringConversionSinkMixin$.__proto__.withBufferSize.call(this, bufferSize);
}).prototype = _Utf8Encoder_StringConversionSinkMixin$.prototype;
dart.applyMixin(_Utf8Encoder_StringConversionSinkMixin$, convert.StringConversionSinkMixin);
convert._Utf8EncoderSink = class _Utf8EncoderSink extends _Utf8Encoder_StringConversionSinkMixin$ {
  close() {
    if (this[_carry] !== 0) {
      this.addSlice("", 0, 0, true);
      return;
    }
    this[_sink$].close();
  }
  addSlice(str, start, end, isLast) {
    this[_bufferIndex] = 0;
    if (start == end && !dart.test(isLast)) {
      return;
    }
    if (this[_carry] !== 0) {
      let nextCodeUnit = 0;
      if (start != end) {
        nextCodeUnit = str[$codeUnitAt](start);
      } else {
        if (!dart.test(isLast)) dart.assertFailed(null, "dart:convert/utf.dart", 240, 16, "isLast");
      }
      let wasCombined = this[_writeSurrogate](this[_carry], nextCodeUnit);
      if (!(!dart.test(wasCombined) || start != end)) dart.assertFailed(null, "dart:convert/utf.dart", 244, 14, "!wasCombined || start != end");
      if (dart.test(wasCombined)) {
        start = dart.notNull(start) + 1;
      }
      this[_carry] = 0;
    }
    do {
      start = this[_fillBuffer](str, start, end);
      let isLastSlice = dart.test(isLast) && start == end;
      if (start === dart.notNull(end) - 1 && dart.test(convert._isLeadSurrogate(str[$codeUnitAt](start)))) {
        if (dart.test(isLast) && dart.notNull(this[_bufferIndex]) < dart.notNull(this[_buffer][$length]) - 3) {
          let hasBeenCombined = this[_writeSurrogate](str[$codeUnitAt](start), 0);
          if (!!dart.test(hasBeenCombined)) dart.assertFailed(null, "dart:convert/utf.dart", 257, 18, "!hasBeenCombined");
        } else {
          this[_carry] = str[$codeUnitAt](start);
        }
        start = dart.notNull(start) + 1;
      }
      this[_sink$].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice);
      this[_bufferIndex] = 0;
    } while (dart.notNull(start) < dart.notNull(end));
    if (dart.test(isLast)) this.close();
  }
};
(convert._Utf8EncoderSink.new = function(sink) {
  this[_sink$] = sink;
  convert._Utf8EncoderSink.__proto__.new.call(this);
}).prototype = convert._Utf8EncoderSink.prototype;
dart.addTypeTests(convert._Utf8EncoderSink);
dart.setMethodSignature(convert._Utf8EncoderSink, () => ({
  __proto__: dart.getMethods(convert._Utf8EncoderSink.__proto__),
  close: dart.fnType(dart.void, []),
  addSlice: dart.fnType(dart.void, [core.String, core.int, core.int, core.bool])
}));
dart.setLibraryUri(convert._Utf8EncoderSink, "dart:convert");
dart.setFieldSignature(convert._Utf8EncoderSink, () => ({
  __proto__: dart.getFields(convert._Utf8EncoderSink.__proto__),
  [_sink$]: dart.finalFieldType(convert.ByteConversionSink)
}));
const _isFirstCharacter = dart.privateName(convert, "_isFirstCharacter");
convert.Utf8Decoder = class Utf8Decoder extends convert.Converter$(core.List$(core.int), core.String) {
  convert(codeUnits, start, end) {
    ListOfint()._check(codeUnits);
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let result = convert.Utf8Decoder._convertIntercepted(this[_allowMalformed], codeUnits, start, end);
    if (result != null) {
      return result;
    }
    let length = codeUnits[$length];
    end = core.RangeError.checkValidRange(start, end, length);
    let oneBytes = convert._scanOneByteCharacters(codeUnits, start, end);
    let buffer = null;
    let isFirstCharacter = true;
    if (dart.notNull(oneBytes) > 0) {
      let firstPart = core.String.fromCharCodes(codeUnits, start, dart.notNull(start) + dart.notNull(oneBytes));
      start = dart.notNull(start) + dart.notNull(oneBytes);
      if (start == end) {
        return firstPart;
      }
      buffer = new core.StringBuffer.new(firstPart);
      isFirstCharacter = false;
    }
    let t = buffer;
    t == null ? buffer = new core.StringBuffer.new() : t;
    let decoder = new convert._Utf8Decoder.new(buffer, this[_allowMalformed]);
    decoder[_isFirstCharacter] = isFirstCharacter;
    decoder.convert(codeUnits, start, end);
    decoder.flush(codeUnits, end);
    return dart.toString(buffer);
  }
  startChunkedConversion(sink) {
    SinkOfString()._check(sink);
    let stringSink = null;
    if (convert.StringConversionSink.is(sink)) {
      stringSink = sink;
    } else {
      stringSink = convert.StringConversionSink.from(sink);
    }
    return stringSink.asUtf8Sink(this[_allowMalformed]);
  }
  bind(stream) {
    StreamOfListOfint()._check(stream);
    return super.bind(stream);
  }
  fuse(T, next) {
    convert.Converter$(core.String, T)._check(next);
    return super.fuse(T, next);
  }
  static _convertIntercepted(allowMalformed, codeUnits, start, end) {
    if (codeUnits instanceof Uint8Array) {
      let casted = codeUnits;
      return convert.Utf8Decoder._convertInterceptedUint8List(allowMalformed, casted, start, end);
    }
  }
  static _convertInterceptedUint8List(allowMalformed, codeUnits, start, end) {
    if (dart.test(allowMalformed)) {
      return null;
    }
    let decoder = convert.Utf8Decoder._decoder;
    if (decoder == null) return null;
    if (0 === start && end == null) {
      return convert.Utf8Decoder._useTextDecoderChecked(decoder, codeUnits);
    }
    let length = codeUnits[$length];
    end = core.RangeError.checkValidRange(start, end, length);
    if (0 === start && end == codeUnits[$length]) {
      return convert.Utf8Decoder._useTextDecoderChecked(decoder, codeUnits);
    }
    return convert.Utf8Decoder._useTextDecoderChecked(decoder, codeUnits.subarray(start, end));
  }
  static _useTextDecoderChecked(decoder, codeUnits) {
    if (dart.test(convert.Utf8Decoder._unsafe(codeUnits))) return null;
    return convert.Utf8Decoder._useTextDecoderUnchecked(decoder, codeUnits);
  }
  static _useTextDecoderUnchecked(decoder, codeUnits) {
    try {
      return decoder.decode(codeUnits);
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    return null;
  }
  static _unsafe(codeUnits) {
    let limit = dart.notNull(codeUnits[$length]) - 2;
    for (let i = 0; i < limit; i++) {
      let unit1 = codeUnits[$_get](i);
      if (unit1 === 237) {
        let unit2 = codeUnits[$_get](i + 1);
        if ((unit2 & 224) === 160) return true;
      }
    }
    return false;
  }
};
(convert.Utf8Decoder.new = function(opts) {
  let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
  this[_allowMalformed] = allowMalformed;
  convert.Utf8Decoder.__proto__.new.call(this);
}).prototype = convert.Utf8Decoder.prototype;
dart.addTypeTests(convert.Utf8Decoder);
dart.setMethodSignature(convert.Utf8Decoder, () => ({
  __proto__: dart.getMethods(convert.Utf8Decoder.__proto__),
  convert: dart.fnType(core.String, [core.Object], [core.int, core.int]),
  startChunkedConversion: dart.fnType(convert.ByteConversionSink, [core.Object]),
  bind: dart.fnType(async.Stream$(core.String), [core.Object]),
  fuse: dart.gFnType(T => [convert.Converter$(core.List$(core.int), T), [core.Object]])
}));
dart.setLibraryUri(convert.Utf8Decoder, "dart:convert");
dart.setFieldSignature(convert.Utf8Decoder, () => ({
  __proto__: dart.getFields(convert.Utf8Decoder.__proto__),
  [_allowMalformed]: dart.finalFieldType(core.bool)
}));
dart.defineLazy(convert.Utf8Decoder, {
  /*convert.Utf8Decoder._decoder*/get _decoder() {
    return dart.fn(() => {
      try {
        return new TextDecoder("utf-8", {fatal: true});
      } catch (e$) {
        let e = dart.getThrown(e$);
      }
      return null;
    }, VoidTodynamic())();
  }
});
dart.defineLazy(convert, {
  /*convert._ONE_BYTE_LIMIT*/get _ONE_BYTE_LIMIT() {
    return 127;
  },
  /*convert._TWO_BYTE_LIMIT*/get _TWO_BYTE_LIMIT() {
    return 2047;
  },
  /*convert._THREE_BYTE_LIMIT*/get _THREE_BYTE_LIMIT() {
    return 65535;
  },
  /*convert._FOUR_BYTE_LIMIT*/get _FOUR_BYTE_LIMIT() {
    return 1114111;
  },
  /*convert._SURROGATE_TAG_MASK*/get _SURROGATE_TAG_MASK() {
    return 64512;
  },
  /*convert._SURROGATE_VALUE_MASK*/get _SURROGATE_VALUE_MASK() {
    return 1023;
  },
  /*convert._LEAD_SURROGATE_MIN*/get _LEAD_SURROGATE_MIN() {
    return 55296;
  },
  /*convert._TAIL_SURROGATE_MIN*/get _TAIL_SURROGATE_MIN() {
    return 56320;
  }
});
convert._isLeadSurrogate = function(codeUnit) {
  return (dart.notNull(codeUnit) & 64512) === 55296;
};
convert._isTailSurrogate = function(codeUnit) {
  return (dart.notNull(codeUnit) & 64512) === 56320;
};
convert._combineSurrogatePair = function(lead, tail) {
  return (65536 + ((dart.notNull(lead) & 1023) << 10) | dart.notNull(tail) & 1023) >>> 0;
};
const _value$ = dart.privateName(convert, "_value");
const _expectedUnits = dart.privateName(convert, "_expectedUnits");
const _extraUnits = dart.privateName(convert, "_extraUnits");
convert._Utf8Decoder = class _Utf8Decoder extends core.Object {
  get hasPartialInput() {
    return dart.notNull(this[_expectedUnits]) > 0;
  }
  close() {
    this.flush();
  }
  flush(source, offset) {
    if (source === void 0) source = null;
    if (offset === void 0) offset = null;
    if (dart.test(this.hasPartialInput)) {
      if (!dart.test(this[_allowMalformed])) {
        dart.throw(new core.FormatException.new("Unfinished UTF-8 octet sequence", source, offset));
      }
      this[_stringSink].writeCharCode(65533);
      this[_value$] = 0;
      this[_expectedUnits] = 0;
      this[_extraUnits] = 0;
    }
  }
  convert(codeUnits, startIndex, endIndex) {
    let value = this[_value$];
    let expectedUnits = this[_expectedUnits];
    let extraUnits = this[_extraUnits];
    this[_value$] = 0;
    this[_expectedUnits] = 0;
    this[_extraUnits] = 0;
    let i = startIndex;
    loop:
      while (true) {
        multibyte:
          if (dart.notNull(expectedUnits) > 0) {
            do {
              if (i == endIndex) {
                break loop;
              }
              let unit = codeUnits[$_get](i);
              if ((dart.notNull(unit) & 192) !== 128) {
                expectedUnits = 0;
                if (!dart.test(this[_allowMalformed])) {
                  dart.throw(new core.FormatException.new("Bad UTF-8 encoding 0x" + unit[$toRadixString](16), codeUnits, i));
                }
                this[_isFirstCharacter] = false;
                this[_stringSink].writeCharCode(65533);
                break multibyte;
              } else {
                value = (dart.notNull(value) << 6 | dart.notNull(unit) & 63) >>> 0;
                expectedUnits = dart.notNull(expectedUnits) - 1;
                i = dart.notNull(i) + 1;
              }
            } while (dart.notNull(expectedUnits) > 0);
            if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[$_get](dart.notNull(extraUnits) - 1))) {
              if (!dart.test(this[_allowMalformed])) {
                dart.throw(new core.FormatException.new("Overlong encoding of 0x" + value[$toRadixString](16), codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
              }
              expectedUnits = extraUnits = 0;
              value = 65533;
            }
            if (dart.notNull(value) > 1114111) {
              if (!dart.test(this[_allowMalformed])) {
                dart.throw(new core.FormatException.new("Character outside valid Unicode range: " + ("0x" + value[$toRadixString](16)), codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
              }
              value = 65533;
            }
            if (!dart.test(this[_isFirstCharacter]) || value !== 65279) {
              this[_stringSink].writeCharCode(value);
            }
            this[_isFirstCharacter] = false;
          }
        while (dart.notNull(i) < dart.notNull(endIndex)) {
          let oneBytes = convert._scanOneByteCharacters(codeUnits, i, endIndex);
          if (dart.notNull(oneBytes) > 0) {
            this[_isFirstCharacter] = false;
            if (!(dart.notNull(i) + dart.notNull(oneBytes) <= dart.notNull(endIndex))) dart.assertFailed(null, "dart:convert/utf.dart", 586, 18, "i + oneBytes <= endIndex");
            this[_stringSink].write(core.String.fromCharCodes(codeUnits, i, dart.notNull(i) + dart.notNull(oneBytes)));
            i = dart.notNull(i) + dart.notNull(oneBytes);
            if (i == endIndex) break;
          }
          let unit = codeUnits[$_get]((() => {
            let x = i;
            i = dart.notNull(x) + 1;
            return x;
          })());
          if (dart.notNull(unit) < 0) {
            if (!dart.test(this[_allowMalformed])) {
              dart.throw(new core.FormatException.new("Negative UTF-8 code unit: -0x" + (-dart.notNull(unit))[$toRadixString](16), codeUnits, dart.notNull(i) - 1));
            }
            this[_stringSink].writeCharCode(65533);
          } else {
            if (!(dart.notNull(unit) > 127)) dart.assertFailed(null, "dart:convert/utf.dart", 608, 18, "unit > _ONE_BYTE_LIMIT");
            if ((dart.notNull(unit) & 224) === 192) {
              value = dart.notNull(unit) & 31;
              expectedUnits = extraUnits = 1;
              continue loop;
            }
            if ((dart.notNull(unit) & 240) === 224) {
              value = dart.notNull(unit) & 15;
              expectedUnits = extraUnits = 2;
              continue loop;
            }
            if ((dart.notNull(unit) & 248) === 240 && dart.notNull(unit) < 245) {
              value = dart.notNull(unit) & 7;
              expectedUnits = extraUnits = 3;
              continue loop;
            }
            if (!dart.test(this[_allowMalformed])) {
              dart.throw(new core.FormatException.new("Bad UTF-8 encoding 0x" + unit[$toRadixString](16), codeUnits, dart.notNull(i) - 1));
            }
            value = 65533;
            expectedUnits = extraUnits = 0;
            this[_isFirstCharacter] = false;
            this[_stringSink].writeCharCode(value);
          }
        }
        break loop;
      }
    if (dart.notNull(expectedUnits) > 0) {
      this[_value$] = value;
      this[_expectedUnits] = expectedUnits;
      this[_extraUnits] = extraUnits;
    }
  }
};
(convert._Utf8Decoder.new = function(stringSink, allowMalformed) {
  this[_isFirstCharacter] = true;
  this[_value$] = 0;
  this[_expectedUnits] = 0;
  this[_extraUnits] = 0;
  this[_stringSink] = stringSink;
  this[_allowMalformed] = allowMalformed;
}).prototype = convert._Utf8Decoder.prototype;
dart.addTypeTests(convert._Utf8Decoder);
dart.setMethodSignature(convert._Utf8Decoder, () => ({
  __proto__: dart.getMethods(convert._Utf8Decoder.__proto__),
  close: dart.fnType(dart.void, []),
  flush: dart.fnType(dart.void, [], [core.List$(core.int), core.int]),
  convert: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int])
}));
dart.setGetterSignature(convert._Utf8Decoder, () => ({
  __proto__: dart.getGetters(convert._Utf8Decoder.__proto__),
  hasPartialInput: core.bool
}));
dart.setLibraryUri(convert._Utf8Decoder, "dart:convert");
dart.setFieldSignature(convert._Utf8Decoder, () => ({
  __proto__: dart.getFields(convert._Utf8Decoder.__proto__),
  [_allowMalformed]: dart.finalFieldType(core.bool),
  [_stringSink]: dart.finalFieldType(core.StringSink),
  [_isFirstCharacter]: dart.fieldType(core.bool),
  [_value$]: dart.fieldType(core.int),
  [_expectedUnits]: dart.fieldType(core.int),
  [_extraUnits]: dart.fieldType(core.int)
}));
dart.defineLazy(convert._Utf8Decoder, {
  /*convert._Utf8Decoder._LIMITS*/get _LIMITS() {
    return dart.constList([127, 2047, 65535, 1114111], core.int);
  }
});
convert._scanOneByteCharacters = function(units, from, endIndex) {
  let to = endIndex;
  for (let i = from; dart.notNull(i) < dart.notNull(to); i = dart.notNull(i) + 1) {
    let unit = units[$_get](i);
    if ((dart.notNull(unit) & 127) !== unit) return dart.notNull(i) - dart.notNull(from);
  }
  return dart.notNull(to) - dart.notNull(from);
};
core._symbolToString = function(symbol) {
  return _js_helper.PrivateSymbol.is(symbol) ? _js_helper.PrivateSymbol.getName(symbol) : _internal.Symbol.getName(_internal.Symbol._check(symbol));
};
core._kNull = function(_) {
  return null;
};
const _errorMsg = dart.privateName(core, "_errorMsg");
core._CompileTimeError = class _CompileTimeError extends core.Error {
  toString() {
    return this[_errorMsg];
  }
};
(core._CompileTimeError.new = function(errorMsg) {
  this[_errorMsg] = errorMsg;
  core._CompileTimeError.__proto__.new.call(this);
}).prototype = core._CompileTimeError.prototype;
dart.addTypeTests(core._CompileTimeError);
dart.setLibraryUri(core._CompileTimeError, "dart:core");
dart.setFieldSignature(core._CompileTimeError, () => ({
  __proto__: dart.getFields(core._CompileTimeError.__proto__),
  [_errorMsg]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core._CompileTimeError, ['toString']);
const _name$2 = dart.privateName(core, "_name");
core._DuplicatedFieldInitializerError = class _DuplicatedFieldInitializerError extends core.Object {
  toString() {
    return "Error: field '" + dart.str(this[_name$2]) + "' is already initialized.";
  }
};
(core._DuplicatedFieldInitializerError.new = function(name) {
  this[_name$2] = name;
}).prototype = core._DuplicatedFieldInitializerError.prototype;
dart.addTypeTests(core._DuplicatedFieldInitializerError);
dart.setLibraryUri(core._DuplicatedFieldInitializerError, "dart:core");
dart.setFieldSignature(core._DuplicatedFieldInitializerError, () => ({
  __proto__: dart.getFields(core._DuplicatedFieldInitializerError.__proto__),
  [_name$2]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core._DuplicatedFieldInitializerError, ['toString']);
core._max = function(a, b) {
  return dart.notNull(a) > dart.notNull(b) ? a : b;
};
core._min = function(a, b) {
  return dart.notNull(a) < dart.notNull(b) ? a : b;
};
const _used = dart.privateName(core, "_used");
const _digits = dart.privateName(core, "_digits");
const _isNegative = dart.privateName(core, "_isNegative");
const _isZero = dart.privateName(core, "_isZero");
const _dlShift = dart.privateName(core, "_dlShift");
const _drShift = dart.privateName(core, "_drShift");
const _absCompare = dart.privateName(core, "_absCompare");
const _absAddSetSign = dart.privateName(core, "_absAddSetSign");
const _absSubSetSign = dart.privateName(core, "_absSubSetSign");
const _absAndSetSign = dart.privateName(core, "_absAndSetSign");
const _absAndNotSetSign = dart.privateName(core, "_absAndNotSetSign");
const _absOrSetSign = dart.privateName(core, "_absOrSetSign");
const _absXorSetSign = dart.privateName(core, "_absXorSetSign");
const _divRem = dart.privateName(core, "_divRem");
const _div = dart.privateName(core, "_div");
const _rem = dart.privateName(core, "_rem");
let const$50;
let const$51;
let const$52;
const _toRadixCodeUnit = dart.privateName(core, "_toRadixCodeUnit");
const _toHexString = dart.privateName(core, "_toHexString");
core._BigIntImpl = class _BigIntImpl extends core.Object {
  static parse(source, opts) {
    let radix = opts && 'radix' in opts ? opts.radix : null;
    let result = core._BigIntImpl._tryParse(source, {radix: radix});
    if (result == null) {
      dart.throw(new core.FormatException.new("Could not parse BigInt", source));
    }
    return result;
  }
  static _parseDecimal(source, isNegative) {
    let _0 = 48;
    let part = 0;
    let result = core._BigIntImpl.zero;
    let digitInPartCount = dart.asInt(4 - source.length[$remainder](4));
    if (digitInPartCount === 4) digitInPartCount = 0;
    for (let i = 0; i < source.length; i++) {
      part = part * 10 + source[$codeUnitAt](i) - _0;
      if ((digitInPartCount = dart.notNull(digitInPartCount) + 1) === 4) {
        result = result['*'](core._BigIntImpl._bigInt10000)['+'](core._BigIntImpl._fromInt(part));
        part = 0;
        digitInPartCount = 0;
      }
    }
    if (dart.test(isNegative)) return result._negate();
    return result;
  }
  static _codeUnitToRadixValue(codeUnit) {
    let _0 = 48;
    let _9 = 57;
    let _a = 97;
    if (_0 <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= _9) return dart.notNull(codeUnit) - _0;
    codeUnit = (dart.notNull(codeUnit) | 32) >>> 0;
    let result = dart.notNull(codeUnit) - _a + 10;
    return result;
  }
  static _parseHex(source, startPos, isNegative) {
    let hexDigitsPerChunk = (16 / 4)[$truncate]();
    let sourceLength = source.length - dart.notNull(startPos);
    let chunkCount = (sourceLength / hexDigitsPerChunk)[$ceil]();
    let digits = typed_data.Uint16List.new(chunkCount);
    let lastDigitLength = sourceLength - (chunkCount - 1) * hexDigitsPerChunk;
    let digitIndex = dart.notNull(digits[$length]) - 1;
    let i = startPos;
    let chunk = 0;
    for (let j = 0; j < lastDigitLength; j++) {
      let digitValue = core._BigIntImpl._codeUnitToRadixValue(source[$codeUnitAt]((() => {
        let x = i;
        i = dart.notNull(x) + 1;
        return x;
      })()));
      if (dart.notNull(digitValue) >= 16) return null;
      chunk = chunk * 16 + dart.notNull(digitValue);
    }
    digits[$_set](digitIndex--, chunk);
    while (dart.notNull(i) < source.length) {
      chunk = 0;
      for (let j = 0; j < hexDigitsPerChunk; j++) {
        let digitValue = core._BigIntImpl._codeUnitToRadixValue(source[$codeUnitAt]((() => {
          let x = i;
          i = dart.notNull(x) + 1;
          return x;
        })()));
        if (dart.notNull(digitValue) >= 16) return null;
        chunk = chunk * 16 + dart.notNull(digitValue);
      }
      digits[$_set](digitIndex--, chunk);
    }
    if (digits[$length] === 1 && digits[$_get](0) === 0) return core._BigIntImpl.zero;
    return new core._BigIntImpl.__(isNegative, digits[$length], digits);
  }
  static _parseRadix(source, radix, isNegative) {
    let result = core._BigIntImpl.zero;
    let base = core._BigIntImpl._fromInt(radix);
    for (let i = 0; i < source.length; i++) {
      let digitValue = core._BigIntImpl._codeUnitToRadixValue(source[$codeUnitAt](i));
      if (dart.notNull(digitValue) >= dart.notNull(radix)) return null;
      result = result['*'](base)['+'](core._BigIntImpl._fromInt(digitValue));
    }
    if (dart.test(isNegative)) return result._negate();
    return result;
  }
  static _tryParse(source, opts) {
    let radix = opts && 'radix' in opts ? opts.radix : null;
    if (source === "") return null;
    let re = core.RegExp.new("^\\s*([+-]?)((0x[a-f0-9]+)|(\\d+)|([a-z0-9]+))\\s*$", {caseSensitive: false});
    let match = re.firstMatch(source);
    let signIndex = 1;
    let hexIndex = 3;
    let decimalIndex = 4;
    let nonDecimalHexIndex = 5;
    if (match == null) return null;
    let isNegative = match._get(signIndex) === "-";
    let decimalMatch = match._get(decimalIndex);
    let hexMatch = match._get(hexIndex);
    let nonDecimalMatch = match._get(nonDecimalHexIndex);
    if (radix == null) {
      if (decimalMatch != null) {
        return core._BigIntImpl._parseDecimal(decimalMatch, isNegative);
      }
      if (hexMatch != null) {
        return core._BigIntImpl._parseHex(hexMatch, 2, isNegative);
      }
      return null;
    }
    if (!core.int.is(radix)) {
      dart.throw(new core.ArgumentError.value(radix, "radix", "is not an integer"));
    }
    if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
      dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
    }
    if (radix === 10 && decimalMatch != null) {
      return core._BigIntImpl._parseDecimal(decimalMatch, isNegative);
    }
    if (radix === 16 && (decimalMatch != null || nonDecimalMatch != null)) {
      return core._BigIntImpl._parseHex(decimalMatch != null ? decimalMatch : nonDecimalMatch, 0, isNegative);
    }
    return core._BigIntImpl._parseRadix((() => {
      let l = decimalMatch != null ? decimalMatch : nonDecimalMatch;
      return l != null ? l : hexMatch;
    })(), radix, isNegative);
  }
  static _normalize(used, digits) {
    while (dart.notNull(used) > 0 && digits[$_get](dart.notNull(used) - 1) === 0) {
      used = dart.notNull(used) - 1;
    }
    return used;
  }
  get [_isZero]() {
    return this[_used] === 0;
  }
  static _cloneDigits(digits, from, to, length) {
    let resultDigits = typed_data.Uint16List.new(length);
    let n = dart.notNull(to) - dart.notNull(from);
    for (let i = 0; i < n; i++) {
      resultDigits[$_set](i, digits[$_get](dart.notNull(from) + i));
    }
    return resultDigits;
  }
  static from(value) {
    if (value === 0) return core._BigIntImpl.zero;
    if (value === 1) return core._BigIntImpl.one;
    if (value === 2) return core._BigIntImpl.two;
    if (value[$abs]() < 4294967296) return core._BigIntImpl._fromInt(value[$toInt]());
    if (typeof value == 'number') return core._BigIntImpl._fromDouble(value);
    return core._BigIntImpl._fromInt(dart.asInt(value));
  }
  static _fromInt(value) {
    let isNegative = dart.notNull(value) < 0;
    if (!(16 === 16)) dart.assertFailed(null, "dart:core", 524, 12, "_digitBits == 16");
    if (isNegative) {
      let minInt64 = -2147483648 * 4294967296;
      if (value === minInt64) {
        let digits = typed_data.Uint16List.new(4);
        digits[$_set](3, 32768);
        return new core._BigIntImpl.__(true, 4, digits);
      }
      value = -dart.notNull(value);
    }
    if (dart.notNull(value) < 65536) {
      let digits = typed_data.Uint16List.new(1);
      digits[$_set](0, value);
      return new core._BigIntImpl.__(isNegative, 1, digits);
    }
    if (dart.notNull(value) <= 4294967295) {
      let digits = typed_data.Uint16List.new(2);
      digits[$_set](0, dart.notNull(value) & 65535);
      digits[$_set](1, value[$rightShift](16));
      return new core._BigIntImpl.__(isNegative, 2, digits);
    }
    let bits = value[$bitLength];
    let digits = typed_data.Uint16List.new(((bits - 1) / 16)[$truncate]() + 1);
    let i = 0;
    while (value !== 0) {
      digits[$_set](i++, dart.notNull(value) & 65535);
      value = (dart.notNull(value) / 65536)[$truncate]();
    }
    return new core._BigIntImpl.__(isNegative, digits[$length], digits);
  }
  static _fromDouble(value) {
    let exponentBias = 1075;
    if (value[$isNaN] || value[$isInfinite]) {
      dart.throw(new core.ArgumentError.new("Value must be finite: " + dart.str(value)));
    }
    let isNegative = dart.notNull(value) < 0;
    if (isNegative) value = -dart.notNull(value);
    value = value[$floorToDouble]();
    if (value === 0) return core._BigIntImpl.zero;
    let bits = core._BigIntImpl._bitsForFromDouble;
    for (let i = 0; i < 8; i++) {
      bits[$_set](i, 0);
    }
    bits[$buffer][$asByteData]()[$setFloat64](0, value, typed_data.Endian.little);
    let biasedExponent = (dart.notNull(bits[$_get](7)) << 4 >>> 0) + bits[$_get](6)[$rightShift](4);
    let exponent = biasedExponent - exponentBias;
    if (!(16 === 16)) dart.assertFailed(null, "dart:core", 583, 12, "_digitBits == 16");
    let unshiftedDigits = typed_data.Uint16List.new(4);
    unshiftedDigits[$_set](0, (dart.notNull(bits[$_get](1)) << 8 >>> 0) + dart.notNull(bits[$_get](0)));
    unshiftedDigits[$_set](1, (dart.notNull(bits[$_get](3)) << 8 >>> 0) + dart.notNull(bits[$_get](2)));
    unshiftedDigits[$_set](2, (dart.notNull(bits[$_get](5)) << 8 >>> 0) + dart.notNull(bits[$_get](4)));
    unshiftedDigits[$_set](3, 16 | dart.notNull(bits[$_get](6)) & 15);
    let unshiftedBig = new core._BigIntImpl._normalized(false, 4, unshiftedDigits);
    let absResult = unshiftedBig;
    if (exponent < 0) {
      absResult = unshiftedBig['>>'](-exponent);
    } else if (exponent > 0) {
      absResult = unshiftedBig['<<'](exponent);
    }
    if (isNegative) return absResult._negate();
    return absResult;
  }
  _negate() {
    if (this[_used] === 0) return this;
    return new core._BigIntImpl.__(!dart.test(this[_isNegative]), this[_used], this[_digits]);
  }
  abs() {
    return dart.test(this[_isNegative]) ? this._negate() : this;
  }
  [_dlShift](n) {
    let used = this[_used];
    if (used === 0) {
      return core._BigIntImpl.zero;
    }
    let resultUsed = dart.notNull(used) + dart.notNull(n);
    let digits = this[_digits];
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    for (let i = dart.notNull(used) - 1; i >= 0; i--) {
      resultDigits[$_set](i + dart.notNull(n), digits[$_get](i));
    }
    return new core._BigIntImpl.__(this[_isNegative], resultUsed, resultDigits);
  }
  static _dlShiftDigits(xDigits, xUsed, n, resultDigits) {
    if (xUsed === 0) {
      return 0;
    }
    if (n === 0 && resultDigits == xDigits) {
      return xUsed;
    }
    let resultUsed = dart.notNull(xUsed) + dart.notNull(n);
    for (let i = dart.notNull(xUsed) - 1; i >= 0; i--) {
      resultDigits[$_set](i + dart.notNull(n), xDigits[$_get](i));
    }
    for (let i = dart.notNull(n) - 1; i >= 0; i--) {
      resultDigits[$_set](i, 0);
    }
    return resultUsed;
  }
  [_drShift](n) {
    let used = this[_used];
    if (used === 0) {
      return core._BigIntImpl.zero;
    }
    let resultUsed = dart.notNull(used) - dart.notNull(n);
    if (resultUsed <= 0) {
      return dart.test(this[_isNegative]) ? core._BigIntImpl._minusOne : core._BigIntImpl.zero;
    }
    let digits = this[_digits];
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    for (let i = n; dart.notNull(i) < dart.notNull(used); i = dart.notNull(i) + 1) {
      resultDigits[$_set](dart.notNull(i) - dart.notNull(n), digits[$_get](i));
    }
    let result = new core._BigIntImpl.__(this[_isNegative], resultUsed, resultDigits);
    if (dart.test(this[_isNegative])) {
      for (let i = 0; i < dart.notNull(n); i++) {
        if (digits[$_get](i) !== 0) {
          return result['-'](core._BigIntImpl.one);
        }
      }
    }
    return result;
  }
  static _lsh(xDigits, xUsed, n, resultDigits) {
    if (!(dart.notNull(xUsed) > 0)) dart.assertFailed(null, "dart:core", 694, 12, "xUsed > 0");
    let digitShift = (dart.notNull(n) / 16)[$truncate]();
    let bitShift = n[$modulo](16);
    let carryBitShift = 16 - bitShift;
    let bitMask = (1)[$leftShift](carryBitShift) - 1;
    let carry = 0;
    for (let i = dart.notNull(xUsed) - 1; i >= 0; i--) {
      let digit = xDigits[$_get](i);
      resultDigits[$_set](i + digitShift + 1, (digit[$rightShift](carryBitShift) | carry) >>> 0);
      carry = ((dart.notNull(digit) & bitMask) >>> 0)[$leftShift](bitShift);
    }
    resultDigits[$_set](digitShift, carry);
  }
  ['<<'](shiftAmount) {
    if (dart.notNull(shiftAmount) < 0) {
      dart.throw(new core.ArgumentError.new("shift-amount must be posititve " + dart.str(shiftAmount)));
    }
    if (dart.test(this[_isZero])) return this;
    let digitShift = (dart.notNull(shiftAmount) / 16)[$truncate]();
    let bitShift = shiftAmount[$modulo](16);
    if (bitShift === 0) {
      return this[_dlShift](digitShift);
    }
    let resultUsed = dart.notNull(this[_used]) + digitShift + 1;
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    core._BigIntImpl._lsh(this[_digits], this[_used], shiftAmount, resultDigits);
    return new core._BigIntImpl.__(this[_isNegative], resultUsed, resultDigits);
  }
  static _lShiftDigits(xDigits, xUsed, n, resultDigits) {
    let digitsShift = (dart.notNull(n) / 16)[$truncate]();
    let bitShift = n[$modulo](16);
    if (bitShift === 0) {
      return core._BigIntImpl._dlShiftDigits(xDigits, xUsed, digitsShift, resultDigits);
    }
    let resultUsed = dart.notNull(xUsed) + digitsShift + 1;
    core._BigIntImpl._lsh(xDigits, xUsed, n, resultDigits);
    let i = digitsShift;
    while (--i >= 0) {
      resultDigits[$_set](i, 0);
    }
    if (resultDigits[$_get](resultUsed - 1) === 0) {
      resultUsed--;
    }
    return resultUsed;
  }
  static _rsh(xDigits, xUsed, n, resultDigits) {
    if (!(dart.notNull(xUsed) > 0)) dart.assertFailed(null, "dart:core", 760, 12, "xUsed > 0");
    let digitsShift = (dart.notNull(n) / 16)[$truncate]();
    let bitShift = n[$modulo](16);
    let carryBitShift = 16 - bitShift;
    let bitMask = (1)[$leftShift](bitShift) - 1;
    let carry = xDigits[$_get](digitsShift)[$rightShift](bitShift);
    let last = dart.notNull(xUsed) - digitsShift - 1;
    for (let i = 0; i < last; i++) {
      let digit = xDigits[$_get](i + digitsShift + 1);
      resultDigits[$_set](i, (((dart.notNull(digit) & bitMask) >>> 0)[$leftShift](carryBitShift) | carry) >>> 0);
      carry = digit[$rightShift](bitShift);
    }
    resultDigits[$_set](last, carry);
  }
  ['>>'](shiftAmount) {
    if (dart.notNull(shiftAmount) < 0) {
      dart.throw(new core.ArgumentError.new("shift-amount must be posititve " + dart.str(shiftAmount)));
    }
    if (dart.test(this[_isZero])) return this;
    let digitShift = (dart.notNull(shiftAmount) / 16)[$truncate]();
    let bitShift = shiftAmount[$modulo](16);
    if (bitShift === 0) {
      return this[_drShift](digitShift);
    }
    let used = this[_used];
    let resultUsed = dart.notNull(used) - digitShift;
    if (resultUsed <= 0) {
      return dart.test(this[_isNegative]) ? core._BigIntImpl._minusOne : core._BigIntImpl.zero;
    }
    let digits = this[_digits];
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    core._BigIntImpl._rsh(digits, used, shiftAmount, resultDigits);
    let result = new core._BigIntImpl.__(this[_isNegative], resultUsed, resultDigits);
    if (dart.test(this[_isNegative])) {
      if ((dart.notNull(digits[$_get](digitShift)) & (1)[$leftShift](bitShift) - 1) !== 0) {
        return result['-'](core._BigIntImpl.one);
      }
      for (let i = 0; i < digitShift; i++) {
        if (digits[$_get](i) !== 0) {
          return result['-'](core._BigIntImpl.one);
        }
      }
    }
    return result;
  }
  [_absCompare](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    return core._BigIntImpl._compareDigits(this[_digits], this[_used], other[_digits], other[_used]);
  }
  compareTo(bigInt) {
    core.BigInt._check(bigInt);
    let other = core._BigIntImpl._check(bigInt);
    if (this[_isNegative] == other[_isNegative]) {
      let result = this[_absCompare](other);
      return dart.test(this[_isNegative]) ? 0 - dart.notNull(result) : result;
    }
    return dart.test(this[_isNegative]) ? -1 : 1;
  }
  static _compareDigits(digits, used, otherDigits, otherUsed) {
    let result = dart.notNull(used) - dart.notNull(otherUsed);
    if (result === 0) {
      for (let i = dart.notNull(used) - 1; i >= 0; i--) {
        result = dart.notNull(digits[$_get](i)) - dart.notNull(otherDigits[$_get](i));
        if (result !== 0) return result;
      }
    }
    return result;
  }
  static _absAdd(digits, used, otherDigits, otherUsed, resultDigits) {
    if (!(dart.notNull(used) >= dart.notNull(otherUsed) && dart.notNull(otherUsed) > 0)) dart.assertFailed(null, "dart:core", 862, 12, "used >= otherUsed && otherUsed > 0");
    let carry = 0;
    for (let i = 0; i < dart.notNull(otherUsed); i++) {
      carry = carry + (dart.notNull(digits[$_get](i)) + dart.notNull(otherDigits[$_get](i)));
      resultDigits[$_set](i, carry & 65535);
      carry = carry[$rightShift](16);
    }
    for (let i = otherUsed; dart.notNull(i) < dart.notNull(used); i = dart.notNull(i) + 1) {
      carry = carry + dart.notNull(digits[$_get](i));
      resultDigits[$_set](i, carry & 65535);
      carry = carry[$rightShift](16);
    }
    resultDigits[$_set](used, carry);
  }
  static _absSub(digits, used, otherDigits, otherUsed, resultDigits) {
    if (!(dart.notNull(used) >= dart.notNull(otherUsed) && dart.notNull(otherUsed) > 0)) dart.assertFailed(null, "dart:core", 881, 12, "used >= otherUsed && otherUsed > 0");
    let carry = 0;
    for (let i = 0; i < dart.notNull(otherUsed); i++) {
      carry = carry + (dart.notNull(digits[$_get](i)) - dart.notNull(otherDigits[$_get](i)));
      resultDigits[$_set](i, carry & 65535);
      carry = 0 - (carry >> 16 & 1);
    }
    for (let i = otherUsed; dart.notNull(i) < dart.notNull(used); i = dart.notNull(i) + 1) {
      carry = carry + dart.notNull(digits[$_get](i));
      resultDigits[$_set](i, carry & 65535);
      carry = 0 - (carry >> 16 & 1);
    }
  }
  [_absAddSetSign](other, isNegative) {
    let used = this[_used];
    let otherUsed = other[_used];
    if (dart.notNull(used) < dart.notNull(otherUsed)) {
      return other[_absAddSetSign](this, isNegative);
    }
    if (used === 0) {
      if (!!dart.test(isNegative)) dart.assertFailed(null, "dart:core", 908, 14, "!isNegative");
      return core._BigIntImpl.zero;
    }
    if (otherUsed === 0) {
      return this[_isNegative] == isNegative ? this : this._negate();
    }
    let resultUsed = dart.notNull(used) + 1;
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    core._BigIntImpl._absAdd(this[_digits], used, other[_digits], otherUsed, resultDigits);
    return new core._BigIntImpl.__(isNegative, resultUsed, resultDigits);
  }
  [_absSubSetSign](other, isNegative) {
    if (!(dart.notNull(this[_absCompare](other)) >= 0)) dart.assertFailed(null, "dart:core", 924, 12, "_absCompare(other) >= 0");
    let used = this[_used];
    if (used === 0) {
      if (!!dart.test(isNegative)) dart.assertFailed(null, "dart:core", 927, 14, "!isNegative");
      return core._BigIntImpl.zero;
    }
    let otherUsed = other[_used];
    if (otherUsed === 0) {
      return this[_isNegative] == isNegative ? this : this._negate();
    }
    let resultDigits = typed_data.Uint16List.new(used);
    core._BigIntImpl._absSub(this[_digits], used, other[_digits], otherUsed, resultDigits);
    return new core._BigIntImpl.__(isNegative, used, resultDigits);
  }
  [_absAndSetSign](other, isNegative) {
    let resultUsed = core._min(this[_used], other[_used]);
    let digits = this[_digits];
    let otherDigits = other[_digits];
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    for (let i = 0; i < dart.notNull(resultUsed); i++) {
      resultDigits[$_set](i, (dart.notNull(digits[$_get](i)) & dart.notNull(otherDigits[$_get](i))) >>> 0);
    }
    return new core._BigIntImpl.__(isNegative, resultUsed, resultDigits);
  }
  [_absAndNotSetSign](other, isNegative) {
    let resultUsed = this[_used];
    let digits = this[_digits];
    let otherDigits = other[_digits];
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    let m = core._min(resultUsed, other[_used]);
    for (let i = 0; i < dart.notNull(m); i++) {
      resultDigits[$_set](i, (dart.notNull(digits[$_get](i)) & dart.notNull(core.int._check(~dart.notNull(otherDigits[$_get](i)) >>> 0))) >>> 0);
    }
    for (let i = m; dart.notNull(i) < dart.notNull(resultUsed); i = dart.notNull(i) + 1) {
      resultDigits[$_set](i, digits[$_get](i));
    }
    return new core._BigIntImpl.__(isNegative, resultUsed, resultDigits);
  }
  [_absOrSetSign](other, isNegative) {
    let used = this[_used];
    let otherUsed = other[_used];
    let resultUsed = core._max(used, otherUsed);
    let digits = this[_digits];
    let otherDigits = other[_digits];
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    let l = null, m = null;
    if (dart.notNull(used) < dart.notNull(otherUsed)) {
      l = other;
      m = used;
    } else {
      l = this;
      m = otherUsed;
    }
    for (let i = 0; i < dart.notNull(core.num._check(m)); i++) {
      resultDigits[$_set](i, (dart.notNull(digits[$_get](i)) | dart.notNull(otherDigits[$_get](i))) >>> 0);
    }
    let lDigits = dart.dload(l, _digits);
    for (let i = m; dart.dtest(dart.dsend(i, '<', [resultUsed])); i = dart.dsend(i, '+', [1])) {
      resultDigits[$_set](core.int._check(i), core.int._check(dart.dindex(lDigits, i)));
    }
    return new core._BigIntImpl.__(isNegative, resultUsed, resultDigits);
  }
  [_absXorSetSign](other, isNegative) {
    let used = this[_used];
    let otherUsed = other[_used];
    let resultUsed = core._max(used, otherUsed);
    let digits = this[_digits];
    let otherDigits = other[_digits];
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    let l = null, m = null;
    if (dart.notNull(used) < dart.notNull(otherUsed)) {
      l = other;
      m = used;
    } else {
      l = this;
      m = otherUsed;
    }
    for (let i = 0; i < dart.notNull(core.num._check(m)); i++) {
      resultDigits[$_set](i, (dart.notNull(digits[$_get](i)) ^ dart.notNull(otherDigits[$_get](i))) >>> 0);
    }
    let lDigits = dart.dload(l, _digits);
    for (let i = m; dart.dtest(dart.dsend(i, '<', [resultUsed])); i = dart.dsend(i, '+', [1])) {
      resultDigits[$_set](core.int._check(i), core.int._check(dart.dindex(lDigits, i)));
    }
    return new core._BigIntImpl.__(isNegative, resultUsed, resultDigits);
  }
  ['&'](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (dart.test(this[_isZero]) || dart.test(other[_isZero])) return core._BigIntImpl.zero;
    if (this[_isNegative] == other[_isNegative]) {
      if (dart.test(this[_isNegative])) {
        let this1 = this[_absSubSetSign](core._BigIntImpl.one, true);
        let other1 = other[_absSubSetSign](core._BigIntImpl.one, true);
        return this1[_absOrSetSign](other1, true)[_absAddSetSign](core._BigIntImpl.one, true);
      }
      return this[_absAndSetSign](other, false);
    }
    let p = null, n = null;
    if (dart.test(this[_isNegative])) {
      p = other;
      n = this;
    } else {
      p = this;
      n = other;
    }
    let n1 = dart.dsend(n, _absSubSetSign, [core._BigIntImpl.one, false]);
    return core._BigIntImpl._check(dart.dsend(p, _absAndNotSetSign, [n1, false]));
  }
  ['|'](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (dart.test(this[_isZero])) return other;
    if (dart.test(other[_isZero])) return this;
    if (this[_isNegative] == other[_isNegative]) {
      if (dart.test(this[_isNegative])) {
        let this1 = this[_absSubSetSign](core._BigIntImpl.one, true);
        let other1 = other[_absSubSetSign](core._BigIntImpl.one, true);
        return this1[_absAndSetSign](other1, true)[_absAddSetSign](core._BigIntImpl.one, true);
      }
      return this[_absOrSetSign](other, false);
    }
    let p = null, n = null;
    if (dart.test(this[_isNegative])) {
      p = other;
      n = this;
    } else {
      p = this;
      n = other;
    }
    let n1 = dart.dsend(n, _absSubSetSign, [core._BigIntImpl.one, true]);
    return core._BigIntImpl._check(dart.dsend(dart.dsend(n1, _absAndNotSetSign, [p, true]), _absAddSetSign, [core._BigIntImpl.one, true]));
  }
  ['^'](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (dart.test(this[_isZero])) return other;
    if (dart.test(other[_isZero])) return this;
    if (this[_isNegative] == other[_isNegative]) {
      if (dart.test(this[_isNegative])) {
        let this1 = this[_absSubSetSign](core._BigIntImpl.one, true);
        let other1 = other[_absSubSetSign](core._BigIntImpl.one, true);
        return this1[_absXorSetSign](other1, false);
      }
      return this[_absXorSetSign](other, false);
    }
    let p = null, n = null;
    if (dart.test(this[_isNegative])) {
      p = other;
      n = this;
    } else {
      p = this;
      n = other;
    }
    let n1 = dart.dsend(n, _absSubSetSign, [core._BigIntImpl.one, true]);
    return core._BigIntImpl._check(dart.dsend(dart.dsend(p, _absXorSetSign, [n1, true]), _absAddSetSign, [core._BigIntImpl.one, true]));
  }
  ['~']() {
    if (dart.test(this[_isZero])) return core._BigIntImpl._minusOne;
    if (dart.test(this[_isNegative])) {
      return this[_absSubSetSign](core._BigIntImpl.one, false);
    }
    return this[_absAddSetSign](core._BigIntImpl.one, true);
  }
  ['+'](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (dart.test(this[_isZero])) return other;
    if (dart.test(other[_isZero])) return this;
    let isNegative = this[_isNegative];
    if (isNegative == other[_isNegative]) {
      return this[_absAddSetSign](other, isNegative);
    }
    if (dart.notNull(this[_absCompare](other)) >= 0) {
      return this[_absSubSetSign](other, isNegative);
    }
    return other[_absSubSetSign](this, !dart.test(isNegative));
  }
  ['-'](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (dart.test(this[_isZero])) return other._negate();
    if (dart.test(other[_isZero])) return this;
    let isNegative = this[_isNegative];
    if (isNegative != other[_isNegative]) {
      return this[_absAddSetSign](other, isNegative);
    }
    if (dart.notNull(this[_absCompare](other)) >= 0) {
      return this[_absSubSetSign](other, isNegative);
    }
    return other[_absSubSetSign](this, !dart.test(isNegative));
  }
  static _mulAdd(x, multiplicandDigits, i, accumulatorDigits, j, n) {
    if (x === 0) {
      return;
    }
    let c = 0;
    while ((n = dart.notNull(n) - 1) >= 0) {
      let product = dart.notNull(x) * dart.notNull(multiplicandDigits[$_get]((() => {
        let x = i;
        i = dart.notNull(x) + 1;
        return x;
      })()));
      let combined = product + dart.notNull(accumulatorDigits[$_get](j)) + c;
      accumulatorDigits[$_set]((() => {
        let x = j;
        j = dart.notNull(x) + 1;
        return x;
      })(), combined & 65535);
      c = (combined / 65536)[$truncate]();
    }
    while (c !== 0) {
      let l = dart.notNull(accumulatorDigits[$_get](j)) + c;
      accumulatorDigits[$_set]((() => {
        let x = j;
        j = dart.notNull(x) + 1;
        return x;
      })(), l & 65535);
      c = (l / 65536)[$truncate]();
    }
  }
  ['*'](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    let used = this[_used];
    let otherUsed = other[_used];
    if (used === 0 || otherUsed === 0) {
      return core._BigIntImpl.zero;
    }
    let resultUsed = dart.notNull(used) + dart.notNull(otherUsed);
    let digits = this[_digits];
    let otherDigits = other[_digits];
    let resultDigits = typed_data.Uint16List.new(resultUsed);
    let i = 0;
    while (i < dart.notNull(otherUsed)) {
      core._BigIntImpl._mulAdd(otherDigits[$_get](i), digits, 0, resultDigits, i, used);
      i++;
    }
    return new core._BigIntImpl.__(this[_isNegative] != other[_isNegative], resultUsed, resultDigits);
  }
  static _mulDigits(xDigits, xUsed, otherDigits, otherUsed, resultDigits) {
    let resultUsed = dart.notNull(xUsed) + dart.notNull(otherUsed);
    let i = resultUsed;
    if (!(dart.notNull(resultDigits[$length]) >= i)) dart.assertFailed(null, "dart:core", 1258, 12, "resultDigits.length >= i");
    while (--i >= 0) {
      resultDigits[$_set](i, 0);
    }
    i = 0;
    while (i < dart.notNull(otherUsed)) {
      core._BigIntImpl._mulAdd(otherDigits[$_get](i), xDigits, 0, resultDigits, i, xUsed);
      i++;
    }
    return resultUsed;
  }
  static _estimateQuotientDigit(topDigitDivisor, digits, i) {
    if (digits[$_get](i) == topDigitDivisor) return 65535;
    let quotientDigit = (((dart.notNull(digits[$_get](i)) << 16 | dart.notNull(digits[$_get](dart.notNull(i) - 1))) >>> 0) / dart.notNull(topDigitDivisor))[$truncate]();
    if (quotientDigit > 65535) return 65535;
    return quotientDigit;
  }
  [_div](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (!(dart.notNull(other[_used]) > 0)) dart.assertFailed(null, "dart:core", 1283, 12, "other._used > 0");
    if (dart.notNull(this[_used]) < dart.notNull(other[_used])) {
      return core._BigIntImpl.zero;
    }
    this[_divRem](other);
    let lastQuo_used = dart.notNull(core._BigIntImpl._lastQuoRemUsed) - dart.notNull(core._BigIntImpl._lastRemUsed);
    let quo_digits = core._BigIntImpl._cloneDigits(core._BigIntImpl._lastQuoRemDigits, core._BigIntImpl._lastRemUsed, core._BigIntImpl._lastQuoRemUsed, lastQuo_used);
    let quo = new core._BigIntImpl.__(false, lastQuo_used, quo_digits);
    if (this[_isNegative] != other[_isNegative] && dart.notNull(quo[_used]) > 0) {
      quo = quo._negate();
    }
    return quo;
  }
  [_rem](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (!(dart.notNull(other[_used]) > 0)) dart.assertFailed(null, "dart:core", 1303, 12, "other._used > 0");
    if (dart.notNull(this[_used]) < dart.notNull(other[_used])) {
      return this;
    }
    this[_divRem](other);
    let remDigits = core._BigIntImpl._cloneDigits(core._BigIntImpl._lastQuoRemDigits, 0, core._BigIntImpl._lastRemUsed, core._BigIntImpl._lastRemUsed);
    let rem = new core._BigIntImpl.__(false, core._BigIntImpl._lastRemUsed, remDigits);
    if (dart.notNull(core._BigIntImpl._lastRem_nsh) > 0) {
      rem = rem['>>'](core._BigIntImpl._lastRem_nsh);
    }
    if (dart.test(this[_isNegative]) && dart.notNull(rem[_used]) > 0) {
      rem = rem._negate();
    }
    return rem;
  }
  [_divRem](other) {
    if (this[_used] == core._BigIntImpl._lastDividendUsed && other[_used] == core._BigIntImpl._lastDivisorUsed && this[_digits] == core._BigIntImpl._lastDividendDigits && other[_digits] == core._BigIntImpl._lastDivisorDigits) {
      return;
    }
    if (!(dart.notNull(this[_used]) >= dart.notNull(other[_used]))) dart.assertFailed(null, "dart:core", 1338, 12, "_used >= other._used");
    let nsh = 16 - other[_digits][$_get](dart.notNull(other[_used]) - 1)[$bitLength];
    let resultDigits = null;
    let resultUsed = null;
    let yDigits = null;
    let yUsed = null;
    if (nsh > 0) {
      yDigits = typed_data.Uint16List.new(dart.notNull(other[_used]) + 5);
      yUsed = core._BigIntImpl._lShiftDigits(other[_digits], other[_used], nsh, yDigits);
      resultDigits = typed_data.Uint16List.new(dart.notNull(this[_used]) + 5);
      resultUsed = core._BigIntImpl._lShiftDigits(this[_digits], this[_used], nsh, resultDigits);
    } else {
      yDigits = other[_digits];
      yUsed = other[_used];
      resultDigits = core._BigIntImpl._cloneDigits(this[_digits], 0, this[_used], dart.notNull(this[_used]) + 2);
      resultUsed = this[_used];
    }
    let topDigitDivisor = yDigits[$_get](dart.notNull(yUsed) - 1);
    let i = resultUsed;
    let j = dart.notNull(i) - dart.notNull(yUsed);
    let tmpDigits = typed_data.Uint16List.new(i);
    let tmpUsed = core._BigIntImpl._dlShiftDigits(yDigits, yUsed, j, tmpDigits);
    if (dart.notNull(core._BigIntImpl._compareDigits(resultDigits, resultUsed, tmpDigits, tmpUsed)) >= 0) {
      if (!(i == resultUsed)) dart.assertFailed(null, "dart:core", 1371, 14, "i == resultUsed");
      resultDigits[$_set]((() => {
        let x = resultUsed;
        resultUsed = dart.notNull(x) + 1;
        return x;
      })(), 1);
      core._BigIntImpl._absSub(resultDigits, resultUsed, tmpDigits, tmpUsed, resultDigits);
    } else {
      resultDigits[$_set]((() => {
        let x = resultUsed;
        resultUsed = dart.notNull(x) + 1;
        return x;
      })(), 0);
    }
    let nyDigits = typed_data.Uint16List.new(dart.notNull(yUsed) + 2);
    nyDigits[$_set](yUsed, 1);
    core._BigIntImpl._absSub(nyDigits, dart.notNull(yUsed) + 1, yDigits, yUsed, nyDigits);
    i = dart.notNull(i) - 1;
    while (j > 0) {
      let estimatedQuotientDigit = core._BigIntImpl._estimateQuotientDigit(topDigitDivisor, resultDigits, i);
      j--;
      core._BigIntImpl._mulAdd(estimatedQuotientDigit, nyDigits, 0, resultDigits, j, yUsed);
      if (dart.notNull(resultDigits[$_get](i)) < dart.notNull(estimatedQuotientDigit)) {
        let tmpUsed = core._BigIntImpl._dlShiftDigits(nyDigits, yUsed, j, tmpDigits);
        core._BigIntImpl._absSub(resultDigits, resultUsed, tmpDigits, tmpUsed, resultDigits);
        while (dart.notNull(resultDigits[$_get](i)) < (estimatedQuotientDigit = dart.notNull(estimatedQuotientDigit) - 1)) {
          core._BigIntImpl._absSub(resultDigits, resultUsed, tmpDigits, tmpUsed, resultDigits);
        }
      }
      i = dart.notNull(i) - 1;
    }
    core._BigIntImpl._lastDividendDigits = this[_digits];
    core._BigIntImpl._lastDividendUsed = this[_used];
    core._BigIntImpl._lastDivisorDigits = other[_digits];
    core._BigIntImpl._lastDivisorUsed = other[_used];
    core._BigIntImpl._lastQuoRemDigits = resultDigits;
    core._BigIntImpl._lastQuoRemUsed = resultUsed;
    core._BigIntImpl._lastRemUsed = yUsed;
    core._BigIntImpl._lastRem_nsh = nsh;
  }
  get hashCode() {
    function combine(hash, value) {
      hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
      hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
      return (dart.notNull(hash) ^ hash[$rightShift](6)) >>> 0;
    }
    dart.fn(combine, intAndintToint());
    function finish(hash) {
      hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
      hash = (dart.notNull(hash) ^ hash[$rightShift](11)) >>> 0;
      return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
    }
    dart.fn(finish, intToint());
    if (dart.test(this[_isZero])) return 6707;
    let hash = dart.test(this[_isNegative]) ? 83585 : 429689;
    for (let i = 0; i < dart.notNull(this[_used]); i++) {
      hash = combine(hash, this[_digits][$_get](i));
    }
    return finish(hash);
  }
  _equals(other) {
    return core._BigIntImpl.is(other) && this.compareTo(other) === 0;
  }
  get bitLength() {
    if (this[_used] === 0) return 0;
    if (dart.test(this[_isNegative])) return this['~']().bitLength;
    return 16 * (dart.notNull(this[_used]) - 1) + this[_digits][$_get](dart.notNull(this[_used]) - 1)[$bitLength];
  }
  ['~/'](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (other[_used] === 0) {
      dart.throw(const$50 || (const$50 = dart.const(new core.IntegerDivisionByZeroException.new())));
    }
    return this[_div](other);
  }
  remainder(bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (other[_used] === 0) {
      dart.throw(const$51 || (const$51 = dart.const(new core.IntegerDivisionByZeroException.new())));
    }
    return this[_rem](other);
  }
  ['/'](other) {
    return dart.notNull(this.toDouble()) / dart.notNull(other.toDouble());
  }
  ['<'](other) {
    return dart.notNull(this.compareTo(other)) < 0;
  }
  ['<='](other) {
    return dart.notNull(this.compareTo(other)) <= 0;
  }
  ['>'](other) {
    return dart.notNull(this.compareTo(other)) > 0;
  }
  ['>='](other) {
    return dart.notNull(this.compareTo(other)) >= 0;
  }
  ['%'](bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (other[_used] === 0) {
      dart.throw(const$52 || (const$52 = dart.const(new core.IntegerDivisionByZeroException.new())));
    }
    let result = this[_rem](other);
    if (dart.test(result[_isNegative])) {
      if (dart.test(other[_isNegative])) {
        result = result['-'](other);
      } else {
        result = result['+'](other);
      }
    }
    return result;
  }
  get sign() {
    if (this[_used] === 0) return 0;
    return dart.test(this[_isNegative]) ? -1 : 1;
  }
  get isEven() {
    return this[_used] === 0 || (dart.notNull(this[_digits][$_get](0)) & 1) === 0;
  }
  get isOdd() {
    return !dart.test(this.isEven);
  }
  get isNegative() {
    return this[_isNegative];
  }
  pow(exponent) {
    if (dart.notNull(exponent) < 0) {
      dart.throw(new core.ArgumentError.new("Exponent must not be negative: " + dart.str(exponent)));
    }
    if (exponent === 0) return core._BigIntImpl.one;
    let result = core._BigIntImpl.one;
    let base = this;
    while (exponent !== 0) {
      if ((dart.notNull(exponent) & 1) === 1) {
        result = result['*'](base);
      }
      exponent = exponent[$rightShift](1);
      if (exponent !== 0) {
        base = base['*'](base);
      }
    }
    return result;
  }
  modPow(bigExponent, bigModulus) {
    let exponent = core._BigIntImpl._check(bigExponent);
    let modulus = core._BigIntImpl._check(bigModulus);
    if (dart.test(exponent[_isNegative])) {
      dart.throw(new core.ArgumentError.new("exponent must be positive: " + dart.str(exponent)));
    }
    if (dart.test(modulus['<='](core._BigIntImpl.zero))) {
      dart.throw(new core.ArgumentError.new("modulus must be strictly positive: " + dart.str(modulus)));
    }
    if (dart.test(exponent[_isZero])) return core._BigIntImpl.one;
    let modulusUsed = modulus[_used];
    let modulusUsed2p4 = 2 * dart.notNull(modulusUsed) + 4;
    let exponentBitlen = exponent.bitLength;
    if (dart.notNull(exponentBitlen) <= 0) return core._BigIntImpl.one;
    let z = new core._BigIntClassic.new(modulus);
    let resultDigits = typed_data.Uint16List.new(modulusUsed2p4);
    let result2Digits = typed_data.Uint16List.new(modulusUsed2p4);
    let gDigits = typed_data.Uint16List.new(modulusUsed);
    let gUsed = z.convert(this, gDigits);
    for (let j = dart.notNull(gUsed) - 1; j >= 0; j--) {
      resultDigits[$_set](j, gDigits[$_get](j));
    }
    let resultUsed = gUsed;
    let result2Used = null;
    for (let i = dart.notNull(exponentBitlen) - 2; i >= 0; i--) {
      result2Used = z.sqr(resultDigits, resultUsed, result2Digits);
      if (!dart.test(exponent['&'](core._BigIntImpl.one['<<'](i))[_isZero])) {
        resultUsed = z.mul(result2Digits, core.int._check(result2Used), gDigits, gUsed, resultDigits);
      } else {
        let tmpDigits = resultDigits;
        let tmpUsed = resultUsed;
        resultDigits = result2Digits;
        resultUsed = core.int._check(result2Used);
        result2Digits = tmpDigits;
        result2Used = tmpUsed;
      }
    }
    return z.revert(resultDigits, resultUsed);
  }
  static _binaryGcd(x, y, inv) {
    let xDigits = x[_digits];
    let yDigits = y[_digits];
    let xUsed = x[_used];
    let yUsed = y[_used];
    let maxUsed = dart.notNull(xUsed) > dart.notNull(yUsed) ? xUsed : yUsed;
    let unshiftedMaxUsed = maxUsed;
    xDigits = core._BigIntImpl._cloneDigits(xDigits, 0, xUsed, maxUsed);
    yDigits = core._BigIntImpl._cloneDigits(yDigits, 0, yUsed, maxUsed);
    let shiftAmount = 0;
    if (dart.test(inv)) {
      if (yUsed === 1 && yDigits[$_get](0) === 1) return core._BigIntImpl.one;
      if (yUsed === 0 || yDigits[$_get](0)[$isEven] && xDigits[$_get](0)[$isEven]) {
        dart.throw(core.Exception.new("Not coprime"));
      }
    } else {
      if (dart.test(x[_isZero])) {
        dart.throw(new core.ArgumentError.value(0, "this", "must not be zero"));
      }
      if (dart.test(y[_isZero])) {
        dart.throw(new core.ArgumentError.value(0, "other", "must not be zero"));
      }
      if (xUsed === 1 && xDigits[$_get](0) === 1 || yUsed === 1 && yDigits[$_get](0) === 1) return core._BigIntImpl.one;
      while ((dart.notNull(xDigits[$_get](0)) & 1) === 0 && (dart.notNull(yDigits[$_get](0)) & 1) === 0) {
        core._BigIntImpl._rsh(xDigits, xUsed, 1, xDigits);
        core._BigIntImpl._rsh(yDigits, yUsed, 1, yDigits);
        shiftAmount++;
      }
      if (shiftAmount >= 16) {
        let digitShiftAmount = (shiftAmount / 16)[$truncate]();
        xUsed = dart.notNull(xUsed) - digitShiftAmount;
        yUsed = dart.notNull(yUsed) - digitShiftAmount;
        maxUsed = dart.notNull(maxUsed) - digitShiftAmount;
      }
      if ((dart.notNull(yDigits[$_get](0)) & 1) === 1) {
        let tmpDigits = xDigits;
        let tmpUsed = xUsed;
        xDigits = yDigits;
        xUsed = yUsed;
        yDigits = tmpDigits;
        yUsed = tmpUsed;
      }
    }
    let uDigits = core._BigIntImpl._cloneDigits(xDigits, 0, xUsed, unshiftedMaxUsed);
    let vDigits = core._BigIntImpl._cloneDigits(yDigits, 0, yUsed, dart.notNull(unshiftedMaxUsed) + 2);
    let ac = (dart.notNull(xDigits[$_get](0)) & 1) === 0;
    let abcdUsed = dart.notNull(maxUsed) + 1;
    let abcdLen = abcdUsed + 2;
    let aDigits = null, bDigits = null, cDigits = null, dDigits = null;
    let aIsNegative = null, bIsNegative = null, cIsNegative = null, dIsNegative = null;
    if (ac) {
      aDigits = typed_data.Uint16List.new(abcdLen);
      aIsNegative = false;
      dart.dsetindex(aDigits, 0, 1);
      cDigits = typed_data.Uint16List.new(abcdLen);
      cIsNegative = false;
    }
    bDigits = typed_data.Uint16List.new(abcdLen);
    bIsNegative = false;
    dDigits = typed_data.Uint16List.new(abcdLen);
    dIsNegative = false;
    dart.dsetindex(dDigits, 0, 1);
    while (true) {
      while ((dart.notNull(uDigits[$_get](0)) & 1) === 0) {
        core._BigIntImpl._rsh(uDigits, maxUsed, 1, uDigits);
        if (ac) {
          if (dart.equals(dart.dsend(dart.dindex(aDigits, 0), '&', [1]), 1) || dart.equals(dart.dsend(dart.dindex(bDigits, 0), '&', [1]), 1)) {
            if (dart.test(aIsNegative)) {
              if (!dart.equals(dart.dindex(aDigits, maxUsed), 0) || dart.notNull(core._BigIntImpl._compareDigits(typed_data.Uint16List._check(aDigits), maxUsed, yDigits, maxUsed)) > 0) {
                core._BigIntImpl._absSub(typed_data.Uint16List._check(aDigits), abcdUsed, yDigits, maxUsed, typed_data.Uint16List._check(aDigits));
              } else {
                core._BigIntImpl._absSub(yDigits, maxUsed, typed_data.Uint16List._check(aDigits), maxUsed, typed_data.Uint16List._check(aDigits));
                aIsNegative = false;
              }
            } else {
              core._BigIntImpl._absAdd(typed_data.Uint16List._check(aDigits), abcdUsed, yDigits, maxUsed, typed_data.Uint16List._check(aDigits));
            }
            if (dart.test(bIsNegative)) {
              core._BigIntImpl._absAdd(typed_data.Uint16List._check(bDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(bDigits));
            } else if (!dart.equals(dart.dindex(bDigits, maxUsed), 0) || dart.notNull(core._BigIntImpl._compareDigits(typed_data.Uint16List._check(bDigits), maxUsed, xDigits, maxUsed)) > 0) {
              core._BigIntImpl._absSub(typed_data.Uint16List._check(bDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(bDigits));
            } else {
              core._BigIntImpl._absSub(xDigits, maxUsed, typed_data.Uint16List._check(bDigits), maxUsed, typed_data.Uint16List._check(bDigits));
              bIsNegative = true;
            }
          }
          core._BigIntImpl._rsh(typed_data.Uint16List._check(aDigits), abcdUsed, 1, typed_data.Uint16List._check(aDigits));
        } else if (dart.equals(dart.dsend(dart.dindex(bDigits, 0), '&', [1]), 1)) {
          if (dart.test(bIsNegative)) {
            core._BigIntImpl._absAdd(typed_data.Uint16List._check(bDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(bDigits));
          } else if (!dart.equals(dart.dindex(bDigits, maxUsed), 0) || dart.notNull(core._BigIntImpl._compareDigits(typed_data.Uint16List._check(bDigits), maxUsed, xDigits, maxUsed)) > 0) {
            core._BigIntImpl._absSub(typed_data.Uint16List._check(bDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(bDigits));
          } else {
            core._BigIntImpl._absSub(xDigits, maxUsed, typed_data.Uint16List._check(bDigits), maxUsed, typed_data.Uint16List._check(bDigits));
            bIsNegative = true;
          }
        }
        core._BigIntImpl._rsh(typed_data.Uint16List._check(bDigits), abcdUsed, 1, typed_data.Uint16List._check(bDigits));
      }
      while ((dart.notNull(vDigits[$_get](0)) & 1) === 0) {
        core._BigIntImpl._rsh(vDigits, maxUsed, 1, vDigits);
        if (ac) {
          if (dart.equals(dart.dsend(dart.dindex(cDigits, 0), '&', [1]), 1) || dart.equals(dart.dsend(dart.dindex(dDigits, 0), '&', [1]), 1)) {
            if (dart.test(cIsNegative)) {
              if (!dart.equals(dart.dindex(cDigits, maxUsed), 0) || dart.notNull(core._BigIntImpl._compareDigits(typed_data.Uint16List._check(cDigits), maxUsed, yDigits, maxUsed)) > 0) {
                core._BigIntImpl._absSub(typed_data.Uint16List._check(cDigits), abcdUsed, yDigits, maxUsed, typed_data.Uint16List._check(cDigits));
              } else {
                core._BigIntImpl._absSub(yDigits, maxUsed, typed_data.Uint16List._check(cDigits), maxUsed, typed_data.Uint16List._check(cDigits));
                cIsNegative = false;
              }
            } else {
              core._BigIntImpl._absAdd(typed_data.Uint16List._check(cDigits), abcdUsed, yDigits, maxUsed, typed_data.Uint16List._check(cDigits));
            }
            if (dart.test(dIsNegative)) {
              core._BigIntImpl._absAdd(typed_data.Uint16List._check(dDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(dDigits));
            } else if (!dart.equals(dart.dindex(dDigits, maxUsed), 0) || dart.notNull(core._BigIntImpl._compareDigits(typed_data.Uint16List._check(dDigits), maxUsed, xDigits, maxUsed)) > 0) {
              core._BigIntImpl._absSub(typed_data.Uint16List._check(dDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(dDigits));
            } else {
              core._BigIntImpl._absSub(xDigits, maxUsed, typed_data.Uint16List._check(dDigits), maxUsed, typed_data.Uint16List._check(dDigits));
              dIsNegative = true;
            }
          }
          core._BigIntImpl._rsh(typed_data.Uint16List._check(cDigits), abcdUsed, 1, typed_data.Uint16List._check(cDigits));
        } else if (dart.equals(dart.dsend(dart.dindex(dDigits, 0), '&', [1]), 1)) {
          if (dart.test(dIsNegative)) {
            core._BigIntImpl._absAdd(typed_data.Uint16List._check(dDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(dDigits));
          } else if (!dart.equals(dart.dindex(dDigits, maxUsed), 0) || dart.notNull(core._BigIntImpl._compareDigits(typed_data.Uint16List._check(dDigits), maxUsed, xDigits, maxUsed)) > 0) {
            core._BigIntImpl._absSub(typed_data.Uint16List._check(dDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(dDigits));
          } else {
            core._BigIntImpl._absSub(xDigits, maxUsed, typed_data.Uint16List._check(dDigits), maxUsed, typed_data.Uint16List._check(dDigits));
            dIsNegative = true;
          }
        }
        core._BigIntImpl._rsh(typed_data.Uint16List._check(dDigits), abcdUsed, 1, typed_data.Uint16List._check(dDigits));
      }
      if (dart.notNull(core._BigIntImpl._compareDigits(uDigits, maxUsed, vDigits, maxUsed)) >= 0) {
        core._BigIntImpl._absSub(uDigits, maxUsed, vDigits, maxUsed, uDigits);
        if (ac) {
          if (aIsNegative == cIsNegative) {
            let a_cmp_c = core._BigIntImpl._compareDigits(typed_data.Uint16List._check(aDigits), abcdUsed, typed_data.Uint16List._check(cDigits), abcdUsed);
            if (dart.notNull(a_cmp_c) > 0) {
              core._BigIntImpl._absSub(typed_data.Uint16List._check(aDigits), abcdUsed, typed_data.Uint16List._check(cDigits), abcdUsed, typed_data.Uint16List._check(aDigits));
            } else {
              core._BigIntImpl._absSub(typed_data.Uint16List._check(cDigits), abcdUsed, typed_data.Uint16List._check(aDigits), abcdUsed, typed_data.Uint16List._check(aDigits));
              aIsNegative = !dart.test(aIsNegative) && a_cmp_c !== 0;
            }
          } else {
            core._BigIntImpl._absAdd(typed_data.Uint16List._check(aDigits), abcdUsed, typed_data.Uint16List._check(cDigits), abcdUsed, typed_data.Uint16List._check(aDigits));
          }
        }
        if (bIsNegative == dIsNegative) {
          let b_cmp_d = core._BigIntImpl._compareDigits(typed_data.Uint16List._check(bDigits), abcdUsed, typed_data.Uint16List._check(dDigits), abcdUsed);
          if (dart.notNull(b_cmp_d) > 0) {
            core._BigIntImpl._absSub(typed_data.Uint16List._check(bDigits), abcdUsed, typed_data.Uint16List._check(dDigits), abcdUsed, typed_data.Uint16List._check(bDigits));
          } else {
            core._BigIntImpl._absSub(typed_data.Uint16List._check(dDigits), abcdUsed, typed_data.Uint16List._check(bDigits), abcdUsed, typed_data.Uint16List._check(bDigits));
            bIsNegative = !dart.test(bIsNegative) && b_cmp_d !== 0;
          }
        } else {
          core._BigIntImpl._absAdd(typed_data.Uint16List._check(bDigits), abcdUsed, typed_data.Uint16List._check(dDigits), abcdUsed, typed_data.Uint16List._check(bDigits));
        }
      } else {
        core._BigIntImpl._absSub(vDigits, maxUsed, uDigits, maxUsed, vDigits);
        if (ac) {
          if (cIsNegative == aIsNegative) {
            let c_cmp_a = core._BigIntImpl._compareDigits(typed_data.Uint16List._check(cDigits), abcdUsed, typed_data.Uint16List._check(aDigits), abcdUsed);
            if (dart.notNull(c_cmp_a) > 0) {
              core._BigIntImpl._absSub(typed_data.Uint16List._check(cDigits), abcdUsed, typed_data.Uint16List._check(aDigits), abcdUsed, typed_data.Uint16List._check(cDigits));
            } else {
              core._BigIntImpl._absSub(typed_data.Uint16List._check(aDigits), abcdUsed, typed_data.Uint16List._check(cDigits), abcdUsed, typed_data.Uint16List._check(cDigits));
              cIsNegative = !dart.test(cIsNegative) && c_cmp_a !== 0;
            }
          } else {
            core._BigIntImpl._absAdd(typed_data.Uint16List._check(cDigits), abcdUsed, typed_data.Uint16List._check(aDigits), abcdUsed, typed_data.Uint16List._check(cDigits));
          }
        }
        if (dIsNegative == bIsNegative) {
          let d_cmp_b = core._BigIntImpl._compareDigits(typed_data.Uint16List._check(dDigits), abcdUsed, typed_data.Uint16List._check(bDigits), abcdUsed);
          if (dart.notNull(d_cmp_b) > 0) {
            core._BigIntImpl._absSub(typed_data.Uint16List._check(dDigits), abcdUsed, typed_data.Uint16List._check(bDigits), abcdUsed, typed_data.Uint16List._check(dDigits));
          } else {
            core._BigIntImpl._absSub(typed_data.Uint16List._check(bDigits), abcdUsed, typed_data.Uint16List._check(dDigits), abcdUsed, typed_data.Uint16List._check(dDigits));
            dIsNegative = !dart.test(dIsNegative) && d_cmp_b !== 0;
          }
        } else {
          core._BigIntImpl._absAdd(typed_data.Uint16List._check(dDigits), abcdUsed, typed_data.Uint16List._check(bDigits), abcdUsed, typed_data.Uint16List._check(dDigits));
        }
      }
      let i = maxUsed;
      while (dart.notNull(i) > 0 && uDigits[$_get](dart.notNull(i) - 1) === 0) {
        i = dart.notNull(i) - 1;
      }
      if (i === 0) break;
    }
    if (!dart.test(inv)) {
      if (shiftAmount > 0) {
        maxUsed = core._BigIntImpl._lShiftDigits(vDigits, maxUsed, shiftAmount, vDigits);
      }
      return new core._BigIntImpl.__(false, maxUsed, vDigits);
    }
    let i = dart.notNull(maxUsed) - 1;
    while (i > 0 && vDigits[$_get](i) === 0)
      --i;
    if (i !== 0 || vDigits[$_get](0) !== 1) {
      dart.throw(core.Exception.new("Not coprime"));
    }
    if (dart.test(dIsNegative)) {
      while (!dart.equals(dart.dindex(dDigits, maxUsed), 0) || dart.notNull(core._BigIntImpl._compareDigits(typed_data.Uint16List._check(dDigits), maxUsed, xDigits, maxUsed)) > 0) {
        core._BigIntImpl._absSub(typed_data.Uint16List._check(dDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(dDigits));
      }
      core._BigIntImpl._absSub(xDigits, maxUsed, typed_data.Uint16List._check(dDigits), maxUsed, typed_data.Uint16List._check(dDigits));
      dIsNegative = false;
    } else {
      while (!dart.equals(dart.dindex(dDigits, maxUsed), 0) || dart.notNull(core._BigIntImpl._compareDigits(typed_data.Uint16List._check(dDigits), maxUsed, xDigits, maxUsed)) >= 0) {
        core._BigIntImpl._absSub(typed_data.Uint16List._check(dDigits), abcdUsed, xDigits, maxUsed, typed_data.Uint16List._check(dDigits));
      }
    }
    return new core._BigIntImpl.__(false, maxUsed, typed_data.Uint16List._check(dDigits));
  }
  modInverse(bigInt) {
    let modulus = core._BigIntImpl._check(bigInt);
    if (dart.test(modulus['<='](core._BigIntImpl.zero))) {
      dart.throw(new core.ArgumentError.new("Modulus must be strictly positive: " + dart.str(modulus)));
    }
    if (dart.equals(modulus, core._BigIntImpl.one)) return core._BigIntImpl.zero;
    let tmp = this;
    if (dart.test(tmp[_isNegative]) || dart.notNull(tmp[_absCompare](modulus)) >= 0) {
      tmp = tmp['%'](modulus);
    }
    return core._BigIntImpl._binaryGcd(modulus, tmp, true);
  }
  gcd(bigInt) {
    let other = core._BigIntImpl._check(bigInt);
    if (dart.test(this[_isZero])) return other.abs();
    if (dart.test(other[_isZero])) return this.abs();
    return core._BigIntImpl._binaryGcd(this, other, false);
  }
  toUnsigned(width) {
    return this['&'](core._BigIntImpl.one['<<'](width)['-'](core._BigIntImpl.one));
  }
  toSigned(width) {
    let signMask = core._BigIntImpl.one['<<'](dart.notNull(width) - 1);
    return this['&'](signMask['-'](core._BigIntImpl.one))['-'](this['&'](signMask));
  }
  get isValidInt() {
    if (dart.notNull(this[_used]) <= 3) return true;
    let asInt = this.toInt();
    if (!asInt[$toDouble]()[$isFinite]) return false;
    return this._equals(core._BigIntImpl._fromInt(asInt));
  }
  toInt() {
    let result = 0;
    for (let i = dart.notNull(this[_used]) - 1; i >= 0; i--) {
      result = result * 65536 + dart.notNull(this[_digits][$_get](i));
    }
    return dart.test(this[_isNegative]) ? -result : result;
  }
  toDouble() {
    let exponentBias = 1075;
    let maxDoubleExponent = 2046 - exponentBias;
    if (dart.test(this[_isZero])) return 0.0;
    let resultBits = typed_data.Uint8List.new(8);
    let length = 16 * (dart.notNull(this[_used]) - 1) + this[_digits][$_get](dart.notNull(this[_used]) - 1)[$bitLength];
    if (length > maxDoubleExponent + 53) {
      return dart.test(this[_isNegative]) ? core.double.negativeInfinity : core.double.infinity;
    }
    if (dart.test(this[_isNegative])) resultBits[$_set](7, 128);
    let biasedExponent = length - 53 + exponentBias;
    resultBits[$_set](6, (biasedExponent & 15) << 4);
    let i$ = 7;
    resultBits[$_set](i$, (dart.notNull(resultBits[$_get](i$)) | biasedExponent[$rightShift](4)) >>> 0);
    let cachedBits = 0;
    let cachedBitsLength = 0;
    let digitIndex = dart.notNull(this[_used]) - 1;
    const readBits = n => {
      while (cachedBitsLength < dart.notNull(n)) {
        let nextDigit = null;
        let nextDigitLength = 16;
        if (digitIndex < 0) {
          nextDigit = 0;
          digitIndex--;
        } else {
          nextDigit = this[_digits][$_get](digitIndex);
          if (digitIndex === dart.notNull(this[_used]) - 1) nextDigitLength = nextDigit[$bitLength];
          digitIndex--;
        }
        cachedBits = cachedBits[$leftShift](nextDigitLength) + dart.notNull(nextDigit);
        cachedBitsLength = cachedBitsLength + nextDigitLength;
      }
      let result = cachedBits[$rightShift](cachedBitsLength - dart.notNull(n));
      cachedBits = cachedBits - result[$leftShift](cachedBitsLength - dart.notNull(n));
      cachedBitsLength = cachedBitsLength - dart.notNull(n);
      return result;
    };
    dart.fn(readBits, intToint());
    let leadingBits = dart.notNull(readBits(5)) & 15;
    let i$0 = 6;
    resultBits[$_set](i$0, (dart.notNull(resultBits[$_get](i$0)) | leadingBits) >>> 0);
    for (let i = 5; i >= 0; i--) {
      resultBits[$_set](i, readBits(8));
    }
    function roundUp() {
      let carry = 1;
      for (let i = 0; i < 8; i++) {
        if (carry === 0) break;
        let sum = dart.notNull(resultBits[$_get](i)) + carry;
        resultBits[$_set](i, sum & 255);
        carry = sum[$rightShift](8);
      }
    }
    dart.fn(roundUp, VoidTovoid());
    if (readBits(1) === 1) {
      if (resultBits[$_get](0)[$isOdd]) {
        roundUp();
      } else {
        if (cachedBits !== 0) {
          roundUp();
        } else {
          for (let i = digitIndex; digitIndex >= 0; i--) {
            if (this[_digits][$_get](i) !== 0) {
              roundUp();
              break;
            }
          }
        }
      }
    }
    return resultBits[$buffer][$asByteData]()[$getFloat64](0, typed_data.Endian.little);
  }
  toString() {
    if (this[_used] === 0) return "0";
    if (this[_used] === 1) {
      if (dart.test(this[_isNegative])) return (-dart.notNull(this[_digits][$_get](0)))[$toString]();
      return dart.toString(this[_digits][$_get](0));
    }
    let decimalDigitChunks = JSArrayOfString().of([]);
    let rest = dart.test(this.isNegative) ? this._negate() : this;
    while (dart.notNull(rest[_used]) > 1) {
      let digits4 = dart.toString(rest.remainder(core._BigIntImpl._bigInt10000));
      decimalDigitChunks[$add](digits4);
      if (digits4.length === 1) decimalDigitChunks[$add]("000");
      if (digits4.length === 2) decimalDigitChunks[$add]("00");
      if (digits4.length === 3) decimalDigitChunks[$add]("0");
      rest = rest['~/'](core._BigIntImpl._bigInt10000);
    }
    decimalDigitChunks[$add](dart.toString(rest[_digits][$_get](0)));
    if (dart.test(this[_isNegative])) decimalDigitChunks[$add]("-");
    return decimalDigitChunks[$reversed][$join]();
  }
  [_toRadixCodeUnit](digit) {
    let _0 = 48;
    let _a = 97;
    if (dart.notNull(digit) < 10) return _0 + dart.notNull(digit);
    return _a + dart.notNull(digit) - 10;
  }
  toRadixString(radix) {
    if (dart.notNull(radix) > 36) dart.throw(new core.RangeError.range(radix, 2, 36));
    if (this[_used] === 0) return "0";
    if (this[_used] === 1) {
      let digitString = this[_digits][$_get](0)[$toRadixString](radix);
      if (dart.test(this[_isNegative])) return "-" + digitString;
      return digitString;
    }
    if (radix === 16) return this[_toHexString]();
    let base = core._BigIntImpl._fromInt(radix);
    let reversedDigitCodeUnits = JSArrayOfint().of([]);
    let rest = this.abs();
    while (!dart.test(rest[_isZero])) {
      let digit = rest.remainder(base).toInt();
      rest = rest['~/'](base);
      reversedDigitCodeUnits[$add](this[_toRadixCodeUnit](digit));
    }
    let digitString = core.String.fromCharCodes(reversedDigitCodeUnits[$reversed]);
    if (dart.test(this[_isNegative])) return "-" + digitString;
    return digitString;
  }
  [_toHexString]() {
    let chars = JSArrayOfint().of([]);
    for (let i = 0; i < dart.notNull(this[_used]) - 1; i++) {
      let chunk = this[_digits][$_get](i);
      for (let j = 0; j < (16 / 4)[$truncate](); j++) {
        chars[$add](this[_toRadixCodeUnit](dart.notNull(chunk) & 15));
        chunk = chunk[$rightShift](4);
      }
    }
    let msbChunk = this[_digits][$_get](dart.notNull(this[_used]) - 1);
    while (msbChunk !== 0) {
      chars[$add](this[_toRadixCodeUnit](dart.notNull(msbChunk) & 15));
      msbChunk = msbChunk[$rightShift](4);
    }
    if (dart.test(this[_isNegative])) {
      let _dash = 45;
      chars[$add](_dash);
    }
    return core.String.fromCharCodes(chars[$reversed]);
  }
};
(core._BigIntImpl.__ = function(isNegative, used, digits) {
  core._BigIntImpl._normalized.call(this, isNegative, core._BigIntImpl._normalize(used, digits), digits);
}).prototype = core._BigIntImpl.prototype;
(core._BigIntImpl._normalized = function(isNegative, used, digits) {
  this[_used] = used;
  this[_digits] = digits;
  this[_isNegative] = used === 0 ? false : isNegative;
}).prototype = core._BigIntImpl.prototype;
dart.addTypeTests(core._BigIntImpl);
core._BigIntImpl[dart.implements] = () => [core.BigInt];
dart.setMethodSignature(core._BigIntImpl, () => ({
  __proto__: dart.getMethods(core._BigIntImpl.__proto__),
  _negate: dart.fnType(core._BigIntImpl, []),
  abs: dart.fnType(core._BigIntImpl, []),
  [_dlShift]: dart.fnType(core._BigIntImpl, [core.int]),
  [_drShift]: dart.fnType(core._BigIntImpl, [core.int]),
  '<<': dart.fnType(core._BigIntImpl, [core.int]),
  '>>': dart.fnType(core._BigIntImpl, [core.int]),
  [_absCompare]: dart.fnType(core.int, [core.BigInt]),
  compareTo: dart.fnType(core.int, [core.Object]),
  [$compareTo]: dart.fnType(core.int, [core.Object]),
  [_absAddSetSign]: dart.fnType(core._BigIntImpl, [core._BigIntImpl, core.bool]),
  [_absSubSetSign]: dart.fnType(core._BigIntImpl, [core._BigIntImpl, core.bool]),
  [_absAndSetSign]: dart.fnType(core._BigIntImpl, [core._BigIntImpl, core.bool]),
  [_absAndNotSetSign]: dart.fnType(core._BigIntImpl, [core._BigIntImpl, core.bool]),
  [_absOrSetSign]: dart.fnType(core._BigIntImpl, [core._BigIntImpl, core.bool]),
  [_absXorSetSign]: dart.fnType(core._BigIntImpl, [core._BigIntImpl, core.bool]),
  '&': dart.fnType(core._BigIntImpl, [core.BigInt]),
  '|': dart.fnType(core._BigIntImpl, [core.BigInt]),
  '^': dart.fnType(core._BigIntImpl, [core.BigInt]),
  '~': dart.fnType(core._BigIntImpl, []),
  '+': dart.fnType(core._BigIntImpl, [core.BigInt]),
  '-': dart.fnType(core._BigIntImpl, [core.BigInt]),
  '*': dart.fnType(core._BigIntImpl, [core.BigInt]),
  [_div]: dart.fnType(core._BigIntImpl, [core.BigInt]),
  [_rem]: dart.fnType(core._BigIntImpl, [core.BigInt]),
  [_divRem]: dart.fnType(dart.void, [core._BigIntImpl]),
  _equals: dart.fnType(core.bool, [core.Object]),
  [$_equals]: dart.fnType(core.bool, [core.Object]),
  '~/': dart.fnType(core._BigIntImpl, [core.BigInt]),
  remainder: dart.fnType(core._BigIntImpl, [core.BigInt]),
  '/': dart.fnType(core.double, [core.BigInt]),
  '<': dart.fnType(core.bool, [core.BigInt]),
  '<=': dart.fnType(core.bool, [core.BigInt]),
  '>': dart.fnType(core.bool, [core.BigInt]),
  '>=': dart.fnType(core.bool, [core.BigInt]),
  '%': dart.fnType(core._BigIntImpl, [core.BigInt]),
  pow: dart.fnType(core._BigIntImpl, [core.int]),
  modPow: dart.fnType(core._BigIntImpl, [core.BigInt, core.BigInt]),
  modInverse: dart.fnType(core._BigIntImpl, [core.BigInt]),
  gcd: dart.fnType(core._BigIntImpl, [core.BigInt]),
  toUnsigned: dart.fnType(core._BigIntImpl, [core.int]),
  toSigned: dart.fnType(core._BigIntImpl, [core.int]),
  toInt: dart.fnType(core.int, []),
  toDouble: dart.fnType(core.double, []),
  [_toRadixCodeUnit]: dart.fnType(core.int, [core.int]),
  toRadixString: dart.fnType(core.String, [core.int]),
  [_toHexString]: dart.fnType(core.String, [])
}));
dart.setGetterSignature(core._BigIntImpl, () => ({
  __proto__: dart.getGetters(core._BigIntImpl.__proto__),
  [_isZero]: core.bool,
  bitLength: core.int,
  sign: core.int,
  isEven: core.bool,
  isOdd: core.bool,
  isNegative: core.bool,
  isValidInt: core.bool
}));
dart.setLibraryUri(core._BigIntImpl, "dart:core");
dart.setFieldSignature(core._BigIntImpl, () => ({
  __proto__: dart.getFields(core._BigIntImpl.__proto__),
  [_isNegative]: dart.finalFieldType(core.bool),
  [_digits]: dart.finalFieldType(typed_data.Uint16List),
  [_used]: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(core._BigIntImpl, ['compareTo', '_equals', 'toString']);
dart.defineExtensionAccessors(core._BigIntImpl, ['hashCode']);
dart.defineLazy(core._BigIntImpl, {
  /*core._BigIntImpl._digitBits*/get _digitBits() {
    return 16;
  },
  /*core._BigIntImpl._digitBase*/get _digitBase() {
    return 1 << 16;
  },
  /*core._BigIntImpl._digitMask*/get _digitMask() {
    return (1 << 16) - 1;
  },
  /*core._BigIntImpl.zero*/get zero() {
    return core._BigIntImpl._fromInt(0);
  },
  /*core._BigIntImpl.one*/get one() {
    return core._BigIntImpl._fromInt(1);
  },
  /*core._BigIntImpl.two*/get two() {
    return core._BigIntImpl._fromInt(2);
  },
  /*core._BigIntImpl._minusOne*/get _minusOne() {
    return core._BigIntImpl.one._negate();
  },
  /*core._BigIntImpl._bigInt10000*/get _bigInt10000() {
    return core._BigIntImpl._fromInt(10000);
  },
  /*core._BigIntImpl._lastDividendDigits*/get _lastDividendDigits() {
    return null;
  },
  set _lastDividendDigits(_) {},
  /*core._BigIntImpl._lastDividendUsed*/get _lastDividendUsed() {
    return null;
  },
  set _lastDividendUsed(_) {},
  /*core._BigIntImpl._lastDivisorDigits*/get _lastDivisorDigits() {
    return null;
  },
  set _lastDivisorDigits(_) {},
  /*core._BigIntImpl._lastDivisorUsed*/get _lastDivisorUsed() {
    return null;
  },
  set _lastDivisorUsed(_) {},
  /*core._BigIntImpl._lastQuoRemDigits*/get _lastQuoRemDigits() {
    return null;
  },
  set _lastQuoRemDigits(_) {},
  /*core._BigIntImpl._lastQuoRemUsed*/get _lastQuoRemUsed() {
    return null;
  },
  set _lastQuoRemUsed(_) {},
  /*core._BigIntImpl._lastRemUsed*/get _lastRemUsed() {
    return null;
  },
  set _lastRemUsed(_) {},
  /*core._BigIntImpl._lastRem_nsh*/get _lastRem_nsh() {
    return null;
  },
  set _lastRem_nsh(_) {},
  /*core._BigIntImpl._bitsForFromDouble*/get _bitsForFromDouble() {
    return typed_data.Uint8List.new(8);
  },
  /*core._BigIntImpl._simpleValidIntDigits*/get _simpleValidIntDigits() {
    return (53 / 16)[$truncate]();
  }
});
core._BigIntReduction = class _BigIntReduction extends core.Object {};
(core._BigIntReduction.new = function() {
}).prototype = core._BigIntReduction.prototype;
dart.addTypeTests(core._BigIntReduction);
dart.setLibraryUri(core._BigIntReduction, "dart:core");
const _modulus = dart.privateName(core, "_modulus");
const _normalizedModulus = dart.privateName(core, "_normalizedModulus");
const _reduce = dart.privateName(core, "_reduce");
core._BigIntClassic = class _BigIntClassic extends core.Object {
  convert(x, resultDigits) {
    let digits = null;
    let used = null;
    if (dart.test(x[_isNegative]) || dart.notNull(x[_absCompare](this[_modulus])) >= 0) {
      let remainder = x[_rem](this[_modulus]);
      if (dart.test(x[_isNegative]) && dart.notNull(remainder[_used]) > 0) {
        if (!dart.test(remainder[_isNegative])) dart.assertFailed(null, "dart:core", 2268, 16, "remainder._isNegative");
        remainder = remainder['+'](this[_modulus]);
      }
      if (!!dart.test(remainder[_isNegative])) dart.assertFailed(null, "dart:core", 2271, 14, "!remainder._isNegative");
      used = remainder[_used];
      digits = remainder[_digits];
    } else {
      used = x[_used];
      digits = x[_digits];
    }
    let i = used;
    while (dart.dtest(dart.dsend(i = dart.dsend(i, '-', [1]), '>=', [0]))) {
      resultDigits[$_set](core.int._check(i), core.int._check(dart.dindex(digits, i)));
    }
    return core.int._check(used);
  }
  revert(xDigits, xUsed) {
    return new core._BigIntImpl.__(false, xUsed, xDigits);
  }
  [_reduce](xDigits, xUsed) {
    if (dart.notNull(xUsed) < dart.notNull(this[_modulus][_used])) {
      return xUsed;
    }
    let reverted = this.revert(xDigits, xUsed);
    let rem = reverted[_rem](this[_normalizedModulus]);
    return this.convert(rem, xDigits);
  }
  sqr(xDigits, xUsed, resultDigits) {
    let b = new core._BigIntImpl.__(false, xUsed, xDigits);
    let b2 = b['*'](b);
    for (let i = 0; i < dart.notNull(b2[_used]); i++) {
      resultDigits[$_set](i, b2[_digits][$_get](i));
    }
    for (let i = b2[_used]; dart.notNull(i) < 2 * dart.notNull(xUsed); i = dart.notNull(i) + 1) {
      resultDigits[$_set](i, 0);
    }
    return this[_reduce](resultDigits, 2 * dart.notNull(xUsed));
  }
  mul(xDigits, xUsed, yDigits, yUsed, resultDigits) {
    let resultUsed = core._BigIntImpl._mulDigits(xDigits, xUsed, yDigits, yUsed, resultDigits);
    return this[_reduce](resultDigits, resultUsed);
  }
};
(core._BigIntClassic.new = function(modulus) {
  this[_modulus] = modulus;
  this[_normalizedModulus] = modulus['<<'](core._BigIntImpl._digitBits - modulus[_digits][$_get](dart.notNull(modulus[_used]) - 1)[$bitLength]);
}).prototype = core._BigIntClassic.prototype;
dart.addTypeTests(core._BigIntClassic);
core._BigIntClassic[dart.implements] = () => [core._BigIntReduction];
dart.setMethodSignature(core._BigIntClassic, () => ({
  __proto__: dart.getMethods(core._BigIntClassic.__proto__),
  convert: dart.fnType(core.int, [core._BigIntImpl, typed_data.Uint16List]),
  revert: dart.fnType(core._BigIntImpl, [typed_data.Uint16List, core.int]),
  [_reduce]: dart.fnType(core.int, [typed_data.Uint16List, core.int]),
  sqr: dart.fnType(core.int, [typed_data.Uint16List, core.int, typed_data.Uint16List]),
  mul: dart.fnType(core.int, [typed_data.Uint16List, core.int, typed_data.Uint16List, core.int, typed_data.Uint16List])
}));
dart.setLibraryUri(core._BigIntClassic, "dart:core");
dart.setFieldSignature(core._BigIntClassic, () => ({
  __proto__: dart.getFields(core._BigIntClassic.__proto__),
  [_modulus]: dart.finalFieldType(core._BigIntImpl),
  [_normalizedModulus]: dart.finalFieldType(core._BigIntImpl)
}));
core.Deprecated = class Deprecated extends core.Object {
  get message() {
    return this[message$1];
  }
  set message(value) {
    super.message = value;
  }
  get expires() {
    return this.message;
  }
  toString() {
    return "Deprecated feature: " + dart.str(this.message);
  }
};
(core.Deprecated.new = function(message) {
  this[message$1] = message;
}).prototype = core.Deprecated.prototype;
dart.addTypeTests(core.Deprecated);
const message$1 = Symbol("Deprecated.message");
dart.setGetterSignature(core.Deprecated, () => ({
  __proto__: dart.getGetters(core.Deprecated.__proto__),
  expires: core.String
}));
dart.setLibraryUri(core.Deprecated, "dart:core");
dart.setFieldSignature(core.Deprecated, () => ({
  __proto__: dart.getFields(core.Deprecated.__proto__),
  message: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core.Deprecated, ['toString']);
dart.defineLazy(core, {
  /*core.deprecated*/get deprecated() {
    return dart.const(new core.Deprecated.new("next release"));
  }
});
core._Override = class _Override extends core.Object {};
(core._Override.new = function() {
}).prototype = core._Override.prototype;
dart.addTypeTests(core._Override);
dart.setLibraryUri(core._Override, "dart:core");
dart.defineLazy(core, {
  /*core.override*/get override() {
    return dart.const(new core._Override.new());
  }
});
core.Provisional = class Provisional extends core.Object {
  get message() {
    return null;
  }
};
(core.Provisional.new = function(opts) {
  let message = opts && 'message' in opts ? opts.message : null;
}).prototype = core.Provisional.prototype;
dart.addTypeTests(core.Provisional);
dart.setGetterSignature(core.Provisional, () => ({
  __proto__: dart.getGetters(core.Provisional.__proto__),
  message: core.String
}));
dart.setLibraryUri(core.Provisional, "dart:core");
dart.defineLazy(core, {
  /*core.provisional*/get provisional() {
    return null;
  }
});
core._Proxy = class _Proxy extends core.Object {};
(core._Proxy.new = function() {
}).prototype = core._Proxy.prototype;
dart.addTypeTests(core._Proxy);
dart.setLibraryUri(core._Proxy, "dart:core");
dart.defineLazy(core, {
  /*core.proxy*/get proxy() {
    return dart.const(new core._Proxy.new());
  }
});
core.pragma = class pragma extends core.Object {
  get name() {
    return this[name$0];
  }
  set name(value) {
    super.name = value;
  }
  get options() {
    return this[options$];
  }
  set options(value) {
    super.options = value;
  }
  static new(name, options) {
    return new core.pragma.__(name, options);
  }
};
(core.pragma.__ = function(name, options) {
  if (options === void 0) options = null;
  this[name$0] = name;
  this[options$] = options;
}).prototype = core.pragma.prototype;
dart.addTypeTests(core.pragma);
const name$0 = Symbol("pragma.name");
const options$ = Symbol("pragma.options");
dart.setLibraryUri(core.pragma, "dart:core");
dart.setFieldSignature(core.pragma, () => ({
  __proto__: dart.getFields(core.pragma.__proto__),
  name: dart.finalFieldType(core.String),
  options: dart.finalFieldType(core.Object)
}));
core.BigInt = class BigInt extends core.Object {
  static get zero() {
    return core._BigIntImpl.zero;
  }
  static get one() {
    return core._BigIntImpl.one;
  }
  static get two() {
    return core._BigIntImpl.two;
  }
  static parse(source, opts) {
    let radix = opts && 'radix' in opts ? opts.radix : null;
    return core._BigIntImpl.parse(source, {radix: radix});
  }
  static tryParse(source, opts) {
    let radix = opts && 'radix' in opts ? opts.radix : null;
    return core._BigIntImpl._tryParse(source, {radix: radix});
  }
  static from(value) {
    return core._BigIntImpl.from(value);
  }
};
(core.BigInt[dart.mixinNew] = function() {
}).prototype = core.BigInt.prototype;
dart.addTypeTests(core.BigInt);
core.BigInt[dart.implements] = () => [ComparableOfBigInt()];
dart.setLibraryUri(core.BigInt, "dart:core");
core.bool = class bool extends core.Object {
  static fromEnvironment(name, opts) {
    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
    dart.throw(new core.UnsupportedError.new("bool.fromEnvironment can only be used as a const constructor"));
  }
  get [$hashCode]() {
    return super[$hashCode];
  }
  [$bitAnd](other) {
    return dart.test(other) && this;
  }
  [$bitOr](other) {
    return dart.test(other) || this;
  }
  [$bitXor](other) {
    return !dart.test(other) === this;
  }
  [$toString]() {
    return this ? "true" : "false";
  }
};
(core.bool[dart.mixinNew] = function() {
}).prototype = core.bool.prototype;
core.bool.is = function is_bool(o) {
  return o === true || o === false;
};
core.bool.as = function as_bool(o) {
  if (o === true || o === false || o == null) return o;
  return dart.as(o, core.bool, false);
};
core.bool._check = function check_bool(o) {
  if (o === true || o === false || o == null) return o;
  return dart.as(o, core.bool, true);
};
dart.setMethodSignature(core.bool, () => ({
  __proto__: dart.getMethods(core.bool.__proto__),
  [$bitAnd]: dart.fnType(core.bool, [core.bool]),
  [$bitOr]: dart.fnType(core.bool, [core.bool]),
  [$bitXor]: dart.fnType(core.bool, [core.bool])
}));
dart.setLibraryUri(core.bool, "dart:core");
const _is_Comparable_default = Symbol('_is_Comparable_default');
core.Comparable$ = dart.generic(T => {
  class Comparable extends core.Object {
    static compare(a, b) {
      return a[$compareTo](b);
    }
  }
  (Comparable.new = function() {
  }).prototype = Comparable.prototype;
  dart.addTypeTests(Comparable);
  Comparable.prototype[_is_Comparable_default] = true;
  dart.setLibraryUri(Comparable, "dart:core");
  return Comparable;
});
core.Comparable = core.Comparable$();
dart.addTypeTests(core.Comparable, _is_Comparable_default);
const _value$0 = dart.privateName(core, "_value");
core.DateTime = class DateTime extends core.Object {
  get isUtc() {
    return this[isUtc$];
  }
  set isUtc(value) {
    super.isUtc = value;
  }
  static parse(formattedString) {
    let re = core.DateTime._parseFormat;
    let match = re.firstMatch(formattedString);
    if (match != null) {
      function parseIntOrZero(matched) {
        if (matched == null) return 0;
        return core.int.parse(matched);
      }
      dart.fn(parseIntOrZero, StringToint());
      function parseMilliAndMicroseconds(matched) {
        if (matched == null) return 0;
        let length = matched.length;
        if (!(length >= 1)) dart.assertFailed(null, "dart:core/date_time.dart", 291, 16, "length >= 1");
        if (!(length <= 6)) dart.assertFailed(null, "dart:core/date_time.dart", 292, 16, "length <= 6");
        let result = 0;
        for (let i = 0; i < 6; i++) {
          result = result * 10;
          if (i < matched.length) {
            result = result + ((matched[$codeUnitAt](i) ^ 48) >>> 0);
          }
        }
        return result;
      }
      dart.fn(parseMilliAndMicroseconds, StringToint());
      let years = core.int.parse(match._get(1));
      let month = core.int.parse(match._get(2));
      let day = core.int.parse(match._get(3));
      let hour = parseIntOrZero(match._get(4));
      let minute = parseIntOrZero(match._get(5));
      let second = parseIntOrZero(match._get(6));
      let addOneMillisecond = false;
      let milliAndMicroseconds = parseMilliAndMicroseconds(match._get(7));
      let millisecond = (dart.notNull(milliAndMicroseconds) / core.Duration.microsecondsPerMillisecond)[$truncate]();
      let microsecond = dart.asInt(milliAndMicroseconds[$remainder](core.Duration.microsecondsPerMillisecond));
      let isUtc = false;
      if (match._get(8) != null) {
        isUtc = true;
        if (match._get(9) != null) {
          let sign = match._get(9) === "-" ? -1 : 1;
          let hourDifference = core.int.parse(match._get(10));
          let minuteDifference = parseIntOrZero(match._get(11));
          minuteDifference = dart.notNull(minuteDifference) + 60 * dart.notNull(hourDifference);
          minute = dart.notNull(minute) - sign * dart.notNull(minuteDifference);
        }
      }
      let value = core.DateTime._brokenDownDateToValue(years, month, day, hour, minute, second, millisecond, microsecond, isUtc);
      if (value == null) {
        dart.throw(new core.FormatException.new("Time out of range", formattedString));
      }
      return new core.DateTime._withValue(value, {isUtc: isUtc});
    } else {
      dart.throw(new core.FormatException.new("Invalid date format", formattedString));
    }
  }
  static tryParse(formattedString) {
    try {
      return core.DateTime.parse(formattedString);
    } catch (e) {
      let ex = dart.getThrown(e);
      if (core.FormatException.is(ex)) {
        return null;
      } else
        throw e;
    }
  }
  _equals(other) {
    return core.DateTime.is(other) && this[_value$0] == other.millisecondsSinceEpoch && this.isUtc == other.isUtc;
  }
  isBefore(other) {
    return dart.notNull(this[_value$0]) < dart.notNull(other.millisecondsSinceEpoch);
  }
  isAfter(other) {
    return dart.notNull(this[_value$0]) > dart.notNull(other.millisecondsSinceEpoch);
  }
  isAtSameMomentAs(other) {
    return this[_value$0] == other.millisecondsSinceEpoch;
  }
  compareTo(other) {
    core.DateTime._check(other);
    return this[_value$0][$compareTo](other.millisecondsSinceEpoch);
  }
  get hashCode() {
    return (dart.notNull(this[_value$0]) ^ this[_value$0][$rightShift](30)) & 1073741823;
  }
  toLocal() {
    if (dart.test(this.isUtc)) {
      return new core.DateTime._withValue(this[_value$0], {isUtc: false});
    }
    return this;
  }
  toUtc() {
    if (dart.test(this.isUtc)) return this;
    return new core.DateTime._withValue(this[_value$0], {isUtc: true});
  }
  static _fourDigits(n) {
    let absN = n[$abs]();
    let sign = dart.notNull(n) < 0 ? "-" : "";
    if (absN >= 1000) return dart.str(n);
    if (absN >= 100) return sign + "0" + dart.str(absN);
    if (absN >= 10) return sign + "00" + dart.str(absN);
    return sign + "000" + dart.str(absN);
  }
  static _sixDigits(n) {
    if (!(dart.notNull(n) < -9999 || dart.notNull(n) > 9999)) dart.assertFailed(null, "dart:core/date_time.dart", 548, 12, "n < -9999 || n > 9999");
    let absN = n[$abs]();
    let sign = dart.notNull(n) < 0 ? "-" : "+";
    if (absN >= 100000) return sign + dart.str(absN);
    return sign + "0" + dart.str(absN);
  }
  static _threeDigits(n) {
    if (dart.notNull(n) >= 100) return dart.str(n);
    if (dart.notNull(n) >= 10) return "0" + dart.str(n);
    return "00" + dart.str(n);
  }
  static _twoDigits(n) {
    if (dart.notNull(n) >= 10) return dart.str(n);
    return "0" + dart.str(n);
  }
  toString() {
    let y = core.DateTime._fourDigits(this.year);
    let m = core.DateTime._twoDigits(this.month);
    let d = core.DateTime._twoDigits(this.day);
    let h = core.DateTime._twoDigits(this.hour);
    let min = core.DateTime._twoDigits(this.minute);
    let sec = core.DateTime._twoDigits(this.second);
    let ms = core.DateTime._threeDigits(this.millisecond);
    let us = this.microsecond === 0 ? "" : core.DateTime._threeDigits(this.microsecond);
    if (dart.test(this.isUtc)) {
      return dart.str(y) + "-" + dart.str(m) + "-" + dart.str(d) + " " + dart.str(h) + ":" + dart.str(min) + ":" + dart.str(sec) + "." + dart.str(ms) + dart.str(us) + "Z";
    } else {
      return dart.str(y) + "-" + dart.str(m) + "-" + dart.str(d) + " " + dart.str(h) + ":" + dart.str(min) + ":" + dart.str(sec) + "." + dart.str(ms) + dart.str(us);
    }
  }
  toIso8601String() {
    let y = dart.notNull(this.year) >= -9999 && dart.notNull(this.year) <= 9999 ? core.DateTime._fourDigits(this.year) : core.DateTime._sixDigits(this.year);
    let m = core.DateTime._twoDigits(this.month);
    let d = core.DateTime._twoDigits(this.day);
    let h = core.DateTime._twoDigits(this.hour);
    let min = core.DateTime._twoDigits(this.minute);
    let sec = core.DateTime._twoDigits(this.second);
    let ms = core.DateTime._threeDigits(this.millisecond);
    let us = this.microsecond === 0 ? "" : core.DateTime._threeDigits(this.microsecond);
    if (dart.test(this.isUtc)) {
      return dart.str(y) + "-" + dart.str(m) + "-" + dart.str(d) + "T" + dart.str(h) + ":" + dart.str(min) + ":" + dart.str(sec) + "." + dart.str(ms) + dart.str(us) + "Z";
    } else {
      return dart.str(y) + "-" + dart.str(m) + "-" + dart.str(d) + "T" + dart.str(h) + ":" + dart.str(min) + ":" + dart.str(sec) + "." + dart.str(ms) + dart.str(us);
    }
  }
  add(duration) {
    return new core.DateTime._withValue(dart.notNull(this[_value$0]) + dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
  }
  subtract(duration) {
    return new core.DateTime._withValue(dart.notNull(this[_value$0]) - dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
  }
  difference(other) {
    return new core.Duration.new({milliseconds: dart.notNull(this[_value$0]) - dart.notNull(other[_value$0])});
  }
  static _brokenDownDateToValue(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
    return dart.asInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc));
  }
  get millisecondsSinceEpoch() {
    return this[_value$0];
  }
  get microsecondsSinceEpoch() {
    return dart.notNull(this[_value$0]) * 1000;
  }
  get timeZoneName() {
    if (dart.test(this.isUtc)) return "UTC";
    return _js_helper.Primitives.getTimeZoneName(this);
  }
  get timeZoneOffset() {
    if (dart.test(this.isUtc)) return new core.Duration.new();
    return new core.Duration.new({minutes: _js_helper.Primitives.getTimeZoneOffsetInMinutes(this)});
  }
  get year() {
    return _js_helper.Primitives.getYear(this);
  }
  get month() {
    return _js_helper.Primitives.getMonth(this);
  }
  get day() {
    return _js_helper.Primitives.getDay(this);
  }
  get hour() {
    return _js_helper.Primitives.getHours(this);
  }
  get minute() {
    return _js_helper.Primitives.getMinutes(this);
  }
  get second() {
    return _js_helper.Primitives.getSeconds(this);
  }
  get millisecond() {
    return _js_helper.Primitives.getMilliseconds(this);
  }
  get microsecond() {
    return 0;
  }
  get weekday() {
    return _js_helper.Primitives.getWeekday(this);
  }
  static _microsecondInRoundedMilliseconds(microsecond) {
    return (dart.notNull(microsecond) / 1000)[$round]();
  }
};
(core.DateTime.new = function(year, month, day, hour, minute, second, millisecond, microsecond) {
  if (month === void 0) month = 1;
  if (day === void 0) day = 1;
  if (hour === void 0) hour = 0;
  if (minute === void 0) minute = 0;
  if (second === void 0) second = 0;
  if (millisecond === void 0) millisecond = 0;
  if (microsecond === void 0) microsecond = 0;
  core.DateTime._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, false);
}).prototype = core.DateTime.prototype;
(core.DateTime.utc = function(year, month, day, hour, minute, second, millisecond, microsecond) {
  if (month === void 0) month = 1;
  if (day === void 0) day = 1;
  if (hour === void 0) hour = 0;
  if (minute === void 0) minute = 0;
  if (second === void 0) second = 0;
  if (millisecond === void 0) millisecond = 0;
  if (microsecond === void 0) microsecond = 0;
  core.DateTime._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, true);
}).prototype = core.DateTime.prototype;
(core.DateTime.now = function() {
  core.DateTime._now.call(this);
}).prototype = core.DateTime.prototype;
(core.DateTime.fromMillisecondsSinceEpoch = function(millisecondsSinceEpoch, opts) {
  let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
  core.DateTime._withValue.call(this, millisecondsSinceEpoch, {isUtc: isUtc});
}).prototype = core.DateTime.prototype;
(core.DateTime.fromMicrosecondsSinceEpoch = function(microsecondsSinceEpoch, opts) {
  let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
  core.DateTime._withValue.call(this, core.DateTime._microsecondInRoundedMilliseconds(microsecondsSinceEpoch), {isUtc: isUtc});
}).prototype = core.DateTime.prototype;
(core.DateTime._withValue = function(value, opts) {
  let isUtc = opts && 'isUtc' in opts ? opts.isUtc : null;
  this[_value$0] = value;
  this[isUtc$] = isUtc;
  if (this.millisecondsSinceEpoch[$abs]() > 8640000000000000 || this.millisecondsSinceEpoch[$abs]() === 8640000000000000 && this.microsecond !== 0) {
    dart.throw(new core.ArgumentError.new("DateTime is outside valid range: " + dart.str(this.millisecondsSinceEpoch)));
  }
  if (this.isUtc == null) {
    dart.throw(new core.ArgumentError.new("'isUtc' flag may not be 'null'"));
  }
}).prototype = core.DateTime.prototype;
(core.DateTime._internal = function(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
  this[isUtc$] = typeof isUtc == 'boolean' ? isUtc : dart.throw(new core.ArgumentError.value(isUtc, "isUtc"));
  this[_value$0] = core.int._check(_js_helper.checkInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc)));
}).prototype = core.DateTime.prototype;
(core.DateTime._now = function() {
  this[isUtc$] = false;
  this[_value$0] = _js_helper.Primitives.dateNow();
}).prototype = core.DateTime.prototype;
dart.addTypeTests(core.DateTime);
const isUtc$ = Symbol("DateTime.isUtc");
core.DateTime[dart.implements] = () => [ComparableOfDateTime()];
dart.setMethodSignature(core.DateTime, () => ({
  __proto__: dart.getMethods(core.DateTime.__proto__),
  isBefore: dart.fnType(core.bool, [core.DateTime]),
  isAfter: dart.fnType(core.bool, [core.DateTime]),
  isAtSameMomentAs: dart.fnType(core.bool, [core.DateTime]),
  compareTo: dart.fnType(core.int, [core.Object]),
  [$compareTo]: dart.fnType(core.int, [core.Object]),
  toLocal: dart.fnType(core.DateTime, []),
  toUtc: dart.fnType(core.DateTime, []),
  toIso8601String: dart.fnType(core.String, []),
  add: dart.fnType(core.DateTime, [core.Duration]),
  subtract: dart.fnType(core.DateTime, [core.Duration]),
  difference: dart.fnType(core.Duration, [core.DateTime])
}));
dart.setGetterSignature(core.DateTime, () => ({
  __proto__: dart.getGetters(core.DateTime.__proto__),
  millisecondsSinceEpoch: core.int,
  microsecondsSinceEpoch: core.int,
  timeZoneName: core.String,
  timeZoneOffset: core.Duration,
  year: core.int,
  month: core.int,
  day: core.int,
  hour: core.int,
  minute: core.int,
  second: core.int,
  millisecond: core.int,
  microsecond: core.int,
  weekday: core.int
}));
dart.setLibraryUri(core.DateTime, "dart:core");
dart.setFieldSignature(core.DateTime, () => ({
  __proto__: dart.getFields(core.DateTime.__proto__),
  [_value$0]: dart.finalFieldType(core.int),
  isUtc: dart.finalFieldType(core.bool)
}));
dart.defineExtensionMethods(core.DateTime, ['_equals', 'compareTo', 'toString']);
dart.defineExtensionAccessors(core.DateTime, ['hashCode']);
dart.defineLazy(core.DateTime, {
  /*core.DateTime.monday*/get monday() {
    return 1;
  },
  /*core.DateTime.tuesday*/get tuesday() {
    return 2;
  },
  /*core.DateTime.wednesday*/get wednesday() {
    return 3;
  },
  /*core.DateTime.thursday*/get thursday() {
    return 4;
  },
  /*core.DateTime.friday*/get friday() {
    return 5;
  },
  /*core.DateTime.saturday*/get saturday() {
    return 6;
  },
  /*core.DateTime.sunday*/get sunday() {
    return 7;
  },
  /*core.DateTime.daysPerWeek*/get daysPerWeek() {
    return 7;
  },
  /*core.DateTime.january*/get january() {
    return 1;
  },
  /*core.DateTime.february*/get february() {
    return 2;
  },
  /*core.DateTime.march*/get march() {
    return 3;
  },
  /*core.DateTime.april*/get april() {
    return 4;
  },
  /*core.DateTime.may*/get may() {
    return 5;
  },
  /*core.DateTime.june*/get june() {
    return 6;
  },
  /*core.DateTime.july*/get july() {
    return 7;
  },
  /*core.DateTime.august*/get august() {
    return 8;
  },
  /*core.DateTime.september*/get september() {
    return 9;
  },
  /*core.DateTime.october*/get october() {
    return 10;
  },
  /*core.DateTime.november*/get november() {
    return 11;
  },
  /*core.DateTime.december*/get december() {
    return 12;
  },
  /*core.DateTime.monthsPerYear*/get monthsPerYear() {
    return 12;
  },
  /*core.DateTime._maxMillisecondsSinceEpoch*/get _maxMillisecondsSinceEpoch() {
    return 8640000000000000;
  },
  /*core.DateTime._parseFormat*/get _parseFormat() {
    return core.RegExp.new("^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)" + "(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,6}))?)?)?" + "( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$");
  }
});
const _duration = dart.privateName(core, "_duration");
core.Duration = class Duration extends core.Object {
  ['+'](other) {
    return new core.Duration._microseconds(dart.notNull(this[_duration]) + dart.notNull(other[_duration]));
  }
  ['-'](other) {
    return new core.Duration._microseconds(dart.notNull(this[_duration]) - dart.notNull(other[_duration]));
  }
  ['*'](factor) {
    return new core.Duration._microseconds((dart.notNull(this[_duration]) * dart.notNull(factor))[$round]());
  }
  ['~/'](quotient) {
    if (quotient === 0) dart.throw(new core.IntegerDivisionByZeroException.new());
    return new core.Duration._microseconds((dart.notNull(this[_duration]) / dart.notNull(quotient))[$truncate]());
  }
  ['<'](other) {
    return dart.notNull(this[_duration]) < dart.notNull(other[_duration]);
  }
  ['>'](other) {
    return dart.notNull(this[_duration]) > dart.notNull(other[_duration]);
  }
  ['<='](other) {
    return dart.notNull(this[_duration]) <= dart.notNull(other[_duration]);
  }
  ['>='](other) {
    return dart.notNull(this[_duration]) >= dart.notNull(other[_duration]);
  }
  get inDays() {
    return (dart.notNull(this[_duration]) / core.Duration.microsecondsPerDay)[$truncate]();
  }
  get inHours() {
    return (dart.notNull(this[_duration]) / core.Duration.microsecondsPerHour)[$truncate]();
  }
  get inMinutes() {
    return (dart.notNull(this[_duration]) / core.Duration.microsecondsPerMinute)[$truncate]();
  }
  get inSeconds() {
    return (dart.notNull(this[_duration]) / core.Duration.microsecondsPerSecond)[$truncate]();
  }
  get inMilliseconds() {
    return (dart.notNull(this[_duration]) / core.Duration.microsecondsPerMillisecond)[$truncate]();
  }
  get inMicroseconds() {
    return this[_duration];
  }
  _equals(other) {
    return core.Duration.is(other) && this[_duration] == other.inMicroseconds;
  }
  get hashCode() {
    return dart.hashCode(this[_duration]);
  }
  compareTo(other) {
    core.Duration._check(other);
    return this[_duration][$compareTo](other[_duration]);
  }
  toString() {
    function sixDigits(n) {
      if (dart.notNull(n) >= 100000) return dart.str(n);
      if (dart.notNull(n) >= 10000) return "0" + dart.str(n);
      if (dart.notNull(n) >= 1000) return "00" + dart.str(n);
      if (dart.notNull(n) >= 100) return "000" + dart.str(n);
      if (dart.notNull(n) >= 10) return "0000" + dart.str(n);
      return "00000" + dart.str(n);
    }
    dart.fn(sixDigits, intToString());
    function twoDigits(n) {
      if (dart.notNull(n) >= 10) return dart.str(n);
      return "0" + dart.str(n);
    }
    dart.fn(twoDigits, intToString());
    if (dart.notNull(this.inMicroseconds) < 0) {
      return "-" + dart.str(this._negate());
    }
    let twoDigitMinutes = twoDigits(dart.asInt(this.inMinutes[$remainder](60)));
    let twoDigitSeconds = twoDigits(dart.asInt(this.inSeconds[$remainder](60)));
    let sixDigitUs = sixDigits(dart.asInt(this.inMicroseconds[$remainder](1000000)));
    return dart.str(this.inHours) + ":" + dart.str(twoDigitMinutes) + ":" + dart.str(twoDigitSeconds) + "." + dart.str(sixDigitUs);
  }
  get isNegative() {
    return dart.notNull(this[_duration]) < 0;
  }
  abs() {
    return new core.Duration._microseconds(this[_duration][$abs]());
  }
  _negate() {
    return new core.Duration._microseconds(0 - dart.notNull(this[_duration]));
  }
};
(core.Duration.new = function(opts) {
  let days = opts && 'days' in opts ? opts.days : 0;
  let hours = opts && 'hours' in opts ? opts.hours : 0;
  let minutes = opts && 'minutes' in opts ? opts.minutes : 0;
  let seconds = opts && 'seconds' in opts ? opts.seconds : 0;
  let milliseconds = opts && 'milliseconds' in opts ? opts.milliseconds : 0;
  let microseconds = opts && 'microseconds' in opts ? opts.microseconds : 0;
  core.Duration._microseconds.call(this, 86400000000 * dart.notNull(days) + 3600000000 * dart.notNull(hours) + 60000000 * dart.notNull(minutes) + 1000000 * dart.notNull(seconds) + 1000 * dart.notNull(milliseconds) + dart.notNull(microseconds));
}).prototype = core.Duration.prototype;
(core.Duration._microseconds = function(duration) {
  this[_duration] = duration;
}).prototype = core.Duration.prototype;
dart.addTypeTests(core.Duration);
core.Duration[dart.implements] = () => [ComparableOfDuration()];
dart.setMethodSignature(core.Duration, () => ({
  __proto__: dart.getMethods(core.Duration.__proto__),
  '+': dart.fnType(core.Duration, [core.Duration]),
  '-': dart.fnType(core.Duration, [core.Duration]),
  '*': dart.fnType(core.Duration, [core.num]),
  '~/': dart.fnType(core.Duration, [core.int]),
  '<': dart.fnType(core.bool, [core.Duration]),
  '>': dart.fnType(core.bool, [core.Duration]),
  '<=': dart.fnType(core.bool, [core.Duration]),
  '>=': dart.fnType(core.bool, [core.Duration]),
  compareTo: dart.fnType(core.int, [core.Object]),
  [$compareTo]: dart.fnType(core.int, [core.Object]),
  abs: dart.fnType(core.Duration, []),
  _negate: dart.fnType(core.Duration, [])
}));
dart.setGetterSignature(core.Duration, () => ({
  __proto__: dart.getGetters(core.Duration.__proto__),
  inDays: core.int,
  inHours: core.int,
  inMinutes: core.int,
  inSeconds: core.int,
  inMilliseconds: core.int,
  inMicroseconds: core.int,
  isNegative: core.bool
}));
dart.setLibraryUri(core.Duration, "dart:core");
dart.setFieldSignature(core.Duration, () => ({
  __proto__: dart.getFields(core.Duration.__proto__),
  [_duration]: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(core.Duration, ['_equals', 'compareTo', 'toString']);
dart.defineExtensionAccessors(core.Duration, ['hashCode']);
dart.defineLazy(core.Duration, {
  /*core.Duration.microsecondsPerMillisecond*/get microsecondsPerMillisecond() {
    return 1000;
  },
  /*core.Duration.millisecondsPerSecond*/get millisecondsPerSecond() {
    return 1000;
  },
  /*core.Duration.secondsPerMinute*/get secondsPerMinute() {
    return 60;
  },
  /*core.Duration.minutesPerHour*/get minutesPerHour() {
    return 60;
  },
  /*core.Duration.hoursPerDay*/get hoursPerDay() {
    return 24;
  },
  /*core.Duration.microsecondsPerSecond*/get microsecondsPerSecond() {
    return 1000 * 1000;
  },
  /*core.Duration.microsecondsPerMinute*/get microsecondsPerMinute() {
    return 1000000 * 60;
  },
  /*core.Duration.microsecondsPerHour*/get microsecondsPerHour() {
    return 60000000 * 60;
  },
  /*core.Duration.microsecondsPerDay*/get microsecondsPerDay() {
    return 3600000000 * 24;
  },
  /*core.Duration.millisecondsPerMinute*/get millisecondsPerMinute() {
    return 1000 * 60;
  },
  /*core.Duration.millisecondsPerHour*/get millisecondsPerHour() {
    return 60000 * 60;
  },
  /*core.Duration.millisecondsPerDay*/get millisecondsPerDay() {
    return 3600000 * 24;
  },
  /*core.Duration.secondsPerHour*/get secondsPerHour() {
    return 60 * 60;
  },
  /*core.Duration.secondsPerDay*/get secondsPerDay() {
    return 3600 * 24;
  },
  /*core.Duration.minutesPerDay*/get minutesPerDay() {
    return 60 * 24;
  },
  /*core.Duration.zero*/get zero() {
    return dart.const(new core.Duration.new({seconds: 0}));
  }
});
core.TypeError = class TypeError extends core.AssertionError {};
(core.TypeError.new = function() {
  core.TypeError.__proto__.new.call(this);
}).prototype = core.TypeError.prototype;
dart.addTypeTests(core.TypeError);
dart.setLibraryUri(core.TypeError, "dart:core");
core.CastError = class CastError extends core.Error {};
(core.CastError.new = function() {
  core.CastError.__proto__.new.call(this);
}).prototype = core.CastError.prototype;
dart.addTypeTests(core.CastError);
dart.setLibraryUri(core.CastError, "dart:core");
core.NullThrownError = class NullThrownError extends core.Error {
  toString() {
    return "Throw of null.";
  }
};
(core.NullThrownError.new = function() {
  core.NullThrownError.__proto__.new.call(this);
}).prototype = core.NullThrownError.prototype;
dart.addTypeTests(core.NullThrownError);
dart.setLibraryUri(core.NullThrownError, "dart:core");
dart.defineExtensionMethods(core.NullThrownError, ['toString']);
const _hasValue = dart.privateName(core, "_hasValue");
const _errorName = dart.privateName(core, "_errorName");
const _errorExplanation = dart.privateName(core, "_errorExplanation");
core.ArgumentError = class ArgumentError extends core.Error {
  get invalidValue() {
    return this[invalidValue];
  }
  set invalidValue(value) {
    super.invalidValue = value;
  }
  get name() {
    return this[name$1];
  }
  set name(value) {
    super.name = value;
  }
  get message() {
    return this[message$2];
  }
  set message(value) {
    super.message = value;
  }
  static checkNotNull(argument, name) {
    if (name === void 0) name = null;
    if (argument == null) dart.throw(new core.ArgumentError.notNull(name));
  }
  get [_errorName]() {
    return "Invalid argument" + (!dart.test(this[_hasValue]) ? "(s)" : "");
  }
  get [_errorExplanation]() {
    return "";
  }
  toString() {
    let nameString = "";
    if (this[$name] != null) {
      nameString = " (" + dart.str(this[$name]) + ")";
    }
    let message = this[$message] == null ? "" : ": " + dart.str(this[$message]);
    let prefix = dart.str(this[_errorName]) + nameString + message;
    if (!dart.test(this[_hasValue])) return prefix;
    let explanation = this[_errorExplanation];
    let errorValue = core.Error.safeToString(this[$invalidValue]);
    return prefix + dart.str(explanation) + ": " + dart.str(errorValue);
  }
};
(core.ArgumentError.new = function(message) {
  if (message === void 0) message = null;
  this[message$2] = message;
  this[invalidValue] = null;
  this[_hasValue] = false;
  this[name$1] = null;
  core.ArgumentError.__proto__.new.call(this);
}).prototype = core.ArgumentError.prototype;
(core.ArgumentError.value = function(value, name, message) {
  if (name === void 0) name = null;
  if (message === void 0) message = null;
  this[name$1] = name;
  this[message$2] = message;
  this[invalidValue] = value;
  this[_hasValue] = true;
  core.ArgumentError.__proto__.new.call(this);
}).prototype = core.ArgumentError.prototype;
(core.ArgumentError.notNull = function(name) {
  if (name === void 0) name = null;
  this[name$1] = name;
  this[_hasValue] = false;
  this[message$2] = "Must not be null";
  this[invalidValue] = null;
  core.ArgumentError.__proto__.new.call(this);
}).prototype = core.ArgumentError.prototype;
dart.addTypeTests(core.ArgumentError);
const invalidValue = Symbol("ArgumentError.invalidValue");
const name$1 = Symbol("ArgumentError.name");
const message$2 = Symbol("ArgumentError.message");
dart.setGetterSignature(core.ArgumentError, () => ({
  __proto__: dart.getGetters(core.ArgumentError.__proto__),
  [_errorName]: core.String,
  [_errorExplanation]: core.String
}));
dart.setLibraryUri(core.ArgumentError, "dart:core");
dart.setFieldSignature(core.ArgumentError, () => ({
  __proto__: dart.getFields(core.ArgumentError.__proto__),
  [_hasValue]: dart.finalFieldType(core.bool),
  invalidValue: dart.finalFieldType(dart.dynamic),
  name: dart.finalFieldType(core.String),
  message: dart.finalFieldType(dart.dynamic)
}));
dart.defineExtensionMethods(core.ArgumentError, ['toString']);
dart.defineExtensionAccessors(core.ArgumentError, ['invalidValue', 'name', 'message']);
core.RangeError = class RangeError extends core.ArgumentError {
  get start() {
    return this[start];
  }
  set start(value) {
    super.start = value;
  }
  get end() {
    return this[end];
  }
  set end(value) {
    super.end = value;
  }
  static index(index, indexable, name, message, length) {
    return new core.IndexError.new(index, indexable, name, message, length);
  }
  static checkValueInInterval(value, minValue, maxValue, name, message) {
    if (name === void 0) name = null;
    if (message === void 0) message = null;
    if (dart.notNull(value) < dart.notNull(minValue) || dart.notNull(value) > dart.notNull(maxValue)) {
      dart.throw(new core.RangeError.range(value, minValue, maxValue, name, message));
    }
  }
  static checkValidIndex(index, indexable, name, length, message) {
    if (name === void 0) name = null;
    if (length === void 0) length = null;
    if (message === void 0) message = null;
    let t = length;
    t == null ? length = core.int._check(dart.dload(indexable, 'length')) : t;
    if (0 > dart.notNull(index) || dart.notNull(index) >= dart.notNull(length)) {
      let t$ = name;
      t$ == null ? name = "index" : t$;
      dart.throw(core.RangeError.index(index, indexable, name, message, length));
    }
  }
  static checkValidRange(start, end, length, startName, endName, message) {
    if (startName === void 0) startName = null;
    if (endName === void 0) endName = null;
    if (message === void 0) message = null;
    if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(length)) {
      let t = startName;
      t == null ? startName = "start" : t;
      dart.throw(new core.RangeError.range(start, 0, length, startName, message));
    }
    if (end != null) {
      if (dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length)) {
        let t$ = endName;
        t$ == null ? endName = "end" : t$;
        dart.throw(new core.RangeError.range(end, start, length, endName, message));
      }
      return end;
    }
    return length;
  }
  static checkNotNegative(value, name, message) {
    if (name === void 0) name = null;
    if (message === void 0) message = null;
    if (dart.notNull(value) < 0) dart.throw(new core.RangeError.range(value, 0, null, name, message));
  }
  get [_errorName]() {
    return "RangeError";
  }
  get [_errorExplanation]() {
    if (!dart.test(this[_hasValue])) dart.assertFailed(null, "dart:core/errors.dart", 355, 12, "_hasValue");
    let explanation = "";
    if (this.start == null) {
      if (this.end != null) {
        explanation = ": Not less than or equal to " + dart.str(this.end);
      }
    } else if (this.end == null) {
      explanation = ": Not greater than or equal to " + dart.str(this.start);
    } else if (dart.notNull(this.end) > dart.notNull(this.start)) {
      explanation = ": Not in range " + dart.str(this.start) + ".." + dart.str(this.end) + ", inclusive";
    } else if (dart.notNull(this.end) < dart.notNull(this.start)) {
      explanation = ": Valid value range is empty";
    } else {
      explanation = ": Only valid value is " + dart.str(this.start);
    }
    return explanation;
  }
};
(core.RangeError.new = function(message) {
  this[start] = null;
  this[end] = null;
  core.RangeError.__proto__.new.call(this, message);
}).prototype = core.RangeError.prototype;
(core.RangeError.value = function(value, name, message) {
  if (name === void 0) name = null;
  if (message === void 0) message = null;
  this[start] = null;
  this[end] = null;
  core.RangeError.__proto__.value.call(this, value, name, message != null ? message : "Value not in range");
}).prototype = core.RangeError.prototype;
(core.RangeError.range = function(invalidValue, minValue, maxValue, name, message) {
  if (name === void 0) name = null;
  if (message === void 0) message = null;
  this[start] = minValue;
  this[end] = maxValue;
  core.RangeError.__proto__.value.call(this, invalidValue, name, message != null ? message : "Invalid value");
}).prototype = core.RangeError.prototype;
dart.addTypeTests(core.RangeError);
const start = Symbol("RangeError.start");
const end = Symbol("RangeError.end");
dart.setLibraryUri(core.RangeError, "dart:core");
dart.setFieldSignature(core.RangeError, () => ({
  __proto__: dart.getFields(core.RangeError.__proto__),
  start: dart.finalFieldType(core.num),
  end: dart.finalFieldType(core.num)
}));
core.IndexError = class IndexError extends core.ArgumentError {
  get indexable() {
    return this[indexable$];
  }
  set indexable(value) {
    super.indexable = value;
  }
  get length() {
    return this[length$];
  }
  set length(value) {
    super.length = value;
  }
  get start() {
    return 0;
  }
  get end() {
    return dart.notNull(this.length) - 1;
  }
  get [_errorName]() {
    return "RangeError";
  }
  get [_errorExplanation]() {
    if (!dart.test(this[_hasValue])) dart.assertFailed(null, "dart:core/errors.dart", 411, 12, "_hasValue");
    let invalidValue = core.int._check(this.invalidValue);
    if (dart.notNull(invalidValue) < 0) {
      return ": index must not be negative";
    }
    if (this.length === 0) {
      return ": no indices are valid";
    }
    return ": index should be less than " + dart.str(this.length);
  }
};
(core.IndexError.new = function(invalidValue, indexable, name, message, length) {
  if (name === void 0) name = null;
  if (message === void 0) message = null;
  if (length === void 0) length = null;
  this[indexable$] = indexable;
  this[length$] = core.int._check((() => {
    let l = length;
    return l != null ? l : dart.dload(indexable, 'length');
  })());
  core.IndexError.__proto__.value.call(this, invalidValue, name, message != null ? message : "Index out of range");
}).prototype = core.IndexError.prototype;
dart.addTypeTests(core.IndexError);
const indexable$ = Symbol("IndexError.indexable");
const length$ = Symbol("IndexError.length");
core.IndexError[dart.implements] = () => [core.RangeError];
dart.setGetterSignature(core.IndexError, () => ({
  __proto__: dart.getGetters(core.IndexError.__proto__),
  start: core.int,
  end: core.int
}));
dart.setLibraryUri(core.IndexError, "dart:core");
dart.setFieldSignature(core.IndexError, () => ({
  __proto__: dart.getFields(core.IndexError.__proto__),
  indexable: dart.finalFieldType(dart.dynamic),
  length: dart.finalFieldType(core.int)
}));
const _className = dart.privateName(core, "_className");
core.AbstractClassInstantiationError = class AbstractClassInstantiationError extends core.Error {
  toString() {
    return "Cannot instantiate abstract class: '" + dart.str(this[_className]) + "'";
  }
};
(core.AbstractClassInstantiationError.new = function(className) {
  this[_className] = className;
  core.AbstractClassInstantiationError.__proto__.new.call(this);
}).prototype = core.AbstractClassInstantiationError.prototype;
dart.addTypeTests(core.AbstractClassInstantiationError);
dart.setLibraryUri(core.AbstractClassInstantiationError, "dart:core");
dart.setFieldSignature(core.AbstractClassInstantiationError, () => ({
  __proto__: dart.getFields(core.AbstractClassInstantiationError.__proto__),
  [_className]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core.AbstractClassInstantiationError, ['toString']);
const _receiver$ = dart.privateName(core, "_receiver");
const _memberName = dart.privateName(core, "_memberName");
const _arguments = dart.privateName(core, "_arguments");
const _namedArguments = dart.privateName(core, "_namedArguments");
const _existingArgumentNames = dart.privateName(core, "_existingArgumentNames");
const _invocation = dart.privateName(core, "_invocation");
core.NoSuchMethodError = class NoSuchMethodError extends core.Error {
  toString() {
    let sb = new core.StringBuffer.new("");
    let comma = "";
    if (this[_arguments] != null) {
      for (let argument of this[_arguments]) {
        sb.write(comma);
        sb.write(core.Error.safeToString(argument));
        comma = ", ";
      }
    }
    if (this[_namedArguments] != null) {
      this[_namedArguments][$forEach](dart.fn((key, value) => {
        sb.write(comma);
        sb.write(core._symbolToString(key));
        sb.write(": ");
        sb.write(core.Error.safeToString(value));
        comma = ", ";
      }, SymbolAnddynamicToNull()));
    }
    let memberName = core._symbolToString(this[_memberName]);
    let receiverText = core.Error.safeToString(this[_receiver$]);
    let actualParameters = dart.str(sb);
    let failureMessage = dart.InvocationImpl.is(this[_invocation]) ? dart.InvocationImpl.as(this[_invocation]).failureMessage : "method not found";
    if (this[_existingArgumentNames] == null) {
      return "NoSuchMethodError: '" + dart.str(memberName) + "'\n" + (dart.str(failureMessage) + "\n") + ("Receiver: " + dart.str(receiverText) + "\n") + ("Arguments: [" + actualParameters + "]");
    } else {
      let formalParameters = this[_existingArgumentNames][$join](", ");
      return "NoSuchMethodError: incorrect number of arguments passed to " + ("method named '" + dart.str(memberName) + "'\n") + ("Receiver: " + dart.str(receiverText) + "\n") + ("Tried calling: " + dart.str(memberName) + "(" + actualParameters + ")\n") + ("Found: " + dart.str(memberName) + "(" + dart.str(formalParameters) + ")");
    }
  }
};
(core.NoSuchMethodError.withInvocation = function(receiver, invocation) {
  this[_receiver$] = receiver;
  this[_memberName] = invocation.memberName;
  this[_arguments] = invocation.positionalArguments;
  this[_namedArguments] = invocation.namedArguments;
  this[_existingArgumentNames] = null;
  this[_invocation] = invocation;
  core.NoSuchMethodError.__proto__.new.call(this);
}).prototype = core.NoSuchMethodError.prototype;
(core.NoSuchMethodError.new = function(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
  if (existingArgumentNames === void 0) existingArgumentNames = null;
  this[_receiver$] = receiver;
  this[_memberName] = memberName;
  this[_arguments] = positionalArguments;
  this[_namedArguments] = namedArguments;
  this[_existingArgumentNames] = existingArgumentNames;
  this[_invocation] = null;
  core.NoSuchMethodError.__proto__.new.call(this);
}).prototype = core.NoSuchMethodError.prototype;
dart.addTypeTests(core.NoSuchMethodError);
dart.setLibraryUri(core.NoSuchMethodError, "dart:core");
dart.setFieldSignature(core.NoSuchMethodError, () => ({
  __proto__: dart.getFields(core.NoSuchMethodError.__proto__),
  [_receiver$]: dart.finalFieldType(core.Object),
  [_memberName]: dart.finalFieldType(core.Symbol),
  [_arguments]: dart.finalFieldType(core.List),
  [_namedArguments]: dart.finalFieldType(MapOfSymbol$dynamic()),
  [_existingArgumentNames]: dart.finalFieldType(core.List),
  [_invocation]: dart.finalFieldType(core.Invocation)
}));
dart.defineExtensionMethods(core.NoSuchMethodError, ['toString']);
core.UnsupportedError = class UnsupportedError extends core.Error {
  get message() {
    return this[message$3];
  }
  set message(value) {
    super.message = value;
  }
  toString() {
    return "Unsupported operation: " + dart.str(this.message);
  }
};
(core.UnsupportedError.new = function(message) {
  this[message$3] = message;
  core.UnsupportedError.__proto__.new.call(this);
}).prototype = core.UnsupportedError.prototype;
dart.addTypeTests(core.UnsupportedError);
const message$3 = Symbol("UnsupportedError.message");
dart.setLibraryUri(core.UnsupportedError, "dart:core");
dart.setFieldSignature(core.UnsupportedError, () => ({
  __proto__: dart.getFields(core.UnsupportedError.__proto__),
  message: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core.UnsupportedError, ['toString']);
core.UnimplementedError = class UnimplementedError extends core.Error {
  get message() {
    return this[message$4];
  }
  set message(value) {
    super.message = value;
  }
  toString() {
    return this.message != null ? "UnimplementedError: " + dart.str(this.message) : "UnimplementedError";
  }
};
(core.UnimplementedError.new = function(message) {
  if (message === void 0) message = null;
  this[message$4] = message;
  core.UnimplementedError.__proto__.new.call(this);
}).prototype = core.UnimplementedError.prototype;
dart.addTypeTests(core.UnimplementedError);
const message$4 = Symbol("UnimplementedError.message");
core.UnimplementedError[dart.implements] = () => [core.UnsupportedError];
dart.setLibraryUri(core.UnimplementedError, "dart:core");
dart.setFieldSignature(core.UnimplementedError, () => ({
  __proto__: dart.getFields(core.UnimplementedError.__proto__),
  message: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core.UnimplementedError, ['toString']);
core.StateError = class StateError extends core.Error {
  get message() {
    return this[message$5];
  }
  set message(value) {
    super.message = value;
  }
  toString() {
    return "Bad state: " + dart.str(this.message);
  }
};
(core.StateError.new = function(message) {
  this[message$5] = message;
  core.StateError.__proto__.new.call(this);
}).prototype = core.StateError.prototype;
dart.addTypeTests(core.StateError);
const message$5 = Symbol("StateError.message");
dart.setLibraryUri(core.StateError, "dart:core");
dart.setFieldSignature(core.StateError, () => ({
  __proto__: dart.getFields(core.StateError.__proto__),
  message: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core.StateError, ['toString']);
core.ConcurrentModificationError = class ConcurrentModificationError extends core.Error {
  get modifiedObject() {
    return this[modifiedObject$];
  }
  set modifiedObject(value) {
    super.modifiedObject = value;
  }
  toString() {
    if (this.modifiedObject == null) {
      return "Concurrent modification during iteration.";
    }
    return "Concurrent modification during iteration: " + (dart.str(core.Error.safeToString(this.modifiedObject)) + ".");
  }
};
(core.ConcurrentModificationError.new = function(modifiedObject) {
  if (modifiedObject === void 0) modifiedObject = null;
  this[modifiedObject$] = modifiedObject;
  core.ConcurrentModificationError.__proto__.new.call(this);
}).prototype = core.ConcurrentModificationError.prototype;
dart.addTypeTests(core.ConcurrentModificationError);
const modifiedObject$ = Symbol("ConcurrentModificationError.modifiedObject");
dart.setLibraryUri(core.ConcurrentModificationError, "dart:core");
dart.setFieldSignature(core.ConcurrentModificationError, () => ({
  __proto__: dart.getFields(core.ConcurrentModificationError.__proto__),
  modifiedObject: dart.finalFieldType(core.Object)
}));
dart.defineExtensionMethods(core.ConcurrentModificationError, ['toString']);
core.OutOfMemoryError = class OutOfMemoryError extends core.Object {
  toString() {
    return "Out of Memory";
  }
  get stackTrace() {
    return null;
  }
};
(core.OutOfMemoryError.new = function() {
}).prototype = core.OutOfMemoryError.prototype;
dart.addTypeTests(core.OutOfMemoryError);
core.OutOfMemoryError[dart.implements] = () => [core.Error];
dart.setGetterSignature(core.OutOfMemoryError, () => ({
  __proto__: dart.getGetters(core.OutOfMemoryError.__proto__),
  stackTrace: core.StackTrace,
  [$stackTrace]: core.StackTrace
}));
dart.setLibraryUri(core.OutOfMemoryError, "dart:core");
dart.defineExtensionMethods(core.OutOfMemoryError, ['toString']);
dart.defineExtensionAccessors(core.OutOfMemoryError, ['stackTrace']);
core.StackOverflowError = class StackOverflowError extends core.Object {
  toString() {
    return "Stack Overflow";
  }
  get stackTrace() {
    return null;
  }
};
(core.StackOverflowError.new = function() {
}).prototype = core.StackOverflowError.prototype;
dart.addTypeTests(core.StackOverflowError);
core.StackOverflowError[dart.implements] = () => [core.Error];
dart.setGetterSignature(core.StackOverflowError, () => ({
  __proto__: dart.getGetters(core.StackOverflowError.__proto__),
  stackTrace: core.StackTrace,
  [$stackTrace]: core.StackTrace
}));
dart.setLibraryUri(core.StackOverflowError, "dart:core");
dart.defineExtensionMethods(core.StackOverflowError, ['toString']);
dart.defineExtensionAccessors(core.StackOverflowError, ['stackTrace']);
core.CyclicInitializationError = class CyclicInitializationError extends core.Error {
  get variableName() {
    return this[variableName$];
  }
  set variableName(value) {
    super.variableName = value;
  }
  toString() {
    return this.variableName == null ? "Reading static variable during its initialization" : "Reading static variable '" + dart.str(this.variableName) + "' during its initialization";
  }
};
(core.CyclicInitializationError.new = function(variableName) {
  if (variableName === void 0) variableName = null;
  this[variableName$] = variableName;
  core.CyclicInitializationError.__proto__.new.call(this);
}).prototype = core.CyclicInitializationError.prototype;
dart.addTypeTests(core.CyclicInitializationError);
const variableName$ = Symbol("CyclicInitializationError.variableName");
dart.setLibraryUri(core.CyclicInitializationError, "dart:core");
dart.setFieldSignature(core.CyclicInitializationError, () => ({
  __proto__: dart.getFields(core.CyclicInitializationError.__proto__),
  variableName: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core.CyclicInitializationError, ['toString']);
core.Exception = class Exception extends core.Object {
  static new(message) {
    if (message === void 0) message = null;
    return new core._Exception.new(message);
  }
};
(core.Exception[dart.mixinNew] = function() {
}).prototype = core.Exception.prototype;
dart.addTypeTests(core.Exception);
dart.setLibraryUri(core.Exception, "dart:core");
core._Exception = class _Exception extends core.Object {
  toString() {
    if (this.message == null) return "Exception";
    return "Exception: " + dart.str(this.message);
  }
};
(core._Exception.new = function(message) {
  if (message === void 0) message = null;
  this.message = message;
}).prototype = core._Exception.prototype;
dart.addTypeTests(core._Exception);
core._Exception[dart.implements] = () => [core.Exception];
dart.setLibraryUri(core._Exception, "dart:core");
dart.setFieldSignature(core._Exception, () => ({
  __proto__: dart.getFields(core._Exception.__proto__),
  message: dart.finalFieldType(dart.dynamic)
}));
dart.defineExtensionMethods(core._Exception, ['toString']);
core.FormatException = class FormatException extends core.Object {
  get message() {
    return this[message$6];
  }
  set message(value) {
    super.message = value;
  }
  get source() {
    return this[source$];
  }
  set source(value) {
    super.source = value;
  }
  get offset() {
    return this[offset$];
  }
  set offset(value) {
    super.offset = value;
  }
  toString() {
    let report = "FormatException";
    if (this.message != null && "" !== this.message) {
      report = report + ": " + dart.str(this.message);
    }
    let offset = this.offset;
    let objectSource = this.source;
    if (typeof objectSource == 'string') {
      let source = objectSource;
      if (offset != null && (dart.notNull(offset) < 0 || dart.notNull(offset) > source.length)) {
        offset = null;
      }
      if (offset == null) {
        if (source.length > 78) {
          source = source[$substring](0, 75) + "...";
        }
        return report + "\n" + dart.str(source);
      }
      let lineNum = 1;
      let lineStart = 0;
      let previousCharWasCR = false;
      for (let i = 0; i < dart.notNull(offset); i++) {
        let char = source[$codeUnitAt](i);
        if (char === 10) {
          if (lineStart !== i || !previousCharWasCR) {
            lineNum++;
          }
          lineStart = i + 1;
          previousCharWasCR = false;
        } else if (char === 13) {
          lineNum++;
          lineStart = i + 1;
          previousCharWasCR = true;
        }
      }
      if (lineNum > 1) {
        report = report + (" (at line " + dart.str(lineNum) + ", character " + dart.str(dart.notNull(offset) - lineStart + 1) + ")\n");
      } else {
        report = report + (" (at character " + dart.str(dart.notNull(offset) + 1) + ")\n");
      }
      let lineEnd = source.length;
      for (let i = offset; dart.notNull(i) < source.length; i = dart.notNull(i) + 1) {
        let char = source[$codeUnitAt](i);
        if (char === 10 || char === 13) {
          lineEnd = i;
          break;
        }
      }
      let length = dart.notNull(lineEnd) - lineStart;
      let start = lineStart;
      let end = lineEnd;
      let prefix = "";
      let postfix = "";
      if (length > 78) {
        let index = dart.notNull(offset) - lineStart;
        if (index < 75) {
          end = start + 75;
          postfix = "...";
        } else if (dart.notNull(end) - dart.notNull(offset) < 75) {
          start = dart.notNull(end) - 75;
          prefix = "...";
        } else {
          start = dart.notNull(offset) - 36;
          end = dart.notNull(offset) + 36;
          prefix = postfix = "...";
        }
      }
      let slice = source[$substring](start, end);
      let markOffset = dart.notNull(offset) - start + prefix.length;
      return report + prefix + slice + postfix + "\n" + " "[$times](markOffset) + "^\n";
    } else {
      if (offset != null) {
        report = report + (" (at offset " + dart.str(offset) + ")");
      }
      return report;
    }
  }
};
(core.FormatException.new = function(message, source, offset) {
  if (message === void 0) message = "";
  if (source === void 0) source = null;
  if (offset === void 0) offset = null;
  this[message$6] = message;
  this[source$] = source;
  this[offset$] = offset;
}).prototype = core.FormatException.prototype;
dart.addTypeTests(core.FormatException);
const message$6 = Symbol("FormatException.message");
const source$ = Symbol("FormatException.source");
const offset$ = Symbol("FormatException.offset");
core.FormatException[dart.implements] = () => [core.Exception];
dart.setLibraryUri(core.FormatException, "dart:core");
dart.setFieldSignature(core.FormatException, () => ({
  __proto__: dart.getFields(core.FormatException.__proto__),
  message: dart.finalFieldType(core.String),
  source: dart.finalFieldType(dart.dynamic),
  offset: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(core.FormatException, ['toString']);
core.IntegerDivisionByZeroException = class IntegerDivisionByZeroException extends core.Object {
  toString() {
    return "IntegerDivisionByZeroException";
  }
};
(core.IntegerDivisionByZeroException.new = function() {
}).prototype = core.IntegerDivisionByZeroException.prototype;
dart.addTypeTests(core.IntegerDivisionByZeroException);
core.IntegerDivisionByZeroException[dart.implements] = () => [core.Exception];
dart.setLibraryUri(core.IntegerDivisionByZeroException, "dart:core");
dart.defineExtensionMethods(core.IntegerDivisionByZeroException, ['toString']);
const _getKey = dart.privateName(core, "_getKey");
const _is_Expando_default = Symbol('_is_Expando_default');
core.Expando$ = dart.generic(T => {
  class Expando extends core.Object {
    get name() {
      return this[name$];
    }
    set name(value) {
      super.name = value;
    }
    toString() {
      return "Expando:" + dart.str(this.name);
    }
    _get(object) {
      let values = _js_helper.Primitives.getProperty(object, "expando$values");
      return T._check(values == null ? null : _js_helper.Primitives.getProperty(values, this[_getKey]()));
    }
    _set(object, value) {
      T._check(value);
      let values = _js_helper.Primitives.getProperty(object, "expando$values");
      if (values == null) {
        values = new core.Object.new();
        _js_helper.Primitives.setProperty(object, "expando$values", values);
      }
      _js_helper.Primitives.setProperty(values, this[_getKey](), value);
      return value;
    }
    [_getKey]() {
      let key = core.String._check(_js_helper.Primitives.getProperty(this, "expando$key"));
      if (key == null) {
        key = "expando$key$" + dart.str((() => {
          let x = core.Expando._keyCount;
          core.Expando._keyCount = dart.notNull(x) + 1;
          return x;
        })());
        _js_helper.Primitives.setProperty(this, "expando$key", key);
      }
      return key;
    }
  }
  (Expando.new = function(name) {
    if (name === void 0) name = null;
    this[name$] = name;
  }).prototype = Expando.prototype;
  dart.addTypeTests(Expando);
  Expando.prototype[_is_Expando_default] = true;
  const name$ = Symbol("Expando.name");
  dart.setMethodSignature(Expando, () => ({
    __proto__: dart.getMethods(Expando.__proto__),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, []),
    _get: dart.fnType(T, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [_getKey]: dart.fnType(core.String, [])
  }));
  dart.setLibraryUri(Expando, "dart:core");
  dart.setFieldSignature(Expando, () => ({
    __proto__: dart.getFields(Expando.__proto__),
    name: dart.finalFieldType(core.String)
  }));
  dart.defineExtensionMethods(Expando, ['toString']);
  return Expando;
});
core.Expando = core.Expando$();
dart.defineLazy(core.Expando, {
  /*core.Expando._KEY_PROPERTY_NAME*/get _KEY_PROPERTY_NAME() {
    return "expando$key";
  },
  /*core.Expando._EXPANDO_PROPERTY_NAME*/get _EXPANDO_PROPERTY_NAME() {
    return "expando$values";
  },
  /*core.Expando._keyCount*/get _keyCount() {
    return 0;
  },
  set _keyCount(_) {}
});
dart.addTypeTests(core.Expando, _is_Expando_default);
core.Function = class Function extends core.Object {
  static apply(f, positionalArguments, namedArguments) {
    if (namedArguments === void 0) namedArguments = null;
    let t = positionalArguments;
    t == null ? positionalArguments = [] : t;
    if (namedArguments != null && dart.test(namedArguments[$isNotEmpty])) {
      let map = {};
      namedArguments[$forEach](dart.fn((symbol, arg) => {
        map[core._symbolToString(symbol)] = arg;
      }, SymbolAnddynamicToNull()));
      return dart.dcall(f, positionalArguments, map);
    }
    return dart.dcall(f, positionalArguments);
  }
  static _toMangledNames(namedArguments) {
    let result = new (IdentityMapOfString$dynamic()).new();
    namedArguments[$forEach](dart.fn((symbol, value) => {
      result[$_set](core._symbolToString(symbol), value);
    }, SymbolAnddynamicToNull()));
    return result;
  }
};
(core.Function.new = function() {
}).prototype = core.Function.prototype;
core.Function.is = function is_Function(o) {
  return typeof o == "function";
};
core.Function.as = function as_Function(o) {
  if (typeof o == "function" || o == null) return o;
  return dart.as(o, core.Function, false);
};
core.Function._check = function check_Function(o) {
  if (typeof o == "function" || o == null) return o;
  return dart.as(o, core.Function, true);
};
dart.setLibraryUri(core.Function, "dart:core");
core.identical = function(a, b) {
  return a == null ? b == null : a === b;
};
core.identityHashCode = function(object) {
  if (object == null) return 0;
  let hash = object[dart.identityHashCode_];
  if (hash == null) {
    hash = Math.random() * 0x3fffffff | 0;
    object[dart.identityHashCode_] = hash;
  }
  return hash;
};
const _positional = dart.privateName(core, "_positional");
let const$53;
const _named = dart.privateName(core, "_named");
let const$54;
let const$55;
let const$56;
let const$57;
let const$58;
let const$59;
core._Invocation = class _Invocation extends core.Object {
  get positionalArguments() {
    return this[_positional] != null ? this[_positional] : const$57 || (const$57 = dart.constList([], core.Object));
  }
  get namedArguments() {
    return this[_named] != null ? this[_named] : const$58 || (const$58 = dart.constMap(core.Symbol, core.Object, []));
  }
  get isMethod() {
    return this[_named] != null;
  }
  get isGetter() {
    return this[_positional] == null;
  }
  get isSetter() {
    return this[_positional] != null && this[_named] == null;
  }
  get isAccessor() {
    return this[_named] == null;
  }
  static _ensureNonNullTypes(types) {
    if (types == null) return const$59 || (const$59 = dart.constList([], core.Type));
    for (let i = 0; i < dart.notNull(types[$length]); i++) {
      if (types[$_get](i) == null) {
        dart.throw(new core.ArgumentError.new("Type arguments must be non-null, was null at index " + dart.str(i) + "."));
      }
    }
    return types;
  }
  static _makeUnmodifiable(T, elements) {
    if (elements == null) return null;
    return core.List$(T).unmodifiable(elements);
  }
};
(core._Invocation.method = function(memberName, types, positional, named) {
  this.memberName = memberName;
  this.typeArguments = core._Invocation._ensureNonNullTypes(core._Invocation._makeUnmodifiable(core.Type, types));
  let l = core._Invocation._makeUnmodifiable(core.Object, positional);
  this[_positional] = l != null ? l : const$53 || (const$53 = dart.constList([], core.Object));
  this[_named] = named == null || dart.test(named[$isEmpty]) ? const$54 || (const$54 = dart.constMap(core.Symbol, core.Object, [])) : MapOfSymbol$Object().unmodifiable(named);
}).prototype = core._Invocation.prototype;
(core._Invocation.getter = function(memberName) {
  this.memberName = memberName;
  this.typeArguments = const$55 || (const$55 = dart.constList([], core.Type));
  this[_positional] = null;
  this[_named] = null;
}).prototype = core._Invocation.prototype;
(core._Invocation.setter = function(memberName, argument) {
  this.memberName = memberName;
  this.typeArguments = const$56 || (const$56 = dart.constList([], core.Type));
  this[_positional] = ListOfObject().unmodifiable([argument]);
  this[_named] = null;
}).prototype = core._Invocation.prototype;
dart.addTypeTests(core._Invocation);
core._Invocation[dart.implements] = () => [core.Invocation];
dart.setGetterSignature(core._Invocation, () => ({
  __proto__: dart.getGetters(core._Invocation.__proto__),
  positionalArguments: core.List,
  namedArguments: core.Map$(core.Symbol, dart.dynamic),
  isMethod: core.bool,
  isGetter: core.bool,
  isSetter: core.bool,
  isAccessor: core.bool
}));
dart.setLibraryUri(core._Invocation, "dart:core");
dart.setFieldSignature(core._Invocation, () => ({
  __proto__: dart.getFields(core._Invocation.__proto__),
  memberName: dart.finalFieldType(core.Symbol),
  typeArguments: dart.finalFieldType(ListOfType()),
  [_positional]: dart.finalFieldType(ListOfObject()),
  [_named]: dart.finalFieldType(MapOfSymbol$Object())
}));
const _generator = dart.privateName(core, "_generator");
const _is__GeneratorIterable_default = Symbol('_is__GeneratorIterable_default');
core._GeneratorIterable$ = dart.generic(E => {
  let intToE = () => (intToE = dart.constFn(dart.fnType(E, [core.int])))();
  class _GeneratorIterable extends _internal.ListIterable$(E) {
    get length() {
      return this[length$];
    }
    set length(value) {
      super.length = value;
    }
    elementAt(index) {
      core.RangeError.checkValidIndex(index, this);
      return this[_generator](index);
    }
    static _id(n) {
      return n;
    }
  }
  (_GeneratorIterable.new = function(length, generator) {
    this[length$] = length;
    this[_generator] = generator != null ? generator : intToE().as(dart.fn(core._GeneratorIterable._id, intToint()));
    _GeneratorIterable.__proto__.new.call(this);
  }).prototype = _GeneratorIterable.prototype;
  dart.addTypeTests(_GeneratorIterable);
  _GeneratorIterable.prototype[_is__GeneratorIterable_default] = true;
  const length$ = Symbol("_GeneratorIterable.length");
  dart.setMethodSignature(_GeneratorIterable, () => ({
    __proto__: dart.getMethods(_GeneratorIterable.__proto__),
    elementAt: dart.fnType(E, [core.int]),
    [$elementAt]: dart.fnType(E, [core.int])
  }));
  dart.setLibraryUri(_GeneratorIterable, "dart:core");
  dart.setFieldSignature(_GeneratorIterable, () => ({
    __proto__: dart.getFields(_GeneratorIterable.__proto__),
    length: dart.finalFieldType(core.int),
    [_generator]: dart.finalFieldType(intToE())
  }));
  dart.defineExtensionMethods(_GeneratorIterable, ['elementAt']);
  dart.defineExtensionAccessors(_GeneratorIterable, ['length']);
  return _GeneratorIterable;
});
core._GeneratorIterable = core._GeneratorIterable$();
dart.addTypeTests(core._GeneratorIterable, _is__GeneratorIterable_default);
const _is_BidirectionalIterator_default = Symbol('_is_BidirectionalIterator_default');
core.BidirectionalIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class BidirectionalIterator extends core.Object {}
  (BidirectionalIterator.new = function() {
  }).prototype = BidirectionalIterator.prototype;
  dart.addTypeTests(BidirectionalIterator);
  BidirectionalIterator.prototype[_is_BidirectionalIterator_default] = true;
  BidirectionalIterator[dart.implements] = () => [IteratorOfE()];
  dart.setLibraryUri(BidirectionalIterator, "dart:core");
  return BidirectionalIterator;
});
core.BidirectionalIterator = core.BidirectionalIterator$();
dart.addTypeTests(core.BidirectionalIterator, _is_BidirectionalIterator_default);
core.Map$ = dart.generic((K, V) => {
  let LinkedMapOfK$V = () => (LinkedMapOfK$V = dart.constFn(_js_helper.LinkedMap$(K, V)))();
  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
  let UnmodifiableMapViewOfK$V = () => (UnmodifiableMapViewOfK$V = dart.constFn(collection.UnmodifiableMapView$(K, V)))();
  class Map extends core.Object {
    static new() {
      return new (LinkedMapOfK$V()).new();
    }
    static from(other) {
      return LinkedHashMapOfK$V().from(other);
    }
    static of(other) {
      return LinkedHashMapOfK$V().of(other);
    }
    static unmodifiable(other) {
      return new (UnmodifiableMapViewOfK$V()).new(MapOfK$V().from(other));
    }
    static identity() {
      return LinkedHashMapOfK$V().identity();
    }
    static fromIterable(iterable, opts) {
      return LinkedHashMapOfK$V().fromIterable(iterable, opts);
    }
    static fromIterables(keys, values) {
      return LinkedHashMapOfK$V().fromIterables(keys, values);
    }
    static castFrom(K, V, K2, V2, source) {
      return new (_internal.CastMap$(K, V, K2, V2)).new(source);
    }
    static fromEntries(entries) {
      let _ = new (LinkedMapOfK$V()).new();
      _[$addEntries](entries);
      return _;
    }
  }
  (Map[dart.mixinNew] = function() {
  }).prototype = Map.prototype;
  dart.addTypeTests(Map);
  Map.prototype[dart.isMap] = true;
  dart.setLibraryUri(Map, "dart:core");
  return Map;
});
core.Map = core.Map$();
dart.addTypeTests(core.Map, dart.isMap);
const _is_MapEntry_default = Symbol('_is_MapEntry_default');
core.MapEntry$ = dart.generic((K, V) => {
  let MapEntryOfK$V = () => (MapEntryOfK$V = dart.constFn(core.MapEntry$(K, V)))();
  class MapEntry extends core.Object {
    get key() {
      return this[key$];
    }
    set key(value) {
      super.key = value;
    }
    get value() {
      return this[value$];
    }
    set value(value) {
      super.value = value;
    }
    static new(key, value) {
      return new (MapEntryOfK$V()).__(key, value);
    }
    toString() {
      return "MapEntry(" + dart.str(this.key) + ": " + dart.str(this.value) + ")";
    }
  }
  (MapEntry.__ = function(key, value) {
    this[key$] = key;
    this[value$] = value;
  }).prototype = MapEntry.prototype;
  dart.addTypeTests(MapEntry);
  MapEntry.prototype[_is_MapEntry_default] = true;
  const key$ = Symbol("MapEntry.key");
  const value$ = Symbol("MapEntry.value");
  dart.setMethodSignature(MapEntry, () => ({
    __proto__: dart.getMethods(MapEntry.__proto__),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, [])
  }));
  dart.setLibraryUri(MapEntry, "dart:core");
  dart.setFieldSignature(MapEntry, () => ({
    __proto__: dart.getFields(MapEntry.__proto__),
    key: dart.finalFieldType(K),
    value: dart.finalFieldType(V)
  }));
  dart.defineExtensionMethods(MapEntry, ['toString']);
  return MapEntry;
});
core.MapEntry = core.MapEntry$();
dart.addTypeTests(core.MapEntry, _is_MapEntry_default);
core.Null = class Null extends core.Object {
  get hashCode() {
    return super.hashCode;
  }
  toString() {
    return "null";
  }
};
(core.Null[dart.mixinNew] = function() {
}).prototype = core.Null.prototype;
core.Null.is = function is_Null(o) {
  return o == null;
};
core.Null.as = function as_Null(o) {
  if (o == null) return o;
  return dart.as(o, core.Null, false);
};
core.Null._check = function check_Null(o) {
  if (o == null) return o;
  return dart.as(o, core.Null, true);
};
dart.setLibraryUri(core.Null, "dart:core");
dart.defineExtensionMethods(core.Null, ['toString']);
dart.defineExtensionAccessors(core.Null, ['hashCode']);
core.Pattern = class Pattern extends core.Object {};
(core.Pattern.new = function() {
}).prototype = core.Pattern.prototype;
dart.addTypeTests(core.Pattern);
dart.setLibraryUri(core.Pattern, "dart:core");
core.print = function(object) {
  let line = dart.str(object);
  if (_internal.printToZone == null) {
    _internal.printToConsole(line);
  } else {
    _internal.printToZone(line);
  }
};
core.RegExp = class RegExp extends core.Object {
  static new(source, opts) {
    let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
    let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
    let unicode = opts && 'unicode' in opts ? opts.unicode : false;
    let dotAll = opts && 'dotAll' in opts ? opts.dotAll : false;
    return new _js_helper.JSSyntaxRegExp.new(source, {multiLine: multiLine, caseSensitive: caseSensitive, unicode: unicode, dotAll: dotAll});
  }
  static escape(text) {
    return _js_helper.quoteStringForRegExp(text);
  }
};
(core.RegExp[dart.mixinNew] = function() {
}).prototype = core.RegExp.prototype;
dart.addTypeTests(core.RegExp);
core.RegExp[dart.implements] = () => [core.Pattern];
dart.setLibraryUri(core.RegExp, "dart:core");
const _is_Set_default = Symbol('_is_Set_default');
core.Set$ = dart.generic(E => {
  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
  class Set extends _internal.EfficientLengthIterable$(E) {
    static new() {
      return LinkedHashSetOfE().new();
    }
    static identity() {
      return LinkedHashSetOfE().identity();
    }
    static from(elements) {
      return LinkedHashSetOfE().from(elements);
    }
    static of(elements) {
      return LinkedHashSetOfE().of(elements);
    }
    static castFrom(S, T, source, opts) {
      let newSet = opts && 'newSet' in opts ? opts.newSet : null;
      return new (_internal.CastSet$(S, T)).new(source, newSet);
    }
  }
  dart.addTypeTests(Set);
  Set.prototype[_is_Set_default] = true;
  dart.setLibraryUri(Set, "dart:core");
  return Set;
});
core.Set = core.Set$();
dart.addTypeTests(core.Set, _is_Set_default);
const _is_Sink_default = Symbol('_is_Sink_default');
core.Sink$ = dart.generic(T => {
  class Sink extends core.Object {}
  (Sink.new = function() {
  }).prototype = Sink.prototype;
  dart.addTypeTests(Sink);
  Sink.prototype[_is_Sink_default] = true;
  dart.setLibraryUri(Sink, "dart:core");
  return Sink;
});
core.Sink = core.Sink$();
dart.addTypeTests(core.Sink, _is_Sink_default);
core.StackTrace = class StackTrace extends core.Object {
  static fromString(stackTraceString) {
    return new core._StringStackTrace.new(stackTraceString);
  }
  static get current() {
    return dart.stackTrace(Error());
  }
};
(core.StackTrace.new = function() {
}).prototype = core.StackTrace.prototype;
dart.addTypeTests(core.StackTrace);
dart.setLibraryUri(core.StackTrace, "dart:core");
const _stackTrace = dart.privateName(core, "_stackTrace");
core._StringStackTrace = class _StringStackTrace extends core.Object {
  toString() {
    return this[_stackTrace];
  }
};
(core._StringStackTrace.new = function(stackTrace) {
  this[_stackTrace] = stackTrace;
}).prototype = core._StringStackTrace.prototype;
dart.addTypeTests(core._StringStackTrace);
core._StringStackTrace[dart.implements] = () => [core.StackTrace];
dart.setLibraryUri(core._StringStackTrace, "dart:core");
dart.setFieldSignature(core._StringStackTrace, () => ({
  __proto__: dart.getFields(core._StringStackTrace.__proto__),
  [_stackTrace]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(core._StringStackTrace, ['toString']);
const _start$0 = dart.privateName(core, "_start");
const _stop = dart.privateName(core, "_stop");
core.Stopwatch = class Stopwatch extends core.Object {
  get frequency() {
    return core.Stopwatch._frequency;
  }
  start() {
    if (this[_stop] != null) {
      this[_start$0] = dart.notNull(this[_start$0]) + (dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_stop]));
      this[_stop] = null;
    }
  }
  stop() {
    let t = this[_stop];
    t == null ? this[_stop] = core.Stopwatch._now() : t;
  }
  reset() {
    let l = this[_stop];
    this[_start$0] = l != null ? l : core.Stopwatch._now();
  }
  get elapsedTicks() {
    return dart.notNull((() => {
      let l = this[_stop];
      return l != null ? l : core.Stopwatch._now();
    })()) - dart.notNull(this[_start$0]);
  }
  get elapsed() {
    return new core.Duration.new({microseconds: this.elapsedMicroseconds});
  }
  get elapsedMicroseconds() {
    let ticks = this.elapsedTicks;
    if (core.Stopwatch._frequency === 1000000) return ticks;
    if (!(core.Stopwatch._frequency === 1000)) dart.assertFailed(null, "dart:core/stopwatch.dart", 108, 12, "_frequency == 1000");
    return dart.notNull(ticks) * 1000;
  }
  get elapsedMilliseconds() {
    let ticks = this.elapsedTicks;
    if (core.Stopwatch._frequency === 1000) return ticks;
    if (!(core.Stopwatch._frequency === 1000000)) dart.assertFailed(null, "dart:core/stopwatch.dart", 118, 12, "_frequency == 1000000");
    return (dart.notNull(ticks) / 1000)[$truncate]();
  }
  get isRunning() {
    return this[_stop] == null;
  }
  static _initTicker() {
    _js_helper.Primitives.initTicker();
    core.Stopwatch._frequency = _js_helper.Primitives.timerFrequency;
  }
  static _now() {
    return dart.asInt(_js_helper.Primitives.timerTicks());
  }
};
(core.Stopwatch.new = function() {
  this[_start$0] = 0;
  this[_stop] = 0;
  if (core.Stopwatch._frequency == null) core.Stopwatch._initTicker();
}).prototype = core.Stopwatch.prototype;
dart.addTypeTests(core.Stopwatch);
dart.setMethodSignature(core.Stopwatch, () => ({
  __proto__: dart.getMethods(core.Stopwatch.__proto__),
  start: dart.fnType(dart.void, []),
  stop: dart.fnType(dart.void, []),
  reset: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(core.Stopwatch, () => ({
  __proto__: dart.getGetters(core.Stopwatch.__proto__),
  frequency: core.int,
  elapsedTicks: core.int,
  elapsed: core.Duration,
  elapsedMicroseconds: core.int,
  elapsedMilliseconds: core.int,
  isRunning: core.bool
}));
dart.setLibraryUri(core.Stopwatch, "dart:core");
dart.setFieldSignature(core.Stopwatch, () => ({
  __proto__: dart.getFields(core.Stopwatch.__proto__),
  [_start$0]: dart.fieldType(core.int),
  [_stop]: dart.fieldType(core.int)
}));
dart.defineLazy(core.Stopwatch, {
  /*core.Stopwatch._frequency*/get _frequency() {
    return null;
  },
  set _frequency(_) {}
});
core.Runes = class Runes extends core.Iterable$(core.int) {
  get string() {
    return this[string$];
  }
  set string(value) {
    super.string = value;
  }
  get iterator() {
    return new core.RuneIterator.new(this.string);
  }
  get last() {
    if (this.string.length === 0) {
      dart.throw(new core.StateError.new("No elements."));
    }
    let length = this.string.length;
    let code = this.string[$codeUnitAt](length - 1);
    if (dart.test(core._isTrailSurrogate(code)) && this.string.length > 1) {
      let previousCode = this.string[$codeUnitAt](length - 2);
      if (dart.test(core._isLeadSurrogate(previousCode))) {
        return core._combineSurrogatePair(previousCode, code);
      }
    }
    return code;
  }
};
(core.Runes.new = function(string) {
  this[string$] = string;
  core.Runes.__proto__.new.call(this);
}).prototype = core.Runes.prototype;
dart.addTypeTests(core.Runes);
const string$ = Symbol("Runes.string");
dart.setGetterSignature(core.Runes, () => ({
  __proto__: dart.getGetters(core.Runes.__proto__),
  iterator: core.RuneIterator,
  [$iterator]: core.RuneIterator,
  last: core.int,
  [$last]: core.int
}));
dart.setLibraryUri(core.Runes, "dart:core");
dart.setFieldSignature(core.Runes, () => ({
  __proto__: dart.getFields(core.Runes.__proto__),
  string: dart.finalFieldType(core.String)
}));
dart.defineExtensionAccessors(core.Runes, ['iterator', 'last']);
core._isLeadSurrogate = function(code) {
  return (dart.notNull(code) & 64512) === 55296;
};
core._isTrailSurrogate = function(code) {
  return (dart.notNull(code) & 64512) === 56320;
};
core._combineSurrogatePair = function(start, end) {
  return 65536 + ((dart.notNull(start) & 1023) << 10) + (dart.notNull(end) & 1023);
};
const _position$ = dart.privateName(core, "_position");
const _nextPosition = dart.privateName(core, "_nextPosition");
const _currentCodePoint = dart.privateName(core, "_currentCodePoint");
const _checkSplitSurrogate = dart.privateName(core, "_checkSplitSurrogate");
core.RuneIterator = class RuneIterator extends core.Object {
  get string() {
    return this[string$0];
  }
  set string(value) {
    super.string = value;
  }
  [_checkSplitSurrogate](index) {
    if (dart.notNull(index) > 0 && dart.notNull(index) < this.string.length && dart.test(core._isLeadSurrogate(this.string[$codeUnitAt](dart.notNull(index) - 1))) && dart.test(core._isTrailSurrogate(this.string[$codeUnitAt](index)))) {
      dart.throw(new core.ArgumentError.new("Index inside surrogate pair: " + dart.str(index)));
    }
  }
  get rawIndex() {
    return this[_position$] != this[_nextPosition] ? this[_position$] : null;
  }
  set rawIndex(rawIndex) {
    core.RangeError.checkValidIndex(rawIndex, this.string, "rawIndex");
    this.reset(rawIndex);
    this.moveNext();
  }
  reset(rawIndex) {
    if (rawIndex === void 0) rawIndex = 0;
    core.RangeError.checkValueInInterval(rawIndex, 0, this.string.length, "rawIndex");
    this[_checkSplitSurrogate](rawIndex);
    this[_position$] = this[_nextPosition] = rawIndex;
    this[_currentCodePoint] = null;
  }
  get current() {
    return this[_currentCodePoint];
  }
  get currentSize() {
    return dart.notNull(this[_nextPosition]) - dart.notNull(this[_position$]);
  }
  get currentAsString() {
    if (this[_position$] == this[_nextPosition]) return null;
    if (dart.notNull(this[_position$]) + 1 === this[_nextPosition]) return this.string[$_get](this[_position$]);
    return this.string[$substring](this[_position$], this[_nextPosition]);
  }
  moveNext() {
    this[_position$] = this[_nextPosition];
    if (this[_position$] === this.string.length) {
      this[_currentCodePoint] = null;
      return false;
    }
    let codeUnit = this.string[$codeUnitAt](this[_position$]);
    let nextPosition = dart.notNull(this[_position$]) + 1;
    if (dart.test(core._isLeadSurrogate(codeUnit)) && nextPosition < this.string.length) {
      let nextCodeUnit = this.string[$codeUnitAt](nextPosition);
      if (dart.test(core._isTrailSurrogate(nextCodeUnit))) {
        this[_nextPosition] = nextPosition + 1;
        this[_currentCodePoint] = core._combineSurrogatePair(codeUnit, nextCodeUnit);
        return true;
      }
    }
    this[_nextPosition] = nextPosition;
    this[_currentCodePoint] = codeUnit;
    return true;
  }
  movePrevious() {
    this[_nextPosition] = this[_position$];
    if (this[_position$] === 0) {
      this[_currentCodePoint] = null;
      return false;
    }
    let position = dart.notNull(this[_position$]) - 1;
    let codeUnit = this.string[$codeUnitAt](position);
    if (dart.test(core._isTrailSurrogate(codeUnit)) && position > 0) {
      let prevCodeUnit = this.string[$codeUnitAt](position - 1);
      if (dart.test(core._isLeadSurrogate(prevCodeUnit))) {
        this[_position$] = position - 1;
        this[_currentCodePoint] = core._combineSurrogatePair(prevCodeUnit, codeUnit);
        return true;
      }
    }
    this[_position$] = position;
    this[_currentCodePoint] = codeUnit;
    return true;
  }
};
(core.RuneIterator.new = function(string) {
  this[_currentCodePoint] = null;
  this[string$0] = string;
  this[_position$] = 0;
  this[_nextPosition] = 0;
}).prototype = core.RuneIterator.prototype;
(core.RuneIterator.at = function(string, index) {
  this[_currentCodePoint] = null;
  this[string$0] = string;
  this[_position$] = index;
  this[_nextPosition] = index;
  core.RangeError.checkValueInInterval(index, 0, string.length);
  this[_checkSplitSurrogate](index);
}).prototype = core.RuneIterator.prototype;
dart.addTypeTests(core.RuneIterator);
const string$0 = Symbol("RuneIterator.string");
core.RuneIterator[dart.implements] = () => [BidirectionalIteratorOfint()];
dart.setMethodSignature(core.RuneIterator, () => ({
  __proto__: dart.getMethods(core.RuneIterator.__proto__),
  [_checkSplitSurrogate]: dart.fnType(dart.void, [core.int]),
  reset: dart.fnType(dart.void, [], [core.int]),
  moveNext: dart.fnType(core.bool, []),
  movePrevious: dart.fnType(core.bool, [])
}));
dart.setGetterSignature(core.RuneIterator, () => ({
  __proto__: dart.getGetters(core.RuneIterator.__proto__),
  rawIndex: core.int,
  current: core.int,
  currentSize: core.int,
  currentAsString: core.String
}));
dart.setSetterSignature(core.RuneIterator, () => ({
  __proto__: dart.getSetters(core.RuneIterator.__proto__),
  rawIndex: core.int
}));
dart.setLibraryUri(core.RuneIterator, "dart:core");
dart.setFieldSignature(core.RuneIterator, () => ({
  __proto__: dart.getFields(core.RuneIterator.__proto__),
  string: dart.finalFieldType(core.String),
  [_position$]: dart.fieldType(core.int),
  [_nextPosition]: dart.fieldType(core.int),
  [_currentCodePoint]: dart.fieldType(core.int)
}));
core.Symbol = class Symbol extends core.Object {
  static new(name) {
    return new _internal.Symbol.new(name);
  }
};
(core.Symbol[dart.mixinNew] = function() {
}).prototype = core.Symbol.prototype;
dart.addTypeTests(core.Symbol);
dart.setLibraryUri(core.Symbol, "dart:core");
dart.defineLazy(core.Symbol, {
  /*core.Symbol.unaryMinus*/get unaryMinus() {
    return dart.const(core.Symbol.new("unary-"));
  },
  /*core.Symbol.empty*/get empty() {
    return dart.const(core.Symbol.new(""));
  }
});
dart.defineLazy(core, {
  /*core._SPACE*/get _SPACE() {
    return 32;
  },
  /*core._PERCENT*/get _PERCENT() {
    return 37;
  },
  /*core._AMPERSAND*/get _AMPERSAND() {
    return 38;
  },
  /*core._PLUS*/get _PLUS() {
    return 43;
  },
  /*core._DOT*/get _DOT() {
    return 46;
  },
  /*core._SLASH*/get _SLASH() {
    return 47;
  },
  /*core._COLON*/get _COLON() {
    return 58;
  },
  /*core._EQUALS*/get _EQUALS() {
    return 61;
  },
  /*core._UPPER_CASE_A*/get _UPPER_CASE_A() {
    return 65;
  },
  /*core._UPPER_CASE_Z*/get _UPPER_CASE_Z() {
    return 90;
  },
  /*core._LEFT_BRACKET*/get _LEFT_BRACKET() {
    return 91;
  },
  /*core._BACKSLASH*/get _BACKSLASH() {
    return 92;
  },
  /*core._RIGHT_BRACKET*/get _RIGHT_BRACKET() {
    return 93;
  },
  /*core._LOWER_CASE_A*/get _LOWER_CASE_A() {
    return 97;
  },
  /*core._LOWER_CASE_F*/get _LOWER_CASE_F() {
    return 102;
  },
  /*core._LOWER_CASE_Z*/get _LOWER_CASE_Z() {
    return 122;
  },
  /*core._hexDigits*/get _hexDigits() {
    return "0123456789ABCDEF";
  }
});
core.Uri = class Uri extends core.Object {
  static get base() {
    let uri = _js_helper.Primitives.currentUri();
    if (uri != null) return core.Uri.parse(uri);
    dart.throw(new core.UnsupportedError.new("'Uri.base' is not supported"));
  }
  static new(opts) {
    return core._Uri.new(opts);
  }
  static http(authority, unencodedPath, queryParameters) {
    return core._Uri.http(authority, unencodedPath, queryParameters);
  }
  static https(authority, unencodedPath, queryParameters) {
    return core._Uri.https(authority, unencodedPath, queryParameters);
  }
  static file(path, opts) {
    return core._Uri.file(path, opts);
  }
  static directory(path, opts) {
    return core._Uri.directory(path, opts);
  }
  static dataFromString(content, opts) {
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    let base64 = opts && 'base64' in opts ? opts.base64 : false;
    let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
    return data.uri;
  }
  static dataFromBytes(bytes, opts) {
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
    let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
    return data.uri;
  }
  get hasScheme() {
    return this.scheme[$isNotEmpty];
  }
  static parse(uri, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let t = end;
    t == null ? end = uri.length : t;
    if (dart.notNull(end) >= dart.notNull(start) + 5) {
      let dataDelta = core._startsWithData(uri, start);
      if (dataDelta === 0) {
        if (dart.notNull(start) > 0 || dart.notNull(end) < uri.length) uri = uri[$substring](start, end);
        return core.UriData._parse(uri, 5, null).uri;
      } else if (dataDelta === 32) {
        return core.UriData._parse(uri[$substring](dart.notNull(start) + 5, end), 0, null).uri;
      }
    }
    let indices = ListOfint().new(8);
    indices[$_set](0, 0);
    indices[$_set](1, dart.notNull(start) - 1);
    indices[$_set](2, dart.notNull(start) - 1);
    indices[$_set](7, dart.notNull(start) - 1);
    indices[$_set](3, start);
    indices[$_set](4, start);
    indices[$_set](5, end);
    indices[$_set](6, end);
    let state = core._scan(uri, start, end, 0, indices);
    if (dart.notNull(state) >= 14) {
      indices[$_set](7, end);
    }
    let schemeEnd = indices[$_get](1);
    if (dart.notNull(schemeEnd) >= dart.notNull(start)) {
      state = core._scan(uri, start, schemeEnd, 20, indices);
      if (state === 20) {
        indices[$_set](7, schemeEnd);
      }
    }
    let hostStart = dart.notNull(indices[$_get](2)) + 1;
    let portStart = indices[$_get](3);
    let pathStart = indices[$_get](4);
    let queryStart = indices[$_get](5);
    let fragmentStart = indices[$_get](6);
    let scheme = null;
    if (dart.notNull(fragmentStart) < dart.notNull(queryStart)) queryStart = fragmentStart;
    if (dart.notNull(pathStart) < hostStart) {
      pathStart = queryStart;
    } else if (dart.notNull(pathStart) <= dart.notNull(schemeEnd)) {
      pathStart = dart.notNull(schemeEnd) + 1;
    }
    if (dart.notNull(portStart) < hostStart) portStart = pathStart;
    if (!(hostStart === start || dart.notNull(schemeEnd) <= hostStart)) dart.assertFailed(null, "dart:core/uri.dart", 875, 12, "hostStart == start || schemeEnd <= hostStart");
    if (!(hostStart <= dart.notNull(portStart))) dart.assertFailed(null, "dart:core/uri.dart", 876, 12, "hostStart <= portStart");
    if (!(dart.notNull(schemeEnd) <= dart.notNull(pathStart))) dart.assertFailed(null, "dart:core/uri.dart", 877, 12, "schemeEnd <= pathStart");
    if (!(dart.notNull(portStart) <= dart.notNull(pathStart))) dart.assertFailed(null, "dart:core/uri.dart", 878, 12, "portStart <= pathStart");
    if (!(dart.notNull(pathStart) <= dart.notNull(queryStart))) dart.assertFailed(null, "dart:core/uri.dart", 879, 12, "pathStart <= queryStart");
    if (!(dart.notNull(queryStart) <= dart.notNull(fragmentStart))) dart.assertFailed(null, "dart:core/uri.dart", 880, 12, "queryStart <= fragmentStart");
    let isSimple = dart.notNull(indices[$_get](7)) < dart.notNull(start);
    if (isSimple) {
      if (hostStart > dart.notNull(schemeEnd) + 3) {
        isSimple = false;
      } else if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 1 === pathStart) {
        isSimple = false;
      } else if (dart.notNull(queryStart) < dart.notNull(end) && queryStart === dart.notNull(pathStart) + 2 && uri[$startsWith]("..", pathStart) || dart.notNull(queryStart) > dart.notNull(pathStart) + 2 && uri[$startsWith]("/..", dart.notNull(queryStart) - 3)) {
        isSimple = false;
      } else {
        if (schemeEnd === dart.notNull(start) + 4) {
          if (uri[$startsWith]("file", start)) {
            scheme = "file";
            if (hostStart <= dart.notNull(start)) {
              let schemeAuth = "file://";
              let delta = 2;
              if (!uri[$startsWith]("/", pathStart)) {
                schemeAuth = "file:///";
                delta = 3;
              }
              uri = schemeAuth + uri[$substring](pathStart, end);
              schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
              hostStart = 7;
              portStart = 7;
              pathStart = 7;
              queryStart = dart.notNull(queryStart) + (delta - dart.notNull(start));
              fragmentStart = dart.notNull(fragmentStart) + (delta - dart.notNull(start));
              start = 0;
              end = uri.length;
            } else if (pathStart == queryStart) {
              if (start === 0 && end === uri.length) {
                uri = uri[$replaceRange](pathStart, queryStart, "/");
                queryStart = dart.notNull(queryStart) + 1;
                fragmentStart = dart.notNull(fragmentStart) + 1;
                end = dart.notNull(end) + 1;
              } else {
                uri = uri[$substring](start, pathStart) + "/" + uri[$substring](queryStart, end);
                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
                hostStart = hostStart - dart.notNull(start);
                portStart = dart.notNull(portStart) - dart.notNull(start);
                pathStart = dart.notNull(pathStart) - dart.notNull(start);
                queryStart = dart.notNull(queryStart) + (1 - dart.notNull(start));
                fragmentStart = dart.notNull(fragmentStart) + (1 - dart.notNull(start));
                start = 0;
                end = uri.length;
              }
            }
          } else if (uri[$startsWith]("http", start)) {
            scheme = "http";
            if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 3 === pathStart && uri[$startsWith]("80", dart.notNull(portStart) + 1)) {
              if (start === 0 && end === uri.length) {
                uri = uri[$replaceRange](portStart, pathStart, "");
                pathStart = dart.notNull(pathStart) - 3;
                queryStart = dart.notNull(queryStart) - 3;
                fragmentStart = dart.notNull(fragmentStart) - 3;
                end = dart.notNull(end) - 3;
              } else {
                uri = uri[$substring](start, portStart) + uri[$substring](pathStart, end);
                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
                hostStart = hostStart - dart.notNull(start);
                portStart = dart.notNull(portStart) - dart.notNull(start);
                pathStart = dart.notNull(pathStart) - (3 + dart.notNull(start));
                queryStart = dart.notNull(queryStart) - (3 + dart.notNull(start));
                fragmentStart = dart.notNull(fragmentStart) - (3 + dart.notNull(start));
                start = 0;
                end = uri.length;
              }
            }
          }
        } else if (schemeEnd === dart.notNull(start) + 5 && uri[$startsWith]("https", start)) {
          scheme = "https";
          if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 4 === pathStart && uri[$startsWith]("443", dart.notNull(portStart) + 1)) {
            if (start === 0 && end === uri.length) {
              uri = uri[$replaceRange](portStart, pathStart, "");
              pathStart = dart.notNull(pathStart) - 4;
              queryStart = dart.notNull(queryStart) - 4;
              fragmentStart = dart.notNull(fragmentStart) - 4;
              end = dart.notNull(end) - 3;
            } else {
              uri = uri[$substring](start, portStart) + uri[$substring](pathStart, end);
              schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
              hostStart = hostStart - dart.notNull(start);
              portStart = dart.notNull(portStart) - dart.notNull(start);
              pathStart = dart.notNull(pathStart) - (4 + dart.notNull(start));
              queryStart = dart.notNull(queryStart) - (4 + dart.notNull(start));
              fragmentStart = dart.notNull(fragmentStart) - (4 + dart.notNull(start));
              start = 0;
              end = uri.length;
            }
          }
        }
      }
    }
    if (isSimple) {
      if (dart.notNull(start) > 0 || dart.notNull(end) < uri.length) {
        uri = uri[$substring](start, end);
        schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
        hostStart = hostStart - dart.notNull(start);
        portStart = dart.notNull(portStart) - dart.notNull(start);
        pathStart = dart.notNull(pathStart) - dart.notNull(start);
        queryStart = dart.notNull(queryStart) - dart.notNull(start);
        fragmentStart = dart.notNull(fragmentStart) - dart.notNull(start);
      }
      return new core._SimpleUri.new(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
    }
    return core._Uri.notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
  }
  static tryParse(uri, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    try {
      return core.Uri.parse(uri, start, end);
    } catch (e) {
      let ex = dart.getThrown(e);
      if (core.FormatException.is(ex)) {
        return null;
      } else
        throw e;
    }
  }
  static encodeComponent(component) {
    return core._Uri._uriEncode(core._Uri._unreserved2396Table, component, convert.utf8, false);
  }
  static encodeQueryComponent(component, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    return core._Uri._uriEncode(core._Uri._unreservedTable, component, encoding, true);
  }
  static decodeComponent(encodedComponent) {
    return core._Uri._uriDecode(encodedComponent, 0, encodedComponent.length, convert.utf8, false);
  }
  static decodeQueryComponent(encodedComponent, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    return core._Uri._uriDecode(encodedComponent, 0, encodedComponent.length, encoding, true);
  }
  static encodeFull(uri) {
    return core._Uri._uriEncode(core._Uri._encodeFullTable, uri, convert.utf8, false);
  }
  static decodeFull(uri) {
    return core._Uri._uriDecode(uri, 0, uri.length, convert.utf8, false);
  }
  static splitQueryString(query, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    return MapOfString$String()._check(query[$split]("&")[$fold](MapOfString$String(), new (IdentityMapOfString$String()).new(), dart.fn((map, element) => {
      let index = element[$indexOf]("=");
      if (index === -1) {
        if (element !== "") {
          map[$_set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
        }
      } else if (index !== 0) {
        let key = element[$substring](0, index);
        let value = element[$substring](index + 1);
        map[$_set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
      }
      return map;
    }, MapOfString$StringAndStringToMapOfString$String())));
  }
  static parseIPv4Address(host) {
    return core.Uri._parseIPv4Address(host, 0, host.length);
  }
  static _parseIPv4Address(host, start, end) {
    function error(msg, position) {
      dart.throw(new core.FormatException.new("Illegal IPv4 address, " + dart.str(msg), host, position));
    }
    dart.fn(error, StringAndintTovoid());
    let result = typed_data.Uint8List.new(4);
    let partIndex = 0;
    let partStart = start;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = host[$codeUnitAt](i);
      if (char !== 46) {
        if ((char ^ 48) >>> 0 > 9) {
          error("invalid character", i);
        }
      } else {
        if (partIndex === 3) {
          error("IPv4 address should contain exactly 4 parts", i);
        }
        let part = core.int.parse(host[$substring](partStart, i));
        if (dart.notNull(part) > 255) {
          error("each part must be in the range 0..255", partStart);
        }
        result[$_set](partIndex++, part);
        partStart = dart.notNull(i) + 1;
      }
    }
    if (partIndex !== 3) {
      error("IPv4 address should contain exactly 4 parts", end);
    }
    let part = core.int.parse(host[$substring](partStart, end));
    if (dart.notNull(part) > 255) {
      error("each part must be in the range 0..255", partStart);
    }
    result[$_set](partIndex, part);
    return result;
  }
  static parseIPv6Address(host, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    let t = end;
    t == null ? end = host.length : t;
    function error(msg, position) {
      if (position === void 0) position = null;
      dart.throw(new core.FormatException.new("Illegal IPv6 address, " + dart.str(msg), host, core.int._check(position)));
    }
    dart.fn(error, String__Tovoid());
    function parseHex(start, end) {
      if (dart.notNull(end) - dart.notNull(start) > 4) {
        error("an IPv6 part can only contain a maximum of 4 hex digits", start);
      }
      let value = core.int.parse(host[$substring](start, end), {radix: 16});
      if (dart.notNull(value) < 0 || dart.notNull(value) > 65535) {
        error("each part must be in the range of `0x0..0xFFFF`", start);
      }
      return value;
    }
    dart.fn(parseHex, intAndintToint());
    if (host.length < 2) error("address is too short");
    let parts = JSArrayOfint().of([]);
    let wildcardSeen = false;
    let seenDot = false;
    let partStart = start;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = host[$codeUnitAt](i);
      if (char === 58) {
        if (i == start) {
          i = dart.notNull(i) + 1;
          if (host[$codeUnitAt](i) !== 58) {
            error("invalid start colon.", i);
          }
          partStart = i;
        }
        if (i == partStart) {
          if (wildcardSeen) {
            error("only one wildcard `::` is allowed", i);
          }
          wildcardSeen = true;
          parts[$add](-1);
        } else {
          parts[$add](parseHex(partStart, i));
        }
        partStart = dart.notNull(i) + 1;
      } else if (char === 46) {
        seenDot = true;
      }
    }
    if (parts[$length] === 0) error("too few parts");
    let atEnd = partStart == end;
    let isLastWildcard = parts[$last] === -1;
    if (atEnd && !isLastWildcard) {
      error("expected a part after last `:`", end);
    }
    if (!atEnd) {
      if (!seenDot) {
        parts[$add](parseHex(partStart, end));
      } else {
        let last = core.Uri._parseIPv4Address(host, partStart, end);
        parts[$add]((dart.notNull(last[$_get](0)) << 8 | dart.notNull(last[$_get](1))) >>> 0);
        parts[$add]((dart.notNull(last[$_get](2)) << 8 | dart.notNull(last[$_get](3))) >>> 0);
      }
    }
    if (wildcardSeen) {
      if (dart.notNull(parts[$length]) > 7) {
        error("an address with a wildcard must have less than 7 parts");
      }
    } else if (parts[$length] !== 8) {
      error("an address without a wildcard must contain exactly 8 parts");
    }
    let bytes = typed_data.Uint8List.new(16);
    for (let i = 0, index = 0; i < dart.notNull(parts[$length]); i++) {
      let value = parts[$_get](i);
      if (value === -1) {
        let wildCardLength = 9 - dart.notNull(parts[$length]);
        for (let j = 0; j < wildCardLength; j++) {
          bytes[$_set](index, 0);
          bytes[$_set](index + 1, 0);
          index = index + 2;
        }
      } else {
        bytes[$_set](index, value[$rightShift](8));
        bytes[$_set](index + 1, dart.notNull(value) & 255);
        index = index + 2;
      }
    }
    return bytes;
  }
};
(core.Uri[dart.mixinNew] = function() {
}).prototype = core.Uri.prototype;
dart.addTypeTests(core.Uri);
dart.setGetterSignature(core.Uri, () => ({
  __proto__: dart.getGetters(core.Uri.__proto__),
  hasScheme: core.bool
}));
dart.setLibraryUri(core.Uri, "dart:core");
const _userInfo = dart.privateName(core, "_userInfo");
const _host = dart.privateName(core, "_host");
const _port = dart.privateName(core, "_port");
const _query = dart.privateName(core, "_query");
const _fragment = dart.privateName(core, "_fragment");
const _pathSegments = dart.privateName(core, "_pathSegments");
const _text = dart.privateName(core, "_text");
const _hashCodeCache = dart.privateName(core, "_hashCodeCache");
const _queryParameters = dart.privateName(core, "_queryParameters");
const _queryParameterLists = dart.privateName(core, "_queryParameterLists");
const _writeAuthority = dart.privateName(core, "_writeAuthority");
let const$60;
const _mergePaths = dart.privateName(core, "_mergePaths");
const _toFilePath = dart.privateName(core, "_toFilePath");
const _isPathAbsolute = dart.privateName(core, "_isPathAbsolute");
const _initializeText = dart.privateName(core, "_initializeText");
core._Uri = class _Uri extends core.Object {
  static notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme) {
    if (scheme == null) {
      scheme = "";
      if (dart.notNull(schemeEnd) > dart.notNull(start)) {
        scheme = core._Uri._makeScheme(uri, start, schemeEnd);
      } else if (schemeEnd == start) {
        core._Uri._fail(uri, start, "Invalid empty scheme");
      }
    }
    let userInfo = "";
    let host = null;
    let port = null;
    if (dart.notNull(hostStart) > dart.notNull(start)) {
      let userInfoStart = dart.notNull(schemeEnd) + 3;
      if (userInfoStart < dart.notNull(hostStart)) {
        userInfo = core._Uri._makeUserInfo(uri, userInfoStart, dart.notNull(hostStart) - 1);
      }
      host = core._Uri._makeHost(uri, hostStart, portStart, false);
      if (dart.notNull(portStart) + 1 < dart.notNull(pathStart)) {
        port = core.int.parse(uri[$substring](dart.notNull(portStart) + 1, pathStart), {onError: dart.fn(_ => {
            dart.throw(new core.FormatException.new("Invalid port", uri, dart.notNull(portStart) + 1));
          }, StringToNull())});
        port = core._Uri._makePort(port, scheme);
      }
    }
    let path = core._Uri._makePath(uri, pathStart, queryStart, null, scheme, host != null);
    let query = null;
    if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
      query = core._Uri._makeQuery(uri, dart.notNull(queryStart) + 1, fragmentStart, null);
    }
    let fragment = null;
    if (dart.notNull(fragmentStart) < dart.notNull(end)) {
      fragment = core._Uri._makeFragment(uri, dart.notNull(fragmentStart) + 1, end);
    }
    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
  }
  static new(opts) {
    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
    let host = opts && 'host' in opts ? opts.host : null;
    let port = opts && 'port' in opts ? opts.port : null;
    let path = opts && 'path' in opts ? opts.path : null;
    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
    let query = opts && 'query' in opts ? opts.query : null;
    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
    scheme = core._Uri._makeScheme(scheme, 0, core._stringOrNullLength(scheme));
    userInfo = core._Uri._makeUserInfo(userInfo, 0, core._stringOrNullLength(userInfo));
    host = core._Uri._makeHost(host, 0, core._stringOrNullLength(host), false);
    if (query === "") query = null;
    query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
    fragment = core._Uri._makeFragment(fragment, 0, core._stringOrNullLength(fragment));
    port = core._Uri._makePort(port, scheme);
    let isFile = scheme === "file";
    if (host == null && (userInfo[$isNotEmpty] || port != null || isFile)) {
      host = "";
    }
    let hasAuthority = host != null;
    path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
    if (scheme[$isEmpty] && host == null && !path[$startsWith]("/")) {
      let allowScheme = scheme[$isNotEmpty] || host != null;
      path = core._Uri._normalizeRelativePath(path, allowScheme);
    } else {
      path = core._Uri._removeDotSegments(path);
    }
    if (host == null && path[$startsWith]("//")) {
      host = "";
    }
    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
  }
  static http(authority, unencodedPath, queryParameters) {
    if (queryParameters === void 0) queryParameters = null;
    return core._Uri._check(core._Uri._makeHttpUri("http", authority, unencodedPath, queryParameters));
  }
  static https(authority, unencodedPath, queryParameters) {
    if (queryParameters === void 0) queryParameters = null;
    return core._Uri._check(core._Uri._makeHttpUri("https", authority, unencodedPath, queryParameters));
  }
  get authority() {
    if (!dart.test(this.hasAuthority)) return "";
    let sb = new core.StringBuffer.new();
    this[_writeAuthority](sb);
    return sb.toString();
  }
  get userInfo() {
    return this[_userInfo];
  }
  get host() {
    if (this[_host] == null) return "";
    if (this[_host][$startsWith]("[")) {
      return this[_host][$substring](1, this[_host].length - 1);
    }
    return this[_host];
  }
  get port() {
    if (this[_port] == null) return core._Uri._defaultPort(this.scheme);
    return this[_port];
  }
  static _defaultPort(scheme) {
    if (scheme === "http") return 80;
    if (scheme === "https") return 443;
    return 0;
  }
  get query() {
    return this[_query] != null ? this[_query] : "";
  }
  get fragment() {
    return this[_fragment] != null ? this[_fragment] : "";
  }
  isScheme(scheme) {
    let thisScheme = this.scheme;
    if (scheme == null) return thisScheme[$isEmpty];
    if (scheme.length !== thisScheme.length) return false;
    return core._Uri._compareScheme(scheme, thisScheme);
  }
  static _compareScheme(scheme, uri) {
    for (let i = 0; i < scheme.length; i++) {
      let schemeChar = scheme[$codeUnitAt](i);
      let uriChar = uri[$codeUnitAt](i);
      let delta = (schemeChar ^ uriChar) >>> 0;
      if (delta !== 0) {
        if (delta === 32) {
          let lowerChar = (uriChar | delta) >>> 0;
          if (97 <= lowerChar && lowerChar <= 122) {
            continue;
          }
        }
        return false;
      }
    }
    return true;
  }
  static _fail(uri, index, message) {
    dart.throw(new core.FormatException.new(message, uri, index));
  }
  static _makeHttpUri(scheme, authority, unencodedPath, queryParameters) {
    let userInfo = "";
    let host = null;
    let port = null;
    if (authority != null && authority[$isNotEmpty]) {
      let hostStart = 0;
      let hasUserInfo = false;
      for (let i = 0; i < authority.length; i++) {
        let atSign = 64;
        if (authority[$codeUnitAt](i) === atSign) {
          hasUserInfo = true;
          userInfo = authority[$substring](0, i);
          hostStart = i + 1;
          break;
        }
      }
      let hostEnd = hostStart;
      if (hostStart < authority.length && authority[$codeUnitAt](hostStart) === 91) {
        for (; hostEnd < authority.length; hostEnd++) {
          if (authority[$codeUnitAt](hostEnd) === 93) break;
        }
        if (hostEnd === authority.length) {
          dart.throw(new core.FormatException.new("Invalid IPv6 host entry.", authority, hostStart));
        }
        core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
        hostEnd++;
        if (hostEnd !== authority.length && authority[$codeUnitAt](hostEnd) !== 58) {
          dart.throw(new core.FormatException.new("Invalid end of authority", authority, hostEnd));
        }
      }
      let hasPort = false;
      for (; hostEnd < authority.length; hostEnd++) {
        if (authority[$codeUnitAt](hostEnd) === 58) {
          let portString = authority[$substring](hostEnd + 1);
          if (portString[$isNotEmpty]) port = core.int.parse(portString);
          break;
        }
      }
      host = authority[$substring](hostStart, hostEnd);
    }
    return core.Uri.new({scheme: scheme, userInfo: userInfo, host: host, port: port, pathSegments: unencodedPath[$split]("/"), queryParameters: queryParameters});
  }
  static file(path, opts) {
    let windows = opts && 'windows' in opts ? opts.windows : null;
    windows = windows == null ? core._Uri._isWindows : windows;
    return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, false) : core._Uri._makeFileUri(path, false));
  }
  static directory(path, opts) {
    let windows = opts && 'windows' in opts ? opts.windows : null;
    windows = windows == null ? core._Uri._isWindows : windows;
    return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, true) : core._Uri._makeFileUri(path, true));
  }
  static get _isWindows() {
    return core._Uri._isWindowsCached;
  }
  static _checkNonWindowsPathReservedCharacters(segments, argumentError) {
    segments[$forEach](dart.fn(segment => {
      if (segment[$contains]("/")) {
        if (dart.test(argumentError)) {
          dart.throw(new core.ArgumentError.new("Illegal path character " + dart.str(segment)));
        } else {
          dart.throw(new core.UnsupportedError.new("Illegal path character " + dart.str(segment)));
        }
      }
    }, StringToNull()));
  }
  static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
    if (firstSegment === void 0) firstSegment = 0;
    for (let segment of segments[$skip](firstSegment)) {
      if (segment[$contains](core.RegExp.new("[\"*/:<>?\\\\|]"))) {
        if (dart.test(argumentError)) {
          dart.throw(new core.ArgumentError.new("Illegal character in path"));
        } else {
          dart.throw(new core.UnsupportedError.new("Illegal character in path: " + dart.str(segment)));
        }
      }
    }
  }
  static _checkWindowsDriveLetter(charCode, argumentError) {
    if (65 <= dart.notNull(charCode) && dart.notNull(charCode) <= 90 || 97 <= dart.notNull(charCode) && dart.notNull(charCode) <= 122) {
      return;
    }
    if (dart.test(argumentError)) {
      dart.throw(new core.ArgumentError.new("Illegal drive letter " + core.String.fromCharCode(charCode)));
    } else {
      dart.throw(new core.UnsupportedError.new("Illegal drive letter " + core.String.fromCharCode(charCode)));
    }
  }
  static _makeFileUri(path, slashTerminated) {
    let sep = "/";
    let segments = path[$split](sep);
    if (dart.test(slashTerminated) && dart.test(segments[$isNotEmpty]) && segments[$last][$isNotEmpty]) {
      segments[$add]("");
    }
    if (path[$startsWith](sep)) {
      return core.Uri.new({scheme: "file", pathSegments: segments});
    } else {
      return core.Uri.new({pathSegments: segments});
    }
  }
  static _makeWindowsFileUrl(path, slashTerminated) {
    if (path[$startsWith]("\\\\?\\")) {
      if (path[$startsWith]("UNC\\", 4)) {
        path = path[$replaceRange](0, 7, "\\");
      } else {
        path = path[$substring](4);
        if (path.length < 3 || path[$codeUnitAt](1) !== 58 || path[$codeUnitAt](2) !== 92) {
          dart.throw(new core.ArgumentError.new("Windows paths with \\\\?\\ prefix must be absolute"));
        }
      }
    } else {
      path = path[$replaceAll]("/", "\\");
    }
    let sep = "\\";
    if (path.length > 1 && path[$codeUnitAt](1) === 58) {
      core._Uri._checkWindowsDriveLetter(path[$codeUnitAt](0), true);
      if (path.length === 2 || path[$codeUnitAt](2) !== 92) {
        dart.throw(new core.ArgumentError.new("Windows paths with drive letter must be absolute"));
      }
      let pathSegments = path[$split](sep);
      if (dart.test(slashTerminated) && pathSegments[$last][$isNotEmpty]) {
        pathSegments[$add]("");
      }
      core._Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
      return core.Uri.new({scheme: "file", pathSegments: pathSegments});
    }
    if (path[$startsWith](sep)) {
      if (path[$startsWith](sep, 1)) {
        let pathStart = path[$indexOf]("\\", 2);
        let hostPart = pathStart < 0 ? path[$substring](2) : path[$substring](2, pathStart);
        let pathPart = pathStart < 0 ? "" : path[$substring](pathStart + 1);
        let pathSegments = pathPart[$split](sep);
        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
        if (dart.test(slashTerminated) && pathSegments[$last][$isNotEmpty]) {
          pathSegments[$add]("");
        }
        return core.Uri.new({scheme: "file", host: hostPart, pathSegments: pathSegments});
      } else {
        let pathSegments = path[$split](sep);
        if (dart.test(slashTerminated) && pathSegments[$last][$isNotEmpty]) {
          pathSegments[$add]("");
        }
        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
        return core.Uri.new({scheme: "file", pathSegments: pathSegments});
      }
    } else {
      let pathSegments = path[$split](sep);
      core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
      if (dart.test(slashTerminated) && dart.test(pathSegments[$isNotEmpty]) && pathSegments[$last][$isNotEmpty]) {
        pathSegments[$add]("");
      }
      return core.Uri.new({pathSegments: pathSegments});
    }
  }
  replace(opts) {
    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
    let host = opts && 'host' in opts ? opts.host : null;
    let port = opts && 'port' in opts ? opts.port : null;
    let path = opts && 'path' in opts ? opts.path : null;
    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
    let query = opts && 'query' in opts ? opts.query : null;
    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
    let schemeChanged = false;
    if (scheme != null) {
      scheme = core._Uri._makeScheme(scheme, 0, scheme.length);
      schemeChanged = scheme != this.scheme;
    } else {
      scheme = this.scheme;
    }
    let isFile = scheme === "file";
    if (userInfo != null) {
      userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo.length);
    } else {
      userInfo = this[_userInfo];
    }
    if (port != null) {
      port = core._Uri._makePort(port, scheme);
    } else {
      port = this[_port];
      if (schemeChanged) {
        port = core._Uri._makePort(port, scheme);
      }
    }
    if (host != null) {
      host = core._Uri._makeHost(host, 0, host.length, false);
    } else if (dart.test(this.hasAuthority)) {
      host = this[_host];
    } else if (userInfo[$isNotEmpty] || port != null || isFile) {
      host = "";
    }
    let hasAuthority = host != null;
    if (path != null || pathSegments != null) {
      path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
    } else {
      path = this.path;
      if ((isFile || hasAuthority && !path[$isEmpty]) && !path[$startsWith]("/")) {
        path = "/" + dart.notNull(path);
      }
    }
    if (query != null || queryParameters != null) {
      query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
    } else {
      query = this[_query];
    }
    if (fragment != null) {
      fragment = core._Uri._makeFragment(fragment, 0, fragment.length);
    } else {
      fragment = this[_fragment];
    }
    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
  }
  removeFragment() {
    if (!dart.test(this.hasFragment)) return this;
    return new core._Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this.path, this[_query], null);
  }
  get pathSegments() {
    let result = this[_pathSegments];
    if (result != null) return result;
    let pathToSplit = this.path;
    if (pathToSplit[$isNotEmpty] && pathToSplit[$codeUnitAt](0) === 47) {
      pathToSplit = pathToSplit[$substring](1);
    }
    result = pathToSplit === "" ? const$60 || (const$60 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[$split]("/")[$map](dart.dynamic, dart.fn(core.Uri.decodeComponent, StringToString())));
    this[_pathSegments] = result;
    return result;
  }
  get queryParameters() {
    let t = this[_queryParameters];
    t == null ? this[_queryParameters] = new (UnmodifiableMapViewOfString$String()).new(core.Uri.splitQueryString(this.query)) : t;
    return this[_queryParameters];
  }
  get queryParametersAll() {
    if (this[_queryParameterLists] == null) {
      let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
      for (let key of queryParameterLists[$keys]) {
        queryParameterLists[$_set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[$_get](key))));
      }
      this[_queryParameterLists] = MapOfString$ListOfString().unmodifiable(queryParameterLists);
    }
    return this[_queryParameterLists];
  }
  normalizePath() {
    let path = core._Uri._normalizePath(this.path, this.scheme, this.hasAuthority);
    if (path == this.path) return this;
    return this.replace({path: path});
  }
  static _makePort(port, scheme) {
    if (port != null && port == core._Uri._defaultPort(scheme)) return null;
    return port;
  }
  static _makeHost(host, start, end, strictIPv6) {
    if (host == null) return null;
    if (start == end) return "";
    if (host[$codeUnitAt](start) === 91) {
      if (host[$codeUnitAt](dart.notNull(end) - 1) !== 93) {
        core._Uri._fail(host, start, "Missing end `]` to match `[` in host");
      }
      core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
      return host[$substring](start, end)[$toLowerCase]();
    }
    if (!dart.test(strictIPv6)) {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        if (host[$codeUnitAt](i) === 58) {
          core.Uri.parseIPv6Address(host, start, end);
          return "[" + dart.str(host) + "]";
        }
      }
    }
    return core._Uri._normalizeRegName(host, start, end);
  }
  static _isRegNameChar(char) {
    return dart.notNull(char) < 127 && (dart.notNull(core._Uri._regNameTable[$_get](char[$rightShift](4))) & 1 << (dart.notNull(char) & 15)) !== 0;
  }
  static _normalizeRegName(host, start, end) {
    let buffer = null;
    let sectionStart = start;
    let index = start;
    let isNormalized = true;
    while (dart.notNull(index) < dart.notNull(end)) {
      let char = host[$codeUnitAt](index);
      if (char === 37) {
        let replacement = core._Uri._normalizeEscape(host, index, true);
        if (replacement == null && isNormalized) {
          index = dart.notNull(index) + 3;
          continue;
        }
        let t = buffer;
        t == null ? buffer = new core.StringBuffer.new() : t;
        let slice = host[$substring](sectionStart, index);
        if (!isNormalized) slice = slice[$toLowerCase]();
        buffer.write(slice);
        let sourceLength = 3;
        if (replacement == null) {
          replacement = host[$substring](index, dart.notNull(index) + 3);
        } else if (replacement === "%") {
          replacement = "%25";
          sourceLength = 1;
        }
        buffer.write(replacement);
        index = dart.notNull(index) + sourceLength;
        sectionStart = index;
        isNormalized = true;
      } else if (dart.test(core._Uri._isRegNameChar(char))) {
        if (isNormalized && 65 <= char && 90 >= char) {
          let t$ = buffer;
          t$ == null ? buffer = new core.StringBuffer.new() : t$;
          if (dart.notNull(sectionStart) < dart.notNull(index)) {
            buffer.write(host[$substring](sectionStart, index));
            sectionStart = index;
          }
          isNormalized = false;
        }
        index = dart.notNull(index) + 1;
      } else if (dart.test(core._Uri._isGeneralDelimiter(char))) {
        core._Uri._fail(host, index, "Invalid character");
      } else {
        let sourceLength = 1;
        if ((char & 64512) === 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
          let tail = host[$codeUnitAt](dart.notNull(index) + 1);
          if ((tail & 64512) === 56320) {
            char = 65536 | (char & 1023) << 10 | tail & 1023;
            sourceLength = 2;
          }
        }
        let t$0 = buffer;
        t$0 == null ? buffer = new core.StringBuffer.new() : t$0;
        let slice = host[$substring](sectionStart, index);
        if (!isNormalized) slice = slice[$toLowerCase]();
        buffer.write(slice);
        buffer.write(core._Uri._escapeChar(char));
        index = dart.notNull(index) + sourceLength;
        sectionStart = index;
      }
    }
    if (buffer == null) return host[$substring](start, end);
    if (dart.notNull(sectionStart) < dart.notNull(end)) {
      let slice = host[$substring](sectionStart, end);
      if (!isNormalized) slice = slice[$toLowerCase]();
      buffer.write(slice);
    }
    return dart.toString(buffer);
  }
  static _makeScheme(scheme, start, end) {
    if (start == end) return "";
    let firstCodeUnit = scheme[$codeUnitAt](start);
    if (!dart.test(core._Uri._isAlphabeticCharacter(firstCodeUnit))) {
      core._Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
    }
    let containsUpperCase = false;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let codeUnit = scheme[$codeUnitAt](i);
      if (!dart.test(core._Uri._isSchemeCharacter(codeUnit))) {
        core._Uri._fail(scheme, i, "Illegal scheme character");
      }
      if (65 <= codeUnit && codeUnit <= 90) {
        containsUpperCase = true;
      }
    }
    scheme = scheme[$substring](start, end);
    if (containsUpperCase) scheme = scheme[$toLowerCase]();
    return core._Uri._canonicalizeScheme(scheme);
  }
  static _canonicalizeScheme(scheme) {
    if (scheme === "http") return "http";
    if (scheme === "file") return "file";
    if (scheme === "https") return "https";
    if (scheme === "package") return "package";
    return scheme;
  }
  static _makeUserInfo(userInfo, start, end) {
    if (userInfo == null) return "";
    return core._Uri._normalizeOrSubstring(userInfo, start, end, core._Uri._userinfoTable);
  }
  static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
    let isFile = scheme === "file";
    let ensureLeadingSlash = isFile || dart.test(hasAuthority);
    if (path == null && pathSegments == null) return isFile ? "/" : "";
    if (path != null && pathSegments != null) {
      dart.throw(new core.ArgumentError.new("Both path and pathSegments specified"));
    }
    let result = null;
    if (path != null) {
      result = core._Uri._normalizeOrSubstring(path, start, end, core._Uri._pathCharOrSlashTable, {escapeDelimiters: true});
    } else {
      result = IterableOfString()._check(pathSegments[$map](core.String, dart.fn(s => core._Uri._uriEncode(core._Uri._pathCharTable, s, convert.utf8, false), StringToString())))[$join]("/");
    }
    if (result[$isEmpty]) {
      if (isFile) return "/";
    } else if (ensureLeadingSlash && !result[$startsWith]("/")) {
      result = "/" + dart.notNull(result);
    }
    result = core._Uri._normalizePath(result, scheme, hasAuthority);
    return result;
  }
  static _normalizePath(path, scheme, hasAuthority) {
    if (scheme[$isEmpty] && !dart.test(hasAuthority) && !path[$startsWith]("/")) {
      return core._Uri._normalizeRelativePath(path, scheme[$isNotEmpty] || dart.test(hasAuthority));
    }
    return core._Uri._removeDotSegments(path);
  }
  static _makeQuery(query, start, end, queryParameters) {
    if (query != null) {
      if (queryParameters != null) {
        dart.throw(new core.ArgumentError.new("Both query and queryParameters specified"));
      }
      return core._Uri._normalizeOrSubstring(query, start, end, core._Uri._queryCharTable, {escapeDelimiters: true});
    }
    if (queryParameters == null) return null;
    let result = new core.StringBuffer.new();
    let separator = "";
    function writeParameter(key, value) {
      result.write(separator);
      separator = "&";
      result.write(core.Uri.encodeQueryComponent(key));
      if (value != null && value[$isNotEmpty]) {
        result.write("=");
        result.write(core.Uri.encodeQueryComponent(value));
      }
    }
    dart.fn(writeParameter, StringAndStringTovoid());
    queryParameters[$forEach](dart.fn((key, value) => {
      if (value == null || typeof value == 'string') {
        writeParameter(key, core.String._check(value));
      } else {
        let values = core.Iterable._check(value);
        for (let value of values) {
          core.String._check(value);
          writeParameter(key, value);
        }
      }
    }, StringAnddynamicToNull()));
    return result.toString();
  }
  static _makeFragment(fragment, start, end) {
    if (fragment == null) return null;
    return core._Uri._normalizeOrSubstring(fragment, start, end, core._Uri._queryCharTable, {escapeDelimiters: true});
  }
  static _normalizeEscape(source, index, lowerCase) {
    if (!(source[$codeUnitAt](index) === 37)) dart.assertFailed(null, "dart:core/uri.dart", 2201, 12, "source.codeUnitAt(index) == _PERCENT");
    if (dart.notNull(index) + 2 >= source.length) {
      return "%";
    }
    let firstDigit = source[$codeUnitAt](dart.notNull(index) + 1);
    let secondDigit = source[$codeUnitAt](dart.notNull(index) + 2);
    let firstDigitValue = _internal.hexDigitValue(firstDigit);
    let secondDigitValue = _internal.hexDigitValue(secondDigit);
    if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
      return "%";
    }
    let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
    if (dart.test(core._Uri._isUnreservedChar(value))) {
      if (dart.test(lowerCase) && 65 <= value && 90 >= value) {
        value = (value | 32) >>> 0;
      }
      return core.String.fromCharCode(value);
    }
    if (firstDigit >= 97 || secondDigit >= 97) {
      return source[$substring](index, dart.notNull(index) + 3)[$toUpperCase]();
    }
    return null;
  }
  static _escapeChar(char) {
    if (!(dart.notNull(char) <= 1114111)) dart.assertFailed(null, "dart:core/uri.dart", 2229, 12, "char <= 0x10ffff");
    let codeUnits = null;
    if (dart.notNull(char) < 128) {
      codeUnits = ListOfint().new(3);
      codeUnits[$_set](0, 37);
      codeUnits[$_set](1, "0123456789ABCDEF"[$codeUnitAt](char[$rightShift](4)));
      codeUnits[$_set](2, "0123456789ABCDEF"[$codeUnitAt](dart.notNull(char) & 15));
    } else {
      let flag = 192;
      let encodedBytes = 2;
      if (dart.notNull(char) > 2047) {
        flag = 224;
        encodedBytes = 3;
        if (dart.notNull(char) > 65535) {
          encodedBytes = 4;
          flag = 240;
        }
      }
      codeUnits = ListOfint().new(3 * encodedBytes);
      let index = 0;
      while (--encodedBytes >= 0) {
        let byte = (char[$rightShift](6 * encodedBytes) & 63 | flag) >>> 0;
        codeUnits[$_set](index, 37);
        codeUnits[$_set](index + 1, "0123456789ABCDEF"[$codeUnitAt](byte[$rightShift](4)));
        codeUnits[$_set](index + 2, "0123456789ABCDEF"[$codeUnitAt](byte & 15));
        index = index + 3;
        flag = 128;
      }
    }
    return core.String.fromCharCodes(codeUnits);
  }
  static _normalizeOrSubstring(component, start, end, charTable, opts) {
    let escapeDelimiters = opts && 'escapeDelimiters' in opts ? opts.escapeDelimiters : false;
    let l = core._Uri._normalize(component, start, end, charTable, {escapeDelimiters: escapeDelimiters});
    return l != null ? l : component[$substring](start, end);
  }
  static _normalize(component, start, end, charTable, opts) {
    let escapeDelimiters = opts && 'escapeDelimiters' in opts ? opts.escapeDelimiters : false;
    let buffer = null;
    let sectionStart = start;
    let index = start;
    while (dart.notNull(index) < dart.notNull(end)) {
      let char = component[$codeUnitAt](index);
      if (char < 127 && (dart.notNull(charTable[$_get](char[$rightShift](4))) & 1 << (char & 15)) !== 0) {
        index = dart.notNull(index) + 1;
      } else {
        let replacement = null;
        let sourceLength = null;
        if (char === 37) {
          replacement = core._Uri._normalizeEscape(component, index, false);
          if (replacement == null) {
            index = dart.notNull(index) + 3;
            continue;
          }
          if ("%" === replacement) {
            replacement = "%25";
            sourceLength = 1;
          } else {
            sourceLength = 3;
          }
        } else if (!dart.test(escapeDelimiters) && dart.test(core._Uri._isGeneralDelimiter(char))) {
          core._Uri._fail(component, index, "Invalid character");
        } else {
          sourceLength = 1;
          if ((char & 64512) === 55296) {
            if (dart.notNull(index) + 1 < dart.notNull(end)) {
              let tail = component[$codeUnitAt](dart.notNull(index) + 1);
              if ((tail & 64512) === 56320) {
                sourceLength = 2;
                char = 65536 | (char & 1023) << 10 | tail & 1023;
              }
            }
          }
          replacement = core._Uri._escapeChar(char);
        }
        let t = buffer;
        t == null ? buffer = new core.StringBuffer.new() : t;
        buffer.write(component[$substring](sectionStart, index));
        buffer.write(replacement);
        index = dart.notNull(index) + dart.notNull(sourceLength);
        sectionStart = index;
      }
    }
    if (buffer == null) {
      return null;
    }
    if (dart.notNull(sectionStart) < dart.notNull(end)) {
      buffer.write(component[$substring](sectionStart, end));
    }
    return dart.toString(buffer);
  }
  static _isSchemeCharacter(ch) {
    return dart.notNull(ch) < 128 && (dart.notNull(core._Uri._schemeTable[$_get](ch[$rightShift](4))) & 1 << (dart.notNull(ch) & 15)) !== 0;
  }
  static _isGeneralDelimiter(ch) {
    return dart.notNull(ch) <= 93 && (dart.notNull(core._Uri._genDelimitersTable[$_get](ch[$rightShift](4))) & 1 << (dart.notNull(ch) & 15)) !== 0;
  }
  get isAbsolute() {
    return this.scheme !== "" && this.fragment === "";
  }
  [_mergePaths](base, reference) {
    let backCount = 0;
    let refStart = 0;
    while (reference[$startsWith]("../", refStart)) {
      refStart = refStart + 3;
      backCount++;
    }
    let baseEnd = base[$lastIndexOf]("/");
    while (baseEnd > 0 && backCount > 0) {
      let newEnd = base[$lastIndexOf]("/", baseEnd - 1);
      if (newEnd < 0) {
        break;
      }
      let delta = baseEnd - newEnd;
      if ((delta === 2 || delta === 3) && base[$codeUnitAt](newEnd + 1) === 46 && (delta === 2 || base[$codeUnitAt](newEnd + 2) === 46)) {
        break;
      }
      baseEnd = newEnd;
      backCount--;
    }
    return base[$replaceRange](baseEnd + 1, null, reference[$substring](refStart - 3 * backCount));
  }
  static _mayContainDotSegments(path) {
    if (path[$startsWith](".")) return true;
    let index = path[$indexOf]("/.");
    return index !== -1;
  }
  static _removeDotSegments(path) {
    if (!dart.test(core._Uri._mayContainDotSegments(path))) return path;
    if (!path[$isNotEmpty]) dart.assertFailed(null, "dart:core/uri.dart", 2414, 12, "path.isNotEmpty");
    let output = JSArrayOfString().of([]);
    let appendSlash = false;
    for (let segment of path[$split]("/")) {
      appendSlash = false;
      if (segment === "..") {
        if (dart.test(output[$isNotEmpty])) {
          output[$removeLast]();
          if (dart.test(output[$isEmpty])) {
            output[$add]("");
          }
        }
        appendSlash = true;
      } else if ("." === segment) {
        appendSlash = true;
      } else {
        output[$add](segment);
      }
    }
    if (appendSlash) output[$add]("");
    return output[$join]("/");
  }
  static _normalizeRelativePath(path, allowScheme) {
    if (!!path[$startsWith]("/")) dart.assertFailed(null, "dart:core/uri.dart", 2449, 12, "!path.startsWith('/')");
    if (!dart.test(core._Uri._mayContainDotSegments(path))) {
      if (!dart.test(allowScheme)) path = core._Uri._escapeScheme(path);
      return path;
    }
    if (!path[$isNotEmpty]) dart.assertFailed(null, "dart:core/uri.dart", 2454, 12, "path.isNotEmpty");
    let output = JSArrayOfString().of([]);
    let appendSlash = false;
    for (let segment of path[$split]("/")) {
      appendSlash = false;
      if (".." === segment) {
        if (!dart.test(output[$isEmpty]) && output[$last] !== "..") {
          output[$removeLast]();
          appendSlash = true;
        } else {
          output[$add]("..");
        }
      } else if ("." === segment) {
        appendSlash = true;
      } else {
        output[$add](segment);
      }
    }
    if (dart.test(output[$isEmpty]) || output[$length] === 1 && output[$_get](0)[$isEmpty]) {
      return "./";
    }
    if (appendSlash || output[$last] === "..") output[$add]("");
    if (!dart.test(allowScheme)) output[$_set](0, core._Uri._escapeScheme(output[$_get](0)));
    return output[$join]("/");
  }
  static _escapeScheme(path) {
    if (path.length >= 2 && dart.test(core._Uri._isAlphabeticCharacter(path[$codeUnitAt](0)))) {
      for (let i = 1; i < path.length; i++) {
        let char = path[$codeUnitAt](i);
        if (char === 58) {
          return path[$substring](0, i) + "%3A" + path[$substring](i + 1);
        }
        if (char > 127 || (dart.notNull(core._Uri._schemeTable[$_get](char[$rightShift](4))) & 1 << (char & 15)) === 0) {
          break;
        }
      }
    }
    return path;
  }
  resolve(reference) {
    return this.resolveUri(core.Uri.parse(reference));
  }
  resolveUri(reference) {
    let targetScheme = null;
    let targetUserInfo = "";
    let targetHost = null;
    let targetPort = null;
    let targetPath = null;
    let targetQuery = null;
    if (reference.scheme[$isNotEmpty]) {
      targetScheme = reference.scheme;
      if (dart.test(reference.hasAuthority)) {
        targetUserInfo = reference.userInfo;
        targetHost = reference.host;
        targetPort = dart.test(reference.hasPort) ? reference.port : null;
      }
      targetPath = core._Uri._removeDotSegments(reference.path);
      if (dart.test(reference.hasQuery)) {
        targetQuery = reference.query;
      }
    } else {
      targetScheme = this.scheme;
      if (dart.test(reference.hasAuthority)) {
        targetUserInfo = reference.userInfo;
        targetHost = reference.host;
        targetPort = core._Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
        targetPath = core._Uri._removeDotSegments(reference.path);
        if (dart.test(reference.hasQuery)) targetQuery = reference.query;
      } else {
        targetUserInfo = this[_userInfo];
        targetHost = this[_host];
        targetPort = this[_port];
        if (reference.path === "") {
          targetPath = this.path;
          if (dart.test(reference.hasQuery)) {
            targetQuery = reference.query;
          } else {
            targetQuery = this[_query];
          }
        } else {
          if (dart.test(reference.hasAbsolutePath)) {
            targetPath = core._Uri._removeDotSegments(reference.path);
          } else {
            if (dart.test(this.hasEmptyPath)) {
              if (!dart.test(this.hasAuthority)) {
                if (!dart.test(this.hasScheme)) {
                  targetPath = reference.path;
                } else {
                  targetPath = core._Uri._removeDotSegments(reference.path);
                }
              } else {
                targetPath = core._Uri._removeDotSegments("/" + dart.notNull(reference.path));
              }
            } else {
              let mergedPath = this[_mergePaths](this.path, reference.path);
              if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
                targetPath = core._Uri._removeDotSegments(mergedPath);
              } else {
                targetPath = core._Uri._normalizeRelativePath(mergedPath, dart.test(this.hasScheme) || dart.test(this.hasAuthority));
              }
            }
          }
          if (dart.test(reference.hasQuery)) targetQuery = reference.query;
        }
      }
    }
    let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
    return new core._Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
  }
  get hasScheme() {
    return this.scheme[$isNotEmpty];
  }
  get hasAuthority() {
    return this[_host] != null;
  }
  get hasPort() {
    return this[_port] != null;
  }
  get hasQuery() {
    return this[_query] != null;
  }
  get hasFragment() {
    return this[_fragment] != null;
  }
  get hasEmptyPath() {
    return this.path[$isEmpty];
  }
  get hasAbsolutePath() {
    return this.path[$startsWith]("/");
  }
  get origin() {
    if (this.scheme === "") {
      dart.throw(new core.StateError.new("Cannot use origin without a scheme: " + dart.str(this)));
    }
    if (this.scheme !== "http" && this.scheme !== "https") {
      dart.throw(new core.StateError.new("Origin is only applicable schemes http and https: " + dart.str(this)));
    }
    if (this[_host] == null || this[_host] === "") {
      dart.throw(new core.StateError.new("A " + dart.str(this.scheme) + ": URI should have a non-empty host name: " + dart.str(this)));
    }
    if (this[_port] == null) return dart.str(this.scheme) + "://" + dart.str(this[_host]);
    return dart.str(this.scheme) + "://" + dart.str(this[_host]) + ":" + dart.str(this[_port]);
  }
  toFilePath(opts) {
    let windows = opts && 'windows' in opts ? opts.windows : null;
    if (this.scheme !== "" && this.scheme !== "file") {
      dart.throw(new core.UnsupportedError.new("Cannot extract a file path from a " + dart.str(this.scheme) + " URI"));
    }
    if (this.query !== "") {
      dart.throw(new core.UnsupportedError.new("Cannot extract a file path from a URI with a query component"));
    }
    if (this.fragment !== "") {
      dart.throw(new core.UnsupportedError.new("Cannot extract a file path from a URI with a fragment component"));
    }
    let t = windows;
    t == null ? windows = core._Uri._isWindows : t;
    return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
  }
  [_toFilePath]() {
    if (dart.test(this.hasAuthority) && this.host !== "") {
      dart.throw(new core.UnsupportedError.new("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
    }
    let pathSegments = this.pathSegments;
    core._Uri._checkNonWindowsPathReservedCharacters(pathSegments, false);
    let result = new core.StringBuffer.new();
    if (dart.test(this.hasAbsolutePath)) result.write("/");
    result.writeAll(pathSegments, "/");
    return result.toString();
  }
  static _toWindowsFilePath(uri) {
    let hasDriveLetter = false;
    let segments = uri.pathSegments;
    if (dart.notNull(segments[$length]) > 0 && segments[$_get](0).length === 2 && segments[$_get](0)[$codeUnitAt](1) === 58) {
      core._Uri._checkWindowsDriveLetter(segments[$_get](0)[$codeUnitAt](0), false);
      core._Uri._checkWindowsPathReservedCharacters(segments, false, 1);
      hasDriveLetter = true;
    } else {
      core._Uri._checkWindowsPathReservedCharacters(segments, false, 0);
    }
    let result = new core.StringBuffer.new();
    if (dart.test(uri.hasAbsolutePath) && !hasDriveLetter) result.write("\\");
    if (dart.test(uri.hasAuthority)) {
      let host = uri.host;
      if (host[$isNotEmpty]) {
        result.write("\\");
        result.write(host);
        result.write("\\");
      }
    }
    result.writeAll(segments, "\\");
    if (hasDriveLetter && segments[$length] === 1) result.write("\\");
    return result.toString();
  }
  get [_isPathAbsolute]() {
    return this.path != null && this.path[$startsWith]("/");
  }
  [_writeAuthority](ss) {
    if (this[_userInfo][$isNotEmpty]) {
      ss.write(this[_userInfo]);
      ss.write("@");
    }
    if (this[_host] != null) ss.write(this[_host]);
    if (this[_port] != null) {
      ss.write(":");
      ss.write(this[_port]);
    }
  }
  get data() {
    return this.scheme === "data" ? core.UriData.fromUri(this) : null;
  }
  toString() {
    let t = this[_text];
    return t == null ? this[_text] = this[_initializeText]() : t;
  }
  [_initializeText]() {
    if (!(this[_text] == null)) dart.assertFailed(null, "dart:core/uri.dart", 2701, 12, "_text == null");
    let sb = new core.StringBuffer.new();
    if (this.scheme[$isNotEmpty]) {
      sb.write(this.scheme);
      sb.write(":");
    }
    if (dart.test(this.hasAuthority) || this.scheme === "file") {
      sb.write("//");
      this[_writeAuthority](sb);
    }
    sb.write(this.path);
    if (this[_query] != null) {
      sb.write("?");
      sb.write(this[_query]);
    }
    if (this[_fragment] != null) {
      sb.write("#");
      sb.write(this[_fragment]);
    }
    return sb.toString();
  }
  _equals(other) {
    if (this === other) return true;
    return core.Uri.is(other) && this.scheme == other.scheme && this.hasAuthority == other.hasAuthority && this.userInfo == other.userInfo && this.host == other.host && this.port == other.port && this.path == other.path && this.hasQuery == other.hasQuery && this.query == other.query && this.hasFragment == other.hasFragment && this.fragment == other.fragment;
  }
  get hashCode() {
    let t = this[_hashCodeCache];
    return t == null ? this[_hashCodeCache] = dart.hashCode(this.toString()) : t;
  }
  static _createList() {
    return JSArrayOfString().of([]);
  }
  static _splitQueryStringAll(query, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    let result = new (IdentityMapOfString$ListOfString()).new();
    let i = 0;
    let start = 0;
    let equalsIndex = -1;
    function parsePair(start, equalsIndex, end) {
      let key = null;
      let value = null;
      if (start == end) return;
      if (dart.notNull(equalsIndex) < 0) {
        key = core._Uri._uriDecode(query, start, end, encoding, true);
        value = "";
      } else {
        key = core._Uri._uriDecode(query, start, equalsIndex, encoding, true);
        value = core._Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
      }
      result[$putIfAbsent](key, dart.fn(core._Uri._createList, VoidToListOfString()))[$add](value);
    }
    dart.fn(parsePair, intAndintAndintTovoid());
    while (i < query.length) {
      let char = query[$codeUnitAt](i);
      if (char === 61) {
        if (equalsIndex < 0) equalsIndex = i;
      } else if (char === 38) {
        parsePair(start, equalsIndex, i);
        start = i + 1;
        equalsIndex = -1;
      }
      i++;
    }
    parsePair(start, equalsIndex, i);
    return result;
  }
  static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
    if (encoding === convert.utf8 && dart.test(core._Uri._needsNoEncoding.hasMatch(text))) {
      return text;
    }
    let result = new core.StringBuffer.new("");
    let bytes = encoding.encode(text);
    for (let i = 0; i < dart.notNull(bytes[$length]); i++) {
      let byte = bytes[$_get](i);
      if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[$_get](byte[$rightShift](4))) & 1 << (dart.notNull(byte) & 15)) !== 0) {
        result.writeCharCode(byte);
      } else if (dart.test(spaceToPlus) && byte === 32) {
        result.write("+");
      } else {
        let hexDigits = "0123456789ABCDEF";
        result.write("%");
        result.write(hexDigits[$_get](dart.notNull(byte) >> 4 & 15));
        result.write(hexDigits[$_get](dart.notNull(byte) & 15));
      }
    }
    return result.toString();
  }
  static _hexCharPairToByte(s, pos) {
    let byte = 0;
    for (let i = 0; i < 2; i++) {
      let charCode = s[$codeUnitAt](dart.notNull(pos) + i);
      if (48 <= charCode && charCode <= 57) {
        byte = byte * 16 + charCode - 48;
      } else {
        charCode = (charCode | 32) >>> 0;
        if (97 <= charCode && charCode <= 102) {
          byte = byte * 16 + charCode - 87;
        } else {
          dart.throw(new core.ArgumentError.new("Invalid URL encoding"));
        }
      }
    }
    return byte;
  }
  static _uriDecode(text, start, end, encoding, plusToSpace) {
    if (!(0 <= dart.notNull(start))) dart.assertFailed(null, "dart:core/uri.dart", 2837, 12, "0 <= start");
    if (!(dart.notNull(start) <= dart.notNull(end))) dart.assertFailed(null, "dart:core/uri.dart", 2838, 12, "start <= end");
    if (!(dart.notNull(end) <= text.length)) dart.assertFailed(null, "dart:core/uri.dart", 2839, 12, "end <= text.length");
    if (!(encoding != null)) dart.assertFailed(null, "dart:core/uri.dart", 2840, 12, "encoding != null");
    let simple = true;
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let codeUnit = text[$codeUnitAt](i);
      if (codeUnit > 127 || codeUnit === 37 || dart.test(plusToSpace) && codeUnit === 43) {
        simple = false;
        break;
      }
    }
    let bytes = null;
    if (simple) {
      if (convert.utf8._equals(encoding) || convert.latin1._equals(encoding) || convert.ascii._equals(encoding)) {
        return text[$substring](start, end);
      } else {
        bytes = text[$substring](start, end)[$codeUnits];
      }
    } else {
      bytes = JSArrayOfint().of([]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let codeUnit = text[$codeUnitAt](i);
        if (codeUnit > 127) {
          dart.throw(new core.ArgumentError.new("Illegal percent encoding in URI"));
        }
        if (codeUnit === 37) {
          if (dart.notNull(i) + 3 > text.length) {
            dart.throw(new core.ArgumentError.new("Truncated URI"));
          }
          bytes[$add](core._Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
          i = dart.notNull(i) + 2;
        } else if (dart.test(plusToSpace) && codeUnit === 43) {
          bytes[$add](32);
        } else {
          bytes[$add](codeUnit);
        }
      }
    }
    return encoding.decode(bytes);
  }
  static _isAlphabeticCharacter(codeUnit) {
    let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
    return 97 <= lowerCase && lowerCase <= 122;
  }
  static _isUnreservedChar(char) {
    return dart.notNull(char) < 127 && (dart.notNull(core._Uri._unreservedTable[$_get](char[$rightShift](4))) & 1 << (dart.notNull(char) & 15)) !== 0;
  }
};
(core._Uri._internal = function(scheme, userInfo, host, port, path, query, fragment) {
  this[_pathSegments] = null;
  this[_text] = null;
  this[_hashCodeCache] = null;
  this[_queryParameters] = null;
  this[_queryParameterLists] = null;
  this.scheme = scheme;
  this[_userInfo] = userInfo;
  this[_host] = host;
  this[_port] = port;
  this.path = path;
  this[_query] = query;
  this[_fragment] = fragment;
}).prototype = core._Uri.prototype;
dart.addTypeTests(core._Uri);
core._Uri[dart.implements] = () => [core.Uri];
dart.setMethodSignature(core._Uri, () => ({
  __proto__: dart.getMethods(core._Uri.__proto__),
  isScheme: dart.fnType(core.bool, [core.String]),
  replace: dart.fnType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: core.Iterable$(core.String), query: core.String, queryParameters: core.Map$(core.String, dart.dynamic), fragment: core.String}),
  removeFragment: dart.fnType(core.Uri, []),
  normalizePath: dart.fnType(core.Uri, []),
  [_mergePaths]: dart.fnType(core.String, [core.String, core.String]),
  resolve: dart.fnType(core.Uri, [core.String]),
  resolveUri: dart.fnType(core.Uri, [core.Uri]),
  toFilePath: dart.fnType(core.String, [], {windows: core.bool}),
  [_toFilePath]: dart.fnType(core.String, []),
  [_writeAuthority]: dart.fnType(dart.void, [core.StringSink]),
  [_initializeText]: dart.fnType(core.String, []),
  _equals: dart.fnType(core.bool, [core.Object]),
  [$_equals]: dart.fnType(core.bool, [core.Object])
}));
dart.setGetterSignature(core._Uri, () => ({
  __proto__: dart.getGetters(core._Uri.__proto__),
  authority: core.String,
  userInfo: core.String,
  host: core.String,
  port: core.int,
  query: core.String,
  fragment: core.String,
  pathSegments: core.List$(core.String),
  queryParameters: core.Map$(core.String, core.String),
  queryParametersAll: core.Map$(core.String, core.List$(core.String)),
  isAbsolute: core.bool,
  hasScheme: core.bool,
  hasAuthority: core.bool,
  hasPort: core.bool,
  hasQuery: core.bool,
  hasFragment: core.bool,
  hasEmptyPath: core.bool,
  hasAbsolutePath: core.bool,
  origin: core.String,
  [_isPathAbsolute]: core.bool,
  data: core.UriData
}));
dart.setLibraryUri(core._Uri, "dart:core");
dart.setFieldSignature(core._Uri, () => ({
  __proto__: dart.getFields(core._Uri.__proto__),
  scheme: dart.finalFieldType(core.String),
  [_userInfo]: dart.finalFieldType(core.String),
  [_host]: dart.finalFieldType(core.String),
  [_port]: dart.fieldType(core.int),
  path: dart.finalFieldType(core.String),
  [_query]: dart.finalFieldType(core.String),
  [_fragment]: dart.finalFieldType(core.String),
  [_pathSegments]: dart.fieldType(ListOfString()),
  [_text]: dart.fieldType(core.String),
  [_hashCodeCache]: dart.fieldType(core.int),
  [_queryParameters]: dart.fieldType(MapOfString$String()),
  [_queryParameterLists]: dart.fieldType(MapOfString$ListOfString())
}));
dart.defineExtensionMethods(core._Uri, ['toString', '_equals']);
dart.defineExtensionAccessors(core._Uri, ['hashCode']);
dart.defineLazy(core._Uri, {
  /*core._Uri._unreservedTable*/get _unreservedTable() {
    return dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._unreserved2396Table*/get _unreserved2396Table() {
    return dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._encodeFullTable*/get _encodeFullTable() {
    return dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._schemeTable*/get _schemeTable() {
    return dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
  },
  /*core._Uri._schemeLowerTable*/get _schemeLowerTable() {
    return dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
  },
  /*core._Uri._subDelimitersTable*/get _subDelimitersTable() {
    return dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._genDelimitersTable*/get _genDelimitersTable() {
    return dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
  },
  /*core._Uri._userinfoTable*/get _userinfoTable() {
    return dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._regNameTable*/get _regNameTable() {
    return dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._pathCharTable*/get _pathCharTable() {
    return dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._pathCharOrSlashTable*/get _pathCharOrSlashTable() {
    return dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._queryCharTable*/get _queryCharTable() {
    return dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
  },
  /*core._Uri._isWindowsCached*/get _isWindowsCached() {
    return typeof process != "undefined" && Object.prototype.toString.call(process) == "[object process]" && process.platform == "win32";
  },
  /*core._Uri._needsNoEncoding*/get _needsNoEncoding() {
    return core.RegExp.new("^[\\-\\.0-9A-Z_a-z~]*$");
  }
});
const _separatorIndices = dart.privateName(core, "_separatorIndices");
const _uriCache = dart.privateName(core, "_uriCache");
core.UriData = class UriData extends core.Object {
  static fromString(content, opts) {
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    let base64 = opts && 'base64' in opts ? opts.base64 : false;
    let buffer = new core.StringBuffer.new();
    let indices = JSArrayOfint().of([-1]);
    let charsetName = null;
    let encodingName = null;
    if (parameters != null) charsetName = parameters[$_get]("charset");
    if (encoding == null) {
      if (charsetName != null) {
        encoding = convert.Encoding.getByName(charsetName);
      }
    } else if (charsetName == null) {
      encodingName = encoding.name;
    }
    let t = encoding;
    t == null ? encoding = convert.ascii : t;
    core.UriData._writeUri(mimeType, encodingName, parameters, buffer, indices);
    indices[$add](buffer.length);
    if (dart.test(base64)) {
      buffer.write(";base64,");
      indices[$add](dart.notNull(buffer.length) - 1);
      buffer.write(encoding.fuse(core.String, core.UriData._base64).encode(content));
    } else {
      buffer.write(",");
      core.UriData._uriEncodeBytes(core.UriData._uricTable, encoding.encode(content), buffer);
    }
    return new core.UriData.__(buffer.toString(), indices, null);
  }
  static fromBytes(bytes, opts) {
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
    let buffer = new core.StringBuffer.new();
    let indices = JSArrayOfint().of([-1]);
    core.UriData._writeUri(core.String._check(mimeType), null, parameters, buffer, indices);
    indices[$add](buffer.length);
    if (dart.dtest(percentEncoded)) {
      buffer.write(",");
      core.UriData._uriEncodeBytes(core.UriData._uricTable, bytes, buffer);
    } else {
      buffer.write(";base64,");
      indices[$add](dart.notNull(buffer.length) - 1);
      core.UriData._base64.encoder.startChunkedConversion(convert.StringConversionSink.fromStringSink(buffer)).addSlice(bytes, 0, bytes[$length], true);
    }
    return new core.UriData.__(buffer.toString(), indices, null);
  }
  static fromUri(uri) {
    if (uri.scheme !== "data") {
      dart.throw(new core.ArgumentError.value(uri, "uri", "Scheme must be 'data'"));
    }
    if (dart.test(uri.hasAuthority)) {
      dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have authority"));
    }
    if (dart.test(uri.hasFragment)) {
      dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have a fragment part"));
    }
    if (!dart.test(uri.hasQuery)) {
      return core.UriData._parse(uri.path, 0, uri);
    }
    return core.UriData._parse(dart.str(uri), 5, uri);
  }
  static _writeUri(mimeType, charsetName, parameters, buffer, indices) {
    if (mimeType == null || mimeType === "text/plain") {
      mimeType = "";
    }
    if (mimeType[$isEmpty] || mimeType === "application/octet-stream") {
      buffer.write(mimeType);
    } else {
      let slashIndex = core.UriData._validateMimeType(mimeType);
      if (dart.notNull(slashIndex) < 0) {
        dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
      }
      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[$substring](0, slashIndex), convert.utf8, false));
      buffer.write("/");
      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[$substring](dart.notNull(slashIndex) + 1), convert.utf8, false));
    }
    if (charsetName != null) {
      if (indices != null) {
        indices[$add](buffer.length);
        indices[$add](dart.notNull(buffer.length) + 8);
      }
      buffer.write(";charset=");
      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.utf8, false));
    }
    parameters == null ? null : parameters[$forEach](dart.fn((key, value) => {
      if (key[$isEmpty]) {
        dart.throw(new core.ArgumentError.value("", "Parameter names must not be empty"));
      }
      if (value[$isEmpty]) {
        dart.throw(new core.ArgumentError.value("", "Parameter values must not be empty", "parameters[\"" + dart.str(key) + "\"]"));
      }
      if (indices != null) indices[$add](buffer.length);
      buffer.write(";");
      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, key, convert.utf8, false));
      if (indices != null) indices[$add](buffer.length);
      buffer.write("=");
      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, value, convert.utf8, false));
    }, StringAndStringToNull()));
  }
  static _validateMimeType(mimeType) {
    let slashIndex = -1;
    for (let i = 0; i < mimeType.length; i++) {
      let char = mimeType[$codeUnitAt](i);
      if (char !== 47) continue;
      if (slashIndex < 0) {
        slashIndex = i;
        continue;
      }
      return -1;
    }
    return slashIndex;
  }
  static parse(uri) {
    if (uri.length >= 5) {
      let dataDelta = core._startsWithData(uri, 0);
      if (dataDelta === 0) {
        return core.UriData._parse(uri, 5, null);
      }
      if (dataDelta === 32) {
        return core.UriData._parse(uri[$substring](5), 0, null);
      }
    }
    dart.throw(new core.FormatException.new("Does not start with 'data:'", uri, 0));
  }
  get uri() {
    if (this[_uriCache] != null) return this[_uriCache];
    let path = this[_text];
    let query = null;
    let colonIndex = this[_separatorIndices][$_get](0);
    let queryIndex = this[_text][$indexOf]("?", dart.notNull(colonIndex) + 1);
    let end = this[_text].length;
    if (queryIndex >= 0) {
      query = core._Uri._normalizeOrSubstring(this[_text], queryIndex + 1, end, core._Uri._queryCharTable);
      end = queryIndex;
    }
    path = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(colonIndex) + 1, end, core._Uri._pathCharOrSlashTable);
    this[_uriCache] = new core._DataUri.new(this, path, query);
    return this[_uriCache];
  }
  get mimeType() {
    let start = dart.notNull(this[_separatorIndices][$_get](0)) + 1;
    let end = this[_separatorIndices][$_get](1);
    if (start === end) return "text/plain";
    return core._Uri._uriDecode(this[_text], start, end, convert.utf8, false);
  }
  get charset() {
    let parameterStart = 1;
    let parameterEnd = dart.notNull(this[_separatorIndices][$length]) - 1;
    if (dart.test(this.isBase64)) {
      parameterEnd = parameterEnd - 1;
    }
    for (let i = parameterStart; i < parameterEnd; i = i + 2) {
      let keyStart = dart.notNull(this[_separatorIndices][$_get](i)) + 1;
      let keyEnd = this[_separatorIndices][$_get](i + 1);
      if (keyEnd === keyStart + 7 && this[_text][$startsWith]("charset", keyStart)) {
        return core._Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][$_get](i + 2), convert.utf8, false);
      }
    }
    return "US-ASCII";
  }
  get isBase64() {
    return this[_separatorIndices][$length][$isOdd];
  }
  get contentText() {
    return this[_text][$substring](dart.notNull(this[_separatorIndices][$last]) + 1);
  }
  contentAsBytes() {
    let text = this[_text];
    let start = dart.notNull(this[_separatorIndices][$last]) + 1;
    if (dart.test(this.isBase64)) {
      return convert.base64.decoder.convert(text, start);
    }
    let percent = 37;
    let length = text.length - start;
    for (let i = start; i < text.length; i++) {
      let codeUnit = text[$codeUnitAt](i);
      if (codeUnit === percent) {
        i = i + 2;
        length = length - 2;
      }
    }
    let result = typed_data.Uint8List.new(length);
    if (length === text.length) {
      result[$setRange](0, length, text[$codeUnits], start);
      return result;
    }
    let index = 0;
    for (let i = start; i < text.length; i++) {
      let codeUnit = text[$codeUnitAt](i);
      if (codeUnit !== percent) {
        result[$_set](index++, codeUnit);
      } else {
        if (i + 2 < text.length) {
          let byte = _internal.parseHexByte(text, i + 1);
          if (dart.notNull(byte) >= 0) {
            result[$_set](index++, byte);
            i = i + 2;
            continue;
          }
        }
        dart.throw(new core.FormatException.new("Invalid percent escape", text, i));
      }
    }
    if (!(index === result[$length])) dart.assertFailed(null, "dart:core/uri.dart", 3569, 12, "index == result.length");
    return result;
  }
  contentAsString(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
    if (encoding == null) {
      let charset = this.charset;
      encoding = convert.Encoding.getByName(charset);
      if (encoding == null) {
        dart.throw(new core.UnsupportedError.new("Unknown charset: " + dart.str(charset)));
      }
    }
    let text = this[_text];
    let start = dart.notNull(this[_separatorIndices][$last]) + 1;
    if (dart.test(this.isBase64)) {
      let converter = convert.base64.decoder.fuse(core.String, encoding.decoder);
      return converter.convert(text[$substring](start));
    }
    return core._Uri._uriDecode(text, start, text.length, encoding, false);
  }
  get parameters() {
    let result = new (IdentityMapOfString$String()).new();
    for (let i = 3; i < dart.notNull(this[_separatorIndices][$length]); i = i + 2) {
      let start = dart.notNull(this[_separatorIndices][$_get](i - 2)) + 1;
      let equals = this[_separatorIndices][$_get](i - 1);
      let end = this[_separatorIndices][$_get](i);
      let key = core._Uri._uriDecode(this[_text], start, equals, convert.utf8, false);
      let value = core._Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.utf8, false);
      result[$_set](key, value);
    }
    return result;
  }
  static _parse(text, start, sourceUri) {
    if (!(start === 0 || start === 5)) dart.assertFailed(null, "dart:core/uri.dart", 3632, 12, "start == 0 || start == 5");
    if (!(start === 5 === text[$startsWith]("data:"))) dart.assertFailed(null, "dart:core/uri.dart", 3633, 12, "(start == 5) == text.startsWith(\"data:\")");
    let comma = 44;
    let slash = 47;
    let semicolon = 59;
    let equals = 61;
    let indices = JSArrayOfint().of([dart.notNull(start) - 1]);
    let slashIndex = -1;
    let char = null;
    let i = start;
    for (; dart.notNull(i) < text.length; i = dart.notNull(i) + 1) {
      char = text[$codeUnitAt](i);
      if (dart.equals(char, comma) || dart.equals(char, semicolon)) break;
      if (dart.equals(char, slash)) {
        if (dart.notNull(slashIndex) < 0) {
          slashIndex = i;
          continue;
        }
        dart.throw(new core.FormatException.new("Invalid MIME type", text, i));
      }
    }
    if (dart.notNull(slashIndex) < 0 && dart.notNull(i) > dart.notNull(start)) {
      dart.throw(new core.FormatException.new("Invalid MIME type", text, i));
    }
    while (!dart.equals(char, comma)) {
      indices[$add](i);
      i = dart.notNull(i) + 1;
      let equalsIndex = -1;
      for (; dart.notNull(i) < text.length; i = dart.notNull(i) + 1) {
        char = text[$codeUnitAt](i);
        if (dart.equals(char, equals)) {
          if (dart.notNull(equalsIndex) < 0) equalsIndex = i;
        } else if (dart.equals(char, semicolon) || dart.equals(char, comma)) {
          break;
        }
      }
      if (dart.notNull(equalsIndex) >= 0) {
        indices[$add](equalsIndex);
      } else {
        let lastSeparator = indices[$last];
        if (!dart.equals(char, comma) || i !== dart.notNull(lastSeparator) + 7 || !text[$startsWith]("base64", dart.notNull(lastSeparator) + 1)) {
          dart.throw(new core.FormatException.new("Expecting '='", text, i));
        }
        break;
      }
    }
    indices[$add](i);
    let isBase64 = indices[$length][$isOdd];
    if (isBase64) {
      text = convert.base64.normalize(text, dart.notNull(i) + 1, text.length);
    } else {
      let data = core._Uri._normalize(text, dart.notNull(i) + 1, text.length, core.UriData._uricTable, {escapeDelimiters: true});
      if (data != null) {
        text = text[$replaceRange](dart.notNull(i) + 1, text.length, data);
      }
    }
    return new core.UriData.__(text, indices, sourceUri);
  }
  static _uriEncodeBytes(canonicalTable, bytes, buffer) {
    let byteOr = 0;
    for (let i = 0; i < dart.notNull(bytes[$length]); i++) {
      let byte = bytes[$_get](i);
      byteOr = (byteOr | dart.notNull(byte)) >>> 0;
      if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[$_get](byte[$rightShift](4))) & 1 << (dart.notNull(byte) & 15)) !== 0) {
        buffer.writeCharCode(byte);
      } else {
        buffer.writeCharCode(37);
        buffer.writeCharCode("0123456789ABCDEF"[$codeUnitAt](byte[$rightShift](4)));
        buffer.writeCharCode("0123456789ABCDEF"[$codeUnitAt](dart.notNull(byte) & 15));
      }
    }
    if ((byteOr & ~255) !== 0) {
      for (let i = 0; i < dart.notNull(bytes[$length]); i++) {
        let byte = bytes[$_get](i);
        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
          dart.throw(new core.ArgumentError.value(byte, "non-byte value"));
        }
      }
    }
  }
  toString() {
    return this[_separatorIndices][$_get](0) === -1 ? "data:" + dart.str(this[_text]) : this[_text];
  }
};
(core.UriData.__ = function(text, separatorIndices, uriCache) {
  this[_text] = text;
  this[_separatorIndices] = separatorIndices;
  this[_uriCache] = uriCache;
}).prototype = core.UriData.prototype;
dart.addTypeTests(core.UriData);
dart.setMethodSignature(core.UriData, () => ({
  __proto__: dart.getMethods(core.UriData.__proto__),
  contentAsBytes: dart.fnType(typed_data.Uint8List, []),
  contentAsString: dart.fnType(core.String, [], {encoding: convert.Encoding})
}));
dart.setGetterSignature(core.UriData, () => ({
  __proto__: dart.getGetters(core.UriData.__proto__),
  uri: core.Uri,
  mimeType: core.String,
  charset: core.String,
  isBase64: core.bool,
  contentText: core.String,
  parameters: core.Map$(core.String, core.String)
}));
dart.setLibraryUri(core.UriData, "dart:core");
dart.setFieldSignature(core.UriData, () => ({
  __proto__: dart.getFields(core.UriData.__proto__),
  [_text]: dart.finalFieldType(core.String),
  [_separatorIndices]: dart.finalFieldType(ListOfint()),
  [_uriCache]: dart.fieldType(core.Uri)
}));
dart.defineExtensionMethods(core.UriData, ['toString']);
dart.defineLazy(core.UriData, {
  /*core.UriData._noScheme*/get _noScheme() {
    return -1;
  },
  /*core.UriData._base64*/get _base64() {
    return convert.base64;
  },
  /*core.UriData._tokenCharTable*/get _tokenCharTable() {
    return dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
  },
  /*core.UriData._uricTable*/get _uricTable() {
    return core._Uri._queryCharTable;
  },
  /*core.UriData._base64Table*/get _base64Table() {
    return dart.constList([0, 0, 34816, 1023, 65534, 2047, 65534, 2047], core.int);
  }
});
dart.defineLazy(core, {
  /*core._schemeEndIndex*/get _schemeEndIndex() {
    return 1;
  },
  /*core._hostStartIndex*/get _hostStartIndex() {
    return 2;
  },
  /*core._portStartIndex*/get _portStartIndex() {
    return 3;
  },
  /*core._pathStartIndex*/get _pathStartIndex() {
    return 4;
  },
  /*core._queryStartIndex*/get _queryStartIndex() {
    return 5;
  },
  /*core._fragmentStartIndex*/get _fragmentStartIndex() {
    return 6;
  },
  /*core._notSimpleIndex*/get _notSimpleIndex() {
    return 7;
  },
  /*core._uriStart*/get _uriStart() {
    return 0;
  },
  /*core._nonSimpleEndStates*/get _nonSimpleEndStates() {
    return 14;
  },
  /*core._schemeStart*/get _schemeStart() {
    return 20;
  },
  /*core._scannerTables*/get _scannerTables() {
    return core._createTables();
  }
});
core._createTables = function() {
  let stateCount = 22;
  let schemeOrPath = 1;
  let authOrPath = 2;
  let authOrPathSlash = 3;
  let uinfoOrHost0 = 4;
  let uinfoOrHost = 5;
  let uinfoOrPort0 = 6;
  let uinfoOrPort = 7;
  let ipv6Host = 8;
  let relPathSeg = 9;
  let pathSeg = 10;
  let path = 11;
  let query = 12;
  let fragment = 13;
  let schemeOrPathDot = 14;
  let schemeOrPathDot2 = 15;
  let relPathSegDot = 16;
  let relPathSegDot2 = 17;
  let pathSegDot = 18;
  let pathSegDot2 = 19;
  let scheme0 = 20;
  let scheme = 21;
  let schemeEnd = 1 << 5;
  let hostStart = 2 << 5;
  let portStart = 3 << 5;
  let pathStart = 4 << 5;
  let queryStart = 5 << 5;
  let fragmentStart = 6 << 5;
  let notSimple = 7 << 5;
  let unreserved = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~";
  let subDelims = "!$&'()*+,;=";
  let pchar = unreserved + subDelims;
  let tables = ListOfUint8List().generate(stateCount, dart.fn(_ => typed_data.Uint8List.new(96), intToUint8List()));
  function build(state, defaultTransition) {
    let _ = tables[$_get](core.int._check(state));
    _[$fillRange](0, 96, core.int._check(defaultTransition));
    return _;
  }
  dart.fn(build, dynamicAnddynamicToUint8List());
  function setChars(target, chars, transition) {
    for (let i = 0; i < chars.length; i++) {
      let char = chars[$codeUnitAt](i);
      target[$_set]((char ^ 96) >>> 0, transition);
    }
  }
  dart.fn(setChars, Uint8ListAndStringAndintTovoid());
  function setRange(target, range, transition) {
    for (let i = range[$codeUnitAt](0), n = range[$codeUnitAt](1); i <= n; i++) {
      target[$_set]((i ^ 96) >>> 0, transition);
    }
  }
  dart.fn(setRange, Uint8ListAndStringAndintTovoid());
  let b = null;
  b = build(0, (schemeOrPath | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
  setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot);
  setChars(typed_data.Uint8List._check(b), ":", (authOrPath | schemeEnd) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", authOrPathSlash);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(schemeOrPathDot, (schemeOrPath | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
  setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot2);
  setChars(typed_data.Uint8List._check(b), ":", (authOrPath | schemeEnd) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(schemeOrPathDot2, (schemeOrPath | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
  setChars(typed_data.Uint8List._check(b), "%", (schemeOrPath | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), ":", (authOrPath | schemeEnd) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(schemeOrPath, (schemeOrPath | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
  setChars(typed_data.Uint8List._check(b), ":", (authOrPath | schemeEnd) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", pathSeg);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(authOrPath, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, (path | pathStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", (authOrPathSlash | pathStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), ".", (pathSegDot | pathStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(authOrPathSlash, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, path);
  setChars(typed_data.Uint8List._check(b), "/", (uinfoOrHost0 | hostStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(uinfoOrHost0, (uinfoOrHost | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
  setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "[", (ipv6Host | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(uinfoOrHost, (uinfoOrHost | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
  setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(uinfoOrPort0, (uinfoOrPort | notSimple) >>> 0);
  setRange(typed_data.Uint8List._check(b), "19", uinfoOrPort);
  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(uinfoOrPort, (uinfoOrPort | notSimple) >>> 0);
  setRange(typed_data.Uint8List._check(b), "09", uinfoOrPort);
  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(ipv6Host, ipv6Host);
  setChars(typed_data.Uint8List._check(b), "]", uinfoOrHost);
  b = build(relPathSeg, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, path);
  setChars(typed_data.Uint8List._check(b), ".", relPathSegDot);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(relPathSegDot, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, path);
  setChars(typed_data.Uint8List._check(b), ".", relPathSegDot2);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(relPathSegDot2, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, path);
  setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(pathSeg, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, path);
  setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(pathSegDot, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, path);
  setChars(typed_data.Uint8List._check(b), ".", pathSegDot2);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(pathSegDot2, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, path);
  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(path, (path | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, path);
  setChars(typed_data.Uint8List._check(b), "/", pathSeg);
  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(query, (query | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, query);
  setChars(typed_data.Uint8List._check(b), "?", query);
  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
  b = build(fragment, (fragment | notSimple) >>> 0);
  setChars(typed_data.Uint8List._check(b), pchar, fragment);
  setChars(typed_data.Uint8List._check(b), "?", fragment);
  b = build(scheme0, (scheme | notSimple) >>> 0);
  setRange(typed_data.Uint8List._check(b), "az", scheme);
  b = build(scheme, (scheme | notSimple) >>> 0);
  setRange(typed_data.Uint8List._check(b), "az", scheme);
  setRange(typed_data.Uint8List._check(b), "09", scheme);
  setChars(typed_data.Uint8List._check(b), "+-.", scheme);
  return tables;
};
core._scan = function(uri, start, end, state, indices) {
  let tables = core._scannerTables;
  if (!(dart.notNull(end) <= uri.length)) dart.assertFailed(null, "dart:core/uri.dart", 4170, 10, "end <= uri.length");
  for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
    let table = tables[$_get](state);
    let char = (uri[$codeUnitAt](i) ^ 96) >>> 0;
    if (char > 95) char = 31;
    let transition = table[$_get](char);
    state = dart.notNull(transition) & 31;
    indices[$_set](transition[$rightShift](5), i);
  }
  return state;
};
const _uri = dart.privateName(core, "_uri");
const _schemeEnd = dart.privateName(core, "_schemeEnd");
const _hostStart = dart.privateName(core, "_hostStart");
const _portStart = dart.privateName(core, "_portStart");
const _pathStart = dart.privateName(core, "_pathStart");
const _queryStart = dart.privateName(core, "_queryStart");
const _fragmentStart = dart.privateName(core, "_fragmentStart");
const _schemeCache = dart.privateName(core, "_schemeCache");
const _isFile = dart.privateName(core, "_isFile");
const _isHttp = dart.privateName(core, "_isHttp");
const _isHttps = dart.privateName(core, "_isHttps");
const _isPackage = dart.privateName(core, "_isPackage");
const _isScheme = dart.privateName(core, "_isScheme");
let const$61;
let const$62;
let const$63;
const _isPort = dart.privateName(core, "_isPort");
const _simpleMerge = dart.privateName(core, "_simpleMerge");
const _toNonSimple = dart.privateName(core, "_toNonSimple");
core._SimpleUri = class _SimpleUri extends core.Object {
  get hasScheme() {
    return dart.notNull(this[_schemeEnd]) > 0;
  }
  get hasAuthority() {
    return dart.notNull(this[_hostStart]) > 0;
  }
  get hasUserInfo() {
    return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 4;
  }
  get hasPort() {
    return dart.notNull(this[_hostStart]) > 0 && dart.notNull(this[_portStart]) + 1 < dart.notNull(this[_pathStart]);
  }
  get hasQuery() {
    return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]);
  }
  get hasFragment() {
    return dart.notNull(this[_fragmentStart]) < this[_uri].length;
  }
  get [_isFile]() {
    return this[_schemeEnd] === 4 && this[_uri][$startsWith]("file");
  }
  get [_isHttp]() {
    return this[_schemeEnd] === 4 && this[_uri][$startsWith]("http");
  }
  get [_isHttps]() {
    return this[_schemeEnd] === 5 && this[_uri][$startsWith]("https");
  }
  get [_isPackage]() {
    return this[_schemeEnd] === 7 && this[_uri][$startsWith]("package");
  }
  [_isScheme](scheme) {
    return this[_schemeEnd] === scheme.length && this[_uri][$startsWith](scheme);
  }
  get hasAbsolutePath() {
    return this[_uri][$startsWith]("/", this[_pathStart]);
  }
  get hasEmptyPath() {
    return this[_pathStart] == this[_queryStart];
  }
  get isAbsolute() {
    return dart.test(this.hasScheme) && !dart.test(this.hasFragment);
  }
  isScheme(scheme) {
    if (scheme == null || scheme[$isEmpty]) return dart.notNull(this[_schemeEnd]) < 0;
    if (scheme.length !== this[_schemeEnd]) return false;
    return core._Uri._compareScheme(scheme, this[_uri]);
  }
  get scheme() {
    if (dart.notNull(this[_schemeEnd]) <= 0) return "";
    if (this[_schemeCache] != null) return this[_schemeCache];
    if (dart.test(this[_isHttp])) {
      this[_schemeCache] = "http";
    } else if (dart.test(this[_isHttps])) {
      this[_schemeCache] = "https";
    } else if (dart.test(this[_isFile])) {
      this[_schemeCache] = "file";
    } else if (dart.test(this[_isPackage])) {
      this[_schemeCache] = "package";
    } else {
      this[_schemeCache] = this[_uri][$substring](0, this[_schemeEnd]);
    }
    return this[_schemeCache];
  }
  get authority() {
    return dart.notNull(this[_hostStart]) > 0 ? this[_uri][$substring](dart.notNull(this[_schemeEnd]) + 3, this[_pathStart]) : "";
  }
  get userInfo() {
    return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 3 ? this[_uri][$substring](dart.notNull(this[_schemeEnd]) + 3, dart.notNull(this[_hostStart]) - 1) : "";
  }
  get host() {
    return dart.notNull(this[_hostStart]) > 0 ? this[_uri][$substring](this[_hostStart], this[_portStart]) : "";
  }
  get port() {
    if (dart.test(this.hasPort)) return core.int.parse(this[_uri][$substring](dart.notNull(this[_portStart]) + 1, this[_pathStart]));
    if (dart.test(this[_isHttp])) return 80;
    if (dart.test(this[_isHttps])) return 443;
    return 0;
  }
  get path() {
    return this[_uri][$substring](this[_pathStart], this[_queryStart]);
  }
  get query() {
    return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]) ? this[_uri][$substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]) : "";
  }
  get fragment() {
    return dart.notNull(this[_fragmentStart]) < this[_uri].length ? this[_uri][$substring](dart.notNull(this[_fragmentStart]) + 1) : "";
  }
  get origin() {
    let isHttp = this[_isHttp];
    if (dart.notNull(this[_schemeEnd]) < 0) {
      dart.throw(new core.StateError.new("Cannot use origin without a scheme: " + dart.str(this)));
    }
    if (!dart.test(isHttp) && !dart.test(this[_isHttps])) {
      dart.throw(new core.StateError.new("Origin is only applicable to schemes http and https: " + dart.str(this)));
    }
    if (this[_hostStart] == this[_portStart]) {
      dart.throw(new core.StateError.new("A " + dart.str(this.scheme) + ": URI should have a non-empty host name: " + dart.str(this)));
    }
    if (this[_hostStart] === dart.notNull(this[_schemeEnd]) + 3) {
      return this[_uri][$substring](0, this[_pathStart]);
    }
    return this[_uri][$substring](0, dart.notNull(this[_schemeEnd]) + 3) + this[_uri][$substring](this[_hostStart], this[_pathStart]);
  }
  get pathSegments() {
    let start = this[_pathStart];
    let end = this[_queryStart];
    if (this[_uri][$startsWith]("/", start)) {
      start = dart.notNull(start) + 1;
    }
    if (start == end) return const$61 || (const$61 = dart.constList([], core.String));
    let parts = JSArrayOfString().of([]);
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      let char = this[_uri][$codeUnitAt](i);
      if (char === 47) {
        parts[$add](this[_uri][$substring](start, i));
        start = dart.notNull(i) + 1;
      }
    }
    parts[$add](this[_uri][$substring](start, end));
    return ListOfString().unmodifiable(parts);
  }
  get queryParameters() {
    if (!dart.test(this.hasQuery)) return const$62 || (const$62 = dart.constMap(core.String, core.String, []));
    return new (UnmodifiableMapViewOfString$String()).new(core.Uri.splitQueryString(this.query));
  }
  get queryParametersAll() {
    if (!dart.test(this.hasQuery)) return const$63 || (const$63 = dart.constMap(core.String, ListOfString(), []));
    let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
    for (let key of queryParameterLists[$keys]) {
      queryParameterLists[$_set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[$_get](key))));
    }
    return MapOfString$ListOfString().unmodifiable(queryParameterLists);
  }
  [_isPort](port) {
    let portDigitStart = dart.notNull(this[_portStart]) + 1;
    return portDigitStart + port.length === this[_pathStart] && this[_uri][$startsWith](port, portDigitStart);
  }
  normalizePath() {
    return this;
  }
  removeFragment() {
    if (!dart.test(this.hasFragment)) return this;
    return new core._SimpleUri.new(this[_uri][$substring](0, this[_fragmentStart]), this[_schemeEnd], this[_hostStart], this[_portStart], this[_pathStart], this[_queryStart], this[_fragmentStart], this[_schemeCache]);
  }
  replace(opts) {
    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
    let host = opts && 'host' in opts ? opts.host : null;
    let port = opts && 'port' in opts ? opts.port : null;
    let path = opts && 'path' in opts ? opts.path : null;
    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
    let query = opts && 'query' in opts ? opts.query : null;
    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
    let schemeChanged = false;
    if (scheme != null) {
      scheme = core._Uri._makeScheme(scheme, 0, scheme.length);
      schemeChanged = !dart.test(this[_isScheme](scheme));
    } else {
      scheme = this.scheme;
    }
    let isFile = scheme === "file";
    if (userInfo != null) {
      userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo.length);
    } else if (dart.notNull(this[_hostStart]) > 0) {
      userInfo = this[_uri][$substring](dart.notNull(this[_schemeEnd]) + 3, this[_hostStart]);
    } else {
      userInfo = "";
    }
    if (port != null) {
      port = core._Uri._makePort(port, scheme);
    } else {
      port = dart.test(this.hasPort) ? this.port : null;
      if (schemeChanged) {
        port = core._Uri._makePort(port, scheme);
      }
    }
    if (host != null) {
      host = core._Uri._makeHost(host, 0, host.length, false);
    } else if (dart.notNull(this[_hostStart]) > 0) {
      host = this[_uri][$substring](this[_hostStart], this[_portStart]);
    } else if (userInfo[$isNotEmpty] || port != null || isFile) {
      host = "";
    }
    let hasAuthority = host != null;
    if (path != null || pathSegments != null) {
      path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
    } else {
      path = this[_uri][$substring](this[_pathStart], this[_queryStart]);
      if ((isFile || hasAuthority && !path[$isEmpty]) && !path[$startsWith]("/")) {
        path = "/" + dart.notNull(path);
      }
    }
    if (query != null || queryParameters != null) {
      query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
    } else if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
      query = this[_uri][$substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]);
    }
    if (fragment != null) {
      fragment = core._Uri._makeFragment(fragment, 0, fragment.length);
    } else if (dart.notNull(this[_fragmentStart]) < this[_uri].length) {
      fragment = this[_uri][$substring](dart.notNull(this[_fragmentStart]) + 1);
    }
    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
  }
  resolve(reference) {
    return this.resolveUri(core.Uri.parse(reference));
  }
  resolveUri(reference) {
    if (core._SimpleUri.is(reference)) {
      return this[_simpleMerge](this, reference);
    }
    return this[_toNonSimple]().resolveUri(reference);
  }
  [_simpleMerge](base, ref) {
    if (dart.test(ref.hasScheme)) return ref;
    if (dart.test(ref.hasAuthority)) {
      if (!dart.test(base.hasScheme)) return ref;
      let isSimple = true;
      if (dart.test(base[_isFile])) {
        isSimple = !dart.test(ref.hasEmptyPath);
      } else if (dart.test(base[_isHttp])) {
        isSimple = !dart.test(ref[_isPort]("80"));
      } else if (dart.test(base[_isHttps])) {
        isSimple = !dart.test(ref[_isPort]("443"));
      }
      if (isSimple) {
        let delta = dart.notNull(base[_schemeEnd]) + 1;
        let newUri = base[_uri][$substring](0, dart.notNull(base[_schemeEnd]) + 1) + ref[_uri][$substring](dart.notNull(ref[_schemeEnd]) + 1);
        return new core._SimpleUri.new(newUri, base[_schemeEnd], dart.notNull(ref[_hostStart]) + delta, dart.notNull(ref[_portStart]) + delta, dart.notNull(ref[_pathStart]) + delta, dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
      } else {
        return this[_toNonSimple]().resolveUri(ref);
      }
    }
    if (dart.test(ref.hasEmptyPath)) {
      if (dart.test(ref.hasQuery)) {
        let delta = dart.notNull(base[_queryStart]) - dart.notNull(ref[_queryStart]);
        let newUri = base[_uri][$substring](0, base[_queryStart]) + ref[_uri][$substring](ref[_queryStart]);
        return new core._SimpleUri.new(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
      }
      if (dart.test(ref.hasFragment)) {
        let delta = dart.notNull(base[_fragmentStart]) - dart.notNull(ref[_fragmentStart]);
        let newUri = base[_uri][$substring](0, base[_fragmentStart]) + ref[_uri][$substring](ref[_fragmentStart]);
        return new core._SimpleUri.new(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], base[_queryStart], dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
      }
      return base.removeFragment();
    }
    if (dart.test(ref.hasAbsolutePath)) {
      let delta = dart.notNull(base[_pathStart]) - dart.notNull(ref[_pathStart]);
      let newUri = base[_uri][$substring](0, base[_pathStart]) + ref[_uri][$substring](ref[_pathStart]);
      return new core._SimpleUri.new(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
    }
    if (dart.test(base.hasEmptyPath) && dart.test(base.hasAuthority)) {
      let refStart = ref[_pathStart];
      while (ref[_uri][$startsWith]("../", refStart)) {
        refStart = dart.notNull(refStart) + 3;
      }
      let delta = dart.notNull(base[_pathStart]) - dart.notNull(refStart) + 1;
      let newUri = base[_uri][$substring](0, base[_pathStart]) + "/" + ref[_uri][$substring](refStart);
      return new core._SimpleUri.new(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
    }
    let baseUri = base[_uri];
    let refUri = ref[_uri];
    let baseStart = base[_pathStart];
    let baseEnd = base[_queryStart];
    while (baseUri[$startsWith]("../", baseStart)) {
      baseStart = dart.notNull(baseStart) + 3;
    }
    let refStart = ref[_pathStart];
    let refEnd = ref[_queryStart];
    let backCount = 0;
    while (dart.notNull(refStart) + 3 <= dart.notNull(refEnd) && refUri[$startsWith]("../", refStart)) {
      refStart = dart.notNull(refStart) + 3;
      backCount = backCount + 1;
    }
    let insert = "";
    while (dart.notNull(baseEnd) > dart.notNull(baseStart)) {
      baseEnd = dart.notNull(baseEnd) - 1;
      let char = baseUri[$codeUnitAt](baseEnd);
      if (char === 47) {
        insert = "/";
        if (backCount === 0) break;
        backCount--;
      }
    }
    if (baseEnd == baseStart && !dart.test(base.hasScheme) && !dart.test(base.hasAbsolutePath)) {
      insert = "";
      refStart = dart.notNull(refStart) - backCount * 3;
    }
    let delta = dart.notNull(baseEnd) - dart.notNull(refStart) + insert.length;
    let newUri = base[_uri][$substring](0, baseEnd) + insert + ref[_uri][$substring](refStart);
    return new core._SimpleUri.new(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
  }
  toFilePath(opts) {
    let windows = opts && 'windows' in opts ? opts.windows : null;
    if (dart.notNull(this[_schemeEnd]) >= 0 && !dart.test(this[_isFile])) {
      dart.throw(new core.UnsupportedError.new("Cannot extract a file path from a " + dart.str(this.scheme) + " URI"));
    }
    if (dart.notNull(this[_queryStart]) < this[_uri].length) {
      if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
        dart.throw(new core.UnsupportedError.new("Cannot extract a file path from a URI with a query component"));
      }
      dart.throw(new core.UnsupportedError.new("Cannot extract a file path from a URI with a fragment component"));
    }
    let t = windows;
    t == null ? windows = core._Uri._isWindows : t;
    return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
  }
  [_toFilePath]() {
    if (dart.notNull(this[_hostStart]) < dart.notNull(this[_portStart])) {
      dart.throw(new core.UnsupportedError.new("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
    }
    return this.path;
  }
  get data() {
    if (!(this.scheme !== "data")) dart.assertFailed(null, "dart:core/uri.dart", 4630, 12, "scheme != \"data\"");
    return null;
  }
  get hashCode() {
    let t = this[_hashCodeCache];
    return t == null ? this[_hashCodeCache] = dart.hashCode(this[_uri]) : t;
  }
  _equals(other) {
    if (this === other) return true;
    return core.Uri.is(other) && this[_uri] == dart.toString(other);
  }
  [_toNonSimple]() {
    return new core._Uri._internal(this.scheme, this.userInfo, dart.test(this.hasAuthority) ? this.host : null, dart.test(this.hasPort) ? this.port : null, this.path, dart.test(this.hasQuery) ? this.query : null, dart.test(this.hasFragment) ? this.fragment : null);
  }
  toString() {
    return this[_uri];
  }
};
(core._SimpleUri.new = function(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, schemeCache) {
  this[_hashCodeCache] = null;
  this[_uri] = uri;
  this[_schemeEnd] = schemeEnd;
  this[_hostStart] = hostStart;
  this[_portStart] = portStart;
  this[_pathStart] = pathStart;
  this[_queryStart] = queryStart;
  this[_fragmentStart] = fragmentStart;
  this[_schemeCache] = schemeCache;
}).prototype = core._SimpleUri.prototype;
dart.addTypeTests(core._SimpleUri);
core._SimpleUri[dart.implements] = () => [core.Uri];
dart.setMethodSignature(core._SimpleUri, () => ({
  __proto__: dart.getMethods(core._SimpleUri.__proto__),
  [_isScheme]: dart.fnType(core.bool, [core.String]),
  isScheme: dart.fnType(core.bool, [core.String]),
  [_isPort]: dart.fnType(core.bool, [core.String]),
  normalizePath: dart.fnType(core.Uri, []),
  removeFragment: dart.fnType(core.Uri, []),
  replace: dart.fnType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: core.Iterable$(core.String), query: core.String, queryParameters: core.Map$(core.String, dart.dynamic), fragment: core.String}),
  resolve: dart.fnType(core.Uri, [core.String]),
  resolveUri: dart.fnType(core.Uri, [core.Uri]),
  [_simpleMerge]: dart.fnType(core.Uri, [core._SimpleUri, core._SimpleUri]),
  toFilePath: dart.fnType(core.String, [], {windows: core.bool}),
  [_toFilePath]: dart.fnType(core.String, []),
  _equals: dart.fnType(core.bool, [core.Object]),
  [$_equals]: dart.fnType(core.bool, [core.Object]),
  [_toNonSimple]: dart.fnType(core.Uri, [])
}));
dart.setGetterSignature(core._SimpleUri, () => ({
  __proto__: dart.getGetters(core._SimpleUri.__proto__),
  hasScheme: core.bool,
  hasAuthority: core.bool,
  hasUserInfo: core.bool,
  hasPort: core.bool,
  hasQuery: core.bool,
  hasFragment: core.bool,
  [_isFile]: core.bool,
  [_isHttp]: core.bool,
  [_isHttps]: core.bool,
  [_isPackage]: core.bool,
  hasAbsolutePath: core.bool,
  hasEmptyPath: core.bool,
  isAbsolute: core.bool,
  scheme: core.String,
  authority: core.String,
  userInfo: core.String,
  host: core.String,
  port: core.int,
  path: core.String,
  query: core.String,
  fragment: core.String,
  origin: core.String,
  pathSegments: core.List$(core.String),
  queryParameters: core.Map$(core.String, core.String),
  queryParametersAll: core.Map$(core.String, core.List$(core.String)),
  data: core.UriData
}));
dart.setLibraryUri(core._SimpleUri, "dart:core");
dart.setFieldSignature(core._SimpleUri, () => ({
  __proto__: dart.getFields(core._SimpleUri.__proto__),
  [_uri]: dart.finalFieldType(core.String),
  [_schemeEnd]: dart.finalFieldType(core.int),
  [_hostStart]: dart.finalFieldType(core.int),
  [_portStart]: dart.finalFieldType(core.int),
  [_pathStart]: dart.finalFieldType(core.int),
  [_queryStart]: dart.finalFieldType(core.int),
  [_fragmentStart]: dart.finalFieldType(core.int),
  [_schemeCache]: dart.fieldType(core.String),
  [_hashCodeCache]: dart.fieldType(core.int)
}));
dart.defineExtensionMethods(core._SimpleUri, ['_equals', 'toString']);
dart.defineExtensionAccessors(core._SimpleUri, ['hashCode']);
const _data$ = dart.privateName(core, "_data");
core._DataUri = class _DataUri extends core._Uri {
  get data() {
    return this[_data$];
  }
};
(core._DataUri.new = function(data, path, query) {
  this[_data$] = data;
  core._DataUri.__proto__._internal.call(this, "data", null, null, null, path, query, null);
}).prototype = core._DataUri.prototype;
dart.addTypeTests(core._DataUri);
dart.setLibraryUri(core._DataUri, "dart:core");
dart.setFieldSignature(core._DataUri, () => ({
  __proto__: dart.getFields(core._DataUri.__proto__),
  [_data$]: dart.finalFieldType(core.UriData)
}));
core._startsWithData = function(text, start) {
  let delta = ((text[$codeUnitAt](dart.notNull(start) + 4) ^ 58) >>> 0) * 3;
  delta = (delta | text[$codeUnitAt](start) ^ 100) >>> 0;
  delta = (delta | text[$codeUnitAt](dart.notNull(start) + 1) ^ 97) >>> 0;
  delta = (delta | text[$codeUnitAt](dart.notNull(start) + 2) ^ 116) >>> 0;
  delta = (delta | text[$codeUnitAt](dart.notNull(start) + 3) ^ 97) >>> 0;
  return delta;
};
core._stringOrNullLength = function(s) {
  return s == null ? 0 : s.length;
};
developer.debugger = function(opts) {
  let when = opts && 'when' in opts ? opts.when : true;
  let message = opts && 'message' in opts ? opts.message : null;
  if (dart.test(when)) {
    debugger;
  }
  return when;
};
developer.inspect = function(object) {
  console.debug("dart.developer.inspect", object);
  return object;
};
developer.log = function(message, opts) {
  let time = opts && 'time' in opts ? opts.time : null;
  let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
  let level = opts && 'level' in opts ? opts.level : 0;
  let name = opts && 'name' in opts ? opts.name : "";
  let zone = opts && 'zone' in opts ? opts.zone : null;
  let error = opts && 'error' in opts ? opts.error : null;
  let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
  let items = {message: message, name: name, level: level};
  if (time != null) items.time = time;
  if (sequenceNumber != null) {
    items.sequenceNumber = sequenceNumber;
  }
  if (zone != null) items.zone = zone;
  if (error != null) items.error = error;
  if (stackTrace != null) items.stackTrace = stackTrace;
  console.debug("dart.developer.log", items);
};
dart.defineLazy(developer, {
  /*developer._extensions*/get _extensions() {
    return new (IdentityMapOfString$StringAndMapOfString$StringToFutureOfServiceExtensionResponse()).new();
  }
});
const _toString = dart.privateName(developer, "_toString");
developer.invokeExtension = function(methodName, encodedJson) {
  return new dart.global.Promise((resolve, reject) => async.async(core.Null, function*() {
    try {
      let method = developer._lookupExtension(methodName);
      let parameters = MapOfString$String()._check(core.Map.as(convert.json.decode(encodedJson))[$cast](core.String, core.String));
      let result = (yield method(methodName, parameters));
      resolve(result[_toString]());
    } catch (e$) {
      let e = dart.getThrown(e$);
      reject(dart.str(e));
    }
  }));
};
dart.defineLazy(developer, {
  /*developer._clockValue*/get _clockValue() {
    return 0;
  },
  set _clockValue(_) {}
});
developer._FakeUserTag = class _FakeUserTag extends core.Object {
  static new(label) {
    let existingTag = developer._FakeUserTag._instances[$_get](label);
    if (existingTag != null) {
      return developer._FakeUserTag._check(existingTag);
    }
    if (developer._FakeUserTag._instances[$length] === developer.UserTag.MAX_USER_TAGS) {
      dart.throw(new core.UnsupportedError.new("UserTag instance limit (" + dart.str(developer.UserTag.MAX_USER_TAGS) + ") reached."));
    }
    let instance = new developer._FakeUserTag.real(label);
    developer._FakeUserTag._instances[$_set](label, instance);
    return instance;
  }
  makeCurrent() {
    let old = developer._currentTag;
    developer._currentTag = this;
    return old;
  }
};
(developer._FakeUserTag.real = function(label) {
  this.label = label;
}).prototype = developer._FakeUserTag.prototype;
dart.addTypeTests(developer._FakeUserTag);
developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
dart.setMethodSignature(developer._FakeUserTag, () => ({
  __proto__: dart.getMethods(developer._FakeUserTag.__proto__),
  makeCurrent: dart.fnType(developer.UserTag, [])
}));
dart.setLibraryUri(developer._FakeUserTag, "dart:developer");
dart.setFieldSignature(developer._FakeUserTag, () => ({
  __proto__: dart.getFields(developer._FakeUserTag.__proto__),
  label: dart.finalFieldType(core.String)
}));
dart.defineLazy(developer._FakeUserTag, {
  /*developer._FakeUserTag._instances*/get _instances() {
    return new _js_helper.LinkedMap.new();
  },
  set _instances(_) {},
  /*developer._FakeUserTag._defaultTag*/get _defaultTag() {
    return developer._FakeUserTag.new("Default");
  }
});
dart.defineLazy(developer, {
  /*developer._currentTag*/get _currentTag() {
    return developer._FakeUserTag._defaultTag;
  },
  set _currentTag(_) {}
});
developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
  get result() {
    return this[result$];
  }
  set result(value) {
    super.result = value;
  }
  get errorCode() {
    return this[errorCode$];
  }
  set errorCode(value) {
    super.errorCode = value;
  }
  get errorDetail() {
    return this[errorDetail$];
  }
  set errorDetail(value) {
    super.errorDetail = value;
  }
  static _errorCodeMessage(errorCode) {
    developer.ServiceExtensionResponse._validateErrorCode(errorCode);
    if (errorCode === -32602) {
      return "Invalid params";
    }
    return "Server error";
  }
  static _validateErrorCode(errorCode) {
    core.ArgumentError.checkNotNull(errorCode, "errorCode");
    if (errorCode === -32602) return;
    if (dart.notNull(errorCode) >= -32016 && dart.notNull(errorCode) <= -32000) {
      return;
    }
    dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
  }
  isError() {
    return this.errorCode != null && this.errorDetail != null;
  }
  [_toString]() {
    if (this.result != null) {
      return this.result;
    } else {
      if (!(this.errorCode != null)) dart.assertFailed(null, "dart:developer/extension.dart", 99, 14, "errorCode != null");
      if (!(this.errorDetail != null)) dart.assertFailed(null, "dart:developer/extension.dart", 100, 14, "errorDetail != null");
      return convert.json.encode(new (IdentityMapOfString$Object()).from(["code", this.errorCode, "message", developer.ServiceExtensionResponse._errorCodeMessage(this.errorCode), "data", new (IdentityMapOfString$String()).from(["details", this.errorDetail])]));
    }
  }
};
(developer.ServiceExtensionResponse.result = function(result) {
  this[result$] = result;
  this[errorCode$] = null;
  this[errorDetail$] = null;
  core.ArgumentError.checkNotNull(result, "result");
}).prototype = developer.ServiceExtensionResponse.prototype;
(developer.ServiceExtensionResponse.error = function(errorCode, errorDetail) {
  this[result$] = null;
  this[errorCode$] = errorCode;
  this[errorDetail$] = errorDetail;
  developer.ServiceExtensionResponse._validateErrorCode(errorCode);
  core.ArgumentError.checkNotNull(errorDetail, "errorDetail");
}).prototype = developer.ServiceExtensionResponse.prototype;
dart.addTypeTests(developer.ServiceExtensionResponse);
const result$ = Symbol("ServiceExtensionResponse.result");
const errorCode$ = Symbol("ServiceExtensionResponse.errorCode");
const errorDetail$ = Symbol("ServiceExtensionResponse.errorDetail");
dart.setMethodSignature(developer.ServiceExtensionResponse, () => ({
  __proto__: dart.getMethods(developer.ServiceExtensionResponse.__proto__),
  isError: dart.fnType(core.bool, []),
  [_toString]: dart.fnType(core.String, [])
}));
dart.setLibraryUri(developer.ServiceExtensionResponse, "dart:developer");
dart.setFieldSignature(developer.ServiceExtensionResponse, () => ({
  __proto__: dart.getFields(developer.ServiceExtensionResponse.__proto__),
  result: dart.finalFieldType(core.String),
  errorCode: dart.finalFieldType(core.int),
  errorDetail: dart.finalFieldType(core.String)
}));
dart.defineLazy(developer.ServiceExtensionResponse, {
  /*developer.ServiceExtensionResponse.kInvalidParams*/get kInvalidParams() {
    return -32602;
  },
  /*developer.ServiceExtensionResponse.kExtensionError*/get kExtensionError() {
    return -32000;
  },
  /*developer.ServiceExtensionResponse.kExtensionErrorMax*/get kExtensionErrorMax() {
    return -32000;
  },
  /*developer.ServiceExtensionResponse.kExtensionErrorMin*/get kExtensionErrorMin() {
    return -32016;
  },
  /*developer.ServiceExtensionResponse.invalidParams*/get invalidParams() {
    return -32602;
  },
  /*developer.ServiceExtensionResponse.extensionError*/get extensionError() {
    return -32000;
  },
  /*developer.ServiceExtensionResponse.extensionErrorMax*/get extensionErrorMax() {
    return -32000;
  },
  /*developer.ServiceExtensionResponse.extensionErrorMin*/get extensionErrorMin() {
    return -32016;
  }
});
developer.registerExtension = function(method, handler) {
  core.ArgumentError.checkNotNull(method, "method");
  if (!method[$startsWith]("ext.")) {
    dart.throw(new core.ArgumentError.value(method, "method", "Must begin with ext."));
  }
  if (developer._lookupExtension(method) != null) {
    dart.throw(new core.ArgumentError.new("Extension already registered: " + dart.str(method)));
  }
  core.ArgumentError.checkNotNull(handler, "handler");
  developer._registerExtension(method, handler);
};
developer.postEvent = function(eventKind, eventData) {
  core.ArgumentError.checkNotNull(eventKind, "eventKind");
  core.ArgumentError.checkNotNull(eventData, "eventData");
  let eventDataAsString = convert.json.encode(eventData);
  developer._postEvent(eventKind, eventDataAsString);
};
developer._postEvent = function(eventKind, eventData) {
  console.debug("dart.developer.postEvent", eventKind, eventData);
};
developer._lookupExtension = function(method) {
  return developer._extensions[$_get](method);
};
developer._registerExtension = function(method, handler) {
  developer._extensions[$_set](method, handler);
  console.debug("dart.developer.registerExtension", method);
};
developer.UserTag = class UserTag extends core.Object {
  static new(label) {
    return developer._FakeUserTag.new(label);
  }
  static get defaultTag() {
    return developer._FakeUserTag._defaultTag;
  }
};
(developer.UserTag[dart.mixinNew] = function() {
}).prototype = developer.UserTag.prototype;
dart.addTypeTests(developer.UserTag);
dart.setLibraryUri(developer.UserTag, "dart:developer");
dart.defineLazy(developer.UserTag, {
  /*developer.UserTag.MAX_USER_TAGS*/get MAX_USER_TAGS() {
    return 64;
  }
});
developer.getCurrentTag = function() {
  return developer._currentTag;
};
developer.Metric = class Metric extends core.Object {
  get name() {
    return this[name$2];
  }
  set name(value) {
    super.name = value;
  }
  get description() {
    return this[description$];
  }
  set description(value) {
    super.description = value;
  }
};
(developer.Metric.new = function(name, description) {
  this[name$2] = name;
  this[description$] = description;
  if (this.name === "vm" || this.name[$contains]("/")) {
    dart.throw(new core.ArgumentError.new("Invalid Metric name."));
  }
}).prototype = developer.Metric.prototype;
dart.addTypeTests(developer.Metric);
const name$2 = Symbol("Metric.name");
const description$ = Symbol("Metric.description");
dart.setLibraryUri(developer.Metric, "dart:developer");
dart.setFieldSignature(developer.Metric, () => ({
  __proto__: dart.getFields(developer.Metric.__proto__),
  name: dart.finalFieldType(core.String),
  description: dart.finalFieldType(core.String)
}));
const _value$1 = dart.privateName(developer, "_value");
const _toJSON = dart.privateName(developer, "_toJSON");
developer.Gauge = class Gauge extends developer.Metric {
  get min() {
    return this[min$];
  }
  set min(value) {
    super.min = value;
  }
  get max() {
    return this[max$];
  }
  set max(value) {
    super.max = value;
  }
  get value() {
    return this[_value$1];
  }
  set value(v) {
    if (dart.notNull(v) < dart.notNull(this.min)) {
      v = this.min;
    } else if (dart.notNull(v) > dart.notNull(this.max)) {
      v = this.max;
    }
    this[_value$1] = v;
  }
  [_toJSON]() {
    let map = new (IdentityMapOfString$Object()).from(["type", "Gauge", "id", "metrics/" + dart.str(this.name), "name", this.name, "description", this.description, "value", this.value, "min", this.min, "max", this.max]);
    return map;
  }
};
(developer.Gauge.new = function(name, description, min, max) {
  this[_value$1] = null;
  this[min$] = min;
  this[max$] = max;
  developer.Gauge.__proto__.new.call(this, name, description);
  core.ArgumentError.checkNotNull(this.min, "min");
  core.ArgumentError.checkNotNull(this.max, "max");
  if (!(dart.notNull(this.min) < dart.notNull(this.max))) dart.throw(new core.ArgumentError.new("min must be less than max"));
  this[_value$1] = this.min;
}).prototype = developer.Gauge.prototype;
dart.addTypeTests(developer.Gauge);
const min$ = Symbol("Gauge.min");
const max$ = Symbol("Gauge.max");
dart.setMethodSignature(developer.Gauge, () => ({
  __proto__: dart.getMethods(developer.Gauge.__proto__),
  [_toJSON]: dart.fnType(core.Map, [])
}));
dart.setGetterSignature(developer.Gauge, () => ({
  __proto__: dart.getGetters(developer.Gauge.__proto__),
  value: core.double
}));
dart.setSetterSignature(developer.Gauge, () => ({
  __proto__: dart.getSetters(developer.Gauge.__proto__),
  value: core.double
}));
dart.setLibraryUri(developer.Gauge, "dart:developer");
dart.setFieldSignature(developer.Gauge, () => ({
  __proto__: dart.getFields(developer.Gauge.__proto__),
  min: dart.finalFieldType(core.double),
  max: dart.finalFieldType(core.double),
  [_value$1]: dart.fieldType(core.double)
}));
developer.Counter = class Counter extends developer.Metric {
  get value() {
    return this[_value$1];
  }
  set value(v) {
    this[_value$1] = v;
  }
  [_toJSON]() {
    let map = new (IdentityMapOfString$Object()).from(["type", "Counter", "id", "metrics/" + dart.str(this.name), "name", this.name, "description", this.description, "value", this.value]);
    return map;
  }
};
(developer.Counter.new = function(name, description) {
  this[_value$1] = 0.0;
  developer.Counter.__proto__.new.call(this, name, description);
}).prototype = developer.Counter.prototype;
dart.addTypeTests(developer.Counter);
dart.setMethodSignature(developer.Counter, () => ({
  __proto__: dart.getMethods(developer.Counter.__proto__),
  [_toJSON]: dart.fnType(core.Map, [])
}));
dart.setGetterSignature(developer.Counter, () => ({
  __proto__: dart.getGetters(developer.Counter.__proto__),
  value: core.double
}));
dart.setSetterSignature(developer.Counter, () => ({
  __proto__: dart.getSetters(developer.Counter.__proto__),
  value: core.double
}));
dart.setLibraryUri(developer.Counter, "dart:developer");
dart.setFieldSignature(developer.Counter, () => ({
  __proto__: dart.getFields(developer.Counter.__proto__),
  [_value$1]: dart.fieldType(core.double)
}));
developer.Metrics = class Metrics extends core.Object {
  static register(metric) {
    core.ArgumentError.checkNotNull(metric, "metric");
    if (developer.Metrics._metrics[$_get](metric.name) != null) {
      dart.throw(new core.ArgumentError.new("Registered metrics have unique names"));
    }
    developer.Metrics._metrics[$_set](metric.name, metric);
  }
  static deregister(metric) {
    core.ArgumentError.checkNotNull(metric, "metric");
    developer.Metrics._metrics[$remove](metric.name);
  }
  static _printMetric(id) {
    let metric = developer.Metrics._metrics[$_get](id);
    if (metric == null) {
      return null;
    }
    return convert.json.encode(metric[_toJSON]());
  }
  static _printMetrics() {
    let metrics = [];
    for (let metric of developer.Metrics._metrics[$values]) {
      metrics[$add](metric[_toJSON]());
    }
    let map = new (IdentityMapOfString$Object()).from(["type", "MetricList", "metrics", metrics]);
    return convert.json.encode(map);
  }
};
(developer.Metrics.new = function() {
}).prototype = developer.Metrics.prototype;
dart.addTypeTests(developer.Metrics);
dart.setLibraryUri(developer.Metrics, "dart:developer");
dart.defineLazy(developer.Metrics, {
  /*developer.Metrics._metrics*/get _metrics() {
    return new (IdentityMapOfString$Metric()).new();
  }
});
developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
  get majorVersion() {
    return this[majorVersion];
  }
  set majorVersion(value) {
    super.majorVersion = value;
  }
  get minorVersion() {
    return this[minorVersion];
  }
  set minorVersion(value) {
    super.minorVersion = value;
  }
  get serverUri() {
    return this[serverUri$];
  }
  set serverUri(value) {
    super.serverUri = value;
  }
  toString() {
    if (this.serverUri != null) {
      return "Dart VM Service Protocol v" + dart.str(this.majorVersion) + "." + dart.str(this.minorVersion) + " " + ("listening on " + dart.str(this.serverUri));
    } else {
      return "Dart VM Service Protocol v" + dart.str(this.majorVersion) + "." + dart.str(this.minorVersion);
    }
  }
};
(developer.ServiceProtocolInfo.new = function(serverUri) {
  this[majorVersion] = developer._getServiceMajorVersion();
  this[minorVersion] = developer._getServiceMinorVersion();
  this[serverUri$] = serverUri;
}).prototype = developer.ServiceProtocolInfo.prototype;
dart.addTypeTests(developer.ServiceProtocolInfo);
const majorVersion = Symbol("ServiceProtocolInfo.majorVersion");
const minorVersion = Symbol("ServiceProtocolInfo.minorVersion");
const serverUri$ = Symbol("ServiceProtocolInfo.serverUri");
dart.setLibraryUri(developer.ServiceProtocolInfo, "dart:developer");
dart.setFieldSignature(developer.ServiceProtocolInfo, () => ({
  __proto__: dart.getFields(developer.ServiceProtocolInfo.__proto__),
  majorVersion: dart.finalFieldType(core.int),
  minorVersion: dart.finalFieldType(core.int),
  serverUri: dart.finalFieldType(core.Uri)
}));
dart.defineExtensionMethods(developer.ServiceProtocolInfo, ['toString']);
developer.Service = class Service extends core.Object {
  static getInfo() {
    return async.async(developer.ServiceProtocolInfo, function* getInfo() {
      let receivePort = isolate.RawReceivePort.new();
      let uriCompleter = CompleterOfUri().new();
      receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
      developer._getServerInfo(receivePort.sendPort);
      let uri = (yield uriCompleter.future);
      receivePort.close();
      return new developer.ServiceProtocolInfo.new(uri);
    });
  }
  static controlWebServer(opts) {
    let enable = opts && 'enable' in opts ? opts.enable : false;
    return async.async(developer.ServiceProtocolInfo, function* controlWebServer() {
      core.ArgumentError.checkNotNull(enable, "enable");
      let receivePort = isolate.RawReceivePort.new();
      let uriCompleter = CompleterOfUri().new();
      receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
      developer._webServerControl(receivePort.sendPort, enable);
      let uri = (yield uriCompleter.future);
      receivePort.close();
      return new developer.ServiceProtocolInfo.new(uri);
    });
  }
  static getIsolateID(isolate) {
    core.ArgumentError.checkNotNull(isolate, "isolate");
    return developer._getIsolateIDFromSendPort(isolate.controlPort);
  }
};
(developer.Service.new = function() {
}).prototype = developer.Service.prototype;
dart.addTypeTests(developer.Service);
dart.setLibraryUri(developer.Service, "dart:developer");
developer._getServerInfo = function(sendPort) {
  sendPort.send(null);
};
developer._webServerControl = function(sendPort, enable) {
  sendPort.send(null);
};
developer._getServiceMajorVersion = function() {
  return 0;
};
developer._getServiceMinorVersion = function() {
  return 0;
};
developer._getIsolateIDFromSendPort = function(sendPort) {
  return null;
};
dart.defineLazy(developer, {
  /*developer._hasTimeline*/get _hasTimeline() {
    return true;
  }
});
const _type$ = dart.privateName(developer, "_type");
developer.Flow = class Flow extends core.Object {
  get id() {
    return this[id$];
  }
  set id(value) {
    super.id = value;
  }
  static begin(opts) {
    let id = opts && 'id' in opts ? opts.id : null;
    return new developer.Flow.__(9, id != null ? id : developer._getNextAsyncId());
  }
  static step(id) {
    return new developer.Flow.__(10, id);
  }
  static end(id) {
    return new developer.Flow.__(11, id);
  }
};
(developer.Flow.__ = function(type, id) {
  this[_type$] = type;
  this[id$] = id;
}).prototype = developer.Flow.prototype;
dart.addTypeTests(developer.Flow);
const id$ = Symbol("Flow.id");
dart.setLibraryUri(developer.Flow, "dart:developer");
dart.setFieldSignature(developer.Flow, () => ({
  __proto__: dart.getFields(developer.Flow.__proto__),
  [_type$]: dart.finalFieldType(core.int),
  id: dart.finalFieldType(core.int)
}));
dart.defineLazy(developer.Flow, {
  /*developer.Flow._begin*/get _begin() {
    return 9;
  },
  /*developer.Flow._step*/get _step() {
    return 10;
  },
  /*developer.Flow._end*/get _end() {
    return 11;
  }
});
const _arguments$ = dart.privateName(developer, "_arguments");
developer.Timeline = class Timeline extends core.Object {
  static startSync(name, opts) {
    let arguments$0 = opts && 'arguments' in opts ? opts.arguments : null;
    let flow = opts && 'flow' in opts ? opts.flow : null;
    if (!true) return;
    core.ArgumentError.checkNotNull(name, "name");
    if (!dart.test(developer._isDartStreamEnabled())) {
      developer.Timeline._stack[$add](null);
      return;
    }
    let block = new developer._SyncBlock.__(name, developer._getTraceClock(), developer._getThreadCpuClock());
    if (arguments$0 != null) {
      block[_arguments$] = arguments$0;
    }
    if (flow != null) {
      block.flow = flow;
    }
    developer.Timeline._stack[$add](block);
  }
  static finishSync() {
    if (!true) {
      return;
    }
    if (developer.Timeline._stack[$length] === 0) {
      dart.throw(new core.StateError.new("Uneven calls to startSync and finishSync"));
    }
    let block = developer.Timeline._stack[$removeLast]();
    if (block == null) {
      return;
    }
    block.finish();
  }
  static instantSync(name, opts) {
    let arguments$0 = opts && 'arguments' in opts ? opts.arguments : null;
    if (!true) return;
    core.ArgumentError.checkNotNull(name, "name");
    if (!dart.test(developer._isDartStreamEnabled())) {
      return;
    }
    let instantArguments = null;
    if (arguments$0 != null) {
      instantArguments = core.Map.from(arguments$0);
    }
    developer._reportInstantEvent(developer._getTraceClock(), "Dart", name, developer._argumentsAsJson(instantArguments));
  }
  static timeSync(T, name, func, opts) {
    let arguments$0 = opts && 'arguments' in opts ? opts.arguments : null;
    let flow = opts && 'flow' in opts ? opts.flow : null;
    developer.Timeline.startSync(name, {arguments: arguments$0, flow: flow});
    try {
      return func();
    } finally {
      developer.Timeline.finishSync();
    }
  }
  static get now() {
    return developer._getTraceClock();
  }
};
(developer.Timeline.new = function() {
}).prototype = developer.Timeline.prototype;
dart.addTypeTests(developer.Timeline);
dart.setLibraryUri(developer.Timeline, "dart:developer");
dart.defineLazy(developer.Timeline, {
  /*developer.Timeline._stack*/get _stack() {
    return JSArrayOf_SyncBlock().of([]);
  }
});
const _taskId = dart.privateName(developer, "_taskId");
const _stack = dart.privateName(developer, "_stack");
const _start$1 = dart.privateName(developer, "_start");
const _finish = dart.privateName(developer, "_finish");
developer.TimelineTask = class TimelineTask extends core.Object {
  start(name, opts) {
    let arguments$0 = opts && 'arguments' in opts ? opts.arguments : null;
    if (!true) return;
    core.ArgumentError.checkNotNull(name, "name");
    let block = new developer._AsyncBlock.__(name, this[_taskId]);
    if (arguments$0 != null) {
      block[_arguments$] = arguments$0;
    }
    this[_stack][$add](block);
    block[_start$1]();
  }
  instant(name, opts) {
    let arguments$0 = opts && 'arguments' in opts ? opts.arguments : null;
    if (!true) return;
    core.ArgumentError.checkNotNull(name, "name");
    let instantArguments = null;
    if (arguments$0 != null) {
      instantArguments = core.Map.from(arguments$0);
    }
    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], "n", "Dart", name, developer._argumentsAsJson(instantArguments));
  }
  finish() {
    if (!true) {
      return;
    }
    if (this[_stack][$length] === 0) {
      dart.throw(new core.StateError.new("Uneven calls to start and finish"));
    }
    let block = this[_stack][$removeLast]();
    block[_finish]();
  }
  pass() {
    if (dart.notNull(this[_stack][$length]) > 0) {
      dart.throw(new core.StateError.new("You cannot pass a TimelineTask without finishing all started " + "operations"));
    }
    let r = this[_taskId];
    return r;
  }
};
(developer.TimelineTask.new = function() {
  this[_stack] = JSArrayOf_AsyncBlock().of([]);
  this[_taskId] = developer._getNextAsyncId();
}).prototype = developer.TimelineTask.prototype;
(developer.TimelineTask.withTaskId = function(taskId) {
  this[_stack] = JSArrayOf_AsyncBlock().of([]);
  this[_taskId] = taskId;
  core.ArgumentError.checkNotNull(taskId, "taskId");
}).prototype = developer.TimelineTask.prototype;
dart.addTypeTests(developer.TimelineTask);
dart.setMethodSignature(developer.TimelineTask, () => ({
  __proto__: dart.getMethods(developer.TimelineTask.__proto__),
  start: dart.fnType(dart.void, [core.String], {arguments: core.Map}),
  instant: dart.fnType(dart.void, [core.String], {arguments: core.Map}),
  finish: dart.fnType(dart.void, []),
  pass: dart.fnType(core.int, [])
}));
dart.setLibraryUri(developer.TimelineTask, "dart:developer");
dart.setFieldSignature(developer.TimelineTask, () => ({
  __proto__: dart.getFields(developer.TimelineTask.__proto__),
  [_taskId]: dart.finalFieldType(core.int),
  [_stack]: dart.finalFieldType(ListOf_AsyncBlock())
}));
developer._AsyncBlock = class _AsyncBlock extends core.Object {
  [_start$1]() {
    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], "b", this.category, this.name, developer._argumentsAsJson(null));
  }
  [_finish]() {
    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], "e", this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
  }
};
(developer._AsyncBlock.__ = function(name, taskId) {
  this.category = "Dart";
  this[_arguments$] = null;
  this.name = name;
  this[_taskId] = taskId;
}).prototype = developer._AsyncBlock.prototype;
dart.addTypeTests(developer._AsyncBlock);
dart.setMethodSignature(developer._AsyncBlock, () => ({
  __proto__: dart.getMethods(developer._AsyncBlock.__proto__),
  [_start$1]: dart.fnType(dart.void, []),
  [_finish]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(developer._AsyncBlock, "dart:developer");
dart.setFieldSignature(developer._AsyncBlock, () => ({
  __proto__: dart.getFields(developer._AsyncBlock.__proto__),
  category: dart.finalFieldType(core.String),
  name: dart.finalFieldType(core.String),
  [_taskId]: dart.finalFieldType(core.int),
  [_arguments$]: dart.fieldType(core.Map)
}));
const _startCpu = dart.privateName(developer, "_startCpu");
const _flow = dart.privateName(developer, "_flow");
developer._SyncBlock = class _SyncBlock extends core.Object {
  finish() {
    developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
    if (this[_flow] != null) {
      developer._reportFlowEvent(this[_start$1], this[_startCpu], this.category, this.name, this[_flow][_type$], this[_flow].id, developer._argumentsAsJson(null));
    }
  }
  set flow(f) {
    this[_flow] = f;
  }
};
(developer._SyncBlock.__ = function(name, start, startCpu) {
  this.category = "Dart";
  this[_arguments$] = null;
  this[_flow] = null;
  this.name = name;
  this[_start$1] = start;
  this[_startCpu] = startCpu;
}).prototype = developer._SyncBlock.prototype;
dart.addTypeTests(developer._SyncBlock);
dart.setMethodSignature(developer._SyncBlock, () => ({
  __proto__: dart.getMethods(developer._SyncBlock.__proto__),
  finish: dart.fnType(dart.void, [])
}));
dart.setSetterSignature(developer._SyncBlock, () => ({
  __proto__: dart.getSetters(developer._SyncBlock.__proto__),
  flow: developer.Flow
}));
dart.setLibraryUri(developer._SyncBlock, "dart:developer");
dart.setFieldSignature(developer._SyncBlock, () => ({
  __proto__: dart.getFields(developer._SyncBlock.__proto__),
  category: dart.finalFieldType(core.String),
  name: dart.finalFieldType(core.String),
  [_arguments$]: dart.fieldType(core.Map),
  [_start$1]: dart.finalFieldType(core.int),
  [_startCpu]: dart.finalFieldType(core.int),
  [_flow]: dart.fieldType(developer.Flow)
}));
developer._argumentsAsJson = function(arguments$0) {
  if (arguments$0 == null || arguments$0[$length] === 0) {
    return "{}";
  }
  return convert.json.encode(arguments$0);
};
developer._isDartStreamEnabled = function() {
  return false;
};
developer._getNextAsyncId = function() {
  return 0;
};
developer._getTraceClock = function() {
  let x = developer._clockValue;
  developer._clockValue = dart.notNull(x) + 1;
  return x;
};
developer._getThreadCpuClock = function() {
  return -1;
};
developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
};
developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
};
developer._reportFlowEvent = function(start, startCpu, category, name, type, id, argumentsAsJson) {
};
developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
};
io.BytesBuilder = class BytesBuilder extends core.Object {
  static new(opts) {
    let copy = opts && 'copy' in opts ? opts.copy : true;
    if (dart.test(copy)) {
      return new io._CopyingBytesBuilder.new();
    } else {
      return new io._BytesBuilder.new();
    }
  }
};
(io.BytesBuilder[dart.mixinNew] = function() {
}).prototype = io.BytesBuilder.prototype;
dart.addTypeTests(io.BytesBuilder);
dart.setLibraryUri(io.BytesBuilder, "dart:io");
const _buffer$ = dart.privateName(io, "_buffer");
const _length$1 = dart.privateName(io, "_length");
const _grow$ = dart.privateName(io, "_grow");
io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
  add(bytes) {
    let bytesLength = bytes[$length];
    if (bytesLength === 0) return;
    let required = dart.notNull(this[_length$1]) + dart.notNull(bytesLength);
    if (dart.notNull(this[_buffer$][$length]) < required) {
      this[_grow$](required);
    }
    if (!(dart.notNull(this[_buffer$][$length]) >= required)) dart.assertFailed(null, "dart:io/bytes_builder.dart", 102, 12, "_buffer.length >= required");
    if (typed_data.Uint8List.is(bytes)) {
      this[_buffer$][$setRange](this[_length$1], required, bytes);
    } else {
      for (let i = 0; i < dart.notNull(bytesLength); i++) {
        this[_buffer$][$_set](dart.notNull(this[_length$1]) + i, bytes[$_get](i));
      }
    }
    this[_length$1] = required;
  }
  addByte(byte) {
    if (this[_buffer$][$length] == this[_length$1]) {
      this[_grow$](this[_length$1]);
    }
    if (!(dart.notNull(this[_buffer$][$length]) > dart.notNull(this[_length$1]))) dart.assertFailed(null, "dart:io/bytes_builder.dart", 119, 12, "_buffer.length > _length");
    this[_buffer$][$_set](this[_length$1], byte);
    this[_length$1] = dart.notNull(this[_length$1]) + 1;
  }
  [_grow$](required) {
    let newSize = dart.notNull(required) * 2;
    if (dart.notNull(newSize) < 1024) {
      newSize = 1024;
    } else {
      newSize = io._CopyingBytesBuilder._pow2roundup(newSize);
    }
    let newBuffer = typed_data.Uint8List.new(newSize);
    newBuffer[$setRange](0, this[_buffer$][$length], this[_buffer$]);
    this[_buffer$] = newBuffer;
  }
  takeBytes() {
    if (this[_length$1] === 0) return io._CopyingBytesBuilder._emptyList;
    let buffer = typed_data.Uint8List.view(this[_buffer$][$buffer], 0, this[_length$1]);
    this.clear();
    return buffer;
  }
  toBytes() {
    if (this[_length$1] === 0) return io._CopyingBytesBuilder._emptyList;
    return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][$buffer], 0, this[_length$1]));
  }
  get length() {
    return this[_length$1];
  }
  get isEmpty() {
    return this[_length$1] === 0;
  }
  get isNotEmpty() {
    return this[_length$1] !== 0;
  }
  clear() {
    this[_length$1] = 0;
    this[_buffer$] = io._CopyingBytesBuilder._emptyList;
  }
  static _pow2roundup(x) {
    if (!(dart.notNull(x) > 0)) dart.assertFailed(null, "dart:io/bytes_builder.dart", 163, 12, "x > 0");
    x = dart.notNull(x) - 1;
    x = (dart.notNull(x) | x[$rightShift](1)) >>> 0;
    x = (dart.notNull(x) | x[$rightShift](2)) >>> 0;
    x = (dart.notNull(x) | x[$rightShift](4)) >>> 0;
    x = (dart.notNull(x) | x[$rightShift](8)) >>> 0;
    x = (dart.notNull(x) | x[$rightShift](16)) >>> 0;
    return dart.notNull(x) + 1;
  }
};
(io._CopyingBytesBuilder.new = function(initialCapacity) {
  if (initialCapacity === void 0) initialCapacity = 0;
  this[_length$1] = 0;
  this[_buffer$] = dart.notNull(initialCapacity) <= 0 ? io._CopyingBytesBuilder._emptyList : typed_data.Uint8List.new(io._CopyingBytesBuilder._pow2roundup(initialCapacity));
}).prototype = io._CopyingBytesBuilder.prototype;
dart.addTypeTests(io._CopyingBytesBuilder);
io._CopyingBytesBuilder[dart.implements] = () => [io.BytesBuilder];
dart.setMethodSignature(io._CopyingBytesBuilder, () => ({
  __proto__: dart.getMethods(io._CopyingBytesBuilder.__proto__),
  add: dart.fnType(dart.void, [core.List$(core.int)]),
  addByte: dart.fnType(dart.void, [core.int]),
  [_grow$]: dart.fnType(dart.void, [core.int]),
  takeBytes: dart.fnType(core.List$(core.int), []),
  toBytes: dart.fnType(core.List$(core.int), []),
  clear: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(io._CopyingBytesBuilder, () => ({
  __proto__: dart.getGetters(io._CopyingBytesBuilder.__proto__),
  length: core.int,
  isEmpty: core.bool,
  isNotEmpty: core.bool
}));
dart.setLibraryUri(io._CopyingBytesBuilder, "dart:io");
dart.setFieldSignature(io._CopyingBytesBuilder, () => ({
  __proto__: dart.getFields(io._CopyingBytesBuilder.__proto__),
  [_length$1]: dart.fieldType(core.int),
  [_buffer$]: dart.fieldType(typed_data.Uint8List)
}));
dart.defineLazy(io._CopyingBytesBuilder, {
  /*io._CopyingBytesBuilder._initSize*/get _initSize() {
    return 1024;
  },
  /*io._CopyingBytesBuilder._emptyList*/get _emptyList() {
    return typed_data.Uint8List.new(0);
  }
});
const _chunks = dart.privateName(io, "_chunks");
io._BytesBuilder = class _BytesBuilder extends core.Object {
  add(bytes) {
    let typedBytes = null;
    if (typed_data.Uint8List.is(bytes)) {
      typedBytes = bytes;
    } else {
      typedBytes = typed_data.Uint8List.fromList(bytes);
    }
    this[_chunks][$add](typedBytes);
    this[_length$1] = dart.notNull(this[_length$1]) + dart.notNull(typedBytes[$length]);
  }
  addByte(byte) {
    this[_chunks][$add]((() => {
      let _ = typed_data.Uint8List.new(1);
      _[$_set](0, byte);
      return _;
    })());
    this[_length$1] = dart.notNull(this[_length$1]) + 1;
  }
  takeBytes() {
    if (this[_length$1] === 0) return io._CopyingBytesBuilder._emptyList;
    if (this[_chunks][$length] === 1) {
      let buffer = this[_chunks][$_get](0);
      this.clear();
      return buffer;
    }
    let buffer = typed_data.Uint8List.new(this[_length$1]);
    let offset = 0;
    for (let chunk of this[_chunks]) {
      buffer[$setRange](offset, offset + dart.notNull(chunk[$length]), chunk);
      offset = offset + dart.notNull(chunk[$length]);
    }
    this.clear();
    return buffer;
  }
  toBytes() {
    if (this[_length$1] === 0) return io._CopyingBytesBuilder._emptyList;
    let buffer = typed_data.Uint8List.new(this[_length$1]);
    let offset = 0;
    for (let chunk of this[_chunks]) {
      buffer[$setRange](offset, offset + dart.notNull(chunk[$length]), chunk);
      offset = offset + dart.notNull(chunk[$length]);
    }
    return buffer;
  }
  get length() {
    return this[_length$1];
  }
  get isEmpty() {
    return this[_length$1] === 0;
  }
  get isNotEmpty() {
    return this[_length$1] !== 0;
  }
  clear() {
    this[_length$1] = 0;
    this[_chunks][$clear]();
  }
};
(io._BytesBuilder.new = function() {
  this[_length$1] = 0;
  this[_chunks] = JSArrayOfUint8List().of([]);
}).prototype = io._BytesBuilder.prototype;
dart.addTypeTests(io._BytesBuilder);
io._BytesBuilder[dart.implements] = () => [io.BytesBuilder];
dart.setMethodSignature(io._BytesBuilder, () => ({
  __proto__: dart.getMethods(io._BytesBuilder.__proto__),
  add: dart.fnType(dart.void, [core.List$(core.int)]),
  addByte: dart.fnType(dart.void, [core.int]),
  takeBytes: dart.fnType(core.List$(core.int), []),
  toBytes: dart.fnType(core.List$(core.int), []),
  clear: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(io._BytesBuilder, () => ({
  __proto__: dart.getGetters(io._BytesBuilder.__proto__),
  length: core.int,
  isEmpty: core.bool,
  isNotEmpty: core.bool
}));
dart.setLibraryUri(io._BytesBuilder, "dart:io");
dart.setFieldSignature(io._BytesBuilder, () => ({
  __proto__: dart.getFields(io._BytesBuilder.__proto__),
  [_length$1]: dart.fieldType(core.int),
  [_chunks]: dart.finalFieldType(ListOfUint8List())
}));
dart.defineLazy(io, {
  /*io._successResponse*/get _successResponse() {
    return 0;
  },
  /*io._illegalArgumentResponse*/get _illegalArgumentResponse() {
    return 1;
  },
  /*io._osErrorResponse*/get _osErrorResponse() {
    return 2;
  },
  /*io._fileClosedResponse*/get _fileClosedResponse() {
    return 3;
  },
  /*io._errorResponseErrorType*/get _errorResponseErrorType() {
    return 0;
  },
  /*io._osErrorResponseErrorCode*/get _osErrorResponseErrorCode() {
    return 1;
  },
  /*io._osErrorResponseMessage*/get _osErrorResponseMessage() {
    return 2;
  }
});
io._isErrorResponse = function(response) {
  return core.List.is(response) && !dart.equals(response[$_get](0), 0);
};
io._exceptionFromResponse = function(response, message, path) {
  if (!dart.test(io._isErrorResponse(response))) dart.assertFailed(null, "dart:io/common.dart", 26, 10, "_isErrorResponse(response)");
  switch (dart.dindex(response, 0)) {
    case 1:
    {
      return new core.ArgumentError.new(dart.str(message) + ": " + dart.str(path));
    }
    case 2:
    {
      let err = new io.OSError.new(core.String._check(dart.dindex(response, 2)), core.int._check(dart.dindex(response, 1)));
      return new io.FileSystemException.new(message, path, err);
    }
    case 3:
    {
      return new io.FileSystemException.new("File closed", path);
    }
    default:
    {
      return core.Exception.new("Unknown error");
    }
  }
};
io.IOException = class IOException extends core.Object {
  toString() {
    return "IOException";
  }
};
(io.IOException.new = function() {
}).prototype = io.IOException.prototype;
dart.addTypeTests(io.IOException);
io.IOException[dart.implements] = () => [core.Exception];
dart.setLibraryUri(io.IOException, "dart:io");
dart.defineExtensionMethods(io.IOException, ['toString']);
io.OSError = class OSError extends core.Object {
  get message() {
    return this[message$7];
  }
  set message(value) {
    super.message = value;
  }
  get errorCode() {
    return this[errorCode$0];
  }
  set errorCode(value) {
    super.errorCode = value;
  }
  toString() {
    let sb = new core.StringBuffer.new();
    sb.write("OS Error");
    if (this.message[$isNotEmpty]) {
      sb.write(": ");
      sb.write(this.message);
      if (this.errorCode !== -1) {
        sb.write(", errno = ");
        sb.write(dart.toString(this.errorCode));
      }
    } else if (this.errorCode !== -1) {
      sb.write(": errno = ");
      sb.write(dart.toString(this.errorCode));
    }
    return sb.toString();
  }
};
(io.OSError.new = function(message, errorCode) {
  if (message === void 0) message = "";
  if (errorCode === void 0) errorCode = -1;
  this[message$7] = message;
  this[errorCode$0] = errorCode;
}).prototype = io.OSError.prototype;
dart.addTypeTests(io.OSError);
const message$7 = Symbol("OSError.message");
const errorCode$0 = Symbol("OSError.errorCode");
dart.setLibraryUri(io.OSError, "dart:io");
dart.setFieldSignature(io.OSError, () => ({
  __proto__: dart.getFields(io.OSError.__proto__),
  message: dart.finalFieldType(core.String),
  errorCode: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io.OSError, ['toString']);
dart.defineLazy(io.OSError, {
  /*io.OSError.noErrorCode*/get noErrorCode() {
    return -1;
  }
});
io._BufferAndStart = class _BufferAndStart extends core.Object {};
(io._BufferAndStart.new = function(buffer, start) {
  this.buffer = buffer;
  this.start = start;
}).prototype = io._BufferAndStart.prototype;
dart.addTypeTests(io._BufferAndStart);
dart.setLibraryUri(io._BufferAndStart, "dart:io");
dart.setFieldSignature(io._BufferAndStart, () => ({
  __proto__: dart.getFields(io._BufferAndStart.__proto__),
  buffer: dart.fieldType(ListOfint()),
  start: dart.fieldType(core.int)
}));
io._ensureFastAndSerializableByteData = function(buffer, start, end) {
  if (typed_data.Uint8List.is(buffer) || typed_data.Int8List.is(buffer)) {
    return new io._BufferAndStart.new(buffer, start);
  }
  let length = dart.notNull(end) - dart.notNull(start);
  let newBuffer = typed_data.Uint8List.new(length);
  let j = start;
  for (let i = 0; i < length; i++) {
    let value = buffer[$_get](j);
    if (value == null) dart.throw(new core.ArgumentError.new("List element is null at index " + dart.str(j)));
    newBuffer[$_set](i, value);
    j = dart.notNull(j) + 1;
  }
  return new io._BufferAndStart.new(newBuffer, 0);
};
io._IOCrypto = class _IOCrypto extends core.Object {
  static getRandomBytes(count) {
    dart.throw(new core.UnsupportedError.new("_IOCrypto.getRandomBytes"));
  }
};
(io._IOCrypto.new = function() {
}).prototype = io._IOCrypto.prototype;
dart.addTypeTests(io._IOCrypto);
dart.setLibraryUri(io._IOCrypto, "dart:io");
io.ZLibOption = class ZLibOption extends core.Object {};
(io.ZLibOption.new = function() {
}).prototype = io.ZLibOption.prototype;
dart.addTypeTests(io.ZLibOption);
dart.setLibraryUri(io.ZLibOption, "dart:io");
dart.defineLazy(io.ZLibOption, {
  /*io.ZLibOption.minWindowBits*/get minWindowBits() {
    return 8;
  },
  /*io.ZLibOption.MIN_WINDOW_BITS*/get MIN_WINDOW_BITS() {
    return 8;
  },
  /*io.ZLibOption.maxWindowBits*/get maxWindowBits() {
    return 15;
  },
  /*io.ZLibOption.MAX_WINDOW_BITS*/get MAX_WINDOW_BITS() {
    return 15;
  },
  /*io.ZLibOption.defaultWindowBits*/get defaultWindowBits() {
    return 15;
  },
  /*io.ZLibOption.DEFAULT_WINDOW_BITS*/get DEFAULT_WINDOW_BITS() {
    return 15;
  },
  /*io.ZLibOption.minLevel*/get minLevel() {
    return -1;
  },
  /*io.ZLibOption.MIN_LEVEL*/get MIN_LEVEL() {
    return -1;
  },
  /*io.ZLibOption.maxLevel*/get maxLevel() {
    return 9;
  },
  /*io.ZLibOption.MAX_LEVEL*/get MAX_LEVEL() {
    return 9;
  },
  /*io.ZLibOption.defaultLevel*/get defaultLevel() {
    return 6;
  },
  /*io.ZLibOption.DEFAULT_LEVEL*/get DEFAULT_LEVEL() {
    return 6;
  },
  /*io.ZLibOption.minMemLevel*/get minMemLevel() {
    return 1;
  },
  /*io.ZLibOption.MIN_MEM_LEVEL*/get MIN_MEM_LEVEL() {
    return 1;
  },
  /*io.ZLibOption.maxMemLevel*/get maxMemLevel() {
    return 9;
  },
  /*io.ZLibOption.MAX_MEM_LEVEL*/get MAX_MEM_LEVEL() {
    return 9;
  },
  /*io.ZLibOption.defaultMemLevel*/get defaultMemLevel() {
    return 8;
  },
  /*io.ZLibOption.DEFAULT_MEM_LEVEL*/get DEFAULT_MEM_LEVEL() {
    return 8;
  },
  /*io.ZLibOption.strategyFiltered*/get strategyFiltered() {
    return 1;
  },
  /*io.ZLibOption.STRATEGY_FILTERED*/get STRATEGY_FILTERED() {
    return 1;
  },
  /*io.ZLibOption.strategyHuffmanOnly*/get strategyHuffmanOnly() {
    return 2;
  },
  /*io.ZLibOption.STRATEGY_HUFFMAN_ONLY*/get STRATEGY_HUFFMAN_ONLY() {
    return 2;
  },
  /*io.ZLibOption.strategyRle*/get strategyRle() {
    return 3;
  },
  /*io.ZLibOption.STRATEGY_RLE*/get STRATEGY_RLE() {
    return 3;
  },
  /*io.ZLibOption.strategyFixed*/get strategyFixed() {
    return 4;
  },
  /*io.ZLibOption.STRATEGY_FIXED*/get STRATEGY_FIXED() {
    return 4;
  },
  /*io.ZLibOption.strategyDefault*/get strategyDefault() {
    return 0;
  },
  /*io.ZLibOption.STRATEGY_DEFAULT*/get STRATEGY_DEFAULT() {
    return 0;
  }
});
dart.defineLazy(io, {
  /*io.zlib*/get zlib() {
    return dart.const(new io.ZLibCodec._default());
  },
  /*io.ZLIB*/get ZLIB() {
    return io.zlib;
  }
});
io.ZLibCodec = class ZLibCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
  get gzip() {
    return this[gzip$];
  }
  set gzip(value) {
    super.gzip = value;
  }
  get level() {
    return this[level$];
  }
  set level(value) {
    super.level = value;
  }
  get memLevel() {
    return this[memLevel$];
  }
  set memLevel(value) {
    super.memLevel = value;
  }
  get strategy() {
    return this[strategy$];
  }
  set strategy(value) {
    super.strategy = value;
  }
  get windowBits() {
    return this[windowBits$];
  }
  set windowBits(value) {
    super.windowBits = value;
  }
  get raw() {
    return this[raw$];
  }
  set raw(value) {
    super.raw = value;
  }
  get dictionary() {
    return this[dictionary$];
  }
  set dictionary(value) {
    super.dictionary = value;
  }
  get encoder() {
    return new io.ZLibEncoder.new({gzip: false, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
  }
  get decoder() {
    return new io.ZLibDecoder.new({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
  }
};
(io.ZLibCodec.new = function(opts) {
  let level = opts && 'level' in opts ? opts.level : io.ZLibOption.defaultLevel;
  let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.defaultWindowBits;
  let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.defaultMemLevel;
  let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.strategyDefault;
  let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
  let raw = opts && 'raw' in opts ? opts.raw : false;
  let gzip = opts && 'gzip' in opts ? opts.gzip : false;
  this[level$] = level;
  this[windowBits$] = windowBits;
  this[memLevel$] = memLevel;
  this[strategy$] = strategy;
  this[dictionary$] = dictionary;
  this[raw$] = raw;
  this[gzip$] = gzip;
  io.ZLibCodec.__proto__.new.call(this);
  io._validateZLibeLevel(this.level);
  io._validateZLibMemLevel(this.memLevel);
  io._validateZLibStrategy(this.strategy);
  io._validateZLibWindowBits(this.windowBits);
}).prototype = io.ZLibCodec.prototype;
(io.ZLibCodec._default = function() {
  this[level$] = io.ZLibOption.defaultLevel;
  this[windowBits$] = io.ZLibOption.defaultWindowBits;
  this[memLevel$] = io.ZLibOption.defaultMemLevel;
  this[strategy$] = io.ZLibOption.strategyDefault;
  this[raw$] = false;
  this[gzip$] = false;
  this[dictionary$] = null;
  io.ZLibCodec.__proto__.new.call(this);
}).prototype = io.ZLibCodec.prototype;
dart.addTypeTests(io.ZLibCodec);
const gzip$ = Symbol("ZLibCodec.gzip");
const level$ = Symbol("ZLibCodec.level");
const memLevel$ = Symbol("ZLibCodec.memLevel");
const strategy$ = Symbol("ZLibCodec.strategy");
const windowBits$ = Symbol("ZLibCodec.windowBits");
const raw$ = Symbol("ZLibCodec.raw");
const dictionary$ = Symbol("ZLibCodec.dictionary");
dart.setGetterSignature(io.ZLibCodec, () => ({
  __proto__: dart.getGetters(io.ZLibCodec.__proto__),
  encoder: io.ZLibEncoder,
  decoder: io.ZLibDecoder
}));
dart.setLibraryUri(io.ZLibCodec, "dart:io");
dart.setFieldSignature(io.ZLibCodec, () => ({
  __proto__: dart.getFields(io.ZLibCodec.__proto__),
  gzip: dart.finalFieldType(core.bool),
  level: dart.finalFieldType(core.int),
  memLevel: dart.finalFieldType(core.int),
  strategy: dart.finalFieldType(core.int),
  windowBits: dart.finalFieldType(core.int),
  raw: dart.finalFieldType(core.bool),
  dictionary: dart.finalFieldType(ListOfint())
}));
dart.defineLazy(io, {
  /*io.gzip*/get gzip() {
    return dart.const(new io.GZipCodec._default());
  },
  /*io.GZIP*/get GZIP() {
    return io.gzip;
  }
});
io.GZipCodec = class GZipCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
  get gzip() {
    return this[gzip$0];
  }
  set gzip(value) {
    super.gzip = value;
  }
  get level() {
    return this[level$0];
  }
  set level(value) {
    super.level = value;
  }
  get memLevel() {
    return this[memLevel$0];
  }
  set memLevel(value) {
    super.memLevel = value;
  }
  get strategy() {
    return this[strategy$0];
  }
  set strategy(value) {
    super.strategy = value;
  }
  get windowBits() {
    return this[windowBits$0];
  }
  set windowBits(value) {
    super.windowBits = value;
  }
  get dictionary() {
    return this[dictionary$0];
  }
  set dictionary(value) {
    super.dictionary = value;
  }
  get raw() {
    return this[raw$0];
  }
  set raw(value) {
    super.raw = value;
  }
  get encoder() {
    return new io.ZLibEncoder.new({gzip: true, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
  }
  get decoder() {
    return new io.ZLibDecoder.new({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
  }
};
(io.GZipCodec.new = function(opts) {
  let level = opts && 'level' in opts ? opts.level : io.ZLibOption.defaultLevel;
  let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.defaultWindowBits;
  let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.defaultMemLevel;
  let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.strategyDefault;
  let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
  let raw = opts && 'raw' in opts ? opts.raw : false;
  let gzip = opts && 'gzip' in opts ? opts.gzip : true;
  this[level$0] = level;
  this[windowBits$0] = windowBits;
  this[memLevel$0] = memLevel;
  this[strategy$0] = strategy;
  this[dictionary$0] = dictionary;
  this[raw$0] = raw;
  this[gzip$0] = gzip;
  io.GZipCodec.__proto__.new.call(this);
  io._validateZLibeLevel(this.level);
  io._validateZLibMemLevel(this.memLevel);
  io._validateZLibStrategy(this.strategy);
  io._validateZLibWindowBits(this.windowBits);
}).prototype = io.GZipCodec.prototype;
(io.GZipCodec._default = function() {
  this[level$0] = io.ZLibOption.defaultLevel;
  this[windowBits$0] = io.ZLibOption.defaultWindowBits;
  this[memLevel$0] = io.ZLibOption.defaultMemLevel;
  this[strategy$0] = io.ZLibOption.strategyDefault;
  this[raw$0] = false;
  this[gzip$0] = true;
  this[dictionary$0] = null;
  io.GZipCodec.__proto__.new.call(this);
}).prototype = io.GZipCodec.prototype;
dart.addTypeTests(io.GZipCodec);
const gzip$0 = Symbol("GZipCodec.gzip");
const level$0 = Symbol("GZipCodec.level");
const memLevel$0 = Symbol("GZipCodec.memLevel");
const strategy$0 = Symbol("GZipCodec.strategy");
const windowBits$0 = Symbol("GZipCodec.windowBits");
const dictionary$0 = Symbol("GZipCodec.dictionary");
const raw$0 = Symbol("GZipCodec.raw");
dart.setGetterSignature(io.GZipCodec, () => ({
  __proto__: dart.getGetters(io.GZipCodec.__proto__),
  encoder: io.ZLibEncoder,
  decoder: io.ZLibDecoder
}));
dart.setLibraryUri(io.GZipCodec, "dart:io");
dart.setFieldSignature(io.GZipCodec, () => ({
  __proto__: dart.getFields(io.GZipCodec.__proto__),
  gzip: dart.finalFieldType(core.bool),
  level: dart.finalFieldType(core.int),
  memLevel: dart.finalFieldType(core.int),
  strategy: dart.finalFieldType(core.int),
  windowBits: dart.finalFieldType(core.int),
  dictionary: dart.finalFieldType(ListOfint()),
  raw: dart.finalFieldType(core.bool)
}));
io.ZLibEncoder = class ZLibEncoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
  get gzip() {
    return this[gzip$1];
  }
  set gzip(value) {
    super.gzip = value;
  }
  get level() {
    return this[level$1];
  }
  set level(value) {
    super.level = value;
  }
  get memLevel() {
    return this[memLevel$1];
  }
  set memLevel(value) {
    super.memLevel = value;
  }
  get strategy() {
    return this[strategy$1];
  }
  set strategy(value) {
    super.strategy = value;
  }
  get windowBits() {
    return this[windowBits$1];
  }
  set windowBits(value) {
    super.windowBits = value;
  }
  get dictionary() {
    return this[dictionary$1];
  }
  set dictionary(value) {
    super.dictionary = value;
  }
  get raw() {
    return this[raw$1];
  }
  set raw(value) {
    super.raw = value;
  }
  convert(bytes) {
    ListOfint()._check(bytes);
    let sink = new io._BufferSink.new();
    let _ = this.startChunkedConversion(sink);
    _.add(bytes);
    _.close();
    return sink.builder.takeBytes();
  }
  startChunkedConversion(sink) {
    SinkOfListOfint()._check(sink);
    if (!convert.ByteConversionSink.is(sink)) {
      sink = convert.ByteConversionSink.from(sink);
    }
    return new io._ZLibEncoderSink.new(convert.ByteConversionSink._check(sink), this.gzip, this.level, this.windowBits, this.memLevel, this.strategy, this.dictionary, this.raw);
  }
};
(io.ZLibEncoder.new = function(opts) {
  let gzip = opts && 'gzip' in opts ? opts.gzip : false;
  let level = opts && 'level' in opts ? opts.level : io.ZLibOption.defaultLevel;
  let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.defaultWindowBits;
  let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.defaultMemLevel;
  let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.strategyDefault;
  let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
  let raw = opts && 'raw' in opts ? opts.raw : false;
  this[gzip$1] = gzip;
  this[level$1] = level;
  this[windowBits$1] = windowBits;
  this[memLevel$1] = memLevel;
  this[strategy$1] = strategy;
  this[dictionary$1] = dictionary;
  this[raw$1] = raw;
  io.ZLibEncoder.__proto__.new.call(this);
  io._validateZLibeLevel(this.level);
  io._validateZLibMemLevel(this.memLevel);
  io._validateZLibStrategy(this.strategy);
  io._validateZLibWindowBits(this.windowBits);
}).prototype = io.ZLibEncoder.prototype;
dart.addTypeTests(io.ZLibEncoder);
const gzip$1 = Symbol("ZLibEncoder.gzip");
const level$1 = Symbol("ZLibEncoder.level");
const memLevel$1 = Symbol("ZLibEncoder.memLevel");
const strategy$1 = Symbol("ZLibEncoder.strategy");
const windowBits$1 = Symbol("ZLibEncoder.windowBits");
const dictionary$1 = Symbol("ZLibEncoder.dictionary");
const raw$1 = Symbol("ZLibEncoder.raw");
dart.setMethodSignature(io.ZLibEncoder, () => ({
  __proto__: dart.getMethods(io.ZLibEncoder.__proto__),
  convert: dart.fnType(core.List$(core.int), [core.Object]),
  startChunkedConversion: dart.fnType(convert.ByteConversionSink, [core.Object])
}));
dart.setLibraryUri(io.ZLibEncoder, "dart:io");
dart.setFieldSignature(io.ZLibEncoder, () => ({
  __proto__: dart.getFields(io.ZLibEncoder.__proto__),
  gzip: dart.finalFieldType(core.bool),
  level: dart.finalFieldType(core.int),
  memLevel: dart.finalFieldType(core.int),
  strategy: dart.finalFieldType(core.int),
  windowBits: dart.finalFieldType(core.int),
  dictionary: dart.finalFieldType(ListOfint()),
  raw: dart.finalFieldType(core.bool)
}));
io.ZLibDecoder = class ZLibDecoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
  get windowBits() {
    return this[windowBits$2];
  }
  set windowBits(value) {
    super.windowBits = value;
  }
  get dictionary() {
    return this[dictionary$2];
  }
  set dictionary(value) {
    super.dictionary = value;
  }
  get raw() {
    return this[raw$2];
  }
  set raw(value) {
    super.raw = value;
  }
  convert(bytes) {
    ListOfint()._check(bytes);
    let sink = new io._BufferSink.new();
    let _ = this.startChunkedConversion(sink);
    _.add(bytes);
    _.close();
    return sink.builder.takeBytes();
  }
  startChunkedConversion(sink) {
    SinkOfListOfint()._check(sink);
    if (!convert.ByteConversionSink.is(sink)) {
      sink = convert.ByteConversionSink.from(sink);
    }
    return new io._ZLibDecoderSink.new(convert.ByteConversionSink._check(sink), this.windowBits, this.dictionary, this.raw);
  }
};
(io.ZLibDecoder.new = function(opts) {
  let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.defaultWindowBits;
  let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
  let raw = opts && 'raw' in opts ? opts.raw : false;
  this[windowBits$2] = windowBits;
  this[dictionary$2] = dictionary;
  this[raw$2] = raw;
  io.ZLibDecoder.__proto__.new.call(this);
  io._validateZLibWindowBits(this.windowBits);
}).prototype = io.ZLibDecoder.prototype;
dart.addTypeTests(io.ZLibDecoder);
const windowBits$2 = Symbol("ZLibDecoder.windowBits");
const dictionary$2 = Symbol("ZLibDecoder.dictionary");
const raw$2 = Symbol("ZLibDecoder.raw");
dart.setMethodSignature(io.ZLibDecoder, () => ({
  __proto__: dart.getMethods(io.ZLibDecoder.__proto__),
  convert: dart.fnType(core.List$(core.int), [core.Object]),
  startChunkedConversion: dart.fnType(convert.ByteConversionSink, [core.Object])
}));
dart.setLibraryUri(io.ZLibDecoder, "dart:io");
dart.setFieldSignature(io.ZLibDecoder, () => ({
  __proto__: dart.getFields(io.ZLibDecoder.__proto__),
  windowBits: dart.finalFieldType(core.int),
  dictionary: dart.finalFieldType(ListOfint()),
  raw: dart.finalFieldType(core.bool)
}));
io.RawZLibFilter = class RawZLibFilter extends core.Object {
  static deflateFilter(opts) {
    let gzip = opts && 'gzip' in opts ? opts.gzip : false;
    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.defaultLevel;
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.defaultWindowBits;
    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.defaultMemLevel;
    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.strategyDefault;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    return io.RawZLibFilter._makeZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw);
  }
  static inflateFilter(opts) {
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.defaultWindowBits;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    return io.RawZLibFilter._makeZLibInflateFilter(windowBits, dictionary, raw);
  }
  static _makeZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
    dart.throw(new core.UnsupportedError.new("_newZLibDeflateFilter"));
  }
  static _makeZLibInflateFilter(windowBits, dictionary, raw) {
    dart.throw(new core.UnsupportedError.new("_newZLibInflateFilter"));
  }
};
(io.RawZLibFilter[dart.mixinNew] = function() {
}).prototype = io.RawZLibFilter.prototype;
dart.addTypeTests(io.RawZLibFilter);
dart.setLibraryUri(io.RawZLibFilter, "dart:io");
io._BufferSink = class _BufferSink extends convert.ByteConversionSink {
  add(chunk) {
    ListOfint()._check(chunk);
    this.builder.add(chunk);
  }
  addSlice(chunk, start, end, isLast) {
    if (typed_data.Uint8List.is(chunk)) {
      let list = chunk;
      this.builder.add(typed_data.Uint8List.view(list[$buffer], start, dart.notNull(end) - dart.notNull(start)));
    } else {
      this.builder.add(chunk[$sublist](start, end));
    }
  }
  close() {}
};
(io._BufferSink.new = function() {
  this.builder = io.BytesBuilder.new({copy: false});
  io._BufferSink.__proto__.new.call(this);
}).prototype = io._BufferSink.prototype;
dart.addTypeTests(io._BufferSink);
dart.setMethodSignature(io._BufferSink, () => ({
  __proto__: dart.getMethods(io._BufferSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  addSlice: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(io._BufferSink, "dart:io");
dart.setFieldSignature(io._BufferSink, () => ({
  __proto__: dart.getFields(io._BufferSink.__proto__),
  builder: dart.finalFieldType(io.BytesBuilder)
}));
const _sink$0 = dart.privateName(io, "_sink");
const _filter$ = dart.privateName(io, "_filter");
const _closed = dart.privateName(io, "_closed");
const _empty = dart.privateName(io, "_empty");
let const$64;
io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
  add(data) {
    ListOfint()._check(data);
    this.addSlice(data, 0, data[$length], false);
  }
  addSlice(data, start, end, isLast) {
    if (dart.test(this[_closed])) return;
    if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
    core.RangeError.checkValidRange(start, end, data[$length]);
    try {
      this[_empty] = false;
      let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
      this[_filter$].process(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
      let out = null;
      while ((out = this[_filter$].processed({flush: false})) != null) {
        this[_sink$0].add(out);
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
      this[_closed] = true;
      dart.rethrow(e$);
    }
    if (dart.test(isLast)) this.close();
  }
  close() {
    if (dart.test(this[_closed])) return;
    if (dart.test(this[_empty])) this[_filter$].process(const$64 || (const$64 = dart.constList([], core.int)), 0, 0);
    try {
      let out = null;
      while ((out = this[_filter$].processed({end: true})) != null) {
        this[_sink$0].add(out);
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
      this[_closed] = true;
      dart.throw(e);
    }
    this[_closed] = true;
    this[_sink$0].close();
  }
};
(io._FilterSink.new = function(sink, filter) {
  this[_closed] = false;
  this[_empty] = true;
  this[_sink$0] = sink;
  this[_filter$] = filter;
  io._FilterSink.__proto__.new.call(this);
}).prototype = io._FilterSink.prototype;
dart.addTypeTests(io._FilterSink);
dart.setMethodSignature(io._FilterSink, () => ({
  __proto__: dart.getMethods(io._FilterSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  addSlice: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(io._FilterSink, "dart:io");
dart.setFieldSignature(io._FilterSink, () => ({
  __proto__: dart.getFields(io._FilterSink.__proto__),
  [_filter$]: dart.finalFieldType(io.RawZLibFilter),
  [_sink$0]: dart.finalFieldType(convert.ByteConversionSink),
  [_closed]: dart.fieldType(core.bool),
  [_empty]: dart.fieldType(core.bool)
}));
io._ZLibEncoderSink = class _ZLibEncoderSink extends io._FilterSink {};
(io._ZLibEncoderSink.new = function(sink, gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
  io._ZLibEncoderSink.__proto__.new.call(this, sink, io.RawZLibFilter._makeZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw));
}).prototype = io._ZLibEncoderSink.prototype;
dart.addTypeTests(io._ZLibEncoderSink);
dart.setLibraryUri(io._ZLibEncoderSink, "dart:io");
io._ZLibDecoderSink = class _ZLibDecoderSink extends io._FilterSink {};
(io._ZLibDecoderSink.new = function(sink, windowBits, dictionary, raw) {
  io._ZLibDecoderSink.__proto__.new.call(this, sink, io.RawZLibFilter._makeZLibInflateFilter(windowBits, dictionary, raw));
}).prototype = io._ZLibDecoderSink.prototype;
dart.addTypeTests(io._ZLibDecoderSink);
dart.setLibraryUri(io._ZLibDecoderSink, "dart:io");
io._validateZLibWindowBits = function(windowBits) {
  if (io.ZLibOption.minWindowBits > dart.notNull(windowBits) || io.ZLibOption.maxWindowBits < dart.notNull(windowBits)) {
    dart.throw(new core.RangeError.range(windowBits, io.ZLibOption.minWindowBits, io.ZLibOption.maxWindowBits));
  }
};
io._validateZLibeLevel = function(level) {
  if (io.ZLibOption.minLevel > dart.notNull(level) || io.ZLibOption.maxLevel < dart.notNull(level)) {
    dart.throw(new core.RangeError.range(level, io.ZLibOption.minLevel, io.ZLibOption.maxLevel));
  }
};
io._validateZLibMemLevel = function(memLevel) {
  if (io.ZLibOption.minMemLevel > dart.notNull(memLevel) || io.ZLibOption.maxMemLevel < dart.notNull(memLevel)) {
    dart.throw(new core.RangeError.range(memLevel, io.ZLibOption.minMemLevel, io.ZLibOption.maxMemLevel));
  }
};
let const$65;
io._validateZLibStrategy = function(strategy) {
  let strategies = const$65 || (const$65 = dart.constList([io.ZLibOption.strategyFiltered, io.ZLibOption.strategyHuffmanOnly, io.ZLibOption.strategyRle, io.ZLibOption.strategyFixed, io.ZLibOption.strategyDefault], core.int));
  if (strategies[$indexOf](strategy) === -1) {
    dart.throw(new core.ArgumentError.new("Unsupported 'strategy'"));
  }
};
io.Directory = class Directory extends core.Object {
  static new(path) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return new io._Directory.new(path);
    }
    return overrides.createDirectory(path);
  }
  static fromRawPath(path) {
    return new io._Directory.fromRawPath(path);
  }
  static fromUri(uri) {
    return io.Directory.new(uri.toFilePath());
  }
  static get current() {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io._Directory.current;
    }
    return overrides.getCurrentDirectory();
  }
  static set current(path) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      io._Directory.current = path;
      return;
    }
    overrides.setCurrentDirectory(core.String._check(path));
  }
  static get systemTemp() {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io._Directory.systemTemp;
    }
    return overrides.getSystemTempDirectory();
  }
};
(io.Directory[dart.mixinNew] = function() {
}).prototype = io.Directory.prototype;
dart.addTypeTests(io.Directory);
io.Directory[dart.implements] = () => [io.FileSystemEntity];
dart.setLibraryUri(io.Directory, "dart:io");
const _path = dart.privateName(io, "_path");
const _rawPath$ = dart.privateName(io, "_rawPath");
const _isErrorResponse = dart.privateName(io, "_isErrorResponse");
const _exceptionOrErrorFromResponse = dart.privateName(io, "_exceptionOrErrorFromResponse");
const _absolutePath = dart.privateName(io, "_absolutePath");
const _delete = dart.privateName(io, "_delete");
const _deleteSync = dart.privateName(io, "_deleteSync");
const _rawAbsolutePath = dart.privateName(io, "_rawAbsolutePath");
io.FileSystemEntity = class FileSystemEntity extends core.Object {
  get [_path]() {
    return this[_path$];
  }
  set [_path](value) {
    this[_path$] = value;
  }
  get [_rawPath$]() {
    return this[_rawPath];
  }
  set [_rawPath$](value) {
    this[_rawPath] = value;
  }
  get uri() {
    return core.Uri.file(this.path);
  }
  resolveSymbolicLinks() {
    return FutureOfString()._check(io._File._dispatchWithNamespace(io._IOService.fileResolveSymbolicLinks, [null, this[_rawPath$]]).then(core.String, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot resolve symbolic links", this.path));
      }
      return FutureOrOfString()._check(response);
    }, dynamicToFutureOrOfString())));
  }
  resolveSymbolicLinksSync() {
    let result = io.FileSystemEntity._resolveSymbolicLinks(io._Namespace._namespace, this[_rawPath$]);
    io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
    return core.String._check(result);
  }
  stat() {
    return io.FileStat.stat(this.path);
  }
  statSync() {
    return io.FileStat.statSync(this.path);
  }
  delete(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return this[_delete]({recursive: recursive});
  }
  deleteSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return this[_deleteSync]({recursive: recursive});
  }
  watch(opts) {
    let events = opts && 'events' in opts ? opts.events : io.FileSystemEvent.all;
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let trimmedPath = io.FileSystemEntity._trimTrailingPathSeparators(this.path);
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io._FileSystemWatcher._watch(trimmedPath, events, recursive);
    }
    return overrides.fsWatch(trimmedPath, events, recursive);
  }
  static _identical(path1, path2) {
    return FutureOfbool()._check(io._File._dispatchWithNamespace(io._IOService.fileIdentical, [null, path1, path2]).then(core.bool, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Error in FileSystemEntity.identical(" + dart.str(path1) + ", " + dart.str(path2) + ")", ""));
      }
      return FutureOrOfbool()._check(response);
    }, dynamicToFutureOrOfbool())));
  }
  static identical(path1, path2) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io.FileSystemEntity._identical(path1, path2);
    }
    return overrides.fseIdentical(path1, path2);
  }
  get isAbsolute() {
    if (dart.test(io.Platform.isWindows)) {
      return this.path[$startsWith](io.FileSystemEntity._absoluteWindowsPathPattern);
    } else {
      return this.path[$startsWith]("/");
    }
  }
  get [_absolutePath]() {
    if (dart.test(this.isAbsolute)) return this.path;
    let current = io.Directory.current.path;
    if (current[$endsWith]("/") || dart.test(io.Platform.isWindows) && current[$endsWith]("\\")) {
      return dart.str(current) + dart.str(this.path);
    } else {
      return dart.str(current) + dart.str(io.Platform.pathSeparator) + dart.str(this.path);
    }
  }
  get [_rawAbsolutePath]() {
    if (dart.test(this.isAbsolute)) return this[_rawPath$];
    let current = io.Directory.current[_rawPath$][$toList]();
    if (!(current[$last] === 0)) dart.assertFailed(null, "dart:io/file_system_entity.dart", 591, 12, "current.last == 0");
    current[$removeLast]();
    if (current[$last] === "/"[$codeUnitAt](0) || dart.test(io.Platform.isWindows) && current[$last] === "\\"[$codeUnitAt](0)) {
      current[$addAll](this[_rawPath$]);
      return typed_data.Uint8List.fromList(current);
    } else {
      current[$addAll](convert.utf8.encode(io.Platform.pathSeparator));
      current[$addAll](this[_rawPath$]);
      return typed_data.Uint8List.fromList(current);
    }
  }
  static _identicalSync(path1, path2) {
    let result = io.FileSystemEntity._identicalNative(io._Namespace._namespace, path1, path2);
    io.FileSystemEntity._throwIfError(result, "Error in FileSystemEntity.identicalSync");
    return core.bool._check(result);
  }
  static identicalSync(path1, path2) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io.FileSystemEntity._identicalSync(path1, path2);
    }
    return overrides.fseIdenticalSync(path1, path2);
  }
  static get isWatchSupported() {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io._FileSystemWatcher.isSupported;
    }
    return overrides.fsWatchIsSupported();
  }
  static _toUtf8Array(s) {
    return io.FileSystemEntity._toNullTerminatedUtf8Array(typed_data.Uint8List._check(convert.utf8.encode(s)));
  }
  static _toNullTerminatedUtf8Array(l) {
    if (l == null) {
      return null;
    }
    if (dart.test(l[$isNotEmpty]) && l[$last] !== 0) {
      let tmp = typed_data.Uint8List.new(dart.notNull(l[$length]) + 1);
      tmp[$setRange](0, l[$length], l);
      return tmp;
    } else {
      return l;
    }
  }
  static _toStringFromUtf8Array(l) {
    if (l == null) {
      return "";
    }
    let nonNullTerminated = l;
    if (l[$last] === 0) {
      nonNullTerminated = typed_data.Uint8List.view(l[$buffer], 0, dart.notNull(l[$length]) - 1);
    }
    return convert.utf8.decode(nonNullTerminated, {allowMalformed: true});
  }
  static type(path, opts) {
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return io.FileSystemEntity._getType(io.FileSystemEntity._toUtf8Array(path), followLinks);
  }
  static typeSync(path, opts) {
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return io.FileSystemEntity._getTypeSync(io.FileSystemEntity._toUtf8Array(path), followLinks);
  }
  static isLink(path) {
    return io.FileSystemEntity._isLinkRaw(io.FileSystemEntity._toUtf8Array(path));
  }
  static _isLinkRaw(rawPath) {
    return FutureOfbool()._check(io.FileSystemEntity._getType(rawPath, false).then(core.bool, dart.fn(type => dart.equals(type, io.FileSystemEntityType.link), FileSystemEntityTypeTobool())));
  }
  static isFile(path) {
    return FutureOfbool()._check(io.FileSystemEntity._getType(io.FileSystemEntity._toUtf8Array(path), true).then(core.bool, dart.fn(type => dart.equals(type, io.FileSystemEntityType.file), FileSystemEntityTypeTobool())));
  }
  static isDirectory(path) {
    return FutureOfbool()._check(io.FileSystemEntity._getType(io.FileSystemEntity._toUtf8Array(path), true).then(core.bool, dart.fn(type => dart.equals(type, io.FileSystemEntityType.directory), FileSystemEntityTypeTobool())));
  }
  static isLinkSync(path) {
    return io.FileSystemEntity._isLinkRawSync(io.FileSystemEntity._toUtf8Array(path));
  }
  static _isLinkRawSync(rawPath) {
    return dart.equals(io.FileSystemEntity._getTypeSync(typed_data.Uint8List._check(rawPath), false), io.FileSystemEntityType.link);
  }
  static isFileSync(path) {
    return dart.equals(io.FileSystemEntity._getTypeSync(io.FileSystemEntity._toUtf8Array(path), true), io.FileSystemEntityType.file);
  }
  static isDirectorySync(path) {
    return dart.equals(io.FileSystemEntity._getTypeSync(io.FileSystemEntity._toUtf8Array(path), true), io.FileSystemEntityType.directory);
  }
  static _getTypeNative(namespace, rawPath, followLinks) {
    dart.throw(new core.UnsupportedError.new("FileSystemEntity._getType"));
  }
  static _identicalNative(namespace, path1, path2) {
    dart.throw(new core.UnsupportedError.new("FileSystemEntity._identical"));
  }
  static _resolveSymbolicLinks(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("FileSystemEntity._resolveSymbolicLinks"));
  }
  static parentOf(path) {
    let rootEnd = -1;
    if (dart.test(io.Platform.isWindows)) {
      if (path[$startsWith](io.FileSystemEntity._absoluteWindowsPathPattern)) {
        rootEnd = path[$indexOf](core.RegExp.new("[/\\\\]"), 2);
        if (rootEnd === -1) return path;
      } else if (path[$startsWith]("\\") || path[$startsWith]("/")) {
        rootEnd = 0;
      }
    } else if (path[$startsWith]("/")) {
      rootEnd = 0;
    }
    let pos = path[$lastIndexOf](io.FileSystemEntity._parentRegExp);
    if (pos > rootEnd) {
      return path[$substring](0, pos + 1);
    } else if (rootEnd > -1) {
      return path[$substring](0, rootEnd + 1);
    } else {
      return ".";
    }
  }
  get parent() {
    return io.Directory.new(io.FileSystemEntity.parentOf(this.path));
  }
  static _getTypeSyncHelper(rawPath, followLinks) {
    let result = io.FileSystemEntity._getTypeNative(io._Namespace._namespace, rawPath, followLinks);
    io.FileSystemEntity._throwIfError(result, "Error getting type of FileSystemEntity");
    return io.FileSystemEntityType._lookup(core.int._check(result));
  }
  static _getTypeSync(rawPath, followLinks) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io.FileSystemEntity._getTypeSyncHelper(rawPath, followLinks);
    }
    return overrides.fseGetTypeSync(convert.utf8.decode(rawPath, {allowMalformed: true}), followLinks);
  }
  static _getTypeRequest(rawPath, followLinks) {
    return FutureOfFileSystemEntityType()._check(io._File._dispatchWithNamespace(io._IOService.fileType, [null, rawPath, followLinks]).then(io.FileSystemEntityType, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Error getting type", convert.utf8.decode(rawPath, {allowMalformed: true})));
      }
      return io.FileSystemEntityType._lookup(core.int._check(response));
    }, dynamicToFileSystemEntityType())));
  }
  static _getType(rawPath, followLinks) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io.FileSystemEntity._getTypeRequest(rawPath, followLinks);
    }
    return overrides.fseGetType(convert.utf8.decode(rawPath, {allowMalformed: true}), followLinks);
  }
  static _throwIfError(result, msg, path) {
    if (path === void 0) path = null;
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new(msg, path, result));
    } else if (core.ArgumentError.is(result)) {
      dart.throw(result);
    }
  }
  static _trimTrailingPathSeparators(path) {
    if (path == null) return path;
    if (dart.test(io.Platform.isWindows)) {
      while (path.length > 1 && (path[$endsWith](io.Platform.pathSeparator) || path[$endsWith]("/"))) {
        path = path[$substring](0, path.length - 1);
      }
    } else {
      while (path.length > 1 && path[$endsWith](io.Platform.pathSeparator)) {
        path = path[$substring](0, path.length - 1);
      }
    }
    return path;
  }
  static _ensureTrailingPathSeparators(path) {
    if (path == null) return path;
    if (path[$isEmpty]) path = ".";
    if (dart.test(io.Platform.isWindows)) {
      while (!path[$endsWith](io.Platform.pathSeparator) && !path[$endsWith]("/")) {
        path = dart.str(path) + dart.str(io.Platform.pathSeparator);
      }
    } else {
      while (!path[$endsWith](io.Platform.pathSeparator)) {
        path = dart.str(path) + dart.str(io.Platform.pathSeparator);
      }
    }
    return path;
  }
};
(io.FileSystemEntity.new = function() {
  this[_path$] = null;
  this[_rawPath] = null;
}).prototype = io.FileSystemEntity.prototype;
dart.addTypeTests(io.FileSystemEntity);
const _path$ = Symbol("FileSystemEntity._path");
const _rawPath = Symbol("FileSystemEntity._rawPath");
dart.setMethodSignature(io.FileSystemEntity, () => ({
  __proto__: dart.getMethods(io.FileSystemEntity.__proto__),
  resolveSymbolicLinks: dart.fnType(async.Future$(core.String), []),
  resolveSymbolicLinksSync: dart.fnType(core.String, []),
  stat: dart.fnType(async.Future$(io.FileStat), []),
  statSync: dart.fnType(io.FileStat, []),
  delete: dart.fnType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
  deleteSync: dart.fnType(dart.void, [], {recursive: core.bool}),
  watch: dart.fnType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
}));
dart.setGetterSignature(io.FileSystemEntity, () => ({
  __proto__: dart.getGetters(io.FileSystemEntity.__proto__),
  uri: core.Uri,
  isAbsolute: core.bool,
  [_absolutePath]: core.String,
  [_rawAbsolutePath]: typed_data.Uint8List,
  parent: io.Directory
}));
dart.setLibraryUri(io.FileSystemEntity, "dart:io");
dart.setFieldSignature(io.FileSystemEntity, () => ({
  __proto__: dart.getFields(io.FileSystemEntity.__proto__),
  [_path]: dart.fieldType(core.String),
  [_rawPath$]: dart.fieldType(typed_data.Uint8List)
}));
dart.defineLazy(io.FileSystemEntity, {
  /*io.FileSystemEntity._absoluteWindowsPathPattern*/get _absoluteWindowsPathPattern() {
    return core.RegExp.new("^(\\\\\\\\|[a-zA-Z]:[/\\\\])");
  },
  /*io.FileSystemEntity._parentRegExp*/get _parentRegExp() {
    return dart.test(io.Platform.isWindows) ? core.RegExp.new("[^/\\\\][/\\\\]+[^/\\\\]") : core.RegExp.new("[^/]/+[^/]");
  }
});
io._Directory = class _Directory extends io.FileSystemEntity {
  get [_path]() {
    return this[_path$0];
  }
  set [_path](value) {
    this[_path$0] = value;
  }
  get [_rawPath$]() {
    return this[_rawPath$0];
  }
  set [_rawPath$](value) {
    this[_rawPath$0] = value;
  }
  get path() {
    return this[_path];
  }
  static _current(namespace) {
    dart.throw(new core.UnsupportedError.new("Directory._current"));
  }
  static _setCurrent(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("Directory_SetCurrent"));
  }
  static _createTemp(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("Directory._createTemp"));
  }
  static _systemTemp(namespace) {
    dart.throw(new core.UnsupportedError.new("Directory._systemTemp"));
  }
  static _exists(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("Directory._exists"));
  }
  static _create(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("Directory._create"));
  }
  static _deleteNative(namespace, rawPath, recursive) {
    dart.throw(new core.UnsupportedError.new("Directory._deleteNative"));
  }
  static _rename(namespace, rawPath, newPath) {
    dart.throw(new core.UnsupportedError.new("Directory._rename"));
  }
  static _fillWithDirectoryListing(namespace, list, rawPath, recursive, followLinks) {
    dart.throw(new core.UnsupportedError.new("Directory._fillWithDirectoryListing"));
  }
  static get current() {
    let result = io._Directory._current(io._Namespace._namespace);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Getting current working directory failed", "", result));
    }
    return new io._Directory.new(core.String._check(result));
  }
  static set current(path) {
    let _rawPath = null;
    if (io._Directory.is(path)) {
      _rawPath = path[_rawPath$];
    } else if (io.Directory.is(path)) {
      _rawPath = io.FileSystemEntity._toUtf8Array(path.path);
    } else if (typeof path == 'string') {
      _rawPath = io.FileSystemEntity._toUtf8Array(path);
    } else {
      dart.throw(new core.ArgumentError.new(dart.str(core.Error.safeToString(path)) + " is not a String or" + " Directory"));
    }
    if (!dart.test(io._EmbedderConfig._mayChdir)) {
      dart.throw(new core.UnsupportedError.new("This embedder disallows setting Directory.current"));
    }
    let result = io._Directory._setCurrent(io._Namespace._namespace, _rawPath);
    if (core.ArgumentError.is(result)) dart.throw(result);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Setting current working directory failed", core.String._check(path), result));
    }
  }
  get uri() {
    return core.Uri.directory(this.path);
  }
  exists() {
    return FutureOfbool()._check(io._File._dispatchWithNamespace(io._IOService.directoryExists, [null, this[_rawPath$]]).then(core.bool, dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Exists failed"));
      }
      return dart.equals(response, 1);
    }, dynamicTobool())));
  }
  existsSync() {
    let result = io._Directory._exists(io._Namespace._namespace, this[_rawPath$]);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Exists failed", this.path, result));
    }
    return dart.equals(result, 1);
  }
  get absolute() {
    return io.Directory.new(this[_absolutePath]);
  }
  create(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return FutureOfDirectory()._check(this.exists().then(io.Directory, dart.fn(exists => {
        if (dart.test(exists)) return this;
        if (this.path != this.parent.path) {
          return FutureOfDirectory()._check(this.parent.create({recursive: true}).then(io.Directory, dart.fn(_ => this.create(), DirectoryToFutureOfDirectory())));
        } else {
          return this.create();
        }
      }, boolToFutureOrOfDirectory())));
    } else {
      return FutureOfDirectory()._check(io._File._dispatchWithNamespace(io._IOService.directoryCreate, [null, this[_rawPath$]]).then(io.Directory, dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation failed"));
        }
        return this;
      }, dynamicTo_Directory())));
    }
  }
  createSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      if (dart.test(this.existsSync())) return;
      if (this.path != this.parent.path) {
        this.parent.createSync({recursive: true});
      }
    }
    let result = io._Directory._create(io._Namespace._namespace, this[_rawPath$]);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Creation failed", this.path, result));
    }
  }
  static get systemTemp() {
    return io.Directory.new(io._Directory._systemTemp(io._Namespace._namespace));
  }
  createTemp(prefix) {
    if (prefix === void 0) prefix = null;
    let t = prefix;
    t == null ? prefix = "" : t;
    if (this.path === "") {
      dart.throw(new core.ArgumentError.new("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
    }
    let fullPrefix = null;
    if (this.path[$endsWith]("/") || dart.test(io.Platform.isWindows) && this.path[$endsWith]("\\")) {
      fullPrefix = dart.str(this.path) + dart.str(prefix);
    } else {
      fullPrefix = dart.str(this.path) + dart.str(io.Platform.pathSeparator) + dart.str(prefix);
    }
    return FutureOfDirectory()._check(io._File._dispatchWithNamespace(io._IOService.directoryCreateTemp, [null, io.FileSystemEntity._toUtf8Array(fullPrefix)]).then(io.Directory, dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation of temporary directory failed"));
      }
      return io.Directory.new(core.String._check(response));
    }, dynamicToDirectory())));
  }
  createTempSync(prefix) {
    if (prefix === void 0) prefix = null;
    let t = prefix;
    t == null ? prefix = "" : t;
    if (this.path === "") {
      dart.throw(new core.ArgumentError.new("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
    }
    let fullPrefix = null;
    if (this.path[$endsWith]("/") || dart.test(io.Platform.isWindows) && this.path[$endsWith]("\\")) {
      fullPrefix = dart.str(this.path) + dart.str(prefix);
    } else {
      fullPrefix = dart.str(this.path) + dart.str(io.Platform.pathSeparator) + dart.str(prefix);
    }
    let result = io._Directory._createTemp(io._Namespace._namespace, io.FileSystemEntity._toUtf8Array(fullPrefix));
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Creation of temporary directory failed", fullPrefix, result));
    }
    return io.Directory.new(core.String._check(result));
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return FutureOfDirectory()._check(io._File._dispatchWithNamespace(io._IOService.directoryDelete, [null, this[_rawPath$], recursive]).then(io.Directory, dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Deletion failed"));
      }
      return this;
    }, dynamicTo_Directory())));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let result = io._Directory._deleteNative(io._Namespace._namespace, this[_rawPath$], recursive);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Deletion failed", this.path, result));
    }
  }
  rename(newPath) {
    return FutureOfDirectory()._check(io._File._dispatchWithNamespace(io._IOService.directoryRename, [null, this[_rawPath$], newPath]).then(io.Directory, dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Rename failed"));
      }
      return io.Directory.new(newPath);
    }, dynamicToDirectory())));
  }
  renameSync(newPath) {
    if (!(typeof newPath == 'string')) {
      dart.throw(new core.ArgumentError.new());
    }
    let result = io._Directory._rename(io._Namespace._namespace, this[_rawPath$], newPath);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Rename failed", this.path, result));
    }
    return io.Directory.new(newPath);
  }
  list(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return new io._AsyncDirectoryLister.new(io.FileSystemEntity._toUtf8Array(io.FileSystemEntity._ensureTrailingPathSeparators(this.path)), recursive, followLinks).stream;
  }
  listSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    if (!(typeof recursive == 'boolean') || !(typeof followLinks == 'boolean')) {
      dart.throw(new core.ArgumentError.new());
    }
    let result = JSArrayOfFileSystemEntity().of([]);
    io._Directory._fillWithDirectoryListing(io._Namespace._namespace, result, io.FileSystemEntity._toUtf8Array(io.FileSystemEntity._ensureTrailingPathSeparators(this.path)), recursive, followLinks);
    return result;
  }
  toString() {
    return "Directory: '" + dart.str(this.path) + "'";
  }
  [_isErrorResponse](response) {
    return core.List.is(response) && !dart.equals(response[$_get](0), 0);
  }
  [_exceptionOrErrorFromResponse](response, message) {
    if (!dart.test(this[_isErrorResponse](response))) dart.assertFailed(null, "dart:io/directory_impl.dart", 284, 12, "_isErrorResponse(response)");
    switch (dart.dindex(response, 0)) {
      case 1:
      {
        return new core.ArgumentError.new();
      }
      case 2:
      {
        let err = new io.OSError.new(core.String._check(dart.dindex(response, 2)), core.int._check(dart.dindex(response, 1)));
        return new io.FileSystemException.new(message, this.path, err);
      }
      default:
      {
        return core.Exception.new("Unknown error");
      }
    }
  }
};
(io._Directory.new = function(path) {
  this[_path$0] = null;
  this[_rawPath$0] = null;
  io._Directory.__proto__.new.call(this);
  core.ArgumentError.checkNotNull(path, "path");
  this[_path] = path;
  this[_rawPath$] = io.FileSystemEntity._toUtf8Array(this[_path]);
}).prototype = io._Directory.prototype;
(io._Directory.fromRawPath = function(rawPath) {
  this[_path$0] = null;
  this[_rawPath$0] = null;
  io._Directory.__proto__.new.call(this);
  if (rawPath == null) {
    dart.throw(new core.ArgumentError.new("rawPath cannot be null"));
  }
  this[_rawPath$] = io.FileSystemEntity._toNullTerminatedUtf8Array(rawPath);
  this[_path] = io.FileSystemEntity._toStringFromUtf8Array(rawPath);
}).prototype = io._Directory.prototype;
dart.addTypeTests(io._Directory);
const _path$0 = Symbol("_Directory._path");
const _rawPath$0 = Symbol("_Directory._rawPath");
io._Directory[dart.implements] = () => [io.Directory];
dart.setMethodSignature(io._Directory, () => ({
  __proto__: dart.getMethods(io._Directory.__proto__),
  exists: dart.fnType(async.Future$(core.bool), []),
  existsSync: dart.fnType(core.bool, []),
  create: dart.fnType(async.Future$(io.Directory), [], {recursive: core.bool}),
  createSync: dart.fnType(dart.void, [], {recursive: core.bool}),
  createTemp: dart.fnType(async.Future$(io.Directory), [], [core.String]),
  createTempSync: dart.fnType(io.Directory, [], [core.String]),
  [_delete]: dart.fnType(async.Future$(io.Directory), [], {recursive: core.bool}),
  [_deleteSync]: dart.fnType(dart.void, [], {recursive: core.bool}),
  rename: dart.fnType(async.Future$(io.Directory), [core.String]),
  renameSync: dart.fnType(io.Directory, [core.String]),
  list: dart.fnType(async.Stream$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
  listSync: dart.fnType(core.List$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
  [_isErrorResponse]: dart.fnType(core.bool, [dart.dynamic]),
  [_exceptionOrErrorFromResponse]: dart.fnType(dart.dynamic, [dart.dynamic, core.String])
}));
dart.setGetterSignature(io._Directory, () => ({
  __proto__: dart.getGetters(io._Directory.__proto__),
  path: core.String,
  absolute: io.Directory
}));
dart.setLibraryUri(io._Directory, "dart:io");
dart.setFieldSignature(io._Directory, () => ({
  __proto__: dart.getFields(io._Directory.__proto__),
  [_path]: dart.fieldType(core.String),
  [_rawPath$]: dart.fieldType(typed_data.Uint8List)
}));
dart.defineExtensionMethods(io._Directory, ['toString']);
io._AsyncDirectoryListerOps = class _AsyncDirectoryListerOps extends core.Object {
  static new(pointer) {
    dart.throw(new core.UnsupportedError.new("Directory._list"));
  }
};
(io._AsyncDirectoryListerOps[dart.mixinNew] = function() {
}).prototype = io._AsyncDirectoryListerOps.prototype;
dart.addTypeTests(io._AsyncDirectoryListerOps);
dart.setLibraryUri(io._AsyncDirectoryListerOps, "dart:io");
const _ops = dart.privateName(io, "_ops");
const _pointer = dart.privateName(io, "_pointer");
const _cleanup = dart.privateName(io, "_cleanup");
io._AsyncDirectoryLister = class _AsyncDirectoryLister extends core.Object {
  [_pointer]() {
    return this[_ops] == null ? null : this[_ops].getPointer();
  }
  get stream() {
    return this.controller.stream;
  }
  onListen() {
    FutureOfNull()._check(io._File._dispatchWithNamespace(io._IOService.directoryListStart, [null, this.rawPath, this.recursive, this.followLinks]).then(core.Null, dart.fn(response => {
      if (core.int.is(response)) {
        this[_ops] = io._AsyncDirectoryListerOps.new(response);
        this.next();
      } else if (core.Error.is(response)) {
        this.controller.addError(response, response[$stackTrace]);
        this.close();
      } else {
        this.error(response);
        this.close();
      }
    }, dynamicToNull())));
  }
  onResume() {
    if (!dart.test(this.nextRunning)) {
      this.next();
    }
  }
  onCancel() {
    this.canceled = true;
    if (!dart.test(this.nextRunning)) {
      this.close();
    }
    return this.closeCompleter.future;
  }
  next() {
    if (dart.test(this.canceled)) {
      this.close();
      return;
    }
    if (dart.test(this.controller.isPaused) || dart.test(this.nextRunning)) {
      return;
    }
    let pointer = this[_pointer]();
    if (pointer == null) {
      return;
    }
    this.nextRunning = true;
    FutureOfNull()._check(io._IOService._dispatch(io._IOService.directoryListNext, [pointer]).then(core.Null, dart.fn(result => {
      this.nextRunning = false;
      if (core.List.is(result)) {
        this.next();
        if (!(result[$length][$modulo](2) === 0)) dart.assertFailed(null, "dart:io/directory_impl.dart", 395, 16, "result.length % 2 == 0");
        for (let i = 0; i < dart.notNull(result[$length]); i++) {
          if (!(i[$modulo](2) === 0)) dart.assertFailed(null, "dart:io/directory_impl.dart", 397, 18, "i % 2 == 0");
          switch (result[$_get](i++)) {
            case 0:
            {
              this.controller.add(io.File.fromRawPath(typed_data.Uint8List._check(result[$_get](i))));
              break;
            }
            case 1:
            {
              this.controller.add(io.Directory.fromRawPath(typed_data.Uint8List._check(result[$_get](i))));
              break;
            }
            case 2:
            {
              this.controller.add(io.Link.fromRawPath(typed_data.Uint8List._check(result[$_get](i))));
              break;
            }
            case 3:
            {
              this.error(result[$_get](i));
              break;
            }
            case 4:
            {
              this.canceled = true;
              return;
            }
          }
        }
      } else {
        this.controller.addError(new io.FileSystemException.new("Internal error"));
      }
    }, dynamicToNull())));
  }
  [_cleanup]() {
    this.controller.close();
    this.closeCompleter.complete();
    this[_ops] = null;
  }
  close() {
    if (dart.test(this.closed)) {
      return;
    }
    if (dart.test(this.nextRunning)) {
      return;
    }
    this.closed = true;
    let pointer = this[_pointer]();
    if (pointer == null) {
      this[_cleanup]();
    } else {
      io._IOService._dispatch(io._IOService.directoryListStop, [pointer]).whenComplete(dart.bind(this, _cleanup));
    }
  }
  error(message) {
    let errorType = dart.dindex(dart.dindex(message, 2), 0);
    if (dart.equals(errorType, 1)) {
      this.controller.addError(new core.ArgumentError.new());
    } else if (dart.equals(errorType, 2)) {
      let responseErrorInfo = dart.dindex(message, 2);
      let err = new io.OSError.new(core.String._check(dart.dindex(responseErrorInfo, 2)), core.int._check(dart.dindex(responseErrorInfo, 1)));
      let errorPath = dart.dindex(message, 1);
      if (errorPath == null) {
        errorPath = convert.utf8.decode(this.rawPath, {allowMalformed: true});
      } else if (typed_data.Uint8List.is(errorPath)) {
        errorPath = convert.utf8.decode(ListOfint()._check(dart.dindex(message, 1)), {allowMalformed: true});
      }
      this.controller.addError(new io.FileSystemException.new("Directory listing failed", core.String._check(errorPath), err));
    } else {
      this.controller.addError(new io.FileSystemException.new("Internal error"));
    }
  }
};
(io._AsyncDirectoryLister.new = function(rawPath, recursive, followLinks) {
  this.controller = null;
  this.canceled = false;
  this.nextRunning = false;
  this.closed = false;
  this[_ops] = null;
  this.closeCompleter = async.Completer.new();
  this.rawPath = rawPath;
  this.recursive = recursive;
  this.followLinks = followLinks;
  this.controller = StreamControllerOfFileSystemEntity().new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
}).prototype = io._AsyncDirectoryLister.prototype;
dart.addTypeTests(io._AsyncDirectoryLister);
dart.setMethodSignature(io._AsyncDirectoryLister, () => ({
  __proto__: dart.getMethods(io._AsyncDirectoryLister.__proto__),
  [_pointer]: dart.fnType(core.int, []),
  onListen: dart.fnType(dart.void, []),
  onResume: dart.fnType(dart.void, []),
  onCancel: dart.fnType(async.Future, []),
  next: dart.fnType(dart.void, []),
  [_cleanup]: dart.fnType(dart.void, []),
  close: dart.fnType(dart.void, []),
  error: dart.fnType(dart.void, [dart.dynamic])
}));
dart.setGetterSignature(io._AsyncDirectoryLister, () => ({
  __proto__: dart.getGetters(io._AsyncDirectoryLister.__proto__),
  stream: async.Stream$(io.FileSystemEntity)
}));
dart.setLibraryUri(io._AsyncDirectoryLister, "dart:io");
dart.setFieldSignature(io._AsyncDirectoryLister, () => ({
  __proto__: dart.getFields(io._AsyncDirectoryLister.__proto__),
  rawPath: dart.finalFieldType(typed_data.Uint8List),
  recursive: dart.finalFieldType(core.bool),
  followLinks: dart.finalFieldType(core.bool),
  controller: dart.fieldType(StreamControllerOfFileSystemEntity()),
  canceled: dart.fieldType(core.bool),
  nextRunning: dart.fieldType(core.bool),
  closed: dart.fieldType(core.bool),
  [_ops]: dart.fieldType(io._AsyncDirectoryListerOps),
  closeCompleter: dart.fieldType(async.Completer)
}));
dart.defineLazy(io._AsyncDirectoryLister, {
  /*io._AsyncDirectoryLister.listFile*/get listFile() {
    return 0;
  },
  /*io._AsyncDirectoryLister.listDirectory*/get listDirectory() {
    return 1;
  },
  /*io._AsyncDirectoryLister.listLink*/get listLink() {
    return 2;
  },
  /*io._AsyncDirectoryLister.listError*/get listError() {
    return 3;
  },
  /*io._AsyncDirectoryLister.listDone*/get listDone() {
    return 4;
  },
  /*io._AsyncDirectoryLister.responseType*/get responseType() {
    return 0;
  },
  /*io._AsyncDirectoryLister.responsePath*/get responsePath() {
    return 1;
  },
  /*io._AsyncDirectoryLister.responseComplete*/get responseComplete() {
    return 1;
  },
  /*io._AsyncDirectoryLister.responseError*/get responseError() {
    return 2;
  }
});
io._EmbedderConfig = class _EmbedderConfig extends core.Object {};
(io._EmbedderConfig.new = function() {
}).prototype = io._EmbedderConfig.prototype;
dart.addTypeTests(io._EmbedderConfig);
dart.setLibraryUri(io._EmbedderConfig, "dart:io");
dart.defineLazy(io._EmbedderConfig, {
  /*io._EmbedderConfig._mayChdir*/get _mayChdir() {
    return true;
  },
  set _mayChdir(_) {},
  /*io._EmbedderConfig._mayExit*/get _mayExit() {
    return true;
  },
  set _mayExit(_) {},
  /*io._EmbedderConfig._maySetEchoMode*/get _maySetEchoMode() {
    return true;
  },
  set _maySetEchoMode(_) {},
  /*io._EmbedderConfig._maySetLineMode*/get _maySetLineMode() {
    return true;
  },
  set _maySetLineMode(_) {},
  /*io._EmbedderConfig._maySleep*/get _maySleep() {
    return true;
  },
  set _maySleep(_) {}
});
io._EventHandler = class _EventHandler extends core.Object {
  static _sendData(sender, sendPort, data) {
    dart.throw(new core.UnsupportedError.new("EventHandler._sendData"));
  }
};
(io._EventHandler.new = function() {
}).prototype = io._EventHandler.prototype;
dart.addTypeTests(io._EventHandler);
dart.setLibraryUri(io._EventHandler, "dart:io");
const _mode = dart.privateName(io, "_mode");
io.FileMode = class FileMode extends core.Object {};
(io.FileMode._internal = function(mode) {
  this[_mode] = mode;
}).prototype = io.FileMode.prototype;
dart.addTypeTests(io.FileMode);
dart.setLibraryUri(io.FileMode, "dart:io");
dart.setFieldSignature(io.FileMode, () => ({
  __proto__: dart.getFields(io.FileMode.__proto__),
  [_mode]: dart.finalFieldType(core.int)
}));
dart.defineLazy(io.FileMode, {
  /*io.FileMode.read*/get read() {
    return dart.const(new io.FileMode._internal(0));
  },
  /*io.FileMode.READ*/get READ() {
    return io.FileMode.read;
  },
  /*io.FileMode.write*/get write() {
    return dart.const(new io.FileMode._internal(1));
  },
  /*io.FileMode.WRITE*/get WRITE() {
    return io.FileMode.write;
  },
  /*io.FileMode.append*/get append() {
    return dart.const(new io.FileMode._internal(2));
  },
  /*io.FileMode.APPEND*/get APPEND() {
    return io.FileMode.append;
  },
  /*io.FileMode.writeOnly*/get writeOnly() {
    return dart.const(new io.FileMode._internal(3));
  },
  /*io.FileMode.WRITE_ONLY*/get WRITE_ONLY() {
    return io.FileMode.writeOnly;
  },
  /*io.FileMode.writeOnlyAppend*/get writeOnlyAppend() {
    return dart.const(new io.FileMode._internal(4));
  },
  /*io.FileMode.WRITE_ONLY_APPEND*/get WRITE_ONLY_APPEND() {
    return io.FileMode.writeOnlyAppend;
  }
});
dart.defineLazy(io, {
  /*io.READ*/get READ() {
    return io.FileMode.read;
  },
  /*io.WRITE*/get WRITE() {
    return io.FileMode.write;
  },
  /*io.APPEND*/get APPEND() {
    return io.FileMode.append;
  },
  /*io.WRITE_ONLY*/get WRITE_ONLY() {
    return io.FileMode.writeOnly;
  },
  /*io.WRITE_ONLY_APPEND*/get WRITE_ONLY_APPEND() {
    return io.FileMode.writeOnlyAppend;
  }
});
const _type$0 = dart.privateName(io, "_type");
io.FileLock = class FileLock extends core.Object {};
(io.FileLock._internal = function(type) {
  this[_type$0] = type;
}).prototype = io.FileLock.prototype;
dart.addTypeTests(io.FileLock);
dart.setLibraryUri(io.FileLock, "dart:io");
dart.setFieldSignature(io.FileLock, () => ({
  __proto__: dart.getFields(io.FileLock.__proto__),
  [_type$0]: dart.finalFieldType(core.int)
}));
dart.defineLazy(io.FileLock, {
  /*io.FileLock.shared*/get shared() {
    return dart.const(new io.FileLock._internal(1));
  },
  /*io.FileLock.SHARED*/get SHARED() {
    return io.FileLock.shared;
  },
  /*io.FileLock.exclusive*/get exclusive() {
    return dart.const(new io.FileLock._internal(2));
  },
  /*io.FileLock.EXCLUSIVE*/get EXCLUSIVE() {
    return io.FileLock.exclusive;
  },
  /*io.FileLock.blockingShared*/get blockingShared() {
    return dart.const(new io.FileLock._internal(3));
  },
  /*io.FileLock.BLOCKING_SHARED*/get BLOCKING_SHARED() {
    return io.FileLock.blockingShared;
  },
  /*io.FileLock.blockingExclusive*/get blockingExclusive() {
    return dart.const(new io.FileLock._internal(4));
  },
  /*io.FileLock.BLOCKING_EXCLUSIVE*/get BLOCKING_EXCLUSIVE() {
    return io.FileLock.blockingExclusive;
  }
});
io.File = class File extends core.Object {
  static new(path) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return new io._File.new(path);
    }
    return overrides.createFile(path);
  }
  static fromUri(uri) {
    return io.File.new(uri.toFilePath());
  }
  static fromRawPath(rawPath) {
    return new io._File.fromRawPath(rawPath);
  }
};
(io.File[dart.mixinNew] = function() {
}).prototype = io.File.prototype;
dart.addTypeTests(io.File);
io.File[dart.implements] = () => [io.FileSystemEntity];
dart.setLibraryUri(io.File, "dart:io");
io.RandomAccessFile = class RandomAccessFile extends core.Object {};
(io.RandomAccessFile.new = function() {
}).prototype = io.RandomAccessFile.prototype;
dart.addTypeTests(io.RandomAccessFile);
dart.setLibraryUri(io.RandomAccessFile, "dart:io");
io.FileSystemException = class FileSystemException extends core.Object {
  get message() {
    return this[message$8];
  }
  set message(value) {
    super.message = value;
  }
  get path() {
    return this[path$];
  }
  set path(value) {
    super.path = value;
  }
  get osError() {
    return this[osError$];
  }
  set osError(value) {
    super.osError = value;
  }
  toString() {
    let sb = new core.StringBuffer.new();
    sb.write("FileSystemException");
    if (this.message[$isNotEmpty]) {
      sb.write(": " + dart.str(this.message));
      if (this.path != null) {
        sb.write(", path = '" + dart.str(this.path) + "'");
      }
      if (this.osError != null) {
        sb.write(" (" + dart.str(this.osError) + ")");
      }
    } else if (this.osError != null) {
      sb.write(": " + dart.str(this.osError));
      if (this.path != null) {
        sb.write(", path = '" + dart.str(this.path) + "'");
      }
    } else if (this.path != null) {
      sb.write(": " + dart.str(this.path));
    }
    return sb.toString();
  }
};
(io.FileSystemException.new = function(message, path, osError) {
  if (message === void 0) message = "";
  if (path === void 0) path = "";
  if (osError === void 0) osError = null;
  this[message$8] = message;
  this[path$] = path;
  this[osError$] = osError;
}).prototype = io.FileSystemException.prototype;
dart.addTypeTests(io.FileSystemException);
const message$8 = Symbol("FileSystemException.message");
const path$ = Symbol("FileSystemException.path");
const osError$ = Symbol("FileSystemException.osError");
io.FileSystemException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(io.FileSystemException, "dart:io");
dart.setFieldSignature(io.FileSystemException, () => ({
  __proto__: dart.getFields(io.FileSystemException.__proto__),
  message: dart.finalFieldType(core.String),
  path: dart.finalFieldType(core.String),
  osError: dart.finalFieldType(io.OSError)
}));
dart.defineExtensionMethods(io.FileSystemException, ['toString']);
dart.defineLazy(io, {
  /*io._blockSize*/get _blockSize() {
    return 64 * 1024;
  }
});
const _position$0 = dart.privateName(io, "_position");
const _end$ = dart.privateName(io, "_end");
const _controller$ = dart.privateName(io, "_controller");
const _openedFile = dart.privateName(io, "_openedFile");
const _closeCompleter = dart.privateName(io, "_closeCompleter");
const _unsubscribed = dart.privateName(io, "_unsubscribed");
const _readInProgress = dart.privateName(io, "_readInProgress");
const _atEnd = dart.privateName(io, "_atEnd");
const _setupController = dart.privateName(io, "_setupController");
const _start$2 = dart.privateName(io, "_start");
const _readBlock = dart.privateName(io, "_readBlock");
const _closeFile = dart.privateName(io, "_closeFile");
io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    this[_setupController]();
    return this[_controller$].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  [_setupController]() {
    this[_controller$] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start$2), onResume: dart.bind(this, _readBlock), onCancel: dart.fn(() => {
        this[_unsubscribed] = true;
        return this[_closeFile]();
      }, VoidToFuture())});
  }
  [_closeFile]() {
    if (dart.test(this[_readInProgress]) || dart.test(this[_closed])) {
      return this[_closeCompleter].future;
    }
    this[_closed] = true;
    const done = () => {
      this[_closeCompleter].complete();
      this[_controller$].close();
    };
    dart.fn(done, VoidTovoid());
    this[_openedFile].close().catchError(dart.bind(this[_controller$], 'addError')).whenComplete(done);
    return this[_closeCompleter].future;
  }
  [_readBlock]() {
    if (dart.test(this[_readInProgress])) return;
    if (dart.test(this[_atEnd])) {
      this[_closeFile]();
      return;
    }
    this[_readInProgress] = true;
    let readBytes = 65536;
    if (this[_end$] != null) {
      readBytes = math.min(core.int, readBytes, dart.notNull(this[_end$]) - dart.notNull(this[_position$0]));
      if (readBytes < 0) {
        this[_readInProgress] = false;
        if (!dart.test(this[_unsubscribed])) {
          this[_controller$].addError(new core.RangeError.new("Bad end position: " + dart.str(this[_end$])));
          this[_closeFile]();
          this[_unsubscribed] = true;
        }
        return;
      }
    }
    FutureOfNull()._check(this[_openedFile].read(readBytes).then(core.Null, dart.fn(block => {
      this[_readInProgress] = false;
      if (dart.test(this[_unsubscribed])) {
        this[_closeFile]();
        return;
      }
      this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[$length]);
      if (dart.notNull(block[$length]) < readBytes || this[_end$] != null && this[_position$0] == this[_end$]) {
        this[_atEnd] = true;
      }
      if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$].isPaused)) {
        this[_readBlock]();
      }
      this[_controller$].add(block);
      if (dart.test(this[_atEnd])) {
        this[_closeFile]();
      }
    }, ListOfintToNull()))).catchError(dart.fn((e, s) => {
      if (!dart.test(this[_unsubscribed])) {
        this[_controller$].addError(e, core.StackTrace._check(s));
        this[_closeFile]();
        this[_unsubscribed] = true;
      }
    }, dynamicAnddynamicToNull()));
  }
  [_start$2]() {
    if (dart.notNull(this[_position$0]) < 0) {
      this[_controller$].addError(new core.RangeError.new("Bad start position: " + dart.str(this[_position$0])));
      this[_controller$].close();
      this[_closeCompleter].complete();
      return;
    }
    const onReady = file => {
      this[_openedFile] = file;
      this[_readInProgress] = false;
      this[_readBlock]();
    };
    dart.fn(onReady, RandomAccessFileTovoid());
    const onOpenFile = file => {
      if (dart.notNull(this[_position$0]) > 0) {
        file.setPosition(this[_position$0]).then(dart.void, onReady, {onError: dart.fn((e, s) => {
            this[_controller$].addError(e, core.StackTrace._check(s));
            this[_readInProgress] = false;
            this[_closeFile]();
          }, dynamicAnddynamicToNull())});
      } else {
        onReady(file);
      }
    };
    dart.fn(onOpenFile, RandomAccessFileTovoid());
    const openFailed = (error, stackTrace) => {
      this[_controller$].addError(error, core.StackTrace._check(stackTrace));
      this[_controller$].close();
      this[_closeCompleter].complete();
    };
    dart.fn(openFailed, dynamicAnddynamicTovoid());
    if (this[_path] != null) {
      io.File.new(this[_path]).open({mode: io.FileMode.read}).then(dart.void, onOpenFile, {onError: openFailed});
    } else {
      try {
        onOpenFile(io._File._openStdioSync(0));
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        openFailed(e, s);
      }
    }
  }
};
(io._FileStream.new = function(path, position, end) {
  this[_controller$] = null;
  this[_openedFile] = null;
  this[_closeCompleter] = async.Completer.new();
  this[_unsubscribed] = false;
  this[_readInProgress] = true;
  this[_closed] = false;
  this[_atEnd] = false;
  this[_path] = path;
  this[_position$0] = position;
  this[_end$] = end;
  io._FileStream.__proto__.new.call(this);
  let t = this[_position$0];
  t == null ? this[_position$0] = 0 : t;
}).prototype = io._FileStream.prototype;
(io._FileStream.forStdin = function() {
  this[_controller$] = null;
  this[_path] = null;
  this[_openedFile] = null;
  this[_end$] = null;
  this[_closeCompleter] = async.Completer.new();
  this[_unsubscribed] = false;
  this[_readInProgress] = true;
  this[_closed] = false;
  this[_atEnd] = false;
  this[_position$0] = 0;
  io._FileStream.__proto__.new.call(this);
}).prototype = io._FileStream.prototype;
dart.addTypeTests(io._FileStream);
dart.setMethodSignature(io._FileStream, () => ({
  __proto__: dart.getMethods(io._FileStream.__proto__),
  listen: dart.fnType(async.StreamSubscription$(core.List$(core.int)), [dart.fnType(dart.void, [core.List$(core.int)])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  [_setupController]: dart.fnType(dart.void, []),
  [_closeFile]: dart.fnType(async.Future, []),
  [_readBlock]: dart.fnType(dart.void, []),
  [_start$2]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(io._FileStream, "dart:io");
dart.setFieldSignature(io._FileStream, () => ({
  __proto__: dart.getFields(io._FileStream.__proto__),
  [_controller$]: dart.fieldType(StreamControllerOfListOfint()),
  [_path]: dart.fieldType(core.String),
  [_openedFile]: dart.fieldType(io.RandomAccessFile),
  [_position$0]: dart.fieldType(core.int),
  [_end$]: dart.fieldType(core.int),
  [_closeCompleter]: dart.finalFieldType(async.Completer),
  [_unsubscribed]: dart.fieldType(core.bool),
  [_readInProgress]: dart.fieldType(core.bool),
  [_closed]: dart.fieldType(core.bool),
  [_atEnd]: dart.fieldType(core.bool)
}));
const _file = dart.privateName(io, "_file");
const _openFuture = dart.privateName(io, "_openFuture");
io._FileStreamConsumer = class _FileStreamConsumer extends async.StreamConsumer$(core.List$(core.int)) {
  addStream(stream) {
    StreamOfListOfint()._check(stream);
    let completer = CompleterOfFile().sync();
    FutureOfNull()._check(this[_openFuture].then(core.Null, dart.fn(openedFile => {
      let _subscription = null;
      function error(e, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        dart.dsend(_subscription, 'cancel', []);
        openedFile.close();
        completer.completeError(e, stackTrace);
      }
      dart.fn(error, dynamic__Tovoid());
      _subscription = stream.listen(dart.fn(d => {
        dart.dsend(_subscription, 'pause', []);
        try {
          openedFile.writeFrom(d, 0, d[$length]).then(dart.dynamic, dart.fn(_ => dart.dsend(_subscription, 'resume', []), RandomAccessFileTodynamic()), {onError: error});
        } catch (e$) {
          let e = dart.getThrown(e$);
          let stackTrace = dart.stackTrace(e$);
          error(e, stackTrace);
        }
      }, ListOfintToNull()), {onDone: dart.fn(() => {
          completer.complete(this[_file]);
        }, VoidToNull()), onError: error, cancelOnError: true});
    }, RandomAccessFileToNull()))).catchError(dart.bind(completer, 'completeError'));
    return completer.future;
  }
  close() {
    return FutureOfFile()._check(this[_openFuture].then(dart.void, dart.fn(openedFile => openedFile.close(), RandomAccessFileToFutureOfvoid())).then(io.File, dart.fn(_ => this[_file], voidToFile())));
  }
};
(io._FileStreamConsumer.new = function(file, mode) {
  this[_openFuture] = null;
  this[_file] = file;
  this[_openFuture] = this[_file].open({mode: mode});
}).prototype = io._FileStreamConsumer.prototype;
(io._FileStreamConsumer.fromStdio = function(fd) {
  this[_file] = null;
  this[_openFuture] = null;
  this[_openFuture] = FutureOfRandomAccessFile().value(io._File._openStdioSync(fd));
}).prototype = io._FileStreamConsumer.prototype;
dart.addTypeTests(io._FileStreamConsumer);
dart.setMethodSignature(io._FileStreamConsumer, () => ({
  __proto__: dart.getMethods(io._FileStreamConsumer.__proto__),
  addStream: dart.fnType(async.Future$(io.File), [core.Object]),
  close: dart.fnType(async.Future$(io.File), [])
}));
dart.setLibraryUri(io._FileStreamConsumer, "dart:io");
dart.setFieldSignature(io._FileStreamConsumer, () => ({
  __proto__: dart.getFields(io._FileStreamConsumer.__proto__),
  [_file]: dart.fieldType(io.File),
  [_openFuture]: dart.fieldType(FutureOfRandomAccessFile())
}));
const _tryDecode = dart.privateName(io, "_tryDecode");
let const$66;
let const$67;
io._File = class _File extends io.FileSystemEntity {
  get [_path]() {
    return this[_path$1];
  }
  set [_path](value) {
    this[_path$1] = value;
  }
  get [_rawPath$]() {
    return this[_rawPath$1];
  }
  set [_rawPath$](value) {
    this[_rawPath$1] = value;
  }
  get path() {
    return this[_path];
  }
  static _namespacePointer() {
    return io._Namespace._namespacePointer;
  }
  static _dispatchWithNamespace(request, data) {
    data[$_set](0, io._File._namespacePointer());
    return io._IOService._dispatch(request, data);
  }
  exists() {
    return FutureOfbool()._check(io._File._dispatchWithNamespace(io._IOService.fileExists, [null, this[_rawPath$]]).then(core.bool, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot check existence", this.path));
      }
      return FutureOrOfbool()._check(response);
    }, dynamicToFutureOrOfbool())));
  }
  static _exists(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("File._exists"));
  }
  existsSync() {
    let result = io._File._exists(io._Namespace._namespace, this[_rawPath$]);
    io._File.throwIfError(result, "Cannot check existence of file", this.path);
    return core.bool._check(result);
  }
  get absolute() {
    return io.File.new(this[_absolutePath]);
  }
  create(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let result = dart.test(recursive) ? this.parent.create({recursive: true}) : FutureOfNull().value(null);
    return FutureOfFile()._check(result.then(dart.dynamic, dart.fn(_ => io._File._dispatchWithNamespace(io._IOService.fileCreate, [null, this[_rawPath$]]), DirectoryToFuture())).then(io.File, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot create file", this.path));
      }
      return this;
    }, dynamicTo_File())));
  }
  static _create(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("File._create"));
  }
  static _createLink(namespace, rawPath, target) {
    dart.throw(new core.UnsupportedError.new("File._createLink"));
  }
  static _linkTarget(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("File._linkTarget"));
  }
  createSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      this.parent.createSync({recursive: true});
    }
    let result = io._File._create(io._Namespace._namespace, this[_rawPath$]);
    io._File.throwIfError(result, "Cannot create file", this.path);
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return FutureOfFile()._check(io.Directory.new(this.path).delete({recursive: true}).then(io.File, dart.fn(_ => this, FileSystemEntityTo_File())));
    }
    return FutureOfFile()._check(io._File._dispatchWithNamespace(io._IOService.fileDelete, [null, this[_rawPath$]]).then(io.File, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot delete file", this.path));
      }
      return this;
    }, dynamicTo_File())));
  }
  static _deleteNative(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("File._deleteNative"));
  }
  static _deleteLinkNative(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("File._deleteLinkNative"));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.fromRawPath(this[_rawPath$]).deleteSync({recursive: true});
    }
    let result = io._File._deleteNative(io._Namespace._namespace, this[_rawPath$]);
    io._File.throwIfError(result, "Cannot delete file", this.path);
  }
  rename(newPath) {
    return FutureOfFile()._check(io._File._dispatchWithNamespace(io._IOService.fileRename, [null, this[_rawPath$], newPath]).then(io.File, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot rename file to '" + dart.str(newPath) + "'", this.path));
      }
      return io.File.new(newPath);
    }, dynamicToFile())));
  }
  static _rename(namespace, oldPath, newPath) {
    dart.throw(new core.UnsupportedError.new("File._rename"));
  }
  static _renameLink(namespace, oldPath, newPath) {
    dart.throw(new core.UnsupportedError.new("File._renameLink"));
  }
  renameSync(newPath) {
    let result = io._File._rename(io._Namespace._namespace, this[_rawPath$], newPath);
    io._File.throwIfError(result, "Cannot rename file to '" + dart.str(newPath) + "'", this.path);
    return io.File.new(newPath);
  }
  copy(newPath) {
    return FutureOfFile()._check(io._File._dispatchWithNamespace(io._IOService.fileCopy, [null, this[_rawPath$], newPath]).then(io.File, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot copy file to '" + dart.str(newPath) + "'", this.path));
      }
      return io.File.new(newPath);
    }, dynamicToFile())));
  }
  static _copy(namespace, oldPath, newPath) {
    dart.throw(new core.UnsupportedError.new("File._copy"));
  }
  copySync(newPath) {
    let result = io._File._copy(io._Namespace._namespace, this[_rawPath$], newPath);
    io._File.throwIfError(result, "Cannot copy file to '" + dart.str(newPath) + "'", this.path);
    return io.File.new(newPath);
  }
  open(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.read;
    if (!dart.equals(mode, io.FileMode.read) && !dart.equals(mode, io.FileMode.write) && !dart.equals(mode, io.FileMode.append) && !dart.equals(mode, io.FileMode.writeOnly) && !dart.equals(mode, io.FileMode.writeOnlyAppend)) {
      return FutureOfRandomAccessFile().error(new core.ArgumentError.new("Invalid file mode for this operation"));
    }
    return FutureOfRandomAccessFile()._check(io._File._dispatchWithNamespace(io._IOService.fileOpen, [null, this[_rawPath$], mode[_mode]]).then(io.RandomAccessFile, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot open file", this.path));
      }
      return new io._RandomAccessFile.new(core.int._check(response), this.path);
    }, dynamicTo_RandomAccessFile())));
  }
  length() {
    return FutureOfint()._check(io._File._dispatchWithNamespace(io._IOService.fileLengthFromPath, [null, this[_rawPath$]]).then(core.int, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve length of file", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint())));
  }
  static _lengthFromPath(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("File._lengthFromPath"));
  }
  lengthSync() {
    let result = io._File._lengthFromPath(io._Namespace._namespace, this[_rawPath$]);
    io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
    return core.int._check(result);
  }
  lastAccessed() {
    return FutureOfDateTime()._check(io._File._dispatchWithNamespace(io._IOService.fileLastAccessed, [null, this[_rawPath$]]).then(core.DateTime, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve access time", this.path));
      }
      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
    }, dynamicToDateTime())));
  }
  static _lastAccessed(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("File._lastAccessed"));
  }
  lastAccessedSync() {
    let ms = io._File._lastAccessed(io._Namespace._namespace, this[_rawPath$]);
    io._File.throwIfError(ms, "Cannot retrieve access time", this.path);
    return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
  }
  setLastAccessed(time) {
    let millis = time.millisecondsSinceEpoch;
    return io._File._dispatchWithNamespace(io._IOService.fileSetLastAccessed, [null, this[_rawPath$], millis]).then(dart.dynamic, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot set access time", this.path));
      }
      return null;
    }, dynamicToNull()));
  }
  static _setLastAccessed(namespace, rawPath, millis) {
    dart.throw(new core.UnsupportedError.new("File._setLastAccessed"));
  }
  setLastAccessedSync(time) {
    let millis = time.millisecondsSinceEpoch;
    let result = io._File._setLastAccessed(io._Namespace._namespace, this[_rawPath$], millis);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Failed to set file access time", this.path, result));
    }
  }
  lastModified() {
    return FutureOfDateTime()._check(io._File._dispatchWithNamespace(io._IOService.fileLastModified, [null, this[_rawPath$]]).then(core.DateTime, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve modification time", this.path));
      }
      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
    }, dynamicToDateTime())));
  }
  static _lastModified(namespace, rawPath) {
    dart.throw(new core.UnsupportedError.new("File._lastModified"));
  }
  lastModifiedSync() {
    let ms = io._File._lastModified(io._Namespace._namespace, this[_rawPath$]);
    io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
    return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
  }
  setLastModified(time) {
    let millis = time.millisecondsSinceEpoch;
    return io._File._dispatchWithNamespace(io._IOService.fileSetLastModified, [null, this[_rawPath$], millis]).then(dart.dynamic, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot set modification time", this.path));
      }
      return null;
    }, dynamicToNull()));
  }
  static _setLastModified(namespace, rawPath, millis) {
    dart.throw(new core.UnsupportedError.new("File._setLastModified"));
  }
  setLastModifiedSync(time) {
    let millis = time.millisecondsSinceEpoch;
    let result = io._File._setLastModified(io._Namespace._namespace, this[_rawPath$], millis);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("Failed to set file modification time", this.path, result));
    }
  }
  static _open(namespace, rawPath, mode) {
    dart.throw(new core.UnsupportedError.new("File._open"));
  }
  openSync(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.read;
    if (!dart.equals(mode, io.FileMode.read) && !dart.equals(mode, io.FileMode.write) && !dart.equals(mode, io.FileMode.append) && !dart.equals(mode, io.FileMode.writeOnly) && !dart.equals(mode, io.FileMode.writeOnlyAppend)) {
      dart.throw(new core.ArgumentError.new("Invalid file mode for this operation"));
    }
    let id = io._File._open(io._Namespace._namespace, this[_rawPath$], mode[_mode]);
    io._File.throwIfError(id, "Cannot open file", this.path);
    return new io._RandomAccessFile.new(core.int._check(id), this[_path]);
  }
  static _openStdio(fd) {
    dart.throw(new core.UnsupportedError.new("File._openStdio"));
  }
  static _openStdioSync(fd) {
    let id = io._File._openStdio(fd);
    if (id === 0) {
      dart.throw(new io.FileSystemException.new("Cannot open stdio file for: " + dart.str(fd)));
    }
    return new io._RandomAccessFile.new(id, "");
  }
  openRead(start, end) {
    if (start === void 0) start = null;
    if (end === void 0) end = null;
    return new io._FileStream.new(this.path, start, end);
  }
  openWrite(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.write;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    if (!dart.equals(mode, io.FileMode.write) && !dart.equals(mode, io.FileMode.append) && !dart.equals(mode, io.FileMode.writeOnly) && !dart.equals(mode, io.FileMode.writeOnlyAppend)) {
      dart.throw(new core.ArgumentError.new("Invalid file mode for this operation"));
    }
    let consumer = new io._FileStreamConsumer.new(this, mode);
    return io.IOSink.new(consumer, {encoding: encoding});
  }
  readAsBytes() {
    function readDataChunked(file) {
      let builder = io.BytesBuilder.new({copy: false});
      let completer = CompleterOfListOfint().new();
      function read() {
        FutureOfNull()._check(file.read(65536).then(core.Null, dart.fn(data => {
          if (dart.notNull(data[$length]) > 0) {
            builder.add(data);
            read();
          } else {
            completer.complete(builder.takeBytes());
          }
        }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError')}));
      }
      dart.fn(read, VoidTovoid());
      read();
      return completer.future;
    }
    dart.fn(readDataChunked, RandomAccessFileToFutureOfListOfint());
    return FutureOfListOfint()._check(this.open().then(ListOfint(), dart.fn(file => FutureOfListOfint()._check(file.length().then(ListOfint(), dart.fn(length => {
      if (length === 0) {
        return readDataChunked(file);
      }
      return file.read(length);
    }, intToFutureOfListOfint()))).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOfListOfint())));
  }
  readAsBytesSync() {
    let opened = this.openSync();
    try {
      let data = null;
      let length = opened.lengthSync();
      if (length === 0) {
        let builder = io.BytesBuilder.new({copy: false});
        do {
          data = opened.readSync(65536);
          if (dart.notNull(data[$length]) > 0) builder.add(data);
        } while (dart.notNull(data[$length]) > 0);
        data = builder.takeBytes();
      } else {
        data = opened.readSync(length);
      }
      return data;
    } finally {
      opened.closeSync();
    }
  }
  [_tryDecode](bytes, encoding) {
    try {
      return encoding.decode(bytes);
    } catch (e) {
      let _ = dart.getThrown(e);
      dart.throw(new io.FileSystemException.new("Failed to decode data using encoding '" + dart.str(encoding.name) + "'", this.path));
    }
  }
  readAsString(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    let stack = core.StackTrace.current;
    return FutureOfString()._check(this.readAsBytes().then(core.String, dart.fn(bytes => {
      try {
        return this[_tryDecode](bytes, encoding);
      } catch (e$) {
        let e = dart.getThrown(e$);
        return FutureOfString().error(e, stack);
      }
    }, ListOfintToFutureOrOfString())));
  }
  readAsStringSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    return this[_tryDecode](this.readAsBytesSync(), encoding);
  }
  readAsLines(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    return FutureOfListOfString()._check(this.readAsString({encoding: encoding}).then(ListOfString(), dart.bind(const$66 || (const$66 = dart.const(new convert.LineSplitter.new())), 'convert')));
  }
  readAsLinesSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    return (const$67 || (const$67 = dart.const(new convert.LineSplitter.new()))).convert(this.readAsStringSync({encoding: encoding}));
  }
  writeAsBytes(bytes, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.write;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    return FutureOfFile()._check(this.open({mode: mode}).then(io.File, dart.fn(file => FutureOfFile()._check(file.writeFrom(bytes, 0, bytes[$length]).then(io.File, dart.fn(_ => {
      if (dart.test(flush)) return FutureOfFile()._check(file.flush().then(io.File, dart.fn(_ => this, RandomAccessFileTo_File())));
      return this;
    }, RandomAccessFileToFutureOrOfFile()))).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOfFile())));
  }
  writeAsBytesSync(bytes, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.write;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    let opened = this.openSync({mode: mode});
    try {
      opened.writeFromSync(bytes, 0, bytes[$length]);
      if (dart.test(flush)) opened.flushSync();
    } finally {
      opened.closeSync();
    }
  }
  writeAsString(contents, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.write;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    try {
      return this.writeAsBytes(encoding.encode(contents), {mode: mode, flush: flush});
    } catch (e$) {
      let e = dart.getThrown(e$);
      return FutureOfFile().error(e);
    }
  }
  writeAsStringSync(contents, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.write;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    this.writeAsBytesSync(encoding.encode(contents), {mode: mode, flush: flush});
  }
  toString() {
    return "File: '" + dart.str(this.path) + "'";
  }
  static throwIfError(result, msg, path) {
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new(msg, path, result));
    }
  }
};
(io._File.new = function(path) {
  this[_path$1] = null;
  this[_rawPath$1] = null;
  io._File.__proto__.new.call(this);
  core.ArgumentError.checkNotNull(path, "path");
  this[_path] = path;
  this[_rawPath$] = io.FileSystemEntity._toUtf8Array(path);
}).prototype = io._File.prototype;
(io._File.fromRawPath = function(rawPath) {
  this[_path$1] = null;
  this[_rawPath$1] = null;
  io._File.__proto__.new.call(this);
  core.ArgumentError.checkNotNull(rawPath, "rawPath");
  this[_rawPath$] = io.FileSystemEntity._toNullTerminatedUtf8Array(rawPath);
  this[_path] = io.FileSystemEntity._toStringFromUtf8Array(rawPath);
}).prototype = io._File.prototype;
dart.addTypeTests(io._File);
const _path$1 = Symbol("_File._path");
const _rawPath$1 = Symbol("_File._rawPath");
io._File[dart.implements] = () => [io.File];
dart.setMethodSignature(io._File, () => ({
  __proto__: dart.getMethods(io._File.__proto__),
  exists: dart.fnType(async.Future$(core.bool), []),
  existsSync: dart.fnType(core.bool, []),
  create: dart.fnType(async.Future$(io.File), [], {recursive: core.bool}),
  createSync: dart.fnType(dart.void, [], {recursive: core.bool}),
  [_delete]: dart.fnType(async.Future$(io.File), [], {recursive: core.bool}),
  [_deleteSync]: dart.fnType(dart.void, [], {recursive: core.bool}),
  rename: dart.fnType(async.Future$(io.File), [core.String]),
  renameSync: dart.fnType(io.File, [core.String]),
  copy: dart.fnType(async.Future$(io.File), [core.String]),
  copySync: dart.fnType(io.File, [core.String]),
  open: dart.fnType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
  length: dart.fnType(async.Future$(core.int), []),
  lengthSync: dart.fnType(core.int, []),
  lastAccessed: dart.fnType(async.Future$(core.DateTime), []),
  lastAccessedSync: dart.fnType(core.DateTime, []),
  setLastAccessed: dart.fnType(async.Future, [core.DateTime]),
  setLastAccessedSync: dart.fnType(dart.void, [core.DateTime]),
  lastModified: dart.fnType(async.Future$(core.DateTime), []),
  lastModifiedSync: dart.fnType(core.DateTime, []),
  setLastModified: dart.fnType(async.Future, [core.DateTime]),
  setLastModifiedSync: dart.fnType(dart.void, [core.DateTime]),
  openSync: dart.fnType(io.RandomAccessFile, [], {mode: io.FileMode}),
  openRead: dart.fnType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
  openWrite: dart.fnType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
  readAsBytes: dart.fnType(async.Future$(core.List$(core.int)), []),
  readAsBytesSync: dart.fnType(core.List$(core.int), []),
  [_tryDecode]: dart.fnType(core.String, [core.List$(core.int), convert.Encoding]),
  readAsString: dart.fnType(async.Future$(core.String), [], {encoding: convert.Encoding}),
  readAsStringSync: dart.fnType(core.String, [], {encoding: convert.Encoding}),
  readAsLines: dart.fnType(async.Future$(core.List$(core.String)), [], {encoding: convert.Encoding}),
  readAsLinesSync: dart.fnType(core.List$(core.String), [], {encoding: convert.Encoding}),
  writeAsBytes: dart.fnType(async.Future$(io.File), [core.List$(core.int)], {mode: io.FileMode, flush: core.bool}),
  writeAsBytesSync: dart.fnType(dart.void, [core.List$(core.int)], {mode: io.FileMode, flush: core.bool}),
  writeAsString: dart.fnType(async.Future$(io.File), [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool}),
  writeAsStringSync: dart.fnType(dart.void, [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool})
}));
dart.setGetterSignature(io._File, () => ({
  __proto__: dart.getGetters(io._File.__proto__),
  path: core.String,
  absolute: io.File
}));
dart.setLibraryUri(io._File, "dart:io");
dart.setFieldSignature(io._File, () => ({
  __proto__: dart.getFields(io._File.__proto__),
  [_path]: dart.fieldType(core.String),
  [_rawPath$]: dart.fieldType(typed_data.Uint8List)
}));
dart.defineExtensionMethods(io._File, ['toString']);
io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
  static new(pointer) {
    dart.throw(new core.UnsupportedError.new("RandomAccessFile"));
  }
};
(io._RandomAccessFileOps[dart.mixinNew] = function() {
}).prototype = io._RandomAccessFileOps.prototype;
dart.addTypeTests(io._RandomAccessFileOps);
dart.setLibraryUri(io._RandomAccessFileOps, "dart:io");
const _asyncDispatched = dart.privateName(io, "_asyncDispatched");
const _fileService = dart.privateName(io, "_fileService");
const _resourceInfo = dart.privateName(io, "_resourceInfo");
const _maybeConnectHandler = dart.privateName(io, "_maybeConnectHandler");
const _maybePerformCleanup = dart.privateName(io, "_maybePerformCleanup");
const _dispatch = dart.privateName(io, "_dispatch");
const _checkAvailable = dart.privateName(io, "_checkAvailable");
const _fileLockValue = dart.privateName(io, "_fileLockValue");
io._RandomAccessFile = class _RandomAccessFile extends core.Object {
  [_maybePerformCleanup]() {
    if (dart.test(this.closed)) {
      io._FileResourceInfo.FileClosed(this[_resourceInfo]);
    }
  }
  [_maybeConnectHandler]() {
    if (!dart.test(io._RandomAccessFile._connectedResourceHandler)) {
      developer.registerExtension("ext.dart.io.getOpenFiles", dart.fn(io._FileResourceInfo.getOpenFiles, dynamicAnddynamicToFutureOfServiceExtensionResponse()));
      developer.registerExtension("ext.dart.io.getFileByID", dart.fn(io._FileResourceInfo.getFileInfoMapByID, dynamicAnddynamicToFutureOfServiceExtensionResponse()));
      io._RandomAccessFile._connectedResourceHandler = true;
    }
  }
  close() {
    return this[_dispatch](io._IOService.fileClose, [null], {markClosed: true}).then(dart.void, dart.fn(result => {
      if (dart.equals(result, -1)) {
        dart.throw(new io.FileSystemException.new("Cannot close file", this.path));
      }
      this.closed = dart.test(this.closed) || dart.equals(result, 0);
      this[_maybePerformCleanup]();
    }, dynamicToNull()));
  }
  closeSync() {
    this[_checkAvailable]();
    let id = this[_ops].close();
    if (id === -1) {
      dart.throw(new io.FileSystemException.new("Cannot close file", this.path));
    }
    this.closed = dart.test(this.closed) || id === 0;
    this[_maybePerformCleanup]();
  }
  readByte() {
    return FutureOfint()._check(this[_dispatch](io._IOService.fileReadByte, [null]).then(core.int, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "readByte failed", this.path));
      }
      this[_resourceInfo].addRead(1);
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint())));
  }
  readByteSync() {
    this[_checkAvailable]();
    let result = this[_ops].readByte();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("readByte failed", this.path, result));
    }
    this[_resourceInfo].addRead(1);
    return core.int._check(result);
  }
  read(bytes) {
    core.ArgumentError.checkNotNull(bytes, "bytes");
    return FutureOfListOfint()._check(this[_dispatch](io._IOService.fileRead, [null, bytes]).then(ListOfint(), dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
      }
      this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
      let result = ListOfint()._check(dart.dindex(response, 1));
      return result;
    }, dynamicToListOfint())));
  }
  readSync(bytes) {
    this[_checkAvailable]();
    core.ArgumentError.checkNotNull(bytes, "bytes");
    let result = this[_ops].read(bytes);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("readSync failed", this.path, result));
    }
    this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
    return ListOfint()._check(result);
  }
  readInto(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (!core.List.is(buffer) || start != null && !core.int.is(start) || end != null && !core.int.is(end)) {
      dart.throw(new core.ArgumentError.new());
    }
    end = core.RangeError.checkValidRange(start, end, buffer[$length]);
    if (end == start) {
      return FutureOfint().value(0);
    }
    let length = dart.notNull(end) - dart.notNull(start);
    return FutureOfint()._check(this[_dispatch](io._IOService.fileReadInto, [null, length]).then(core.int, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
      }
      let read = core.int._check(dart.dindex(response, 1));
      let data = ListOfint()._check(dart.dindex(response, 2));
      buffer[$setRange](start, dart.notNull(start) + dart.notNull(read), data);
      this[_resourceInfo].addRead(read);
      return read;
    }, dynamicToint())));
  }
  readIntoSync(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    this[_checkAvailable]();
    if (!core.List.is(buffer) || start != null && !core.int.is(start) || end != null && !core.int.is(end)) {
      dart.throw(new core.ArgumentError.new());
    }
    end = core.RangeError.checkValidRange(start, end, buffer[$length]);
    if (end == start) {
      return 0;
    }
    let result = this[_ops].readInto(buffer, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("readInto failed", this.path, result));
    }
    this[_resourceInfo].addRead(core.int._check(result));
    return core.int._check(result);
  }
  writeByte(value) {
    core.ArgumentError.checkNotNull(value, "value");
    return FutureOfRandomAccessFile()._check(this[_dispatch](io._IOService.fileWriteByte, [null, value]).then(io.RandomAccessFile, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "writeByte failed", this.path));
      }
      this[_resourceInfo].addWrite(1);
      return this;
    }, dynamicTo_RandomAccessFile())));
  }
  writeByteSync(value) {
    this[_checkAvailable]();
    core.ArgumentError.checkNotNull(value, "value");
    let result = this[_ops].writeByte(value);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("writeByte failed", this.path, result));
    }
    this[_resourceInfo].addWrite(1);
    return core.int._check(result);
  }
  writeFrom(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (!core.List.is(buffer) || start != null && !core.int.is(start) || end != null && !core.int.is(end)) {
      dart.throw(new core.ArgumentError.new("Invalid arguments to writeFrom"));
    }
    end = core.RangeError.checkValidRange(start, end, buffer[$length]);
    if (end == start) {
      return FutureOfRandomAccessFile().value(this);
    }
    let result = null;
    try {
      result = io._ensureFastAndSerializableByteData(buffer, start, end);
    } catch (e$) {
      let e = dart.getThrown(e$);
      return FutureOfRandomAccessFile().error(e);
    }
    let request = core.List.new(4);
    request[$_set](0, null);
    request[$_set](1, result.buffer);
    request[$_set](2, result.start);
    request[$_set](3, dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
    return FutureOfRandomAccessFile()._check(this[_dispatch](io._IOService.fileWriteFrom, request).then(io.RandomAccessFile, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "writeFrom failed", this.path));
      }
      this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
      return this;
    }, dynamicTo_RandomAccessFile())));
  }
  writeFromSync(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    this[_checkAvailable]();
    if (!core.List.is(buffer) || start != null && !core.int.is(start) || end != null && !core.int.is(end)) {
      dart.throw(new core.ArgumentError.new("Invalid arguments to writeFromSync"));
    }
    end = core.RangeError.checkValidRange(start, end, buffer[$length]);
    if (end == start) {
      return;
    }
    let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
    let result = this[_ops].writeFrom(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("writeFrom failed", this.path, result));
    }
    this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
  }
  writeString(string, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    core.ArgumentError.checkNotNull(encoding, "encoding");
    let data = encoding.encode(string);
    return this.writeFrom(data, 0, data[$length]);
  }
  writeStringSync(string, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    core.ArgumentError.checkNotNull(encoding, "encoding");
    let data = encoding.encode(string);
    this.writeFromSync(data, 0, data[$length]);
  }
  position() {
    return FutureOfint()._check(this[_dispatch](io._IOService.filePosition, [null]).then(core.int, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "position failed", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint())));
  }
  positionSync() {
    this[_checkAvailable]();
    let result = this[_ops].position();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("position failed", this.path, result));
    }
    return core.int._check(result);
  }
  setPosition(position) {
    return FutureOfRandomAccessFile()._check(this[_dispatch](io._IOService.fileSetPosition, [null, position]).then(io.RandomAccessFile, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "setPosition failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile())));
  }
  setPositionSync(position) {
    this[_checkAvailable]();
    let result = this[_ops].setPosition(position);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("setPosition failed", this.path, result));
    }
  }
  truncate(length) {
    return FutureOfRandomAccessFile()._check(this[_dispatch](io._IOService.fileTruncate, [null, length]).then(io.RandomAccessFile, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "truncate failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile())));
  }
  truncateSync(length) {
    this[_checkAvailable]();
    let result = this[_ops].truncate(length);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("truncate failed", this.path, result));
    }
  }
  length() {
    return FutureOfint()._check(this[_dispatch](io._IOService.fileLength, [null]).then(core.int, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "length failed", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint())));
  }
  lengthSync() {
    this[_checkAvailable]();
    let result = this[_ops].length();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("length failed", this.path, result));
    }
    return core.int._check(result);
  }
  flush() {
    return FutureOfRandomAccessFile()._check(this[_dispatch](io._IOService.fileFlush, [null]).then(io.RandomAccessFile, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "flush failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile())));
  }
  flushSync() {
    this[_checkAvailable]();
    let result = this[_ops].flush();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("flush failed", this.path, result));
    }
  }
  [_fileLockValue](fl) {
    return fl[_type$0];
  }
  lock(mode, start, end) {
    if (mode === void 0) mode = io.FileLock.exclusive;
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    if (!io.FileLock.is(mode) || !core.int.is(start) || !core.int.is(end)) {
      dart.throw(new core.ArgumentError.new());
    }
    if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end !== -1 && dart.notNull(start) >= dart.notNull(end)) {
      dart.throw(new core.ArgumentError.new());
    }
    let lock = this[_fileLockValue](mode);
    return FutureOfRandomAccessFile()._check(this[_dispatch](io._IOService.fileLock, [null, lock, start, end]).then(io.RandomAccessFile, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "lock failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile())));
  }
  unlock(start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    if (!core.int.is(start) || !core.int.is(end)) {
      dart.throw(new core.ArgumentError.new());
    }
    if (start == end) {
      dart.throw(new core.ArgumentError.new());
    }
    return FutureOfRandomAccessFile()._check(this[_dispatch](io._IOService.fileLock, [null, 0, start, end]).then(io.RandomAccessFile, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "unlock failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile())));
  }
  lockSync(mode, start, end) {
    if (mode === void 0) mode = io.FileLock.exclusive;
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    this[_checkAvailable]();
    if (!io.FileLock.is(mode) || !core.int.is(start) || !core.int.is(end)) {
      dart.throw(new core.ArgumentError.new());
    }
    if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end !== -1 && dart.notNull(start) >= dart.notNull(end)) {
      dart.throw(new core.ArgumentError.new());
    }
    let lock = this[_fileLockValue](mode);
    let result = this[_ops].lock(lock, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("lock failed", this.path, result));
    }
  }
  unlockSync(start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    this[_checkAvailable]();
    if (!core.int.is(start) || !core.int.is(end)) {
      dart.throw(new core.ArgumentError.new());
    }
    if (start == end) {
      dart.throw(new core.ArgumentError.new());
    }
    let result = this[_ops].lock(0, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new("unlock failed", this.path, result));
    }
  }
  [_pointer]() {
    return this[_ops].getPointer();
  }
  [_dispatch](request, data, opts) {
    let markClosed = opts && 'markClosed' in opts ? opts.markClosed : false;
    if (dart.test(this.closed)) {
      return async.Future.error(new io.FileSystemException.new("File closed", this.path));
    }
    if (dart.test(this[_asyncDispatched])) {
      let msg = "An async operation is currently pending";
      return async.Future.error(new io.FileSystemException.new(msg, this.path));
    }
    if (dart.test(markClosed)) {
      this.closed = true;
    }
    this[_asyncDispatched] = true;
    data[$_set](0, this[_pointer]());
    return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
      this[_asyncDispatched] = false;
    }, VoidToNull()));
  }
  [_checkAvailable]() {
    if (dart.test(this[_asyncDispatched])) {
      dart.throw(new io.FileSystemException.new("An async operation is currently pending", this.path));
    }
    if (dart.test(this.closed)) {
      dart.throw(new io.FileSystemException.new("File closed", this.path));
    }
  }
};
(io._RandomAccessFile.new = function(pointer, path) {
  this[_asyncDispatched] = false;
  this[_fileService] = null;
  this[_resourceInfo] = null;
  this[_ops] = null;
  this.closed = false;
  this.path = path;
  this[_ops] = io._RandomAccessFileOps.new(pointer);
  this[_resourceInfo] = new io._FileResourceInfo.new(this);
  this[_maybeConnectHandler]();
}).prototype = io._RandomAccessFile.prototype;
dart.addTypeTests(io._RandomAccessFile);
io._RandomAccessFile[dart.implements] = () => [io.RandomAccessFile];
dart.setMethodSignature(io._RandomAccessFile, () => ({
  __proto__: dart.getMethods(io._RandomAccessFile.__proto__),
  [_maybePerformCleanup]: dart.fnType(dart.void, []),
  [_maybeConnectHandler]: dart.fnType(dart.dynamic, []),
  close: dart.fnType(async.Future$(dart.void), []),
  closeSync: dart.fnType(dart.void, []),
  readByte: dart.fnType(async.Future$(core.int), []),
  readByteSync: dart.fnType(core.int, []),
  read: dart.fnType(async.Future$(core.List$(core.int)), [core.int]),
  readSync: dart.fnType(core.List$(core.int), [core.int]),
  readInto: dart.fnType(async.Future$(core.int), [core.List$(core.int)], [core.int, core.int]),
  readIntoSync: dart.fnType(core.int, [core.List$(core.int)], [core.int, core.int]),
  writeByte: dart.fnType(async.Future$(io.RandomAccessFile), [core.int]),
  writeByteSync: dart.fnType(core.int, [core.int]),
  writeFrom: dart.fnType(async.Future$(io.RandomAccessFile), [core.List$(core.int)], [core.int, core.int]),
  writeFromSync: dart.fnType(dart.void, [core.List$(core.int)], [core.int, core.int]),
  writeString: dart.fnType(async.Future$(io.RandomAccessFile), [core.String], {encoding: convert.Encoding}),
  writeStringSync: dart.fnType(dart.void, [core.String], {encoding: convert.Encoding}),
  position: dart.fnType(async.Future$(core.int), []),
  positionSync: dart.fnType(core.int, []),
  setPosition: dart.fnType(async.Future$(io.RandomAccessFile), [core.int]),
  setPositionSync: dart.fnType(dart.void, [core.int]),
  truncate: dart.fnType(async.Future$(io.RandomAccessFile), [core.int]),
  truncateSync: dart.fnType(dart.void, [core.int]),
  length: dart.fnType(async.Future$(core.int), []),
  lengthSync: dart.fnType(core.int, []),
  flush: dart.fnType(async.Future$(io.RandomAccessFile), []),
  flushSync: dart.fnType(dart.void, []),
  [_fileLockValue]: dart.fnType(core.int, [io.FileLock]),
  lock: dart.fnType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
  unlock: dart.fnType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
  lockSync: dart.fnType(dart.void, [], [io.FileLock, core.int, core.int]),
  unlockSync: dart.fnType(dart.void, [], [core.int, core.int]),
  [_pointer]: dart.fnType(core.int, []),
  [_dispatch]: dart.fnType(async.Future, [core.int, core.List], {markClosed: core.bool}),
  [_checkAvailable]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(io._RandomAccessFile, "dart:io");
dart.setFieldSignature(io._RandomAccessFile, () => ({
  __proto__: dart.getFields(io._RandomAccessFile.__proto__),
  path: dart.finalFieldType(core.String),
  [_asyncDispatched]: dart.fieldType(core.bool),
  [_fileService]: dart.fieldType(isolate.SendPort),
  [_resourceInfo]: dart.fieldType(io._FileResourceInfo),
  [_ops]: dart.fieldType(io._RandomAccessFileOps),
  closed: dart.fieldType(core.bool)
}));
dart.defineLazy(io._RandomAccessFile, {
  /*io._RandomAccessFile._connectedResourceHandler*/get _connectedResourceHandler() {
    return false;
  },
  set _connectedResourceHandler(_) {},
  /*io._RandomAccessFile.lockUnlock*/get lockUnlock() {
    return 0;
  }
});
let const$68;
io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
  static _lookup(type) {
    return io.FileSystemEntityType._typeList[$_get](type);
  }
  toString() {
    return (const$68 || (const$68 = dart.constList(["file", "directory", "link", "notFound"], core.String)))[$_get](this[_type$0]);
  }
};
(io.FileSystemEntityType._internal = function(type) {
  this[_type$0] = type;
}).prototype = io.FileSystemEntityType.prototype;
dart.addTypeTests(io.FileSystemEntityType);
dart.setLibraryUri(io.FileSystemEntityType, "dart:io");
dart.setFieldSignature(io.FileSystemEntityType, () => ({
  __proto__: dart.getFields(io.FileSystemEntityType.__proto__),
  [_type$0]: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io.FileSystemEntityType, ['toString']);
dart.defineLazy(io.FileSystemEntityType, {
  /*io.FileSystemEntityType.file*/get file() {
    return dart.const(new io.FileSystemEntityType._internal(0));
  },
  /*io.FileSystemEntityType.FILE*/get FILE() {
    return io.FileSystemEntityType.file;
  },
  /*io.FileSystemEntityType.directory*/get directory() {
    return dart.const(new io.FileSystemEntityType._internal(1));
  },
  /*io.FileSystemEntityType.DIRECTORY*/get DIRECTORY() {
    return io.FileSystemEntityType.directory;
  },
  /*io.FileSystemEntityType.link*/get link() {
    return dart.const(new io.FileSystemEntityType._internal(2));
  },
  /*io.FileSystemEntityType.LINK*/get LINK() {
    return io.FileSystemEntityType.link;
  },
  /*io.FileSystemEntityType.notFound*/get notFound() {
    return dart.const(new io.FileSystemEntityType._internal(3));
  },
  /*io.FileSystemEntityType.NOT_FOUND*/get NOT_FOUND() {
    return io.FileSystemEntityType.notFound;
  },
  /*io.FileSystemEntityType._typeList*/get _typeList() {
    return dart.constList([io.FileSystemEntityType.file, io.FileSystemEntityType.directory, io.FileSystemEntityType.link, io.FileSystemEntityType.notFound], io.FileSystemEntityType);
  }
});
let const$69;
io.FileStat = class FileStat extends core.Object {
  get changed() {
    return this[changed$];
  }
  set changed(value) {
    super.changed = value;
  }
  get modified() {
    return this[modified$];
  }
  set modified(value) {
    super.modified = value;
  }
  get accessed() {
    return this[accessed$];
  }
  set accessed(value) {
    super.accessed = value;
  }
  get type() {
    return this[type$];
  }
  set type(value) {
    super.type = value;
  }
  get mode() {
    return this[mode$0];
  }
  set mode(value) {
    super.mode = value;
  }
  get size() {
    return this[size$];
  }
  set size(value) {
    super.size = value;
  }
  static _statSync(namespace, path) {
    dart.throw(new core.UnsupportedError.new("FileStat.stat"));
  }
  static statSync(path) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io.FileStat._statSyncInternal(path);
    }
    return overrides.statSync(path);
  }
  static _statSyncInternal(path) {
    if (dart.test(io.Platform.isWindows)) {
      path = io.FileSystemEntity._trimTrailingPathSeparators(path);
    }
    let data = io.FileStat._statSync(io._Namespace._namespace, path);
    if (io.OSError.is(data)) return io.FileStat._notFound;
    return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, 1))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, 2))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, 3))), io.FileSystemEntityType._lookup(core.int._check(dart.dindex(data, 0))), core.int._check(dart.dindex(data, 4)), core.int._check(dart.dindex(data, 5)));
  }
  static stat(path) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io.FileStat._stat(path);
    }
    return overrides.stat(path);
  }
  static _stat(path) {
    if (dart.test(io.Platform.isWindows)) {
      path = io.FileSystemEntity._trimTrailingPathSeparators(path);
    }
    return FutureOfFileStat()._check(io._File._dispatchWithNamespace(io._IOService.fileStat, [null, path]).then(io.FileStat, dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        return io.FileStat._notFound;
      }
      let data = core.List._check(dart.dindex(response, 1));
      return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[$_get](1))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[$_get](2))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[$_get](3))), io.FileSystemEntityType._lookup(core.int._check(data[$_get](0))), core.int._check(data[$_get](4)), core.int._check(data[$_get](5)));
    }, dynamicToFileStat())));
  }
  toString() {
    return "FileStat: type " + dart.str(this.type) + "\n          changed " + dart.str(this.changed) + "\n          modified " + dart.str(this.modified) + "\n          accessed " + dart.str(this.accessed) + "\n          mode " + dart.str(this.modeString()) + "\n          size " + dart.str(this.size);
  }
  modeString() {
    let permissions = dart.notNull(this.mode) & 4095;
    let codes = const$69 || (const$69 = dart.constList(["---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"], core.String));
    let result = [];
    if ((permissions & 2048) !== 0) result[$add]("(suid) ");
    if ((permissions & 1024) !== 0) result[$add]("(guid) ");
    if ((permissions & 512) !== 0) result[$add]("(sticky) ");
    result[$add](codes[$_get](permissions >> 6 & 7));
    result[$add](codes[$_get](permissions >> 3 & 7));
    result[$add](codes[$_get](permissions & 7));
    return result[$join]();
  }
};
(io.FileStat._internal = function(changed, modified, accessed, type, mode, size) {
  this[changed$] = changed;
  this[modified$] = modified;
  this[accessed$] = accessed;
  this[type$] = type;
  this[mode$0] = mode;
  this[size$] = size;
}).prototype = io.FileStat.prototype;
(io.FileStat._internalNotFound = function() {
  this[changed$] = null;
  this[modified$] = null;
  this[accessed$] = null;
  this[type$] = io.FileSystemEntityType.notFound;
  this[mode$0] = 0;
  this[size$] = -1;
}).prototype = io.FileStat.prototype;
dart.addTypeTests(io.FileStat);
const changed$ = Symbol("FileStat.changed");
const modified$ = Symbol("FileStat.modified");
const accessed$ = Symbol("FileStat.accessed");
const type$ = Symbol("FileStat.type");
const mode$0 = Symbol("FileStat.mode");
const size$ = Symbol("FileStat.size");
dart.setMethodSignature(io.FileStat, () => ({
  __proto__: dart.getMethods(io.FileStat.__proto__),
  modeString: dart.fnType(core.String, [])
}));
dart.setLibraryUri(io.FileStat, "dart:io");
dart.setFieldSignature(io.FileStat, () => ({
  __proto__: dart.getFields(io.FileStat.__proto__),
  changed: dart.finalFieldType(core.DateTime),
  modified: dart.finalFieldType(core.DateTime),
  accessed: dart.finalFieldType(core.DateTime),
  type: dart.finalFieldType(io.FileSystemEntityType),
  mode: dart.finalFieldType(core.int),
  size: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io.FileStat, ['toString']);
dart.defineLazy(io.FileStat, {
  /*io.FileStat._type*/get _type() {
    return 0;
  },
  /*io.FileStat._changedTime*/get _changedTime() {
    return 1;
  },
  /*io.FileStat._modifiedTime*/get _modifiedTime() {
    return 2;
  },
  /*io.FileStat._accessedTime*/get _accessedTime() {
    return 3;
  },
  /*io.FileStat._mode*/get _mode() {
    return 4;
  },
  /*io.FileStat._size*/get _size() {
    return 5;
  },
  /*io.FileStat._notFound*/get _notFound() {
    return dart.const(new io.FileStat._internalNotFound());
  }
});
io.FileSystemEvent = class FileSystemEvent extends core.Object {
  get type() {
    return this[type$0];
  }
  set type(value) {
    super.type = value;
  }
  get path() {
    return this[path$0];
  }
  set path(value) {
    super.path = value;
  }
  get isDirectory() {
    return this[isDirectory$];
  }
  set isDirectory(value) {
    super.isDirectory = value;
  }
};
(io.FileSystemEvent.__ = function(type, path, isDirectory) {
  this[type$0] = type;
  this[path$0] = path;
  this[isDirectory$] = isDirectory;
}).prototype = io.FileSystemEvent.prototype;
dart.addTypeTests(io.FileSystemEvent);
const type$0 = Symbol("FileSystemEvent.type");
const path$0 = Symbol("FileSystemEvent.path");
const isDirectory$ = Symbol("FileSystemEvent.isDirectory");
dart.setLibraryUri(io.FileSystemEvent, "dart:io");
dart.setFieldSignature(io.FileSystemEvent, () => ({
  __proto__: dart.getFields(io.FileSystemEvent.__proto__),
  type: dart.finalFieldType(core.int),
  path: dart.finalFieldType(core.String),
  isDirectory: dart.finalFieldType(core.bool)
}));
dart.defineLazy(io.FileSystemEvent, {
  /*io.FileSystemEvent.create*/get create() {
    return 1 << 0;
  },
  /*io.FileSystemEvent.CREATE*/get CREATE() {
    return 1 << 0;
  },
  /*io.FileSystemEvent.modify*/get modify() {
    return 1 << 1;
  },
  /*io.FileSystemEvent.MODIFY*/get MODIFY() {
    return 1 << 1;
  },
  /*io.FileSystemEvent.delete*/get delete() {
    return 1 << 2;
  },
  /*io.FileSystemEvent.DELETE*/get DELETE() {
    return 1 << 2;
  },
  /*io.FileSystemEvent.move*/get move() {
    return 1 << 3;
  },
  /*io.FileSystemEvent.MOVE*/get MOVE() {
    return 1 << 3;
  },
  /*io.FileSystemEvent.all*/get all() {
    return 1 | 2 | 4 | 8;
  },
  /*io.FileSystemEvent.ALL*/get ALL() {
    return 1 | 2 | 4 | 8;
  },
  /*io.FileSystemEvent._modifyAttributes*/get _modifyAttributes() {
    return 1 << 4;
  },
  /*io.FileSystemEvent._deleteSelf*/get _deleteSelf() {
    return 1 << 5;
  },
  /*io.FileSystemEvent._isDir*/get _isDir() {
    return 1 << 6;
  }
});
io.FileSystemCreateEvent = class FileSystemCreateEvent extends io.FileSystemEvent {
  toString() {
    return "FileSystemCreateEvent('" + dart.str(this.path) + "')";
  }
};
(io.FileSystemCreateEvent.__ = function(path, isDirectory) {
  io.FileSystemCreateEvent.__proto__.__.call(this, io.FileSystemEvent.create, core.String._check(path), core.bool._check(isDirectory));
}).prototype = io.FileSystemCreateEvent.prototype;
dart.addTypeTests(io.FileSystemCreateEvent);
dart.setLibraryUri(io.FileSystemCreateEvent, "dart:io");
dart.defineExtensionMethods(io.FileSystemCreateEvent, ['toString']);
io.FileSystemModifyEvent = class FileSystemModifyEvent extends io.FileSystemEvent {
  get contentChanged() {
    return this[contentChanged$];
  }
  set contentChanged(value) {
    super.contentChanged = value;
  }
  toString() {
    return "FileSystemModifyEvent('" + dart.str(this.path) + "', contentChanged=" + dart.str(this.contentChanged) + ")";
  }
};
(io.FileSystemModifyEvent.__ = function(path, isDirectory, contentChanged) {
  this[contentChanged$] = contentChanged;
  io.FileSystemModifyEvent.__proto__.__.call(this, io.FileSystemEvent.modify, core.String._check(path), core.bool._check(isDirectory));
}).prototype = io.FileSystemModifyEvent.prototype;
dart.addTypeTests(io.FileSystemModifyEvent);
const contentChanged$ = Symbol("FileSystemModifyEvent.contentChanged");
dart.setLibraryUri(io.FileSystemModifyEvent, "dart:io");
dart.setFieldSignature(io.FileSystemModifyEvent, () => ({
  __proto__: dart.getFields(io.FileSystemModifyEvent.__proto__),
  contentChanged: dart.finalFieldType(core.bool)
}));
dart.defineExtensionMethods(io.FileSystemModifyEvent, ['toString']);
io.FileSystemDeleteEvent = class FileSystemDeleteEvent extends io.FileSystemEvent {
  toString() {
    return "FileSystemDeleteEvent('" + dart.str(this.path) + "')";
  }
};
(io.FileSystemDeleteEvent.__ = function(path, isDirectory) {
  io.FileSystemDeleteEvent.__proto__.__.call(this, io.FileSystemEvent.delete, core.String._check(path), core.bool._check(isDirectory));
}).prototype = io.FileSystemDeleteEvent.prototype;
dart.addTypeTests(io.FileSystemDeleteEvent);
dart.setLibraryUri(io.FileSystemDeleteEvent, "dart:io");
dart.defineExtensionMethods(io.FileSystemDeleteEvent, ['toString']);
io.FileSystemMoveEvent = class FileSystemMoveEvent extends io.FileSystemEvent {
  get destination() {
    return this[destination$];
  }
  set destination(value) {
    super.destination = value;
  }
  toString() {
    let buffer = new core.StringBuffer.new();
    buffer.write("FileSystemMoveEvent('" + dart.str(this.path) + "'");
    if (this.destination != null) buffer.write(", '" + dart.str(this.destination) + "'");
    buffer.write(")");
    return buffer.toString();
  }
};
(io.FileSystemMoveEvent.__ = function(path, isDirectory, destination) {
  this[destination$] = destination;
  io.FileSystemMoveEvent.__proto__.__.call(this, io.FileSystemEvent.move, core.String._check(path), core.bool._check(isDirectory));
}).prototype = io.FileSystemMoveEvent.prototype;
dart.addTypeTests(io.FileSystemMoveEvent);
const destination$ = Symbol("FileSystemMoveEvent.destination");
dart.setLibraryUri(io.FileSystemMoveEvent, "dart:io");
dart.setFieldSignature(io.FileSystemMoveEvent, () => ({
  __proto__: dart.getFields(io.FileSystemMoveEvent.__proto__),
  destination: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(io.FileSystemMoveEvent, ['toString']);
io._FileSystemWatcher = class _FileSystemWatcher extends core.Object {
  static _watch(path, events, recursive) {
    dart.throw(new core.UnsupportedError.new("_FileSystemWatcher.watch"));
  }
  static get isSupported() {
    dart.throw(new core.UnsupportedError.new("_FileSystemWatcher.isSupported"));
  }
};
(io._FileSystemWatcher.new = function() {
}).prototype = io._FileSystemWatcher.prototype;
dart.addTypeTests(io._FileSystemWatcher);
dart.setLibraryUri(io._FileSystemWatcher, "dart:io");
io._IOResourceInfo = class _IOResourceInfo extends core.Object {
  static get timestamp() {
    return dart.notNull(io._IOResourceInfo._startTime) + dart.notNull(io._IOResourceInfo._sw.elapsedMicroseconds) / 1000;
  }
  get referenceValueMap() {
    return new (IdentityMapOfString$dynamic()).from(["type", "@" + dart.str(this.type), "id", this.id, "name", this.name]);
  }
  static getNextID() {
    let x = io._IOResourceInfo._count;
    io._IOResourceInfo._count = dart.notNull(x) + 1;
    return x;
  }
};
(io._IOResourceInfo.new = function(type) {
  this.type = type;
  this.id = io._IOResourceInfo.getNextID();
}).prototype = io._IOResourceInfo.prototype;
dart.addTypeTests(io._IOResourceInfo);
dart.setGetterSignature(io._IOResourceInfo, () => ({
  __proto__: dart.getGetters(io._IOResourceInfo.__proto__),
  referenceValueMap: core.Map$(core.String, dart.dynamic)
}));
dart.setLibraryUri(io._IOResourceInfo, "dart:io");
dart.setFieldSignature(io._IOResourceInfo, () => ({
  __proto__: dart.getFields(io._IOResourceInfo.__proto__),
  type: dart.finalFieldType(core.String),
  id: dart.finalFieldType(core.int)
}));
dart.defineLazy(io._IOResourceInfo, {
  /*io._IOResourceInfo._count*/get _count() {
    return 0;
  },
  set _count(_) {},
  /*io._IOResourceInfo._sw*/get _sw() {
    let _ = new core.Stopwatch.new();
    _.start();
    return _;
  },
  /*io._IOResourceInfo._startTime*/get _startTime() {
    return new core.DateTime.now().millisecondsSinceEpoch;
  }
});
io._ReadWriteResourceInfo = class _ReadWriteResourceInfo extends io._IOResourceInfo {
  addRead(bytes) {
    this.totalRead = dart.notNull(this.totalRead) + dart.notNull(bytes);
    this.readCount = dart.notNull(this.readCount) + 1;
    this.lastRead = io._IOResourceInfo.timestamp;
  }
  didRead() {
    this.addRead(0);
  }
  addWrite(bytes) {
    this.totalWritten = dart.notNull(this.totalWritten) + dart.notNull(bytes);
    this.writeCount = dart.notNull(this.writeCount) + 1;
    this.lastWrite = io._IOResourceInfo.timestamp;
  }
  get fullValueMap() {
    return new (IdentityMapOfString$dynamic()).from(["type", this.type, "id", this.id, "name", this.name, "totalRead", this.totalRead, "totalWritten", this.totalWritten, "readCount", this.readCount, "writeCount", this.writeCount, "lastRead", this.lastRead, "lastWrite", this.lastWrite]);
  }
};
(io._ReadWriteResourceInfo.new = function(type) {
  this.totalRead = 0;
  this.totalWritten = 0;
  this.readCount = 0;
  this.writeCount = 0;
  this.lastRead = 0.0;
  this.lastWrite = 0.0;
  io._ReadWriteResourceInfo.__proto__.new.call(this, type);
}).prototype = io._ReadWriteResourceInfo.prototype;
dart.addTypeTests(io._ReadWriteResourceInfo);
dart.setMethodSignature(io._ReadWriteResourceInfo, () => ({
  __proto__: dart.getMethods(io._ReadWriteResourceInfo.__proto__),
  addRead: dart.fnType(dart.void, [core.int]),
  didRead: dart.fnType(dart.void, []),
  addWrite: dart.fnType(dart.void, [core.int])
}));
dart.setGetterSignature(io._ReadWriteResourceInfo, () => ({
  __proto__: dart.getGetters(io._ReadWriteResourceInfo.__proto__),
  fullValueMap: core.Map$(core.String, dart.dynamic)
}));
dart.setLibraryUri(io._ReadWriteResourceInfo, "dart:io");
dart.setFieldSignature(io._ReadWriteResourceInfo, () => ({
  __proto__: dart.getFields(io._ReadWriteResourceInfo.__proto__),
  totalRead: dart.fieldType(core.int),
  totalWritten: dart.fieldType(core.int),
  readCount: dart.fieldType(core.int),
  writeCount: dart.fieldType(core.int),
  lastRead: dart.fieldType(core.double),
  lastWrite: dart.fieldType(core.double)
}));
io._FileResourceInfo = class _FileResourceInfo extends io._ReadWriteResourceInfo {
  static FileOpened(info) {
    if (!!dart.test(io._FileResourceInfo.openFiles[$containsKey](info.id))) dart.assertFailed(null, "dart:io/io_resource_info.dart", 101, 12, "!openFiles.containsKey(info.id)");
    io._FileResourceInfo.openFiles[$_set](info.id, info);
  }
  static FileClosed(info) {
    if (!dart.test(io._FileResourceInfo.openFiles[$containsKey](info.id))) dart.assertFailed(null, "dart:io/io_resource_info.dart", 106, 12, "openFiles.containsKey(info.id)");
    io._FileResourceInfo.openFiles[$remove](info.id);
  }
  static getOpenFilesList() {
    return ListOfMapOfString$dynamic().from(io._FileResourceInfo.openFiles[$values][$map](dart.dynamic, dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$dynamic())));
  }
  static getOpenFiles(func, params) {
    if (!dart.equals(func, "ext.dart.io.getOpenFiles")) dart.assertFailed(null, "dart:io/io_resource_info.dart", 115, 12, "function == 'ext.dart.io.getOpenFiles'");
    let data = new (IdentityMapOfString$Object()).from(["type", "_openfiles", "data", io._FileResourceInfo.getOpenFilesList()]);
    let jsonValue = convert.json.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(jsonValue));
  }
  getFileInfoMap() {
    return this.fullValueMap;
  }
  static getFileInfoMapByID(func, params) {
    if (!dart.dassert(dart.dsend(params, 'containsKey', ["id"]))) dart.assertFailed(null, "dart:io/io_resource_info.dart", 126, 12, "params.containsKey('id')");
    let id = core.int.parse(core.String._check(dart.dindex(params, "id")));
    let result = dart.test(io._FileResourceInfo.openFiles[$containsKey](id)) ? io._FileResourceInfo.openFiles[$_get](id).getFileInfoMap() : new _js_helper.LinkedMap.new();
    let jsonValue = convert.json.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(jsonValue));
  }
  get name() {
    return dart.str(dart.dload(this.file, 'path'));
  }
};
(io._FileResourceInfo.new = function(file) {
  this.file = file;
  io._FileResourceInfo.__proto__.new.call(this, "_file");
  io._FileResourceInfo.FileOpened(this);
}).prototype = io._FileResourceInfo.prototype;
dart.addTypeTests(io._FileResourceInfo);
dart.setMethodSignature(io._FileResourceInfo, () => ({
  __proto__: dart.getMethods(io._FileResourceInfo.__proto__),
  getFileInfoMap: dart.fnType(core.Map$(core.String, dart.dynamic), [])
}));
dart.setGetterSignature(io._FileResourceInfo, () => ({
  __proto__: dart.getGetters(io._FileResourceInfo.__proto__),
  name: core.String
}));
dart.setLibraryUri(io._FileResourceInfo, "dart:io");
dart.setFieldSignature(io._FileResourceInfo, () => ({
  __proto__: dart.getFields(io._FileResourceInfo.__proto__),
  file: dart.finalFieldType(dart.dynamic)
}));
dart.defineLazy(io._FileResourceInfo, {
  /*io._FileResourceInfo._type*/get _type() {
    return "_file";
  },
  /*io._FileResourceInfo.openFiles*/get openFiles() {
    return new (IdentityMapOfint$_FileResourceInfo()).new();
  },
  set openFiles(_) {}
});
const _arguments$0 = dart.privateName(io, "_arguments");
const _workingDirectory = dart.privateName(io, "_workingDirectory");
io._ProcessResourceInfo = class _ProcessResourceInfo extends io._IOResourceInfo {
  get name() {
    return core.String._check(dart.dload(this.process, _path));
  }
  stopped() {
    io._ProcessResourceInfo.ProcessStopped(this);
  }
  get fullValueMap() {
    return new (IdentityMapOfString$dynamic()).from(["type", this.type, "id", this.id, "name", this.name, "pid", dart.dload(this.process, 'pid'), "startedAt", this.startedAt, "arguments", dart.dload(this.process, _arguments$0), "workingDirectory", dart.dload(this.process, _workingDirectory) == null ? "." : dart.dload(this.process, _workingDirectory)]);
  }
  static ProcessStarted(info) {
    if (!!dart.test(io._ProcessResourceInfo.startedProcesses[$containsKey](info.id))) dart.assertFailed(null, "dart:io/io_resource_info.dart", 171, 12, "!startedProcesses.containsKey(info.id)");
    io._ProcessResourceInfo.startedProcesses[$_set](info.id, info);
  }
  static ProcessStopped(info) {
    if (!dart.test(io._ProcessResourceInfo.startedProcesses[$containsKey](info.id))) dart.assertFailed(null, "dart:io/io_resource_info.dart", 176, 12, "startedProcesses.containsKey(info.id)");
    io._ProcessResourceInfo.startedProcesses[$remove](info.id);
  }
  static getStartedProcessesList() {
    return ListOfMapOfString$dynamic().from(io._ProcessResourceInfo.startedProcesses[$values][$map](dart.dynamic, dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$dynamic())));
  }
  static getStartedProcesses(func, params) {
    if (!(func === "ext.dart.io.getProcesses")) dart.assertFailed(null, "dart:io/io_resource_info.dart", 185, 12, "function == 'ext.dart.io.getProcesses'");
    let data = new (IdentityMapOfString$Object()).from(["type", "_startedprocesses", "data", io._ProcessResourceInfo.getStartedProcessesList()]);
    let jsonValue = convert.json.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(jsonValue));
  }
  static getProcessInfoMapById(func, params) {
    let id = core.int.parse(params[$_get]("id"));
    let result = dart.test(io._ProcessResourceInfo.startedProcesses[$containsKey](id)) ? io._ProcessResourceInfo.startedProcesses[$_get](id).fullValueMap : new _js_helper.LinkedMap.new();
    let jsonValue = convert.json.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(jsonValue));
  }
};
(io._ProcessResourceInfo.new = function(process) {
  this.process = process;
  this.startedAt = io._IOResourceInfo.timestamp;
  io._ProcessResourceInfo.__proto__.new.call(this, "_process");
  io._ProcessResourceInfo.ProcessStarted(this);
}).prototype = io._ProcessResourceInfo.prototype;
dart.addTypeTests(io._ProcessResourceInfo);
dart.setMethodSignature(io._ProcessResourceInfo, () => ({
  __proto__: dart.getMethods(io._ProcessResourceInfo.__proto__),
  stopped: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(io._ProcessResourceInfo, () => ({
  __proto__: dart.getGetters(io._ProcessResourceInfo.__proto__),
  name: core.String,
  fullValueMap: core.Map$(core.String, dart.dynamic)
}));
dart.setLibraryUri(io._ProcessResourceInfo, "dart:io");
dart.setFieldSignature(io._ProcessResourceInfo, () => ({
  __proto__: dart.getFields(io._ProcessResourceInfo.__proto__),
  process: dart.finalFieldType(dart.dynamic),
  startedAt: dart.finalFieldType(core.double)
}));
dart.defineLazy(io._ProcessResourceInfo, {
  /*io._ProcessResourceInfo._type*/get _type() {
    return "_process";
  },
  /*io._ProcessResourceInfo.startedProcesses*/get startedProcesses() {
    return new (IdentityMapOfint$_ProcessResourceInfo()).new();
  },
  set startedProcesses(_) {}
});
io._SocketResourceInfo = class _SocketResourceInfo extends io._ReadWriteResourceInfo {
  get name() {
    if (dart.dtest(dart.dload(this.socket, 'isListening'))) {
      return "listening:" + dart.str(dart.dload(dart.dload(this.socket, 'address'), 'host')) + ":" + dart.str(dart.dload(this.socket, 'port'));
    }
    let remote = "";
    try {
      let remoteHost = dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host');
      let remotePort = dart.dload(this.socket, 'remotePort');
      remote = " -> " + dart.str(remoteHost) + ":" + dart.str(remotePort);
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    return dart.str(dart.dload(dart.dload(this.socket, 'address'), 'host')) + ":" + dart.str(dart.dload(this.socket, 'port')) + remote;
  }
  static getOpenSocketsList() {
    return ListOfMapOfString$dynamic().from(io._SocketResourceInfo.openSockets[$values][$map](dart.dynamic, dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$dynamic())));
  }
  getSocketInfoMap() {
    let result = this.fullValueMap;
    result[$_set]("socketType", dart.dtest(dart.dload(this.socket, 'isTcp')) ? "TCP" : "UDP");
    result[$_set]("listening", dart.dload(this.socket, 'isListening'));
    result[$_set]("host", dart.dload(dart.dload(this.socket, 'address'), 'host'));
    result[$_set]("port", dart.dload(this.socket, 'port'));
    if (!dart.dtest(dart.dload(this.socket, 'isListening'))) {
      try {
        result[$_set]("remoteHost", dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host'));
        result[$_set]("remotePort", dart.dload(this.socket, 'remotePort'));
      } catch (e$) {
        let e = dart.getThrown(e$);
        result[$_set]("remotePort", "NA");
        result[$_set]("remoteHost", "NA");
      }
    } else {
      result[$_set]("remotePort", "NA");
      result[$_set]("remoteHost", "NA");
    }
    result[$_set]("addressType", dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name'));
    return result;
  }
  static getSocketInfoMapByID(func, params) {
    if (!dart.test(params[$containsKey]("id"))) dart.assertFailed(null, "dart:io/io_resource_info.dart", 258, 12, "params.containsKey('id')");
    let id = core.int.parse(params[$_get]("id"));
    let result = dart.test(io._SocketResourceInfo.openSockets[$containsKey](id)) ? io._SocketResourceInfo.openSockets[$_get](id).getSocketInfoMap() : new _js_helper.LinkedMap.new();
    let jsonValue = convert.json.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(jsonValue));
  }
  static getOpenSockets(func, params) {
    if (!dart.equals(func, "ext.dart.io.getOpenSockets")) dart.assertFailed(null, "dart:io/io_resource_info.dart", 267, 12, "function == 'ext.dart.io.getOpenSockets'");
    let data = new (IdentityMapOfString$Object()).from(["type", "_opensockets", "data", io._SocketResourceInfo.getOpenSocketsList()]);
    let jsonValue = convert.json.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(jsonValue));
  }
  static SocketOpened(info) {
    if (!!dart.test(io._SocketResourceInfo.openSockets[$containsKey](info.id))) dart.assertFailed(null, "dart:io/io_resource_info.dart", 274, 12, "!openSockets.containsKey(info.id)");
    io._SocketResourceInfo.openSockets[$_set](info.id, info);
  }
  static SocketClosed(info) {
    if (!dart.test(io._SocketResourceInfo.openSockets[$containsKey](info.id))) dart.assertFailed(null, "dart:io/io_resource_info.dart", 279, 12, "openSockets.containsKey(info.id)");
    io._SocketResourceInfo.openSockets[$remove](info.id);
  }
};
(io._SocketResourceInfo.new = function(socket) {
  this.socket = socket;
  io._SocketResourceInfo.__proto__.new.call(this, "_socket");
  io._SocketResourceInfo.SocketOpened(this);
}).prototype = io._SocketResourceInfo.prototype;
dart.addTypeTests(io._SocketResourceInfo);
dart.setMethodSignature(io._SocketResourceInfo, () => ({
  __proto__: dart.getMethods(io._SocketResourceInfo.__proto__),
  getSocketInfoMap: dart.fnType(core.Map$(core.String, dart.dynamic), [])
}));
dart.setGetterSignature(io._SocketResourceInfo, () => ({
  __proto__: dart.getGetters(io._SocketResourceInfo.__proto__),
  name: core.String
}));
dart.setLibraryUri(io._SocketResourceInfo, "dart:io");
dart.setFieldSignature(io._SocketResourceInfo, () => ({
  __proto__: dart.getFields(io._SocketResourceInfo.__proto__),
  socket: dart.finalFieldType(dart.dynamic)
}));
dart.defineLazy(io._SocketResourceInfo, {
  /*io._SocketResourceInfo._tcpString*/get _tcpString() {
    return "TCP";
  },
  /*io._SocketResourceInfo._udpString*/get _udpString() {
    return "UDP";
  },
  /*io._SocketResourceInfo._type*/get _type() {
    return "_socket";
  },
  /*io._SocketResourceInfo.openSockets*/get openSockets() {
    return new (IdentityMapOfint$_SocketResourceInfo()).new();
  },
  set openSockets(_) {}
});
io.IOSink = class IOSink extends core.Object {
  static new(target, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.utf8;
    return new io._IOSinkImpl.new(target, encoding);
  }
  get encoding() {
    return this[encoding];
  }
  set encoding(value) {
    this[encoding] = value;
  }
};
(io.IOSink[dart.mixinNew] = function() {
  this[encoding] = null;
}).prototype = io.IOSink.prototype;
dart.addTypeTests(io.IOSink);
const encoding = Symbol("IOSink.encoding");
io.IOSink[dart.implements] = () => [StreamSinkOfListOfint(), core.StringSink];
dart.setLibraryUri(io.IOSink, "dart:io");
dart.setFieldSignature(io.IOSink, () => ({
  __proto__: dart.getFields(io.IOSink.__proto__),
  encoding: dart.fieldType(convert.Encoding)
}));
const _target$ = dart.privateName(io, "_target");
const _doneCompleter = dart.privateName(io, "_doneCompleter");
const _controllerInstance = dart.privateName(io, "_controllerInstance");
const _controllerCompleter = dart.privateName(io, "_controllerCompleter");
const _isClosed$ = dart.privateName(io, "_isClosed");
const _isBound = dart.privateName(io, "_isBound");
const _hasError$ = dart.privateName(io, "_hasError");
const _closeTarget = dart.privateName(io, "_closeTarget");
const _completeDoneValue = dart.privateName(io, "_completeDoneValue");
const _completeDoneError = dart.privateName(io, "_completeDoneError");
const _is__StreamSinkImpl_default = Symbol('_is__StreamSinkImpl_default');
io._StreamSinkImpl$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
  let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
  class _StreamSinkImpl extends core.Object {
    add(data) {
      T._check(data);
      if (dart.test(this[_isClosed$])) {
        dart.throw(new core.StateError.new("StreamSink is closed"));
      }
      this[_controller$].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (dart.test(this[_isClosed$])) {
        dart.throw(new core.StateError.new("StreamSink is closed"));
      }
      this[_controller$].addError(error, stackTrace);
    }
    addStream(stream) {
      StreamOfT()._check(stream);
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError.new("StreamSink is already bound to a stream"));
      }
      if (dart.test(this[_hasError$])) return this.done;
      this[_isBound] = true;
      let future = this[_controllerCompleter] == null ? this[_target$].addStream(stream) : this[_controllerCompleter].future.then(dart.dynamic, dart.fn(_ => this[_target$].addStream(stream), dynamicToFuture()));
      let t = this[_controllerInstance];
      t == null ? null : t.close();
      return future.whenComplete(dart.fn(() => {
        this[_isBound] = false;
      }, VoidToNull()));
    }
    flush() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError.new("StreamSink is bound to a stream"));
      }
      if (this[_controllerInstance] == null) return async.Future.value(this);
      this[_isBound] = true;
      let future = this[_controllerCompleter].future;
      this[_controllerInstance].close();
      return future.whenComplete(dart.fn(() => {
        this[_isBound] = false;
      }, VoidToNull()));
    }
    close() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError.new("StreamSink is bound to a stream"));
      }
      if (!dart.test(this[_isClosed$])) {
        this[_isClosed$] = true;
        if (this[_controllerInstance] != null) {
          this[_controllerInstance].close();
        } else {
          this[_closeTarget]();
        }
      }
      return this.done;
    }
    [_closeTarget]() {
      this[_target$].close().then(dart.void, dart.bind(this, _completeDoneValue), {onError: dart.bind(this, _completeDoneError)});
    }
    get done() {
      return this[_doneCompleter].future;
    }
    [_completeDoneValue](value) {
      if (!dart.test(this[_doneCompleter].isCompleted)) {
        this[_doneCompleter].complete(value);
      }
    }
    [_completeDoneError](error, stackTrace) {
      if (!dart.test(this[_doneCompleter].isCompleted)) {
        this[_hasError$] = true;
        this[_doneCompleter].completeError(error, stackTrace);
      }
    }
    get [_controller$]() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError.new("StreamSink is bound to a stream"));
      }
      if (dart.test(this[_isClosed$])) {
        dart.throw(new core.StateError.new("StreamSink is closed"));
      }
      if (this[_controllerInstance] == null) {
        this[_controllerInstance] = StreamControllerOfT().new({sync: true});
        this[_controllerCompleter] = async.Completer.new();
        FutureOfNull()._check(this[_target$].addStream(this[_controller$].stream).then(core.Null, dart.fn(_ => {
          if (dart.test(this[_isBound])) {
            this[_controllerCompleter].complete(this);
            this[_controllerCompleter] = null;
            this[_controllerInstance] = null;
          } else {
            this[_closeTarget]();
          }
        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
            if (dart.test(this[_isBound])) {
              this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
              this[_controllerCompleter] = null;
              this[_controllerInstance] = null;
            } else {
              this[_completeDoneError](error, core.StackTrace._check(stackTrace));
            }
          }, dynamicAnddynamicToNull())}));
      }
      return this[_controllerInstance];
    }
  }
  (_StreamSinkImpl.new = function(target) {
    this[_doneCompleter] = async.Completer.new();
    this[_controllerInstance] = null;
    this[_controllerCompleter] = null;
    this[_isClosed$] = false;
    this[_isBound] = false;
    this[_hasError$] = false;
    this[_target$] = target;
  }).prototype = _StreamSinkImpl.prototype;
  dart.addTypeTests(_StreamSinkImpl);
  _StreamSinkImpl.prototype[_is__StreamSinkImpl_default] = true;
  _StreamSinkImpl[dart.implements] = () => [StreamSinkOfT()];
  dart.setMethodSignature(_StreamSinkImpl, () => ({
    __proto__: dart.getMethods(_StreamSinkImpl.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    addStream: dart.fnType(async.Future, [core.Object]),
    flush: dart.fnType(async.Future, []),
    close: dart.fnType(async.Future, []),
    [_closeTarget]: dart.fnType(dart.void, []),
    [_completeDoneValue]: dart.fnType(dart.void, [dart.dynamic]),
    [_completeDoneError]: dart.fnType(dart.void, [dart.dynamic, core.StackTrace])
  }));
  dart.setGetterSignature(_StreamSinkImpl, () => ({
    __proto__: dart.getGetters(_StreamSinkImpl.__proto__),
    done: async.Future,
    [_controller$]: async.StreamController$(T)
  }));
  dart.setLibraryUri(_StreamSinkImpl, "dart:io");
  dart.setFieldSignature(_StreamSinkImpl, () => ({
    __proto__: dart.getFields(_StreamSinkImpl.__proto__),
    [_target$]: dart.finalFieldType(StreamConsumerOfT()),
    [_doneCompleter]: dart.finalFieldType(async.Completer),
    [_controllerInstance]: dart.fieldType(StreamControllerOfT()),
    [_controllerCompleter]: dart.fieldType(async.Completer),
    [_isClosed$]: dart.fieldType(core.bool),
    [_isBound]: dart.fieldType(core.bool),
    [_hasError$]: dart.fieldType(core.bool)
  }));
  return _StreamSinkImpl;
});
io._StreamSinkImpl = io._StreamSinkImpl$();
dart.addTypeTests(io._StreamSinkImpl, _is__StreamSinkImpl_default);
const _encoding = dart.privateName(io, "_encoding");
const _encodingMutable = dart.privateName(io, "_encodingMutable");
io._IOSinkImpl = class _IOSinkImpl extends io._StreamSinkImpl$(core.List$(core.int)) {
  get encoding() {
    return this[_encoding];
  }
  set encoding(value) {
    if (!dart.test(this[_encodingMutable])) {
      dart.throw(new core.StateError.new("IOSink encoding is not mutable"));
    }
    this[_encoding] = value;
  }
  write(obj) {
    let string = dart.str(obj);
    if (string[$isEmpty]) return;
    this.add(this[_encoding].encode(string));
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    let iterator = objects[$iterator];
    if (!dart.test(iterator.moveNext())) return;
    if (separator[$isEmpty]) {
      do {
        this.write(iterator.current);
      } while (dart.test(iterator.moveNext()));
    } else {
      this.write(iterator.current);
      while (dart.test(iterator.moveNext())) {
        this.write(separator);
        this.write(iterator.current);
      }
    }
  }
  writeln(object) {
    if (object === void 0) object = "";
    this.write(object);
    this.write("\n");
  }
  writeCharCode(charCode) {
    this.write(core.String.fromCharCode(charCode));
  }
};
(io._IOSinkImpl.new = function(target, encoding) {
  this[_encodingMutable] = true;
  this[_encoding] = encoding;
  io._IOSinkImpl.__proto__.new.call(this, target);
}).prototype = io._IOSinkImpl.prototype;
dart.addTypeTests(io._IOSinkImpl);
io._IOSinkImpl[dart.implements] = () => [io.IOSink];
dart.setMethodSignature(io._IOSinkImpl, () => ({
  __proto__: dart.getMethods(io._IOSinkImpl.__proto__),
  write: dart.fnType(dart.void, [core.Object]),
  writeAll: dart.fnType(dart.void, [core.Iterable], [core.String]),
  writeln: dart.fnType(dart.void, [], [core.Object]),
  writeCharCode: dart.fnType(dart.void, [core.int])
}));
dart.setGetterSignature(io._IOSinkImpl, () => ({
  __proto__: dart.getGetters(io._IOSinkImpl.__proto__),
  encoding: convert.Encoding
}));
dart.setSetterSignature(io._IOSinkImpl, () => ({
  __proto__: dart.getSetters(io._IOSinkImpl.__proto__),
  encoding: convert.Encoding
}));
dart.setLibraryUri(io._IOSinkImpl, "dart:io");
dart.setFieldSignature(io._IOSinkImpl, () => ({
  __proto__: dart.getFields(io._IOSinkImpl.__proto__),
  [_encoding]: dart.fieldType(convert.Encoding),
  [_encodingMutable]: dart.fieldType(core.bool)
}));
io._IOService = class _IOService extends core.Object {
  static _dispatch(request, data) {
    dart.throw(new core.UnsupportedError.new("_IOService._dispatch"));
  }
};
(io._IOService.new = function() {
}).prototype = io._IOService.prototype;
dart.addTypeTests(io._IOService);
dart.setLibraryUri(io._IOService, "dart:io");
dart.defineLazy(io._IOService, {
  /*io._IOService.fileExists*/get fileExists() {
    return 0;
  },
  /*io._IOService.fileCreate*/get fileCreate() {
    return 1;
  },
  /*io._IOService.fileDelete*/get fileDelete() {
    return 2;
  },
  /*io._IOService.fileRename*/get fileRename() {
    return 3;
  },
  /*io._IOService.fileCopy*/get fileCopy() {
    return 4;
  },
  /*io._IOService.fileOpen*/get fileOpen() {
    return 5;
  },
  /*io._IOService.fileResolveSymbolicLinks*/get fileResolveSymbolicLinks() {
    return 6;
  },
  /*io._IOService.fileClose*/get fileClose() {
    return 7;
  },
  /*io._IOService.filePosition*/get filePosition() {
    return 8;
  },
  /*io._IOService.fileSetPosition*/get fileSetPosition() {
    return 9;
  },
  /*io._IOService.fileTruncate*/get fileTruncate() {
    return 10;
  },
  /*io._IOService.fileLength*/get fileLength() {
    return 11;
  },
  /*io._IOService.fileLengthFromPath*/get fileLengthFromPath() {
    return 12;
  },
  /*io._IOService.fileLastAccessed*/get fileLastAccessed() {
    return 13;
  },
  /*io._IOService.fileSetLastAccessed*/get fileSetLastAccessed() {
    return 14;
  },
  /*io._IOService.fileLastModified*/get fileLastModified() {
    return 15;
  },
  /*io._IOService.fileSetLastModified*/get fileSetLastModified() {
    return 16;
  },
  /*io._IOService.fileFlush*/get fileFlush() {
    return 17;
  },
  /*io._IOService.fileReadByte*/get fileReadByte() {
    return 18;
  },
  /*io._IOService.fileWriteByte*/get fileWriteByte() {
    return 19;
  },
  /*io._IOService.fileRead*/get fileRead() {
    return 20;
  },
  /*io._IOService.fileReadInto*/get fileReadInto() {
    return 21;
  },
  /*io._IOService.fileWriteFrom*/get fileWriteFrom() {
    return 22;
  },
  /*io._IOService.fileCreateLink*/get fileCreateLink() {
    return 23;
  },
  /*io._IOService.fileDeleteLink*/get fileDeleteLink() {
    return 24;
  },
  /*io._IOService.fileRenameLink*/get fileRenameLink() {
    return 25;
  },
  /*io._IOService.fileLinkTarget*/get fileLinkTarget() {
    return 26;
  },
  /*io._IOService.fileType*/get fileType() {
    return 27;
  },
  /*io._IOService.fileIdentical*/get fileIdentical() {
    return 28;
  },
  /*io._IOService.fileStat*/get fileStat() {
    return 29;
  },
  /*io._IOService.fileLock*/get fileLock() {
    return 30;
  },
  /*io._IOService.socketLookup*/get socketLookup() {
    return 31;
  },
  /*io._IOService.socketListInterfaces*/get socketListInterfaces() {
    return 32;
  },
  /*io._IOService.socketReverseLookup*/get socketReverseLookup() {
    return 33;
  },
  /*io._IOService.directoryCreate*/get directoryCreate() {
    return 34;
  },
  /*io._IOService.directoryDelete*/get directoryDelete() {
    return 35;
  },
  /*io._IOService.directoryExists*/get directoryExists() {
    return 36;
  },
  /*io._IOService.directoryCreateTemp*/get directoryCreateTemp() {
    return 37;
  },
  /*io._IOService.directoryListStart*/get directoryListStart() {
    return 38;
  },
  /*io._IOService.directoryListNext*/get directoryListNext() {
    return 39;
  },
  /*io._IOService.directoryListStop*/get directoryListStop() {
    return 40;
  },
  /*io._IOService.directoryRename*/get directoryRename() {
    return 41;
  },
  /*io._IOService.sslProcessFilter*/get sslProcessFilter() {
    return 42;
  }
});
io.Link = class Link extends core.Object {
  static new(path) {
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return new io._Link.new(path);
    }
    return overrides.createLink(path);
  }
  static fromRawPath(rawPath) {
    return new io._Link.fromRawPath(rawPath);
  }
  static fromUri(uri) {
    return io.Link.new(uri.toFilePath());
  }
};
(io.Link[dart.mixinNew] = function() {
}).prototype = io.Link.prototype;
dart.addTypeTests(io.Link);
io.Link[dart.implements] = () => [io.FileSystemEntity];
dart.setLibraryUri(io.Link, "dart:io");
const _exceptionFromResponse = dart.privateName(io, "_exceptionFromResponse");
io._Link = class _Link extends io.FileSystemEntity {
  get [_path]() {
    return this[_path$2];
  }
  set [_path](value) {
    this[_path$2] = value;
  }
  get [_rawPath$]() {
    return this[_rawPath$2];
  }
  set [_rawPath$](value) {
    this[_rawPath$2] = value;
  }
  get path() {
    return this[_path];
  }
  toString() {
    return "Link: '" + dart.str(this.path) + "'";
  }
  exists() {
    return io.FileSystemEntity._isLinkRaw(this[_rawPath$]);
  }
  existsSync() {
    return io.FileSystemEntity._isLinkRawSync(this[_rawPath$]);
  }
  get absolute() {
    return io.Link.fromRawPath(this[_rawAbsolutePath]);
  }
  create(target, opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let result = dart.test(recursive) ? this.parent.create({recursive: true}) : FutureOfNull().value(null);
    return FutureOfLink()._check(result.then(dart.dynamic, dart.fn(_ => io._File._dispatchWithNamespace(io._IOService.fileCreateLink, [null, this[_rawPath$], target]), DirectoryToFuture())).then(io.Link, dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, "Cannot create link to target '" + dart.str(target) + "'", this.path));
      }
      return this;
    }, dynamicTo_Link())));
  }
  createSync(target, opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      this.parent.createSync({recursive: true});
    }
    let result = io._File._createLink(io._Namespace._namespace, this[_rawPath$], target);
    io._Link.throwIfError(result, "Cannot create link", this.path);
  }
  updateSync(target) {
    this.deleteSync();
    this.createSync(target);
  }
  update(target) {
    return FutureOfLink()._check(this.delete().then(io.Link, dart.fn(_ => this.create(target), FileSystemEntityToFutureOfLink())));
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return FutureOfLink()._check(io.Directory.fromRawPath(this[_rawPath$]).delete({recursive: true}).then(io.Link, dart.fn(_ => this, FileSystemEntityTo_Link())));
    }
    return FutureOfLink()._check(io._File._dispatchWithNamespace(io._IOService.fileDeleteLink, [null, this[_rawPath$]]).then(io.Link, dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, "Cannot delete link", this.path));
      }
      return this;
    }, dynamicTo_Link())));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.fromRawPath(this[_rawPath$]).deleteSync({recursive: true});
    }
    let result = io._File._deleteLinkNative(io._Namespace._namespace, this[_rawPath$]);
    io._Link.throwIfError(result, "Cannot delete link", this.path);
  }
  rename(newPath) {
    return FutureOfLink()._check(io._File._dispatchWithNamespace(io._IOService.fileRenameLink, [null, this[_rawPath$], newPath]).then(io.Link, dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, "Cannot rename link to '" + dart.str(newPath) + "'", this.path));
      }
      return io.Link.new(newPath);
    }, dynamicToLink())));
  }
  renameSync(newPath) {
    let result = io._File._renameLink(io._Namespace._namespace, this[_rawPath$], newPath);
    io._Link.throwIfError(result, "Cannot rename link '" + dart.str(this.path) + "' to '" + dart.str(newPath) + "'");
    return io.Link.new(newPath);
  }
  target() {
    return FutureOfString()._check(io._File._dispatchWithNamespace(io._IOService.fileLinkTarget, [null, this[_rawPath$]]).then(core.String, dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, "Cannot get target of link", this.path));
      }
      return FutureOrOfString()._check(response);
    }, dynamicToFutureOrOfString())));
  }
  targetSync() {
    let result = io._File._linkTarget(io._Namespace._namespace, this[_rawPath$]);
    io._Link.throwIfError(result, "Cannot read link", this.path);
    return core.String._check(result);
  }
  static throwIfError(result, msg, path) {
    if (path === void 0) path = "";
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException.new(msg, path, result));
    }
  }
  [_isErrorResponse](response) {
    return core.List.is(response) && !dart.equals(response[$_get](0), 0);
  }
  [_exceptionFromResponse](response, message, path) {
    if (!dart.test(this[_isErrorResponse](response))) dart.assertFailed(null, "dart:io/link.dart", 288, 12, "_isErrorResponse(response)");
    switch (dart.dindex(response, 0)) {
      case 1:
      {
        return new core.ArgumentError.new();
      }
      case 2:
      {
        let err = new io.OSError.new(core.String._check(dart.dindex(response, 2)), core.int._check(dart.dindex(response, 1)));
        return new io.FileSystemException.new(message, path, err);
      }
      default:
      {
        return core.Exception.new("Unknown error");
      }
    }
  }
};
(io._Link.new = function(path) {
  this[_path$2] = null;
  this[_rawPath$2] = null;
  io._Link.__proto__.new.call(this);
  core.ArgumentError.checkNotNull(path, "path");
  this[_path] = path;
  this[_rawPath$] = io.FileSystemEntity._toUtf8Array(path);
}).prototype = io._Link.prototype;
(io._Link.fromRawPath = function(rawPath) {
  this[_path$2] = null;
  this[_rawPath$2] = null;
  io._Link.__proto__.new.call(this);
  this[_rawPath$] = io.FileSystemEntity._toNullTerminatedUtf8Array(rawPath);
  this[_path] = io.FileSystemEntity._toStringFromUtf8Array(rawPath);
}).prototype = io._Link.prototype;
dart.addTypeTests(io._Link);
const _path$2 = Symbol("_Link._path");
const _rawPath$2 = Symbol("_Link._rawPath");
io._Link[dart.implements] = () => [io.Link];
dart.setMethodSignature(io._Link, () => ({
  __proto__: dart.getMethods(io._Link.__proto__),
  exists: dart.fnType(async.Future$(core.bool), []),
  existsSync: dart.fnType(core.bool, []),
  create: dart.fnType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
  createSync: dart.fnType(dart.void, [core.String], {recursive: core.bool}),
  updateSync: dart.fnType(dart.void, [core.String]),
  update: dart.fnType(async.Future$(io.Link), [core.String]),
  [_delete]: dart.fnType(async.Future$(io.Link), [], {recursive: core.bool}),
  [_deleteSync]: dart.fnType(dart.void, [], {recursive: core.bool}),
  rename: dart.fnType(async.Future$(io.Link), [core.String]),
  renameSync: dart.fnType(io.Link, [core.String]),
  target: dart.fnType(async.Future$(core.String), []),
  targetSync: dart.fnType(core.String, []),
  [_isErrorResponse]: dart.fnType(core.bool, [dart.dynamic]),
  [_exceptionFromResponse]: dart.fnType(dart.dynamic, [dart.dynamic, core.String, core.String])
}));
dart.setGetterSignature(io._Link, () => ({
  __proto__: dart.getGetters(io._Link.__proto__),
  path: core.String,
  absolute: io.Link
}));
dart.setLibraryUri(io._Link, "dart:io");
dart.setFieldSignature(io._Link, () => ({
  __proto__: dart.getFields(io._Link.__proto__),
  [_path]: dart.fieldType(core.String),
  [_rawPath$]: dart.fieldType(typed_data.Uint8List)
}));
dart.defineExtensionMethods(io._Link, ['toString']);
io._Namespace = class _Namespace extends core.Object {
  static get _namespace() {
    dart.throw(new core.UnsupportedError.new("_Namespace"));
  }
  static get _namespacePointer() {
    dart.throw(new core.UnsupportedError.new("_Namespace"));
  }
  static _setupNamespace(namespace) {
    dart.throw(new core.UnsupportedError.new("_Namespace"));
  }
};
(io._Namespace.new = function() {
}).prototype = io._Namespace.prototype;
dart.addTypeTests(io._Namespace);
dart.setLibraryUri(io._Namespace, "dart:io");
dart.defineLazy(io, {
  /*io._ioOverridesToken*/get _ioOverridesToken() {
    return new core.Object.new();
  },
  /*io._asyncRunZoned*/get _asyncRunZoned() {
    return dart.fn(async.runZoned, Fn__ToR());
  }
});
io.IOOverrides = class IOOverrides extends core.Object {
  static get current() {
    return io.IOOverrides._check((() => {
      let l = async.Zone.current._get(io._ioOverridesToken);
      return l != null ? l : io.IOOverrides._global;
    })());
  }
  static set global(overrides) {
    io.IOOverrides._global = overrides;
  }
  static runZoned(R, body, opts) {
    let createDirectory = opts && 'createDirectory' in opts ? opts.createDirectory : null;
    let getCurrentDirectory = opts && 'getCurrentDirectory' in opts ? opts.getCurrentDirectory : null;
    let setCurrentDirectory = opts && 'setCurrentDirectory' in opts ? opts.setCurrentDirectory : null;
    let getSystemTempDirectory = opts && 'getSystemTempDirectory' in opts ? opts.getSystemTempDirectory : null;
    let createFile = opts && 'createFile' in opts ? opts.createFile : null;
    let stat = opts && 'stat' in opts ? opts.stat : null;
    let statSync = opts && 'statSync' in opts ? opts.statSync : null;
    let fseIdentical = opts && 'fseIdentical' in opts ? opts.fseIdentical : null;
    let fseIdenticalSync = opts && 'fseIdenticalSync' in opts ? opts.fseIdenticalSync : null;
    let fseGetType = opts && 'fseGetType' in opts ? opts.fseGetType : null;
    let fseGetTypeSync = opts && 'fseGetTypeSync' in opts ? opts.fseGetTypeSync : null;
    let fsWatch = opts && 'fsWatch' in opts ? opts.fsWatch : null;
    let fsWatchIsSupported = opts && 'fsWatchIsSupported' in opts ? opts.fsWatchIsSupported : null;
    let createLink = opts && 'createLink' in opts ? opts.createLink : null;
    let socketConnect = opts && 'socketConnect' in opts ? opts.socketConnect : null;
    let socketStartConnect = opts && 'socketStartConnect' in opts ? opts.socketStartConnect : null;
    let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let overrides = new io._IOOverridesScope.new(createDirectory, getCurrentDirectory, setCurrentDirectory, getSystemTempDirectory, createFile, stat, statSync, fseIdentical, fseIdenticalSync, fseGetType, fseGetTypeSync, fsWatch, fsWatchIsSupported, createLink, socketConnect, socketStartConnect);
    return io._asyncRunZoned(R, body, {zoneValues: new _js_helper.LinkedMap.from([io._ioOverridesToken, overrides]), zoneSpecification: zoneSpecification, onError: onError});
  }
  static runWithIOOverrides(R, body, overrides, opts) {
    let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    return io._asyncRunZoned(R, body, {zoneValues: new _js_helper.LinkedMap.from([io._ioOverridesToken, overrides]), zoneSpecification: zoneSpecification, onError: onError});
  }
  createDirectory(path) {
    return new io._Directory.new(path);
  }
  getCurrentDirectory() {
    return io._Directory.current;
  }
  setCurrentDirectory(path) {
    io._Directory.current = path;
  }
  getSystemTempDirectory() {
    return io._Directory.systemTemp;
  }
  createFile(path) {
    return new io._File.new(path);
  }
  stat(path) {
    return io.FileStat._stat(path);
  }
  statSync(path) {
    return io.FileStat._statSyncInternal(path);
  }
  fseIdentical(path1, path2) {
    return io.FileSystemEntity._identical(path1, path2);
  }
  fseIdenticalSync(path1, path2) {
    return io.FileSystemEntity._identicalSync(path1, path2);
  }
  fseGetType(path, followLinks) {
    return io.FileSystemEntity._getTypeRequest(typed_data.Uint8List._check(convert.utf8.encode(path)), followLinks);
  }
  fseGetTypeSync(path, followLinks) {
    return io.FileSystemEntity._getTypeSyncHelper(typed_data.Uint8List._check(convert.utf8.encode(path)), followLinks);
  }
  fsWatch(path, events, recursive) {
    return io._FileSystemWatcher._watch(path, events, recursive);
  }
  fsWatchIsSupported() {
    return io._FileSystemWatcher.isSupported;
  }
  createLink(path) {
    return new io._Link.new(path);
  }
  socketConnect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    return io.Socket._connect(host, port, {sourceAddress: sourceAddress, timeout: timeout});
  }
  socketStartConnect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    return io.Socket._startConnect(host, port, {sourceAddress: sourceAddress});
  }
};
(io.IOOverrides.new = function() {
}).prototype = io.IOOverrides.prototype;
dart.addTypeTests(io.IOOverrides);
dart.setMethodSignature(io.IOOverrides, () => ({
  __proto__: dart.getMethods(io.IOOverrides.__proto__),
  createDirectory: dart.fnType(io.Directory, [core.String]),
  getCurrentDirectory: dart.fnType(io.Directory, []),
  setCurrentDirectory: dart.fnType(dart.void, [core.String]),
  getSystemTempDirectory: dart.fnType(io.Directory, []),
  createFile: dart.fnType(io.File, [core.String]),
  stat: dart.fnType(async.Future$(io.FileStat), [core.String]),
  statSync: dart.fnType(io.FileStat, [core.String]),
  fseIdentical: dart.fnType(async.Future$(core.bool), [core.String, core.String]),
  fseIdenticalSync: dart.fnType(core.bool, [core.String, core.String]),
  fseGetType: dart.fnType(async.Future$(io.FileSystemEntityType), [core.String, core.bool]),
  fseGetTypeSync: dart.fnType(io.FileSystemEntityType, [core.String, core.bool]),
  fsWatch: dart.fnType(async.Stream$(io.FileSystemEvent), [core.String, core.int, core.bool]),
  fsWatchIsSupported: dart.fnType(core.bool, []),
  createLink: dart.fnType(io.Link, [core.String]),
  socketConnect: dart.fnType(async.Future$(io.Socket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic, timeout: core.Duration}),
  socketStartConnect: dart.fnType(async.Future$(io.ConnectionTask$(io.Socket)), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})
}));
dart.setLibraryUri(io.IOOverrides, "dart:io");
dart.defineLazy(io.IOOverrides, {
  /*io.IOOverrides._global*/get _global() {
    return null;
  },
  set _global(_) {}
});
const _createDirectory = dart.privateName(io, "_createDirectory");
const _getCurrentDirectory = dart.privateName(io, "_getCurrentDirectory");
const _setCurrentDirectory = dart.privateName(io, "_setCurrentDirectory");
const _getSystemTempDirectory = dart.privateName(io, "_getSystemTempDirectory");
const _createFile = dart.privateName(io, "_createFile");
const _stat = dart.privateName(io, "_stat");
const _statSync = dart.privateName(io, "_statSync");
const _fseIdentical = dart.privateName(io, "_fseIdentical");
const _fseIdenticalSync = dart.privateName(io, "_fseIdenticalSync");
const _fseGetType = dart.privateName(io, "_fseGetType");
const _fseGetTypeSync = dart.privateName(io, "_fseGetTypeSync");
const _fsWatch = dart.privateName(io, "_fsWatch");
const _fsWatchIsSupported = dart.privateName(io, "_fsWatchIsSupported");
const _createLink = dart.privateName(io, "_createLink");
const _socketConnect = dart.privateName(io, "_socketConnect");
const _socketStartConnect = dart.privateName(io, "_socketStartConnect");
const _previous$1 = dart.privateName(io, "_previous");
io._IOOverridesScope = class _IOOverridesScope extends io.IOOverrides {
  createDirectory(path) {
    if (this[_createDirectory] != null) return this[_createDirectory](path);
    if (this[_previous$1] != null) return this[_previous$1].createDirectory(path);
    return super.createDirectory(path);
  }
  getCurrentDirectory() {
    if (this[_getCurrentDirectory] != null) return this[_getCurrentDirectory]();
    if (this[_previous$1] != null) return this[_previous$1].getCurrentDirectory();
    return super.getCurrentDirectory();
  }
  setCurrentDirectory(path) {
    if (this[_setCurrentDirectory] != null)
      this[_setCurrentDirectory](path);
    else if (this[_previous$1] != null)
      this[_previous$1].setCurrentDirectory(path);
    else
      super.setCurrentDirectory(path);
  }
  getSystemTempDirectory() {
    if (this[_getSystemTempDirectory] != null) return this[_getSystemTempDirectory]();
    if (this[_previous$1] != null) return this[_previous$1].getSystemTempDirectory();
    return super.getSystemTempDirectory();
  }
  createFile(path) {
    if (this[_createFile] != null) return this[_createFile](path);
    if (this[_previous$1] != null) return this[_previous$1].createFile(path);
    return super.createFile(path);
  }
  stat(path) {
    if (this[_stat] != null) return this[_stat](path);
    if (this[_previous$1] != null) return this[_previous$1].stat(path);
    return super.stat(path);
  }
  statSync(path) {
    if (this[_stat] != null) return this[_statSync](path);
    if (this[_previous$1] != null) return this[_previous$1].statSync(path);
    return super.statSync(path);
  }
  fseIdentical(path1, path2) {
    if (this[_fseIdentical] != null) return this[_fseIdentical](path1, path2);
    if (this[_previous$1] != null) return this[_previous$1].fseIdentical(path1, path2);
    return super.fseIdentical(path1, path2);
  }
  fseIdenticalSync(path1, path2) {
    if (this[_fseIdenticalSync] != null) return this[_fseIdenticalSync](path1, path2);
    if (this[_previous$1] != null) return this[_previous$1].fseIdenticalSync(path1, path2);
    return super.fseIdenticalSync(path1, path2);
  }
  fseGetType(path, followLinks) {
    if (this[_fseGetType] != null) return this[_fseGetType](path, followLinks);
    if (this[_previous$1] != null) return this[_previous$1].fseGetType(path, followLinks);
    return super.fseGetType(path, followLinks);
  }
  fseGetTypeSync(path, followLinks) {
    if (this[_fseGetTypeSync] != null) return this[_fseGetTypeSync](path, followLinks);
    if (this[_previous$1] != null) return this[_previous$1].fseGetTypeSync(path, followLinks);
    return super.fseGetTypeSync(path, followLinks);
  }
  fsWatch(path, events, recursive) {
    if (this[_fsWatch] != null) return this[_fsWatch](path, events, recursive);
    if (this[_previous$1] != null) return this[_previous$1].fsWatch(path, events, recursive);
    return super.fsWatch(path, events, recursive);
  }
  fsWatchIsSupported() {
    if (this[_fsWatchIsSupported] != null) return this[_fsWatchIsSupported]();
    if (this[_previous$1] != null) return this[_previous$1].fsWatchIsSupported();
    return super.fsWatchIsSupported();
  }
  createLink(path) {
    if (this[_createLink] != null) return this[_createLink](path);
    if (this[_previous$1] != null) return this[_previous$1].createLink(path);
    return super.createLink(path);
  }
  socketConnect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    if (this[_socketConnect] != null) {
      return this[_socketConnect](host, port, {sourceAddress: sourceAddress, timeout: timeout});
    }
    if (this[_previous$1] != null) {
      return this[_previous$1].socketConnect(host, port, {sourceAddress: sourceAddress, timeout: timeout});
    }
    return super.socketConnect(host, port, {sourceAddress: sourceAddress, timeout: timeout});
  }
  socketStartConnect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    if (this[_socketStartConnect] != null) {
      return this[_socketStartConnect](host, port, {sourceAddress: sourceAddress});
    }
    if (this[_previous$1] != null) {
      return this[_previous$1].socketStartConnect(host, port, {sourceAddress: sourceAddress});
    }
    return super.socketStartConnect(host, port, {sourceAddress: sourceAddress});
  }
};
(io._IOOverridesScope.new = function(createDirectory, getCurrentDirectory, setCurrentDirectory, getSystemTempDirectory, createFile, stat, statSync, fseIdentical, fseIdenticalSync, fseGetType, fseGetTypeSync, fsWatch, fsWatchIsSupported, createLink, socketConnect, socketStartConnect) {
  this[_previous$1] = io.IOOverrides.current;
  this[_createDirectory] = createDirectory;
  this[_getCurrentDirectory] = getCurrentDirectory;
  this[_setCurrentDirectory] = setCurrentDirectory;
  this[_getSystemTempDirectory] = getSystemTempDirectory;
  this[_createFile] = createFile;
  this[_stat] = stat;
  this[_statSync] = statSync;
  this[_fseIdentical] = fseIdentical;
  this[_fseIdenticalSync] = fseIdenticalSync;
  this[_fseGetType] = fseGetType;
  this[_fseGetTypeSync] = fseGetTypeSync;
  this[_fsWatch] = fsWatch;
  this[_fsWatchIsSupported] = fsWatchIsSupported;
  this[_createLink] = createLink;
  this[_socketConnect] = socketConnect;
  this[_socketStartConnect] = socketStartConnect;
}).prototype = io._IOOverridesScope.prototype;
dart.addTypeTests(io._IOOverridesScope);
dart.setLibraryUri(io._IOOverridesScope, "dart:io");
dart.setFieldSignature(io._IOOverridesScope, () => ({
  __proto__: dart.getFields(io._IOOverridesScope.__proto__),
  [_previous$1]: dart.finalFieldType(io.IOOverrides),
  [_createDirectory]: dart.fieldType(StringToDirectory()),
  [_getCurrentDirectory]: dart.fieldType(VoidToDirectory()),
  [_setCurrentDirectory]: dart.fieldType(StringTovoid()),
  [_getSystemTempDirectory]: dart.fieldType(VoidToDirectory()),
  [_createFile]: dart.fieldType(StringToFile()),
  [_stat]: dart.fieldType(StringToFutureOfFileStat()),
  [_statSync]: dart.fieldType(StringToFileStat()),
  [_fseIdentical]: dart.fieldType(StringAndStringToFutureOfbool()),
  [_fseIdenticalSync]: dart.fieldType(StringAndStringTobool()),
  [_fseGetType]: dart.fieldType(StringAndboolToFutureOfFileSystemEntityType()),
  [_fseGetTypeSync]: dart.fieldType(StringAndboolToFileSystemEntityType()),
  [_fsWatch]: dart.fieldType(StringAndintAndboolToStreamOfFileSystemEvent()),
  [_fsWatchIsSupported]: dart.fieldType(VoidTobool()),
  [_createLink]: dart.fieldType(StringToLink()),
  [_socketConnect]: dart.fieldType(dynamicAndint__ToFutureOfSocket()),
  [_socketStartConnect]: dart.fieldType(dynamicAndint__ToFutureOfConnectionTaskOfSocket())
}));
io.Platform = class Platform extends core.Object {
  static get numberOfProcessors() {
    return io.Platform._numberOfProcessors;
  }
  static get pathSeparator() {
    return io.Platform._pathSeparator;
  }
  static get localeName() {
    return io._Platform.localeName();
  }
  static get operatingSystem() {
    return io.Platform._operatingSystem;
  }
  static get operatingSystemVersion() {
    return io.Platform._operatingSystemVersion;
  }
  static get localHostname() {
    return io.Platform._localHostname;
  }
  static get environment() {
    return io._Platform.environment;
  }
  static get executable() {
    return io._Platform.executable;
  }
  static get resolvedExecutable() {
    return io._Platform.resolvedExecutable;
  }
  static get script() {
    return io._Platform.script;
  }
  static get executableArguments() {
    return io._Platform.executableArguments;
  }
  static get packageRoot() {
    return null;
  }
  static get packageConfig() {
    return io._Platform.packageConfig;
  }
  static get version() {
    return io.Platform._version;
  }
};
(io.Platform.new = function() {
}).prototype = io.Platform.prototype;
dart.addTypeTests(io.Platform);
dart.setLibraryUri(io.Platform, "dart:io");
dart.defineLazy(io.Platform, {
  /*io.Platform._numberOfProcessors*/get _numberOfProcessors() {
    return io._Platform.numberOfProcessors;
  },
  /*io.Platform._pathSeparator*/get _pathSeparator() {
    return io._Platform.pathSeparator;
  },
  /*io.Platform._operatingSystem*/get _operatingSystem() {
    return io._Platform.operatingSystem;
  },
  /*io.Platform._operatingSystemVersion*/get _operatingSystemVersion() {
    return io._Platform.operatingSystemVersion;
  },
  /*io.Platform._localHostname*/get _localHostname() {
    return io._Platform.localHostname;
  },
  /*io.Platform._version*/get _version() {
    return io._Platform.version;
  },
  /*io.Platform.isLinux*/get isLinux() {
    return io.Platform._operatingSystem === "linux";
  },
  /*io.Platform.isMacOS*/get isMacOS() {
    return io.Platform._operatingSystem === "macos";
  },
  /*io.Platform.isWindows*/get isWindows() {
    return io.Platform._operatingSystem === "windows";
  },
  /*io.Platform.isAndroid*/get isAndroid() {
    return io.Platform._operatingSystem === "android";
  },
  /*io.Platform.isIOS*/get isIOS() {
    return io.Platform._operatingSystem === "ios";
  },
  /*io.Platform.isFuchsia*/get isFuchsia() {
    return io.Platform._operatingSystem === "fuchsia";
  }
});
io._Platform = class _Platform extends core.Object {
  static _numberOfProcessors() {
    dart.throw(new core.UnsupportedError.new("Platform._numberOfProcessors"));
  }
  static _pathSeparator() {
    dart.throw(new core.UnsupportedError.new("Platform._pathSeparator"));
  }
  static _operatingSystem() {
    dart.throw(new core.UnsupportedError.new("Platform._operatingSystem"));
  }
  static _operatingSystemVersion() {
    dart.throw(new core.UnsupportedError.new("Platform._operatingSystemVersion"));
  }
  static _localHostname() {
    dart.throw(new core.UnsupportedError.new("Platform._localHostname"));
  }
  static _executable() {
    dart.throw(new core.UnsupportedError.new("Platform._executable"));
  }
  static _resolvedExecutable() {
    dart.throw(new core.UnsupportedError.new("Platform._resolvedExecutable"));
  }
  static _environment() {
    dart.throw(new core.UnsupportedError.new("Platform._environment"));
  }
  static _executableArguments() {
    dart.throw(new core.UnsupportedError.new("Platform._executableArguments"));
  }
  static _packageRoot() {
    dart.throw(new core.UnsupportedError.new("Platform._packageRoot"));
  }
  static _packageConfig() {
    dart.throw(new core.UnsupportedError.new("Platform._packageConfig"));
  }
  static _version() {
    dart.throw(new core.UnsupportedError.new("Platform._version"));
  }
  static _localeName() {
    dart.throw(new core.UnsupportedError.new("Platform._localeName"));
  }
  static _script() {
    dart.throw(new core.UnsupportedError.new("Platform._script"));
  }
  static localeName() {
    let result = io._Platform._localeClosure == null ? io._Platform._localeName() : io._Platform._localeClosure();
    if (io.OSError.is(result)) {
      dart.throw(result);
    }
    return result;
  }
  static get numberOfProcessors() {
    return io._Platform._numberOfProcessors();
  }
  static get pathSeparator() {
    return io._Platform._pathSeparator();
  }
  static get operatingSystem() {
    return io._Platform._operatingSystem();
  }
  static get script() {
    return io._Platform._script();
  }
  static get operatingSystemVersion() {
    if (io._Platform._cachedOSVersion == null) {
      let result = io._Platform._operatingSystemVersion();
      if (io.OSError.is(result)) {
        dart.throw(result);
      }
      io._Platform._cachedOSVersion = core.String._check(result);
    }
    return io._Platform._cachedOSVersion;
  }
  static get localHostname() {
    let result = io._Platform._localHostname();
    if (io.OSError.is(result)) {
      dart.throw(result);
    }
    return core.String._check(result);
  }
  static get executableArguments() {
    return io._Platform._executableArguments();
  }
  static get environment() {
    if (io._Platform._environmentCache == null) {
      let env = io._Platform._environment();
      if (!io.OSError.is(env)) {
        let isWindows = io._Platform.operatingSystem === "windows";
        let result = isWindows ? new (_CaseInsensitiveStringMapOfString()).new() : new (IdentityMapOfString$String()).new();
        for (let str of core.Iterable._check(env)) {
          if (str == null) {
            continue;
          }
          let equalsIndex = dart.dsend(str, 'indexOf', ["="]);
          if (dart.dtest(dart.dsend(equalsIndex, '>', [0]))) {
            result[$_set](core.String._check(dart.dsend(str, 'substring', [0, equalsIndex])), core.String._check(dart.dsend(str, 'substring', [dart.dsend(equalsIndex, '+', [1])])));
          }
        }
        io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String()).new(result);
      } else {
        io._Platform._environmentCache = env;
      }
    }
    if (io.OSError.is(io._Platform._environmentCache)) {
      dart.throw(io._Platform._environmentCache);
    } else {
      return MapOfString$String()._check(io._Platform._environmentCache);
    }
  }
  static get version() {
    return io._Platform._version();
  }
};
(io._Platform.new = function() {
}).prototype = io._Platform.prototype;
dart.addTypeTests(io._Platform);
dart.setLibraryUri(io._Platform, "dart:io");
dart.defineLazy(io._Platform, {
  /*io._Platform.executable*/get executable() {
    return core.String._check(io._Platform._executable());
  },
  set executable(_) {},
  /*io._Platform.resolvedExecutable*/get resolvedExecutable() {
    return core.String._check(io._Platform._resolvedExecutable());
  },
  set resolvedExecutable(_) {},
  /*io._Platform.packageRoot*/get packageRoot() {
    return null;
  },
  set packageRoot(_) {},
  /*io._Platform.packageConfig*/get packageConfig() {
    return io._Platform._packageConfig();
  },
  set packageConfig(_) {},
  /*io._Platform._localeClosure*/get _localeClosure() {
    return null;
  },
  set _localeClosure(_) {},
  /*io._Platform._environmentCache*/get _environmentCache() {
    return null;
  },
  set _environmentCache(_) {},
  /*io._Platform._cachedOSVersion*/get _cachedOSVersion() {
    return null;
  },
  set _cachedOSVersion(_) {}
});
const _map$1 = dart.privateName(io, "_map");
const _is__CaseInsensitiveStringMap_default = Symbol('_is__CaseInsensitiveStringMap_default');
io._CaseInsensitiveStringMap$ = dart.generic(V => {
  let IdentityMapOfString$V = () => (IdentityMapOfString$V = dart.constFn(_js_helper.IdentityMap$(core.String, V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.fnType(V, [])))();
  let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
  let StringAndVToV = () => (StringAndVToV = dart.constFn(dart.fnType(V, [core.String, V])))();
  let VToV = () => (VToV = dart.constFn(dart.fnType(V, [V])))();
  class _CaseInsensitiveStringMap extends collection.MapBase$(core.String, V) {
    containsKey(key) {
      return typeof key == 'string' && dart.test(this[_map$1][$containsKey](key[$toUpperCase]()));
    }
    containsValue(value) {
      return this[_map$1][$containsValue](value);
    }
    _get(key) {
      return typeof key == 'string' ? this[_map$1][$_get](key[$toUpperCase]()) : null;
    }
    _set(key, value) {
      core.String._check(key);
      V._check(value);
      this[_map$1][$_set](key[$toUpperCase](), value);
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      core.String._check(key);
      VoidToV()._check(ifAbsent);
      return this[_map$1][$putIfAbsent](key[$toUpperCase](), ifAbsent);
    }
    addAll(other) {
      MapOfString$V()._check(other);
      other[$forEach](dart.fn((key, value) => this._set(key[$toUpperCase](), value), StringAndVToV()));
    }
    remove(key) {
      return typeof key == 'string' ? this[_map$1][$remove](key[$toUpperCase]()) : null;
    }
    clear() {
      this[_map$1][$clear]();
    }
    forEach(f) {
      this[_map$1][$forEach](f);
    }
    get keys() {
      return this[_map$1][$keys];
    }
    get values() {
      return this[_map$1][$values];
    }
    get length() {
      return this[_map$1][$length];
    }
    get isEmpty() {
      return this[_map$1][$isEmpty];
    }
    get isNotEmpty() {
      return this[_map$1][$isNotEmpty];
    }
    get entries() {
      return this[_map$1][$entries];
    }
    map(K2, V2, transform) {
      return core.Map$(K2, V2)._check(this[_map$1][$map](K2, V2, transform));
    }
    update(key, update, opts) {
      core.String._check(key);
      VToV()._check(update);
      let ifAbsent = opts && 'ifAbsent' in opts ? opts.ifAbsent : null;
      VoidToV()._check(ifAbsent);
      return this[_map$1][$update](key[$toUpperCase](), update, {ifAbsent: ifAbsent});
    }
    updateAll(update) {
      StringAndVToV()._check(update);
      this[_map$1][$updateAll](update);
    }
    removeWhere(test) {
      this[_map$1][$removeWhere](test);
    }
    toString() {
      return dart.toString(this[_map$1]);
    }
  }
  (_CaseInsensitiveStringMap.new = function() {
    this[_map$1] = new (IdentityMapOfString$V()).new();
  }).prototype = _CaseInsensitiveStringMap.prototype;
  dart.addTypeTests(_CaseInsensitiveStringMap);
  _CaseInsensitiveStringMap.prototype[_is__CaseInsensitiveStringMap_default] = true;
  dart.setMethodSignature(_CaseInsensitiveStringMap, () => ({
    __proto__: dart.getMethods(_CaseInsensitiveStringMap.__proto__),
    containsKey: dart.fnType(core.bool, [core.Object]),
    [$containsKey]: dart.fnType(core.bool, [core.Object]),
    containsValue: dart.fnType(core.bool, [core.Object]),
    [$containsValue]: dart.fnType(core.bool, [core.Object]),
    _get: dart.fnType(V, [core.Object]),
    [$_get]: dart.fnType(V, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
    putIfAbsent: dart.fnType(V, [core.Object, core.Object]),
    [$putIfAbsent]: dart.fnType(V, [core.Object, core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(V, [core.Object]),
    [$remove]: dart.fnType(V, [core.Object]),
    clear: dart.fnType(dart.void, []),
    [$clear]: dart.fnType(dart.void, []),
    forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, V])]),
    [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, V])]),
    map: dart.gFnType((K2, V2) => [core.Map$(K2, V2), [dart.fnType(core.MapEntry$(K2, V2), [core.String, V])]]),
    [$map]: dart.gFnType((K2, V2) => [core.Map$(K2, V2), [dart.fnType(core.MapEntry$(K2, V2), [core.String, V])]]),
    update: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    [$update]: dart.fnType(V, [core.Object, core.Object], {ifAbsent: core.Object}),
    updateAll: dart.fnType(dart.void, [core.Object]),
    [$updateAll]: dart.fnType(dart.void, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [core.String, V])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [core.String, V])]),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, [])
  }));
  dart.setGetterSignature(_CaseInsensitiveStringMap, () => ({
    __proto__: dart.getGetters(_CaseInsensitiveStringMap.__proto__),
    keys: core.Iterable$(core.String),
    [$keys]: core.Iterable$(core.String),
    values: core.Iterable$(V),
    [$values]: core.Iterable$(V),
    length: core.int,
    [$length]: core.int,
    isEmpty: core.bool,
    [$isEmpty]: core.bool,
    isNotEmpty: core.bool,
    [$isNotEmpty]: core.bool,
    entries: core.Iterable$(core.MapEntry$(core.String, V)),
    [$entries]: core.Iterable$(core.MapEntry$(core.String, V))
  }));
  dart.setLibraryUri(_CaseInsensitiveStringMap, "dart:io");
  dart.setFieldSignature(_CaseInsensitiveStringMap, () => ({
    __proto__: dart.getFields(_CaseInsensitiveStringMap.__proto__),
    [_map$1]: dart.finalFieldType(MapOfString$V())
  }));
  dart.defineExtensionMethods(_CaseInsensitiveStringMap, [
    'containsKey',
    'containsValue',
    '_get',
    '_set',
    'putIfAbsent',
    'addAll',
    'remove',
    'clear',
    'forEach',
    'map',
    'update',
    'updateAll',
    'removeWhere',
    'toString'
  ]);
  dart.defineExtensionAccessors(_CaseInsensitiveStringMap, [
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty',
    'entries'
  ]);
  return _CaseInsensitiveStringMap;
});
io._CaseInsensitiveStringMap = io._CaseInsensitiveStringMap$();
dart.addTypeTests(io._CaseInsensitiveStringMap, _is__CaseInsensitiveStringMap_default);
io._ProcessUtils = class _ProcessUtils extends core.Object {
  static _exit(status) {
    dart.throw(new core.UnsupportedError.new("ProcessUtils._exit"));
  }
  static _setExitCode(status) {
    dart.throw(new core.UnsupportedError.new("ProcessUtils._setExitCode"));
  }
  static _getExitCode() {
    dart.throw(new core.UnsupportedError.new("ProcessUtils._getExitCode"));
  }
  static _sleep(millis) {
    dart.throw(new core.UnsupportedError.new("ProcessUtils._sleep"));
  }
  static _pid(process) {
    dart.throw(new core.UnsupportedError.new("ProcessUtils._pid"));
  }
  static _watchSignal(signal) {
    dart.throw(new core.UnsupportedError.new("ProcessUtils._watchSignal"));
  }
};
(io._ProcessUtils.new = function() {
}).prototype = io._ProcessUtils.prototype;
dart.addTypeTests(io._ProcessUtils);
dart.setLibraryUri(io._ProcessUtils, "dart:io");
io.exit = function(code) {
  core.ArgumentError.checkNotNull(code, "code");
  if (!dart.test(io._EmbedderConfig._mayExit)) {
    dart.throw(new core.UnsupportedError.new("This embedder disallows calling dart:io's exit()"));
  }
  io._ProcessUtils._exit(code);
};
dart.copyProperties(io, {
  get exitCode() {
    return io._ProcessUtils._getExitCode();
  },
  set exitCode(code) {
    core.ArgumentError.checkNotNull(code, "code");
    io._ProcessUtils._setExitCode(code);
  }
});
io.sleep = function(duration) {
  let milliseconds = duration.inMilliseconds;
  if (dart.notNull(milliseconds) < 0) {
    dart.throw(new core.ArgumentError.new("sleep: duration cannot be negative"));
  }
  if (!dart.test(io._EmbedderConfig._maySleep)) {
    dart.throw(new core.UnsupportedError.new("This embedder disallows calling dart:io's sleep()"));
  }
  io._ProcessUtils._sleep(milliseconds);
};
dart.copyProperties(io, {
  get pid() {
    return io._ProcessUtils._pid(null);
  }
});
io.ProcessInfo = class ProcessInfo extends core.Object {
  static get currentRss() {
    dart.throw(new core.UnsupportedError.new("ProcessInfo.currentRss"));
  }
  static get maxRss() {
    dart.throw(new core.UnsupportedError.new("ProcessInfo.maxRss"));
  }
};
(io.ProcessInfo.new = function() {
}).prototype = io.ProcessInfo.prototype;
dart.addTypeTests(io.ProcessInfo);
dart.setLibraryUri(io.ProcessInfo, "dart:io");
let const$70;
let const$71;
io.ProcessStartMode = class ProcessStartMode extends core.Object {
  static get values() {
    return const$70 || (const$70 = dart.constList([io.ProcessStartMode.normal, io.ProcessStartMode.inheritStdio, io.ProcessStartMode.detached, io.ProcessStartMode.detachedWithStdio], io.ProcessStartMode));
  }
  toString() {
    return (const$71 || (const$71 = dart.constList(["normal", "inheritStdio", "detached", "detachedWithStdio"], core.String)))[$_get](this[_mode]);
  }
};
(io.ProcessStartMode._internal = function(mode) {
  this[_mode] = mode;
}).prototype = io.ProcessStartMode.prototype;
dart.addTypeTests(io.ProcessStartMode);
dart.setLibraryUri(io.ProcessStartMode, "dart:io");
dart.setFieldSignature(io.ProcessStartMode, () => ({
  __proto__: dart.getFields(io.ProcessStartMode.__proto__),
  [_mode]: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io.ProcessStartMode, ['toString']);
dart.defineLazy(io.ProcessStartMode, {
  /*io.ProcessStartMode.normal*/get normal() {
    return dart.const(new io.ProcessStartMode._internal(0));
  },
  /*io.ProcessStartMode.NORMAL*/get NORMAL() {
    return io.ProcessStartMode.normal;
  },
  /*io.ProcessStartMode.inheritStdio*/get inheritStdio() {
    return dart.const(new io.ProcessStartMode._internal(1));
  },
  /*io.ProcessStartMode.INHERIT_STDIO*/get INHERIT_STDIO() {
    return io.ProcessStartMode.inheritStdio;
  },
  /*io.ProcessStartMode.detached*/get detached() {
    return dart.const(new io.ProcessStartMode._internal(2));
  },
  /*io.ProcessStartMode.DETACHED*/get DETACHED() {
    return io.ProcessStartMode.detached;
  },
  /*io.ProcessStartMode.detachedWithStdio*/get detachedWithStdio() {
    return dart.const(new io.ProcessStartMode._internal(3));
  },
  /*io.ProcessStartMode.DETACHED_WITH_STDIO*/get DETACHED_WITH_STDIO() {
    return io.ProcessStartMode.detachedWithStdio;
  }
});
io.Process = class Process extends core.Object {
  static start(executable, arguments$0, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let mode = opts && 'mode' in opts ? opts.mode : io.ProcessStartMode.normal;
    dart.throw(new core.UnsupportedError.new("Process.start"));
  }
  static run(executable, arguments$0, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.systemEncoding;
    let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.systemEncoding;
    dart.throw(new core.UnsupportedError.new("Process.run"));
  }
  static runSync(executable, arguments$0, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.systemEncoding;
    let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.systemEncoding;
    dart.throw(new core.UnsupportedError.new("Process.runSync"));
  }
  static killPid(pid, signal) {
    if (signal === void 0) signal = io.ProcessSignal.sigterm;
    dart.throw(new core.UnsupportedError.new("Process.killPid"));
  }
};
(io.Process.new = function() {
}).prototype = io.Process.prototype;
dart.addTypeTests(io.Process);
dart.setLibraryUri(io.Process, "dart:io");
io.ProcessResult = class ProcessResult extends core.Object {
  get exitCode() {
    return this[exitCode$];
  }
  set exitCode(value) {
    super.exitCode = value;
  }
  get stdout() {
    return this[stdout$];
  }
  set stdout(value) {
    super.stdout = value;
  }
  get stderr() {
    return this[stderr$];
  }
  set stderr(value) {
    super.stderr = value;
  }
  get pid() {
    return this[pid$];
  }
  set pid(value) {
    super.pid = value;
  }
};
(io.ProcessResult.new = function(pid, exitCode, stdout, stderr) {
  this[pid$] = pid;
  this[exitCode$] = exitCode;
  this[stdout$] = stdout;
  this[stderr$] = stderr;
}).prototype = io.ProcessResult.prototype;
dart.addTypeTests(io.ProcessResult);
const exitCode$ = Symbol("ProcessResult.exitCode");
const stdout$ = Symbol("ProcessResult.stdout");
const stderr$ = Symbol("ProcessResult.stderr");
const pid$ = Symbol("ProcessResult.pid");
dart.setLibraryUri(io.ProcessResult, "dart:io");
dart.setFieldSignature(io.ProcessResult, () => ({
  __proto__: dart.getFields(io.ProcessResult.__proto__),
  exitCode: dart.finalFieldType(core.int),
  stdout: dart.finalFieldType(dart.dynamic),
  stderr: dart.finalFieldType(dart.dynamic),
  pid: dart.finalFieldType(core.int)
}));
const _signalNumber = dart.privateName(io, "_signalNumber");
const _name$3 = dart.privateName(io, "_name");
io.ProcessSignal = class ProcessSignal extends core.Object {
  toString() {
    return this[_name$3];
  }
  watch() {
    return io._ProcessUtils._watchSignal(this);
  }
};
(io.ProcessSignal.__ = function(signalNumber, name) {
  this[_signalNumber] = signalNumber;
  this[_name$3] = name;
}).prototype = io.ProcessSignal.prototype;
dart.addTypeTests(io.ProcessSignal);
dart.setMethodSignature(io.ProcessSignal, () => ({
  __proto__: dart.getMethods(io.ProcessSignal.__proto__),
  watch: dart.fnType(async.Stream$(io.ProcessSignal), [])
}));
dart.setLibraryUri(io.ProcessSignal, "dart:io");
dart.setFieldSignature(io.ProcessSignal, () => ({
  __proto__: dart.getFields(io.ProcessSignal.__proto__),
  [_signalNumber]: dart.finalFieldType(core.int),
  [_name$3]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(io.ProcessSignal, ['toString']);
dart.defineLazy(io.ProcessSignal, {
  /*io.ProcessSignal.sighup*/get sighup() {
    return dart.const(new io.ProcessSignal.__(1, "SIGHUP"));
  },
  /*io.ProcessSignal.sigint*/get sigint() {
    return dart.const(new io.ProcessSignal.__(2, "SIGINT"));
  },
  /*io.ProcessSignal.sigquit*/get sigquit() {
    return dart.const(new io.ProcessSignal.__(3, "SIGQUIT"));
  },
  /*io.ProcessSignal.sigill*/get sigill() {
    return dart.const(new io.ProcessSignal.__(4, "SIGILL"));
  },
  /*io.ProcessSignal.sigtrap*/get sigtrap() {
    return dart.const(new io.ProcessSignal.__(5, "SIGTRAP"));
  },
  /*io.ProcessSignal.sigabrt*/get sigabrt() {
    return dart.const(new io.ProcessSignal.__(6, "SIGABRT"));
  },
  /*io.ProcessSignal.sigbus*/get sigbus() {
    return dart.const(new io.ProcessSignal.__(7, "SIGBUS"));
  },
  /*io.ProcessSignal.sigfpe*/get sigfpe() {
    return dart.const(new io.ProcessSignal.__(8, "SIGFPE"));
  },
  /*io.ProcessSignal.sigkill*/get sigkill() {
    return dart.const(new io.ProcessSignal.__(9, "SIGKILL"));
  },
  /*io.ProcessSignal.sigusr1*/get sigusr1() {
    return dart.const(new io.ProcessSignal.__(10, "SIGUSR1"));
  },
  /*io.ProcessSignal.sigsegv*/get sigsegv() {
    return dart.const(new io.ProcessSignal.__(11, "SIGSEGV"));
  },
  /*io.ProcessSignal.sigusr2*/get sigusr2() {
    return dart.const(new io.ProcessSignal.__(12, "SIGUSR2"));
  },
  /*io.ProcessSignal.sigpipe*/get sigpipe() {
    return dart.const(new io.ProcessSignal.__(13, "SIGPIPE"));
  },
  /*io.ProcessSignal.sigalrm*/get sigalrm() {
    return dart.const(new io.ProcessSignal.__(14, "SIGALRM"));
  },
  /*io.ProcessSignal.sigterm*/get sigterm() {
    return dart.const(new io.ProcessSignal.__(15, "SIGTERM"));
  },
  /*io.ProcessSignal.sigchld*/get sigchld() {
    return dart.const(new io.ProcessSignal.__(17, "SIGCHLD"));
  },
  /*io.ProcessSignal.sigcont*/get sigcont() {
    return dart.const(new io.ProcessSignal.__(18, "SIGCONT"));
  },
  /*io.ProcessSignal.sigstop*/get sigstop() {
    return dart.const(new io.ProcessSignal.__(19, "SIGSTOP"));
  },
  /*io.ProcessSignal.sigtstp*/get sigtstp() {
    return dart.const(new io.ProcessSignal.__(20, "SIGTSTP"));
  },
  /*io.ProcessSignal.sigttin*/get sigttin() {
    return dart.const(new io.ProcessSignal.__(21, "SIGTTIN"));
  },
  /*io.ProcessSignal.sigttou*/get sigttou() {
    return dart.const(new io.ProcessSignal.__(22, "SIGTTOU"));
  },
  /*io.ProcessSignal.sigurg*/get sigurg() {
    return dart.const(new io.ProcessSignal.__(23, "SIGURG"));
  },
  /*io.ProcessSignal.sigxcpu*/get sigxcpu() {
    return dart.const(new io.ProcessSignal.__(24, "SIGXCPU"));
  },
  /*io.ProcessSignal.sigxfsz*/get sigxfsz() {
    return dart.const(new io.ProcessSignal.__(25, "SIGXFSZ"));
  },
  /*io.ProcessSignal.sigvtalrm*/get sigvtalrm() {
    return dart.const(new io.ProcessSignal.__(26, "SIGVTALRM"));
  },
  /*io.ProcessSignal.sigprof*/get sigprof() {
    return dart.const(new io.ProcessSignal.__(27, "SIGPROF"));
  },
  /*io.ProcessSignal.sigwinch*/get sigwinch() {
    return dart.const(new io.ProcessSignal.__(28, "SIGWINCH"));
  },
  /*io.ProcessSignal.sigpoll*/get sigpoll() {
    return dart.const(new io.ProcessSignal.__(29, "SIGPOLL"));
  },
  /*io.ProcessSignal.sigsys*/get sigsys() {
    return dart.const(new io.ProcessSignal.__(31, "SIGSYS"));
  },
  /*io.ProcessSignal.SIGHUP*/get SIGHUP() {
    return io.ProcessSignal.sighup;
  },
  /*io.ProcessSignal.SIGINT*/get SIGINT() {
    return io.ProcessSignal.sigint;
  },
  /*io.ProcessSignal.SIGQUIT*/get SIGQUIT() {
    return io.ProcessSignal.sigquit;
  },
  /*io.ProcessSignal.SIGILL*/get SIGILL() {
    return io.ProcessSignal.sigill;
  },
  /*io.ProcessSignal.SIGTRAP*/get SIGTRAP() {
    return io.ProcessSignal.sigtrap;
  },
  /*io.ProcessSignal.SIGABRT*/get SIGABRT() {
    return io.ProcessSignal.sigabrt;
  },
  /*io.ProcessSignal.SIGBUS*/get SIGBUS() {
    return io.ProcessSignal.sigbus;
  },
  /*io.ProcessSignal.SIGFPE*/get SIGFPE() {
    return io.ProcessSignal.sigfpe;
  },
  /*io.ProcessSignal.SIGKILL*/get SIGKILL() {
    return io.ProcessSignal.sigkill;
  },
  /*io.ProcessSignal.SIGUSR1*/get SIGUSR1() {
    return io.ProcessSignal.sigusr1;
  },
  /*io.ProcessSignal.SIGSEGV*/get SIGSEGV() {
    return io.ProcessSignal.sigsegv;
  },
  /*io.ProcessSignal.SIGUSR2*/get SIGUSR2() {
    return io.ProcessSignal.sigusr2;
  },
  /*io.ProcessSignal.SIGPIPE*/get SIGPIPE() {
    return io.ProcessSignal.sigpipe;
  },
  /*io.ProcessSignal.SIGALRM*/get SIGALRM() {
    return io.ProcessSignal.sigalrm;
  },
  /*io.ProcessSignal.SIGTERM*/get SIGTERM() {
    return io.ProcessSignal.sigterm;
  },
  /*io.ProcessSignal.SIGCHLD*/get SIGCHLD() {
    return io.ProcessSignal.sigchld;
  },
  /*io.ProcessSignal.SIGCONT*/get SIGCONT() {
    return io.ProcessSignal.sigcont;
  },
  /*io.ProcessSignal.SIGSTOP*/get SIGSTOP() {
    return io.ProcessSignal.sigstop;
  },
  /*io.ProcessSignal.SIGTSTP*/get SIGTSTP() {
    return io.ProcessSignal.sigtstp;
  },
  /*io.ProcessSignal.SIGTTIN*/get SIGTTIN() {
    return io.ProcessSignal.sigttin;
  },
  /*io.ProcessSignal.SIGTTOU*/get SIGTTOU() {
    return io.ProcessSignal.sigttou;
  },
  /*io.ProcessSignal.SIGURG*/get SIGURG() {
    return io.ProcessSignal.sigurg;
  },
  /*io.ProcessSignal.SIGXCPU*/get SIGXCPU() {
    return io.ProcessSignal.sigxcpu;
  },
  /*io.ProcessSignal.SIGXFSZ*/get SIGXFSZ() {
    return io.ProcessSignal.sigxfsz;
  },
  /*io.ProcessSignal.SIGVTALRM*/get SIGVTALRM() {
    return io.ProcessSignal.sigvtalrm;
  },
  /*io.ProcessSignal.SIGPROF*/get SIGPROF() {
    return io.ProcessSignal.sigprof;
  },
  /*io.ProcessSignal.SIGWINCH*/get SIGWINCH() {
    return io.ProcessSignal.sigwinch;
  },
  /*io.ProcessSignal.SIGPOLL*/get SIGPOLL() {
    return io.ProcessSignal.sigpoll;
  },
  /*io.ProcessSignal.SIGSYS*/get SIGSYS() {
    return io.ProcessSignal.sigsys;
  }
});
io.SignalException = class SignalException extends core.Object {
  get message() {
    return this[message$9];
  }
  set message(value) {
    super.message = value;
  }
  get osError() {
    return this[osError$0];
  }
  set osError(value) {
    super.osError = value;
  }
  toString() {
    let msg = "";
    if (this.osError != null) {
      msg = ", osError: " + dart.str(this.osError);
    }
    return "SignalException: " + dart.str(this.message) + msg;
  }
};
(io.SignalException.new = function(message, osError) {
  if (osError === void 0) osError = null;
  this[message$9] = message;
  this[osError$0] = osError;
}).prototype = io.SignalException.prototype;
dart.addTypeTests(io.SignalException);
const message$9 = Symbol("SignalException.message");
const osError$0 = Symbol("SignalException.osError");
io.SignalException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(io.SignalException, "dart:io");
dart.setFieldSignature(io.SignalException, () => ({
  __proto__: dart.getFields(io.SignalException.__proto__),
  message: dart.finalFieldType(core.String),
  osError: dart.finalFieldType(dart.dynamic)
}));
dart.defineExtensionMethods(io.SignalException, ['toString']);
io.ProcessException = class ProcessException extends core.Object {
  get executable() {
    return this[executable$];
  }
  set executable(value) {
    super.executable = value;
  }
  get arguments() {
    return this[arguments$];
  }
  set arguments(value) {
    super.arguments = value;
  }
  get message() {
    return this[message$10];
  }
  set message(value) {
    super.message = value;
  }
  get errorCode() {
    return this[errorCode$1];
  }
  set errorCode(value) {
    super.errorCode = value;
  }
  toString() {
    let msg = this.message == null ? "OS error code: " + dart.str(this.errorCode) : this.message;
    let args = this.arguments[$join](" ");
    return "ProcessException: " + dart.str(msg) + "\n  Command: " + dart.str(this.executable) + " " + dart.str(args);
  }
};
(io.ProcessException.new = function(executable, arguments$0, message, errorCode) {
  if (message === void 0) message = "";
  if (errorCode === void 0) errorCode = 0;
  this[executable$] = executable;
  this[arguments$] = arguments$0;
  this[message$10] = message;
  this[errorCode$1] = errorCode;
}).prototype = io.ProcessException.prototype;
dart.addTypeTests(io.ProcessException);
const executable$ = Symbol("ProcessException.executable");
const arguments$ = Symbol("ProcessException.arguments");
const message$10 = Symbol("ProcessException.message");
const errorCode$1 = Symbol("ProcessException.errorCode");
io.ProcessException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(io.ProcessException, "dart:io");
dart.setFieldSignature(io.ProcessException, () => ({
  __proto__: dart.getFields(io.ProcessException.__proto__),
  executable: dart.finalFieldType(core.String),
  arguments: dart.finalFieldType(ListOfString()),
  message: dart.finalFieldType(core.String),
  errorCode: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io.ProcessException, ['toString']);
const _socket = dart.privateName(io, "_socket");
const _owner = dart.privateName(io, "_owner");
const _onCancel$ = dart.privateName(io, "_onCancel");
const _detachRaw = dart.privateName(io, "_detachRaw");
io.SecureSocket = class SecureSocket extends core.Object {
  static connect(host, port, opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    return FutureOfSecureSocket()._check(io.RawSecureSocket.connect(host, port, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols, timeout: timeout}).then(io.SecureSocket, dart.fn(rawSocket => io.SecureSocket.__(rawSocket), RawSecureSocketToSecureSocket())));
  }
  static startConnect(host, port, opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    return FutureOfConnectionTaskOfSecureSocket()._check(io.RawSecureSocket.startConnect(host, port, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}).then(ConnectionTaskOfSecureSocket(), dart.fn(rawState => {
      let socket = FutureOfSecureSocket()._check(rawState.socket.then(io.SecureSocket, dart.fn(rawSocket => io.SecureSocket.__(rawSocket), RawSecureSocketToSecureSocket())));
      return new (ConnectionTaskOfSecureSocket()).__({socket: socket, onCancel: rawState[_onCancel$]});
    }, ConnectionTaskOfRawSecureSocketToConnectionTaskOfSecureSocket())));
  }
  static secure(socket, opts) {
    let host = opts && 'host' in opts ? opts.host : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    return FutureOfSecureSocket()._check(FutureOfRawSecureSocket()._check(async.Future.as(dart.dsend(socket, _detachRaw, [])).then(io.RawSecureSocket, dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket.as(dart.dindex(detachedRaw, 0)), {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket()))).then(io.SecureSocket, dart.fn(raw => io.SecureSocket.__(raw), RawSecureSocketToSecureSocket())));
  }
  static secureServer(socket, context, opts) {
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    return FutureOfSecureSocket()._check(FutureOfRawSecureSocket()._check(async.Future.as(dart.dsend(socket, _detachRaw, [])).then(io.RawSecureSocket, dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket.as(dart.dindex(detachedRaw, 0)), context, {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket()))).then(io.SecureSocket, dart.fn(raw => io.SecureSocket.__(raw), RawSecureSocketToSecureSocket())));
  }
};
(io.SecureSocket[dart.mixinNew] = function() {
}).prototype = io.SecureSocket.prototype;
dart.addTypeTests(io.SecureSocket);
io.SecureSocket[dart.implements] = () => [io.Socket];
dart.setLibraryUri(io.SecureSocket, "dart:io");
io.SecureServerSocket = class SecureServerSocket extends async.Stream$(io.SecureSocket) {
  static bind(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return FutureOfSecureServerSocket()._check(io.RawSecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols, shared: shared}).then(io.SecureServerSocket, dart.fn(serverSocket => new io.SecureServerSocket.__(serverSocket), RawSecureServerSocketToSecureServerSocket())));
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_socket].map(io.SecureSocket, dart.fn(rawSocket => io.SecureSocket.__(rawSocket), RawSecureSocketToSecureSocket())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get port() {
    return this[_socket].port;
  }
  get address() {
    return this[_socket].address;
  }
  close() {
    return FutureOfSecureServerSocket()._check(this[_socket].close().then(io.SecureServerSocket, dart.fn(_ => this, RawSecureServerSocketToSecureServerSocket())));
  }
  set [_owner](owner) {
    this[_socket][_owner] = owner;
  }
};
(io.SecureServerSocket.__ = function(socket) {
  this[_socket] = socket;
  io.SecureServerSocket.__proto__.new.call(this);
}).prototype = io.SecureServerSocket.prototype;
dart.addTypeTests(io.SecureServerSocket);
dart.setMethodSignature(io.SecureServerSocket, () => ({
  __proto__: dart.getMethods(io.SecureServerSocket.__proto__),
  listen: dart.fnType(async.StreamSubscription$(io.SecureSocket), [dart.fnType(dart.void, [io.SecureSocket])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  close: dart.fnType(async.Future$(io.SecureServerSocket), [])
}));
dart.setGetterSignature(io.SecureServerSocket, () => ({
  __proto__: dart.getGetters(io.SecureServerSocket.__proto__),
  port: core.int,
  address: io.InternetAddress
}));
dart.setSetterSignature(io.SecureServerSocket, () => ({
  __proto__: dart.getSetters(io.SecureServerSocket.__proto__),
  [_owner]: dart.dynamic
}));
dart.setLibraryUri(io.SecureServerSocket, "dart:io");
dart.setFieldSignature(io.SecureServerSocket, () => ({
  __proto__: dart.getFields(io.SecureServerSocket.__proto__),
  [_socket]: dart.finalFieldType(io.RawSecureServerSocket)
}));
const _context = dart.privateName(io, "_context");
const _subscription$ = dart.privateName(io, "_subscription");
const _onSubscriptionStateChange = dart.privateName(io, "_onSubscriptionStateChange");
const _onPauseStateChange = dart.privateName(io, "_onPauseStateChange");
const _onData$0 = dart.privateName(io, "_onData");
io.RawSecureSocket = class RawSecureSocket extends core.Object {
  static connect(host, port, opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    io._RawSecureSocket._verifyFields(host, port, false, false, false, onBadCertificate);
    return FutureOfRawSecureSocket()._check(io.RawSocket.connect(host, port, {timeout: timeout}).then(io.RawSecureSocket, dart.fn(socket => io.RawSecureSocket.secure(socket, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}), RawSocketToFutureOfRawSecureSocket())));
  }
  static startConnect(host, port, opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    return FutureOfConnectionTaskOfRawSecureSocket()._check(io.RawSocket.startConnect(host, port).then(ConnectionTaskOfRawSecureSocket(), dart.fn(rawState => {
      let socket = FutureOfRawSecureSocket()._check(rawState.socket.then(io.RawSecureSocket, dart.fn(rawSocket => io.RawSecureSocket.secure(rawSocket, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}), RawSocketToFutureOfRawSecureSocket())));
      return new (ConnectionTaskOfRawSecureSocket()).__({socket: socket, onCancel: rawState[_onCancel$]});
    }, ConnectionTaskOfRawSocketToConnectionTaskOfRawSecureSocket())));
  }
  static secure(socket, opts) {
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let host = opts && 'host' in opts ? opts.host : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    socket.readEventsEnabled = false;
    socket.writeEventsEnabled = false;
    return io._RawSecureSocket.connect(host != null ? host : socket.address.host, socket.port, {is_server: false, socket: socket, subscription: subscription, context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols});
  }
  static secureServer(socket, context, opts) {
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    socket.readEventsEnabled = false;
    socket.writeEventsEnabled = false;
    return io._RawSecureSocket.connect(socket.address, socket.remotePort, {context: context, is_server: true, socket: socket, subscription: subscription, bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols});
  }
};
(io.RawSecureSocket.new = function() {
}).prototype = io.RawSecureSocket.prototype;
dart.addTypeTests(io.RawSecureSocket);
io.RawSecureSocket[dart.implements] = () => [io.RawSocket];
dart.setLibraryUri(io.RawSecureSocket, "dart:io");
io.RawSecureServerSocket = class RawSecureServerSocket extends async.Stream$(io.RawSecureSocket) {
  get requestClientCertificate() {
    return this[requestClientCertificate$];
  }
  set requestClientCertificate(value) {
    super.requestClientCertificate = value;
  }
  get requireClientCertificate() {
    return this[requireClientCertificate$];
  }
  set requireClientCertificate(value) {
    super.requireClientCertificate = value;
  }
  get supportedProtocols() {
    return this[supportedProtocols$];
  }
  set supportedProtocols(value) {
    super.supportedProtocols = value;
  }
  static bind(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return FutureOfRawSecureServerSocket()._check(io.RawServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io.RawSecureServerSocket, dart.fn(serverSocket => new io.RawSecureServerSocket.__(serverSocket, context, requestClientCertificate, requireClientCertificate, supportedProtocols), RawServerSocketToRawSecureServerSocket())));
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_controller$].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get port() {
    return this[_socket].port;
  }
  get address() {
    return this[_socket].address;
  }
  close() {
    this[_closed] = true;
    return FutureOfRawSecureServerSocket()._check(this[_socket].close().then(io.RawSecureServerSocket, dart.fn(_ => this, RawServerSocketToRawSecureServerSocket())));
  }
  [_onData$0](connection) {
    let remotePort = null;
    try {
      remotePort = connection.remotePort;
    } catch (e$) {
      let e = dart.getThrown(e$);
      return;
    }
    FutureOfNull()._check(io._RawSecureSocket.connect(connection.address, core.int._check(remotePort), {context: this[_context], is_server: true, socket: connection, requestClientCertificate: this.requestClientCertificate, requireClientCertificate: this.requireClientCertificate, supportedProtocols: this.supportedProtocols}).then(core.Null, dart.fn(secureConnection => {
      if (dart.test(this[_closed])) {
        secureConnection.close();
      } else {
        this[_controller$].add(secureConnection);
      }
    }, RawSecureSocketToNull()))).catchError(dart.fn((e, s) => {
      if (!dart.test(this[_closed])) {
        this[_controller$].addError(e, core.StackTrace._check(s));
      }
    }, dynamicAnddynamicToNull()));
  }
  [_onPauseStateChange]() {
    if (dart.test(this[_controller$].isPaused)) {
      this[_subscription$].pause();
    } else {
      this[_subscription$].resume();
    }
  }
  [_onSubscriptionStateChange]() {
    if (dart.test(this[_controller$].hasListener)) {
      this[_subscription$] = this[_socket].listen(dart.bind(this, _onData$0), {onError: dart.bind(this[_controller$], 'addError'), onDone: dart.bind(this[_controller$], 'close')});
    } else {
      this.close();
    }
  }
  set [_owner](owner) {
    dart.dput(this[_socket], _owner, owner);
  }
};
(io.RawSecureServerSocket.__ = function(socket, context, requestClientCertificate, requireClientCertificate, supportedProtocols) {
  this[_controller$] = null;
  this[_subscription$] = null;
  this[_closed] = false;
  this[_socket] = socket;
  this[_context] = context;
  this[requestClientCertificate$] = requestClientCertificate;
  this[requireClientCertificate$] = requireClientCertificate;
  this[supportedProtocols$] = supportedProtocols;
  io.RawSecureServerSocket.__proto__.new.call(this);
  this[_controller$] = StreamControllerOfRawSecureSocket().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
}).prototype = io.RawSecureServerSocket.prototype;
dart.addTypeTests(io.RawSecureServerSocket);
const requestClientCertificate$ = Symbol("RawSecureServerSocket.requestClientCertificate");
const requireClientCertificate$ = Symbol("RawSecureServerSocket.requireClientCertificate");
const supportedProtocols$ = Symbol("RawSecureServerSocket.supportedProtocols");
dart.setMethodSignature(io.RawSecureServerSocket, () => ({
  __proto__: dart.getMethods(io.RawSecureServerSocket.__proto__),
  listen: dart.fnType(async.StreamSubscription$(io.RawSecureSocket), [dart.fnType(dart.void, [io.RawSecureSocket])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  close: dart.fnType(async.Future$(io.RawSecureServerSocket), []),
  [_onData$0]: dart.fnType(dart.void, [io.RawSocket]),
  [_onPauseStateChange]: dart.fnType(dart.void, []),
  [_onSubscriptionStateChange]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(io.RawSecureServerSocket, () => ({
  __proto__: dart.getGetters(io.RawSecureServerSocket.__proto__),
  port: core.int,
  address: io.InternetAddress
}));
dart.setSetterSignature(io.RawSecureServerSocket, () => ({
  __proto__: dart.getSetters(io.RawSecureServerSocket.__proto__),
  [_owner]: dart.dynamic
}));
dart.setLibraryUri(io.RawSecureServerSocket, "dart:io");
dart.setFieldSignature(io.RawSecureServerSocket, () => ({
  __proto__: dart.getFields(io.RawSecureServerSocket.__proto__),
  [_socket]: dart.finalFieldType(io.RawServerSocket),
  [_controller$]: dart.fieldType(StreamControllerOfRawSecureSocket()),
  [_subscription$]: dart.fieldType(StreamSubscriptionOfRawSocket()),
  [_context]: dart.finalFieldType(io.SecurityContext),
  requestClientCertificate: dart.finalFieldType(core.bool),
  requireClientCertificate: dart.finalFieldType(core.bool),
  supportedProtocols: dart.finalFieldType(ListOfString()),
  [_closed]: dart.fieldType(core.bool)
}));
io.X509Certificate = class X509Certificate extends core.Object {};
(io.X509Certificate[dart.mixinNew] = function() {
}).prototype = io.X509Certificate.prototype;
dart.addTypeTests(io.X509Certificate);
dart.setLibraryUri(io.X509Certificate, "dart:io");
io._FilterStatus = class _FilterStatus extends core.Object {};
(io._FilterStatus.new = function() {
  this.progress = false;
  this.readEmpty = true;
  this.writeEmpty = true;
  this.readPlaintextNoLongerEmpty = false;
  this.writePlaintextNoLongerFull = false;
  this.readEncryptedNoLongerFull = false;
  this.writeEncryptedNoLongerEmpty = false;
}).prototype = io._FilterStatus.prototype;
dart.addTypeTests(io._FilterStatus);
dart.setLibraryUri(io._FilterStatus, "dart:io");
dart.setFieldSignature(io._FilterStatus, () => ({
  __proto__: dart.getFields(io._FilterStatus.__proto__),
  progress: dart.fieldType(core.bool),
  readEmpty: dart.fieldType(core.bool),
  writeEmpty: dart.fieldType(core.bool),
  readPlaintextNoLongerEmpty: dart.fieldType(core.bool),
  writePlaintextNoLongerFull: dart.fieldType(core.bool),
  readEncryptedNoLongerFull: dart.fieldType(core.bool),
  writeEncryptedNoLongerEmpty: dart.fieldType(core.bool)
}));
const _socketSubscription = dart.privateName(io, "_socketSubscription");
const _bufferedData = dart.privateName(io, "_bufferedData");
const _handshakeComplete = dart.privateName(io, "_handshakeComplete");
const _stream$ = dart.privateName(io, "_stream");
const _bufferedDataIndex = dart.privateName(io, "_bufferedDataIndex");
const _status = dart.privateName(io, "_status");
const _writeEventsEnabled = dart.privateName(io, "_writeEventsEnabled");
const _readEventsEnabled = dart.privateName(io, "_readEventsEnabled");
const _pauseCount = dart.privateName(io, "_pauseCount");
const _pendingReadEvent = dart.privateName(io, "_pendingReadEvent");
const _socketClosedRead = dart.privateName(io, "_socketClosedRead");
const _socketClosedWrite = dart.privateName(io, "_socketClosedWrite");
const _closedRead = dart.privateName(io, "_closedRead");
const _closedWrite = dart.privateName(io, "_closedWrite");
const _filterStatus = dart.privateName(io, "_filterStatus");
const _connectPending = dart.privateName(io, "_connectPending");
const _filterPending = dart.privateName(io, "_filterPending");
const _filterActive = dart.privateName(io, "_filterActive");
const _secureFilter = dart.privateName(io, "_secureFilter");
const _selectedProtocol = dart.privateName(io, "_selectedProtocol");
const _secureHandshakeCompleteHandler = dart.privateName(io, "_secureHandshakeCompleteHandler");
const _onBadCertificateWrapper = dart.privateName(io, "_onBadCertificateWrapper");
const _eventDispatcher = dart.privateName(io, "_eventDispatcher");
const _reportError = dart.privateName(io, "_reportError");
const _doneHandler = dart.privateName(io, "_doneHandler");
const _secureHandshake = dart.privateName(io, "_secureHandshake");
const _sendWriteEvent = dart.privateName(io, "_sendWriteEvent");
const _completeCloseCompleter = dart.privateName(io, "_completeCloseCompleter");
const _close$ = dart.privateName(io, "_close");
const _scheduleReadEvent = dart.privateName(io, "_scheduleReadEvent");
const _scheduleFilter = dart.privateName(io, "_scheduleFilter");
const _readHandler = dart.privateName(io, "_readHandler");
const _writeHandler = dart.privateName(io, "_writeHandler");
const _closeHandler = dart.privateName(io, "_closeHandler");
const _readSocket = dart.privateName(io, "_readSocket");
const _writeSocket = dart.privateName(io, "_writeSocket");
const _tryFilter = dart.privateName(io, "_tryFilter");
const _pushAllFilterStages = dart.privateName(io, "_pushAllFilterStages");
const _readSocketOrBufferedData = dart.privateName(io, "_readSocketOrBufferedData");
const _sendReadEvent = dart.privateName(io, "_sendReadEvent");
const _value$2 = dart.privateName(io, "_value");
let const$72;
io.RawSocketEvent = class RawSocketEvent extends core.Object {
  toString() {
    return (const$72 || (const$72 = dart.constList(["RawSocketEvent.read", "RawSocketEvent.write", "RawSocketEvent.readClosed", "RawSocketEvent.closed"], core.String)))[$_get](this[_value$2]);
  }
};
(io.RawSocketEvent.__ = function(value) {
  this[_value$2] = value;
}).prototype = io.RawSocketEvent.prototype;
dart.addTypeTests(io.RawSocketEvent);
dart.setLibraryUri(io.RawSocketEvent, "dart:io");
dart.setFieldSignature(io.RawSocketEvent, () => ({
  __proto__: dart.getFields(io.RawSocketEvent.__proto__),
  [_value$2]: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io.RawSocketEvent, ['toString']);
dart.defineLazy(io.RawSocketEvent, {
  /*io.RawSocketEvent.read*/get read() {
    return dart.const(new io.RawSocketEvent.__(0));
  },
  /*io.RawSocketEvent.write*/get write() {
    return dart.const(new io.RawSocketEvent.__(1));
  },
  /*io.RawSocketEvent.readClosed*/get readClosed() {
    return dart.const(new io.RawSocketEvent.__(2));
  },
  /*io.RawSocketEvent.closed*/get closed() {
    return dart.const(new io.RawSocketEvent.__(3));
  },
  /*io.RawSocketEvent.READ*/get READ() {
    return io.RawSocketEvent.read;
  },
  /*io.RawSocketEvent.WRITE*/get WRITE() {
    return io.RawSocketEvent.write;
  },
  /*io.RawSocketEvent.READ_CLOSED*/get READ_CLOSED() {
    return io.RawSocketEvent.readClosed;
  },
  /*io.RawSocketEvent.CLOSED*/get CLOSED() {
    return io.RawSocketEvent.closed;
  }
});
io._RawSecureSocket = class _RawSecureSocket extends async.Stream$(io.RawSocketEvent) {
  static _isBufferEncrypted(identifier) {
    return dart.notNull(identifier) >= 2;
  }
  static connect(host, requestedPort, opts) {
    let is_server = opts && 'is_server' in opts ? opts.is_server : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let socket = opts && 'socket' in opts ? opts.socket : null;
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    io._RawSecureSocket._verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate);
    if (io.InternetAddress.is(host)) host = dart.dload(host, 'host');
    let address = socket.address;
    if (host != null) {
      address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
    }
    return new io._RawSecureSocket.new(address, requestedPort, is_server, context, socket, subscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    this[_sendWriteEvent]();
    return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  static _verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate) {
    if (!(typeof host == 'string') && !io.InternetAddress.is(host)) {
      dart.throw(new core.ArgumentError.new("host is not a String or an InternetAddress"));
    }
    core.ArgumentError.checkNotNull(requestedPort, "requestedPort");
    if (dart.notNull(requestedPort) < 0 || dart.notNull(requestedPort) > 65535) {
      dart.throw(new core.ArgumentError.new("requestedPort is not in the range 0..65535"));
    }
    core.ArgumentError.checkNotNull(requestClientCertificate, "requestClientCertificate");
    core.ArgumentError.checkNotNull(requireClientCertificate, "requireClientCertificate");
  }
  get port() {
    return this[_socket].port;
  }
  get remoteAddress() {
    return this[_socket].remoteAddress;
  }
  get remotePort() {
    return this[_socket].remotePort;
  }
  set [_owner](owner) {
    dart.dput(this[_socket], _owner, owner);
  }
  available() {
    return this[_status] !== 202 ? 0 : this[_secureFilter].buffers[$_get](0).length;
  }
  close() {
    this.shutdown(io.SocketDirection.both);
    return this[_closeCompleter].future;
  }
  [_completeCloseCompleter](dummy) {
    if (dummy === void 0) dummy = null;
    if (!dart.test(this[_closeCompleter].isCompleted)) this[_closeCompleter].complete(this);
  }
  [_close$]() {
    this[_closedWrite] = true;
    this[_closedRead] = true;
    if (this[_socket] != null) {
      this[_socket].close().then(dart.void, dart.bind(this, _completeCloseCompleter));
    } else {
      this[_completeCloseCompleter]();
    }
    this[_socketClosedWrite] = true;
    this[_socketClosedRead] = true;
    if (!dart.test(this[_filterActive]) && this[_secureFilter] != null) {
      this[_secureFilter].destroy();
      this[_secureFilter] = null;
    }
    if (this[_socketSubscription] != null) {
      this[_socketSubscription].cancel();
    }
    this[_controller$].close();
    this[_status] = 203;
  }
  shutdown(direction) {
    if (dart.equals(direction, io.SocketDirection.send) || dart.equals(direction, io.SocketDirection.both)) {
      this[_closedWrite] = true;
      if (dart.test(this[_filterStatus].writeEmpty)) {
        this[_socket].shutdown(io.SocketDirection.send);
        this[_socketClosedWrite] = true;
        if (dart.test(this[_closedRead])) {
          this[_close$]();
        }
      }
    }
    if (dart.equals(direction, io.SocketDirection.receive) || dart.equals(direction, io.SocketDirection.both)) {
      this[_closedRead] = true;
      this[_socketClosedRead] = true;
      this[_socket].shutdown(io.SocketDirection.receive);
      if (dart.test(this[_socketClosedWrite])) {
        this[_close$]();
      }
    }
  }
  get writeEventsEnabled() {
    return this[_writeEventsEnabled];
  }
  set writeEventsEnabled(value) {
    this[_writeEventsEnabled] = value;
    if (dart.test(value)) {
      async.Timer.run(dart.fn(() => this[_sendWriteEvent](), VoidTodynamic()));
    }
  }
  get readEventsEnabled() {
    return this[_readEventsEnabled];
  }
  set readEventsEnabled(value) {
    this[_readEventsEnabled] = value;
    this[_scheduleReadEvent]();
  }
  read(length) {
    if (length === void 0) length = null;
    if (length != null && (!core.int.is(length) || dart.notNull(length) < 0)) {
      dart.throw(new core.ArgumentError.new("Invalid length parameter in SecureSocket.read (length: " + dart.str(length) + ")"));
    }
    if (dart.test(this[_closedRead])) {
      dart.throw(new io.SocketException.new("Reading from a closed socket"));
    }
    if (this[_status] !== 202) {
      return null;
    }
    let result = this[_secureFilter].buffers[$_get](0).read(length);
    this[_scheduleFilter]();
    return result;
  }
  write(data, offset, bytes) {
    if (offset === void 0) offset = null;
    if (bytes === void 0) bytes = null;
    if (bytes != null && (!core.int.is(bytes) || dart.notNull(bytes) < 0)) {
      dart.throw(new core.ArgumentError.new("Invalid bytes parameter in SecureSocket.read (bytes: " + dart.str(bytes) + ")"));
    }
    if (offset != null && (!core.int.is(offset) || dart.notNull(offset) < 0)) {
      dart.throw(new core.ArgumentError.new("Invalid offset parameter in SecureSocket.read (offset: " + dart.str(offset) + ")"));
    }
    if (dart.test(this[_closedWrite])) {
      this[_controller$].addError(new io.SocketException.new("Writing to a closed socket"));
      return 0;
    }
    if (this[_status] !== 202) return 0;
    let t = offset;
    t == null ? offset = 0 : t;
    let t$ = bytes;
    t$ == null ? bytes = dart.notNull(data[$length]) - dart.notNull(offset) : t$;
    let written = this[_secureFilter].buffers[$_get](1).write(data, offset, bytes);
    if (dart.notNull(written) > 0) {
      this[_filterStatus].writeEmpty = false;
    }
    this[_scheduleFilter]();
    return written;
  }
  get peerCertificate() {
    return this[_secureFilter].peerCertificate;
  }
  get selectedProtocol() {
    return this[_selectedProtocol];
  }
  [_onBadCertificateWrapper](certificate) {
    if (this.onBadCertificate == null) return false;
    let result = dart.dcall(this.onBadCertificate, [certificate]);
    if (typeof result == 'boolean') return result;
    dart.throw(new io.HandshakeException.new("onBadCertificate callback returned non-boolean " + dart.str(result)));
  }
  setOption(option, enabled) {
    if (this[_socket] == null) return false;
    return this[_socket].setOption(option, enabled);
  }
  getRawOption(option) {
    let t = this[_socket];
    return t == null ? null : t.getRawOption(option);
  }
  setRawOption(option) {
    let t = this[_socket];
    t == null ? null : t.setRawOption(option);
  }
  [_eventDispatcher](event) {
    try {
      if (dart.equals(event, io.RawSocketEvent.read)) {
        this[_readHandler]();
      } else if (dart.equals(event, io.RawSocketEvent.write)) {
        this[_writeHandler]();
      } else if (dart.equals(event, io.RawSocketEvent.readClosed)) {
        this[_closeHandler]();
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stackTrace = dart.stackTrace(e$);
      this[_reportError](e, stackTrace);
    }
  }
  [_readHandler]() {
    this[_readSocket]();
    this[_scheduleFilter]();
  }
  [_writeHandler]() {
    this[_writeSocket]();
    this[_scheduleFilter]();
  }
  [_doneHandler]() {
    if (dart.test(this[_filterStatus].readEmpty)) {
      this[_close$]();
    }
  }
  [_reportError](e, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    if (this[_status] === 203) {
      return;
    } else if (dart.test(this[_connectPending])) {
      this[_handshakeComplete].completeError(e, stackTrace);
    } else {
      this[_controller$].addError(e, stackTrace);
    }
    this[_close$]();
  }
  [_closeHandler]() {
    if (this[_status] === 202) {
      if (dart.test(this[_closedRead])) return;
      this[_socketClosedRead] = true;
      if (dart.test(this[_filterStatus].readEmpty)) {
        this[_closedRead] = true;
        this[_controller$].add(io.RawSocketEvent.readClosed);
        if (dart.test(this[_socketClosedWrite])) {
          this[_close$]();
        }
      } else {
        this[_scheduleFilter]();
      }
    } else if (this[_status] === 201) {
      this[_socketClosedRead] = true;
      if (dart.test(this[_filterStatus].readEmpty)) {
        this[_reportError](new io.HandshakeException.new("Connection terminated during handshake"), null);
      } else {
        this[_secureHandshake]();
      }
    }
  }
  [_secureHandshake]() {
    try {
      this[_secureFilter].handshake();
      this[_filterStatus].writeEmpty = false;
      this[_readSocket]();
      this[_writeSocket]();
      this[_scheduleFilter]();
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stackTrace = dart.stackTrace(e$);
      this[_reportError](e, stackTrace);
    }
  }
  renegotiate(opts) {
    let useSessionCache = opts && 'useSessionCache' in opts ? opts.useSessionCache : true;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    if (this[_status] !== 202) {
      dart.throw(new io.HandshakeException.new("Called renegotiate on a non-connected socket"));
    }
    this[_secureFilter].renegotiate(useSessionCache, requestClientCertificate, requireClientCertificate);
    this[_status] = 201;
    this[_filterStatus].writeEmpty = false;
    this[_scheduleFilter]();
  }
  [_secureHandshakeCompleteHandler]() {
    this[_status] = 202;
    if (dart.test(this[_connectPending])) {
      this[_connectPending] = false;
      try {
        this[_selectedProtocol] = this[_secureFilter].selectedProtocol();
        async.Timer.run(dart.fn(() => this[_handshakeComplete].complete(this), VoidTovoid()));
      } catch (e) {
        let error = dart.getThrown(e);
        let stack = dart.stackTrace(e);
        this[_handshakeComplete].completeError(error, stack);
      }
    }
  }
  [_onPauseStateChange]() {
    if (dart.test(this[_controller$].isPaused)) {
      this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
    } else {
      this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
      if (this[_pauseCount] === 0) {
        this[_scheduleReadEvent]();
        this[_sendWriteEvent]();
      }
    }
    if (!dart.test(this[_socketClosedRead]) || !dart.test(this[_socketClosedWrite])) {
      if (dart.test(this[_controller$].isPaused)) {
        this[_socketSubscription].pause();
      } else {
        this[_socketSubscription].resume();
      }
    }
  }
  [_onSubscriptionStateChange]() {
    if (dart.test(this[_controller$].hasListener)) {
    }
  }
  [_scheduleFilter]() {
    this[_filterPending] = true;
    this[_tryFilter]();
  }
  [_tryFilter]() {
    if (this[_status] === 203) {
      return;
    }
    if (dart.test(this[_filterPending]) && !dart.test(this[_filterActive])) {
      this[_filterActive] = true;
      this[_filterPending] = false;
      FutureOfNull()._check(this[_pushAllFilterStages]().then(core.Null, dart.fn(status => {
        this[_filterStatus] = status;
        this[_filterActive] = false;
        if (this[_status] === 203) {
          this[_secureFilter].destroy();
          this[_secureFilter] = null;
          return;
        }
        this[_socket].readEventsEnabled = true;
        if (dart.test(this[_filterStatus].writeEmpty) && dart.test(this[_closedWrite]) && !dart.test(this[_socketClosedWrite])) {
          this.shutdown(io.SocketDirection.send);
          if (this[_status] === 203) {
            return;
          }
        }
        if (dart.test(this[_filterStatus].readEmpty) && dart.test(this[_socketClosedRead]) && !dart.test(this[_closedRead])) {
          if (this[_status] === 201) {
            this[_secureFilter].handshake();
            if (this[_status] === 201) {
              dart.throw(new io.HandshakeException.new("Connection terminated during handshake"));
            }
          }
          this[_closeHandler]();
        }
        if (this[_status] === 203) {
          return;
        }
        if (dart.test(this[_filterStatus].progress)) {
          this[_filterPending] = true;
          if (dart.test(this[_filterStatus].writeEncryptedNoLongerEmpty)) {
            this[_writeSocket]();
          }
          if (dart.test(this[_filterStatus].writePlaintextNoLongerFull)) {
            this[_sendWriteEvent]();
          }
          if (dart.test(this[_filterStatus].readEncryptedNoLongerFull)) {
            this[_readSocket]();
          }
          if (dart.test(this[_filterStatus].readPlaintextNoLongerEmpty)) {
            this[_scheduleReadEvent]();
          }
          if (this[_status] === 201) {
            this[_secureHandshake]();
          }
        }
        this[_tryFilter]();
      }, _FilterStatusToNull()))).catchError(dart.bind(this, _reportError));
    }
  }
  [_readSocketOrBufferedData](bytes) {
    if (this[_bufferedData] != null) {
      if (dart.notNull(bytes) > dart.notNull(this[_bufferedData][$length]) - dart.notNull(this[_bufferedDataIndex])) {
        bytes = dart.notNull(this[_bufferedData][$length]) - dart.notNull(this[_bufferedDataIndex]);
      }
      let result = this[_bufferedData][$sublist](this[_bufferedDataIndex], dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes));
      this[_bufferedDataIndex] = dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes);
      if (this[_bufferedData][$length] == this[_bufferedDataIndex]) {
        this[_bufferedData] = null;
      }
      return result;
    } else if (!dart.test(this[_socketClosedRead])) {
      return this[_socket].read(bytes);
    } else {
      return null;
    }
  }
  [_readSocket]() {
    if (this[_status] === 203) return;
    let buffer = this[_secureFilter].buffers[$_get](2);
    if (dart.notNull(buffer.writeFromSource(dart.bind(this, _readSocketOrBufferedData))) > 0) {
      this[_filterStatus].readEmpty = false;
    } else {
      this[_socket].readEventsEnabled = false;
    }
  }
  [_writeSocket]() {
    if (dart.test(this[_socketClosedWrite])) return;
    let buffer = this[_secureFilter].buffers[$_get](3);
    if (dart.test(buffer.readToSocket(this[_socket]))) {
      this[_socket].writeEventsEnabled = true;
    }
  }
  [_scheduleReadEvent]() {
    if (!dart.test(this[_pendingReadEvent]) && dart.test(this[_readEventsEnabled]) && this[_pauseCount] === 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[$_get](0).isEmpty)) {
      this[_pendingReadEvent] = true;
      async.Timer.run(dart.bind(this, _sendReadEvent));
    }
  }
  [_sendReadEvent]() {
    this[_pendingReadEvent] = false;
    if (this[_status] !== 203 && dart.test(this[_readEventsEnabled]) && this[_pauseCount] === 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[$_get](0).isEmpty)) {
      this[_controller$].add(io.RawSocketEvent.read);
      this[_scheduleReadEvent]();
    }
  }
  [_sendWriteEvent]() {
    if (!dart.test(this[_closedWrite]) && dart.test(this[_writeEventsEnabled]) && this[_pauseCount] === 0 && this[_secureFilter] != null && dart.notNull(this[_secureFilter].buffers[$_get](1).free) > 0) {
      this[_writeEventsEnabled] = false;
      this[_controller$].add(io.RawSocketEvent.write);
    }
  }
  [_pushAllFilterStages]() {
    let wasInHandshake = this[_status] !== 202;
    let args = core.List.new(2 + 4 * 2);
    args[$_set](0, this[_secureFilter][_pointer]());
    args[$_set](1, wasInHandshake);
    let bufs = this[_secureFilter].buffers;
    for (let i = 0; i < 4; ++i) {
      args[$_set](2 * i + 2, bufs[$_get](i).start);
      args[$_set](2 * i + 3, bufs[$_get](i).end);
    }
    return FutureOf_FilterStatus()._check(io._IOService._dispatch(io._IOService.sslProcessFilter, args).then(io._FilterStatus, dart.fn(response => {
      if (dart.equals(dart.dload(response, 'length'), 2)) {
        if (wasInHandshake) {
          this[_reportError](new io.HandshakeException.new(dart.str(dart.dindex(response, 1)) + " error " + dart.str(dart.dindex(response, 0))), null);
        } else {
          this[_reportError](new io.TlsException.new(dart.str(dart.dindex(response, 1)) + " error " + dart.str(dart.dindex(response, 0))), null);
        }
      }
      function start(index) {
        return core.int._check(dart.dindex(response, 2 * dart.notNull(index)));
      }
      dart.fn(start, intToint());
      function end(index) {
        return core.int._check(dart.dindex(response, 2 * dart.notNull(index) + 1));
      }
      dart.fn(end, intToint());
      let status = new io._FilterStatus.new();
      status.writeEmpty = dart.test(bufs[$_get](1).isEmpty) && start(3) == end(3);
      if (wasInHandshake) status.writeEmpty = false;
      status.readEmpty = dart.test(bufs[$_get](2).isEmpty) && start(0) == end(0);
      let buffer = bufs[$_get](1);
      let new_start = start(1);
      if (new_start != buffer.start) {
        status.progress = true;
        if (buffer.free === 0) {
          status.writePlaintextNoLongerFull = true;
        }
        buffer.start = new_start;
      }
      buffer = bufs[$_get](2);
      new_start = start(2);
      if (new_start != buffer.start) {
        status.progress = true;
        if (buffer.free === 0) {
          status.readEncryptedNoLongerFull = true;
        }
        buffer.start = new_start;
      }
      buffer = bufs[$_get](3);
      let new_end = end(3);
      if (new_end != buffer.end) {
        status.progress = true;
        if (buffer.length === 0) {
          status.writeEncryptedNoLongerEmpty = true;
        }
        buffer.end = new_end;
      }
      buffer = bufs[$_get](0);
      new_end = end(0);
      if (new_end != buffer.end) {
        status.progress = true;
        if (buffer.length === 0) {
          status.readPlaintextNoLongerEmpty = true;
        }
        buffer.end = new_end;
      }
      return status;
    }, dynamicTo_FilterStatus())));
  }
};
(io._RawSecureSocket.new = function(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
  this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
  this[_controller$] = null;
  this[_stream$] = null;
  this[_bufferedDataIndex] = 0;
  this[_status] = 201;
  this[_writeEventsEnabled] = true;
  this[_readEventsEnabled] = true;
  this[_pauseCount] = 0;
  this[_pendingReadEvent] = false;
  this[_socketClosedRead] = false;
  this[_socketClosedWrite] = false;
  this[_closedRead] = false;
  this[_closedWrite] = false;
  this[_closeCompleter] = CompleterOfRawSecureSocket().new();
  this[_filterStatus] = new io._FilterStatus.new();
  this[_connectPending] = true;
  this[_filterPending] = false;
  this[_filterActive] = false;
  this[_secureFilter] = io._SecureFilter.new();
  this[_selectedProtocol] = null;
  this.address = address;
  this.is_server = is_server;
  this.context = context;
  this[_socket] = socket;
  this[_socketSubscription] = socketSubscription;
  this[_bufferedData] = bufferedData;
  this.requestClientCertificate = requestClientCertificate;
  this.requireClientCertificate = requireClientCertificate;
  this.onBadCertificate = onBadCertificate;
  io._RawSecureSocket.__proto__.new.call(this);
  let t = this.context;
  t == null ? this.context = io.SecurityContext.defaultContext : t;
  this[_controller$] = StreamControllerOfRawSocketEvent().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
  this[_stream$] = this[_controller$].stream;
  this[_secureFilter].init();
  this[_secureFilter].registerHandshakeCompleteCallback(dart.bind(this, _secureHandshakeCompleteHandler));
  if (this.onBadCertificate != null) {
    this[_secureFilter].registerBadCertificateCallback(dart.bind(this, _onBadCertificateWrapper));
  }
  this[_socket].readEventsEnabled = true;
  this[_socket].writeEventsEnabled = false;
  if (this[_socketSubscription] == null) {
    this[_socketSubscription] = this[_socket].listen(dart.bind(this, _eventDispatcher), {onError: dart.bind(this, _reportError), onDone: dart.bind(this, _doneHandler)});
  } else {
    if (dart.test(this[_socketSubscription].isPaused)) {
      this[_socket].close();
      dart.throw(new core.ArgumentError.new("Subscription passed to TLS upgrade is paused"));
    }
    let s = this[_socket];
    if (dart.dtest(dart.dload(dart.dload(s, _socket), 'closedReadEventSent'))) {
      this[_eventDispatcher](io.RawSocketEvent.readClosed);
    }
    let _ = this[_socketSubscription];
    _.onData(dart.bind(this, _eventDispatcher));
    _.onError(dart.bind(this, _reportError));
    _.onDone(dart.bind(this, _doneHandler));
  }
  try {
    let encodedProtocols = io.SecurityContext._protocolsToLengthEncoding(supportedProtocols);
    this[_secureFilter].connect(this.address.host, this.context, this.is_server, dart.test(this.requestClientCertificate) || dart.test(this.requireClientCertificate), this.requireClientCertificate, encodedProtocols);
    this[_secureHandshake]();
  } catch (e$) {
    let e = dart.getThrown(e$);
    let s = dart.stackTrace(e$);
    this[_reportError](e, s);
  }
}).prototype = io._RawSecureSocket.prototype;
dart.addTypeTests(io._RawSecureSocket);
io._RawSecureSocket[dart.implements] = () => [io.RawSecureSocket];
dart.setMethodSignature(io._RawSecureSocket, () => ({
  __proto__: dart.getMethods(io._RawSecureSocket.__proto__),
  listen: dart.fnType(async.StreamSubscription$(io.RawSocketEvent), [dart.fnType(dart.void, [io.RawSocketEvent])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  available: dart.fnType(core.int, []),
  close: dart.fnType(async.Future$(io.RawSecureSocket), []),
  [_completeCloseCompleter]: dart.fnType(dart.void, [], [io.RawSocket]),
  [_close$]: dart.fnType(dart.void, []),
  shutdown: dart.fnType(dart.void, [io.SocketDirection]),
  read: dart.fnType(core.List$(core.int), [], [core.int]),
  write: dart.fnType(core.int, [core.List$(core.int)], [core.int, core.int]),
  [_onBadCertificateWrapper]: dart.fnType(core.bool, [io.X509Certificate]),
  setOption: dart.fnType(core.bool, [io.SocketOption, core.bool]),
  getRawOption: dart.fnType(typed_data.Uint8List, [io.RawSocketOption]),
  setRawOption: dart.fnType(dart.void, [io.RawSocketOption]),
  [_eventDispatcher]: dart.fnType(dart.void, [io.RawSocketEvent]),
  [_readHandler]: dart.fnType(dart.void, []),
  [_writeHandler]: dart.fnType(dart.void, []),
  [_doneHandler]: dart.fnType(dart.void, []),
  [_reportError]: dart.fnType(dart.void, [dart.dynamic], [core.StackTrace]),
  [_closeHandler]: dart.fnType(dart.void, []),
  [_secureHandshake]: dart.fnType(dart.void, []),
  renegotiate: dart.fnType(dart.void, [], {useSessionCache: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool}),
  [_secureHandshakeCompleteHandler]: dart.fnType(dart.void, []),
  [_onPauseStateChange]: dart.fnType(dart.void, []),
  [_onSubscriptionStateChange]: dart.fnType(dart.void, []),
  [_scheduleFilter]: dart.fnType(dart.void, []),
  [_tryFilter]: dart.fnType(dart.void, []),
  [_readSocketOrBufferedData]: dart.fnType(core.List$(core.int), [core.int]),
  [_readSocket]: dart.fnType(dart.void, []),
  [_writeSocket]: dart.fnType(dart.void, []),
  [_scheduleReadEvent]: dart.fnType(dart.dynamic, []),
  [_sendReadEvent]: dart.fnType(dart.dynamic, []),
  [_sendWriteEvent]: dart.fnType(dart.dynamic, []),
  [_pushAllFilterStages]: dart.fnType(async.Future$(io._FilterStatus), [])
}));
dart.setGetterSignature(io._RawSecureSocket, () => ({
  __proto__: dart.getGetters(io._RawSecureSocket.__proto__),
  port: core.int,
  remoteAddress: io.InternetAddress,
  remotePort: core.int,
  writeEventsEnabled: core.bool,
  readEventsEnabled: core.bool,
  peerCertificate: io.X509Certificate,
  selectedProtocol: core.String
}));
dart.setSetterSignature(io._RawSecureSocket, () => ({
  __proto__: dart.getSetters(io._RawSecureSocket.__proto__),
  [_owner]: dart.dynamic,
  writeEventsEnabled: core.bool,
  readEventsEnabled: core.bool
}));
dart.setLibraryUri(io._RawSecureSocket, "dart:io");
dart.setFieldSignature(io._RawSecureSocket, () => ({
  __proto__: dart.getFields(io._RawSecureSocket.__proto__),
  [_socket]: dart.fieldType(io.RawSocket),
  [_handshakeComplete]: dart.finalFieldType(CompleterOf_RawSecureSocket()),
  [_controller$]: dart.fieldType(StreamControllerOfRawSocketEvent()),
  [_stream$]: dart.fieldType(StreamOfRawSocketEvent()),
  [_socketSubscription]: dart.fieldType(StreamSubscriptionOfRawSocketEvent()),
  [_bufferedData]: dart.fieldType(ListOfint()),
  [_bufferedDataIndex]: dart.fieldType(core.int),
  address: dart.finalFieldType(io.InternetAddress),
  is_server: dart.finalFieldType(core.bool),
  context: dart.fieldType(io.SecurityContext),
  requestClientCertificate: dart.finalFieldType(core.bool),
  requireClientCertificate: dart.finalFieldType(core.bool),
  onBadCertificate: dart.finalFieldType(core.Function),
  [_status]: dart.fieldType(core.int),
  [_writeEventsEnabled]: dart.fieldType(core.bool),
  [_readEventsEnabled]: dart.fieldType(core.bool),
  [_pauseCount]: dart.fieldType(core.int),
  [_pendingReadEvent]: dart.fieldType(core.bool),
  [_socketClosedRead]: dart.fieldType(core.bool),
  [_socketClosedWrite]: dart.fieldType(core.bool),
  [_closedRead]: dart.fieldType(core.bool),
  [_closedWrite]: dart.fieldType(core.bool),
  [_closeCompleter]: dart.fieldType(CompleterOfRawSecureSocket()),
  [_filterStatus]: dart.fieldType(io._FilterStatus),
  [_connectPending]: dart.fieldType(core.bool),
  [_filterPending]: dart.fieldType(core.bool),
  [_filterActive]: dart.fieldType(core.bool),
  [_secureFilter]: dart.fieldType(io._SecureFilter),
  [_selectedProtocol]: dart.fieldType(core.String)
}));
dart.defineLazy(io._RawSecureSocket, {
  /*io._RawSecureSocket.handshakeStatus*/get handshakeStatus() {
    return 201;
  },
  /*io._RawSecureSocket.connectedStatus*/get connectedStatus() {
    return 202;
  },
  /*io._RawSecureSocket.closedStatus*/get closedStatus() {
    return 203;
  },
  /*io._RawSecureSocket.readPlaintextId*/get readPlaintextId() {
    return 0;
  },
  /*io._RawSecureSocket.writePlaintextId*/get writePlaintextId() {
    return 1;
  },
  /*io._RawSecureSocket.readEncryptedId*/get readEncryptedId() {
    return 2;
  },
  /*io._RawSecureSocket.writeEncryptedId*/get writeEncryptedId() {
    return 3;
  },
  /*io._RawSecureSocket.bufferCount*/get bufferCount() {
    return 4;
  }
});
io._ExternalBuffer = class _ExternalBuffer extends core.Object {
  advanceStart(bytes) {
    if (!(dart.notNull(this.start) > dart.notNull(this.end) || dart.notNull(this.start) + dart.notNull(bytes) <= dart.notNull(this.end))) dart.assertFailed(null, "dart:io/secure_socket.dart", 1131, 12, "start > end || start + bytes <= end");
    this.start = dart.notNull(this.start) + dart.notNull(bytes);
    if (dart.notNull(this.start) >= dart.notNull(core.num._check(this.size))) {
      this.start = dart.notNull(this.start) - dart.notNull(core.num._check(this.size));
      if (!(dart.notNull(this.start) <= dart.notNull(this.end))) dart.assertFailed(null, "dart:io/secure_socket.dart", 1135, 14, "start <= end");
      if (!(dart.notNull(this.start) < dart.notNull(core.num._check(this.size)))) dart.assertFailed(null, "dart:io/secure_socket.dart", 1136, 14, "start < size as ");
    }
  }
  advanceEnd(bytes) {
    if (!(dart.notNull(this.start) <= dart.notNull(this.end) || dart.notNull(this.start) > dart.notNull(this.end) + dart.notNull(bytes))) dart.assertFailed(null, "dart:io/secure_socket.dart", 1141, 12, "start <= end || start > end + bytes");
    this.end = dart.notNull(this.end) + dart.notNull(bytes);
    if (dart.notNull(this.end) >= dart.notNull(core.num._check(this.size))) {
      this.end = dart.notNull(this.end) - dart.notNull(core.num._check(this.size));
      if (!(dart.notNull(this.end) < dart.notNull(this.start))) dart.assertFailed(null, "dart:io/secure_socket.dart", 1145, 14, "end < start");
      if (!(dart.notNull(this.end) < dart.notNull(core.num._check(this.size)))) dart.assertFailed(null, "dart:io/secure_socket.dart", 1146, 14, "end < size as ");
    }
  }
  get isEmpty() {
    return this.end == this.start;
  }
  get length() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(dart.dsend(this.size, '+', [this.end]), '-', [this.start]) : dart.notNull(this.end) - dart.notNull(this.start));
  }
  get linearLength() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(this.size, '-', [this.start]) : dart.notNull(this.end) - dart.notNull(this.start));
  }
  get free() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.notNull(this.start) - dart.notNull(this.end) - 1 : dart.dsend(dart.dsend(dart.dsend(this.size, '+', [this.start]), '-', [this.end]), '-', [1]));
  }
  get linearFree() {
    if (dart.notNull(this.start) > dart.notNull(this.end)) return dart.notNull(this.start) - dart.notNull(this.end) - 1;
    if (this.start === 0) return core.int._check(dart.dsend(dart.dsend(this.size, '-', [this.end]), '-', [1]));
    return core.int._check(dart.dsend(this.size, '-', [this.end]));
  }
  read(bytes) {
    if (bytes == null) {
      bytes = this.length;
    } else {
      bytes = math.min(core.int, bytes, this.length);
    }
    if (bytes === 0) return null;
    let result = typed_data.Uint8List.new(bytes);
    let bytesRead = 0;
    while (bytesRead < dart.notNull(bytes)) {
      let toRead = math.min(core.int, dart.notNull(bytes) - bytesRead, this.linearLength);
      result[$setRange](bytesRead, bytesRead + toRead, this.data, this.start);
      this.advanceStart(toRead);
      bytesRead = bytesRead + toRead;
    }
    return result;
  }
  write(inputData, offset, bytes) {
    if (dart.notNull(bytes) > dart.notNull(this.free)) {
      bytes = this.free;
    }
    let written = 0;
    let toWrite = math.min(core.int, bytes, this.linearFree);
    while (toWrite > 0) {
      this.data[$setRange](this.end, dart.notNull(this.end) + toWrite, inputData, offset);
      this.advanceEnd(toWrite);
      offset = dart.notNull(offset) + toWrite;
      written = written + toWrite;
      toWrite = math.min(core.int, dart.notNull(bytes) - written, this.linearFree);
    }
    return written;
  }
  writeFromSource(getData) {
    let written = 0;
    let toWrite = this.linearFree;
    while (dart.notNull(toWrite) > 0) {
      let inputData = getData(toWrite);
      if (inputData == null || inputData[$length] === 0) break;
      let len = inputData[$length];
      this.data[$setRange](this.end, dart.notNull(this.end) + dart.notNull(len), inputData);
      this.advanceEnd(len);
      written = written + dart.notNull(len);
      toWrite = this.linearFree;
    }
    return written;
  }
  readToSocket(socket) {
    while (true) {
      let toWrite = this.linearLength;
      if (toWrite === 0) return false;
      let bytes = socket.write(this.data, this.start, toWrite);
      this.advanceStart(bytes);
      if (dart.notNull(bytes) < dart.notNull(toWrite)) {
        return true;
      }
    }
  }
};
(io._ExternalBuffer.new = function(size) {
  this.data = null;
  this.start = null;
  this.end = null;
  this.size = size;
  this.start = core.int._check(this.end = core.int._check(dart.dsend(this.size, '~/', [2])));
}).prototype = io._ExternalBuffer.prototype;
dart.addTypeTests(io._ExternalBuffer);
dart.setMethodSignature(io._ExternalBuffer, () => ({
  __proto__: dart.getMethods(io._ExternalBuffer.__proto__),
  advanceStart: dart.fnType(dart.void, [core.int]),
  advanceEnd: dart.fnType(dart.void, [core.int]),
  read: dart.fnType(core.List$(core.int), [core.int]),
  write: dart.fnType(core.int, [core.List$(core.int), core.int, core.int]),
  writeFromSource: dart.fnType(core.int, [dart.fnType(core.List$(core.int), [core.int])]),
  readToSocket: dart.fnType(core.bool, [io.RawSocket])
}));
dart.setGetterSignature(io._ExternalBuffer, () => ({
  __proto__: dart.getGetters(io._ExternalBuffer.__proto__),
  isEmpty: core.bool,
  length: core.int,
  linearLength: core.int,
  free: core.int,
  linearFree: core.int
}));
dart.setLibraryUri(io._ExternalBuffer, "dart:io");
dart.setFieldSignature(io._ExternalBuffer, () => ({
  __proto__: dart.getFields(io._ExternalBuffer.__proto__),
  data: dart.fieldType(ListOfint()),
  start: dart.fieldType(core.int),
  end: dart.fieldType(core.int),
  size: dart.finalFieldType(dart.dynamic)
}));
io._SecureFilter = class _SecureFilter extends core.Object {
  static new() {
    dart.throw(new core.UnsupportedError.new("_SecureFilter._SecureFilter"));
  }
};
(io._SecureFilter[dart.mixinNew] = function() {
}).prototype = io._SecureFilter.prototype;
dart.addTypeTests(io._SecureFilter);
dart.setLibraryUri(io._SecureFilter, "dart:io");
io.TlsException = class TlsException extends core.Object {
  get type() {
    return this[type$1];
  }
  set type(value) {
    super.type = value;
  }
  get message() {
    return this[message$11];
  }
  set message(value) {
    super.message = value;
  }
  get osError() {
    return this[osError$1];
  }
  set osError(value) {
    super.osError = value;
  }
  toString() {
    let sb = new core.StringBuffer.new();
    sb.write(this.type);
    if (this.message[$isNotEmpty]) {
      sb.write(": " + dart.str(this.message));
      if (this.osError != null) {
        sb.write(" (" + dart.str(this.osError) + ")");
      }
    } else if (this.osError != null) {
      sb.write(": " + dart.str(this.osError));
    }
    return sb.toString();
  }
};
(io.TlsException.new = function(message, osError) {
  if (message === void 0) message = "";
  if (osError === void 0) osError = null;
  io.TlsException.__.call(this, "TlsException", message, osError);
}).prototype = io.TlsException.prototype;
(io.TlsException.__ = function(type, message, osError) {
  this[type$1] = type;
  this[message$11] = message;
  this[osError$1] = osError;
}).prototype = io.TlsException.prototype;
dart.addTypeTests(io.TlsException);
const type$1 = Symbol("TlsException.type");
const message$11 = Symbol("TlsException.message");
const osError$1 = Symbol("TlsException.osError");
io.TlsException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(io.TlsException, "dart:io");
dart.setFieldSignature(io.TlsException, () => ({
  __proto__: dart.getFields(io.TlsException.__proto__),
  type: dart.finalFieldType(core.String),
  message: dart.finalFieldType(core.String),
  osError: dart.finalFieldType(io.OSError)
}));
dart.defineExtensionMethods(io.TlsException, ['toString']);
io.HandshakeException = class HandshakeException extends io.TlsException {};
(io.HandshakeException.new = function(message, osError) {
  if (message === void 0) message = "";
  if (osError === void 0) osError = null;
  io.HandshakeException.__proto__.__.call(this, "HandshakeException", message, osError);
}).prototype = io.HandshakeException.prototype;
dart.addTypeTests(io.HandshakeException);
dart.setLibraryUri(io.HandshakeException, "dart:io");
io.CertificateException = class CertificateException extends io.TlsException {};
(io.CertificateException.new = function(message, osError) {
  if (message === void 0) message = "";
  if (osError === void 0) osError = null;
  io.CertificateException.__proto__.__.call(this, "CertificateException", message, osError);
}).prototype = io.CertificateException.prototype;
dart.addTypeTests(io.CertificateException);
dart.setLibraryUri(io.CertificateException, "dart:io");
io.SecurityContext = class SecurityContext extends core.Object {
  static new(opts) {
    let withTrustedRoots = opts && 'withTrustedRoots' in opts ? opts.withTrustedRoots : false;
    dart.throw(new core.UnsupportedError.new("SecurityContext constructor"));
  }
  static get defaultContext() {
    dart.throw(new core.UnsupportedError.new("default SecurityContext getter"));
  }
  static get alpnSupported() {
    dart.throw(new core.UnsupportedError.new("SecurityContext alpnSupported getter"));
  }
  static _protocolsToLengthEncoding(protocols) {
    if (protocols == null || protocols[$length] === 0) {
      return typed_data.Uint8List.new(0);
    }
    let protocolsLength = protocols[$length];
    let expectedLength = protocolsLength;
    for (let i = 0; i < dart.notNull(protocolsLength); i++) {
      let length = protocols[$_get](i).length;
      if (length > 0 && length <= 255) {
        expectedLength = dart.notNull(expectedLength) + length;
      } else {
        dart.throw(new core.ArgumentError.new("Length of protocol must be between 1 and 255 (was: " + dart.str(length) + ")."));
      }
    }
    if (dart.notNull(expectedLength) >= 1 << 13) {
      dart.throw(new core.ArgumentError.new("The maximum message length supported is 2^13-1."));
    }
    let bytes = typed_data.Uint8List.new(expectedLength);
    let bytesOffset = 0;
    for (let i = 0; i < dart.notNull(protocolsLength); i++) {
      let proto = protocols[$_get](i);
      bytes[$_set](bytesOffset++, proto.length);
      let bits = 0;
      for (let j = 0; j < proto.length; j++) {
        let char = proto[$codeUnitAt](j);
        bits = (bits | char) >>> 0;
        bytes[$_set](bytesOffset++, char & 255);
      }
      if (bits > 127) {
        return io.SecurityContext._protocolsToLengthEncodingNonAsciiBailout(protocols);
      }
    }
    return bytes;
  }
  static _protocolsToLengthEncodingNonAsciiBailout(protocols) {
    function addProtocol(outBytes, protocol) {
      let protocolBytes = convert.utf8.encode(protocol);
      let len = protocolBytes[$length];
      if (dart.notNull(len) > 255) {
        dart.throw(new core.ArgumentError.new("Length of protocol must be between 1 and 255 (was: " + dart.str(len) + ")"));
      }
      outBytes[$add](len);
      outBytes[$addAll](protocolBytes);
    }
    dart.fn(addProtocol, ListOfintAndStringTovoid());
    let bytes = JSArrayOfint().of([]);
    for (let i = 0; i < dart.notNull(protocols[$length]); i++) {
      addProtocol(bytes, protocols[$_get](i));
    }
    if (dart.notNull(bytes[$length]) >= 1 << 13) {
      dart.throw(new core.ArgumentError.new("The maximum message length supported is 2^13-1."));
    }
    return typed_data.Uint8List.fromList(bytes);
  }
};
(io.SecurityContext[dart.mixinNew] = function() {
}).prototype = io.SecurityContext.prototype;
dart.addTypeTests(io.SecurityContext);
dart.setLibraryUri(io.SecurityContext, "dart:io");
dart.defineLazy(io, {
  /*io._nextServiceId*/get _nextServiceId() {
    return 1;
  },
  set _nextServiceId(_) {}
});
const __serviceId = dart.privateName(io, "__serviceId");
const _serviceId = dart.privateName(io, "_serviceId");
const _serviceTypePath = dart.privateName(io, "_serviceTypePath");
const _servicePath = dart.privateName(io, "_servicePath");
const _serviceTypeName = dart.privateName(io, "_serviceTypeName");
const _serviceType = dart.privateName(io, "_serviceType");
io._ServiceObject = class _ServiceObject extends core.Object {
  get [_serviceId]() {
    if (this[__serviceId] === 0) {
      let x = io._nextServiceId;
      io._nextServiceId = dart.notNull(x) + 1;
      this[__serviceId] = x;
    }
    return this[__serviceId];
  }
  get [_servicePath]() {
    return dart.str(this[_serviceTypePath]) + "/" + dart.str(this[_serviceId]);
  }
  [_serviceType](ref) {
    if (dart.test(ref)) return "@" + dart.str(this[_serviceTypeName]);
    return this[_serviceTypeName];
  }
};
(io._ServiceObject.new = function() {
  this[__serviceId] = 0;
}).prototype = io._ServiceObject.prototype;
dart.addTypeTests(io._ServiceObject);
dart.setMethodSignature(io._ServiceObject, () => ({
  __proto__: dart.getMethods(io._ServiceObject.__proto__),
  [_serviceType]: dart.fnType(core.String, [core.bool])
}));
dart.setGetterSignature(io._ServiceObject, () => ({
  __proto__: dart.getGetters(io._ServiceObject.__proto__),
  [_serviceId]: core.int,
  [_servicePath]: core.String
}));
dart.setLibraryUri(io._ServiceObject, "dart:io");
dart.setFieldSignature(io._ServiceObject, () => ({
  __proto__: dart.getFields(io._ServiceObject.__proto__),
  [__serviceId]: dart.fieldType(core.int)
}));
io.InternetAddressType = class InternetAddressType extends core.Object {
  static _from(value) {
    if (value === 0) return io.InternetAddressType.IPv4;
    if (value === 1) return io.InternetAddressType.IPv6;
    dart.throw(new core.ArgumentError.new("Invalid type: " + dart.str(value)));
  }
  get name() {
    switch (this[_value$2]) {
      case -1:
      {
        return "ANY";
      }
      case 0:
      {
        return "IPv4";
      }
      case 1:
      {
        return "IPv6";
      }
      default:
      {
        dart.throw(new core.ArgumentError.new("Invalid InternetAddress"));
      }
    }
  }
  toString() {
    return "InternetAddressType: " + dart.str(this.name);
  }
};
(io.InternetAddressType.__ = function(value) {
  this[_value$2] = value;
}).prototype = io.InternetAddressType.prototype;
dart.addTypeTests(io.InternetAddressType);
dart.setGetterSignature(io.InternetAddressType, () => ({
  __proto__: dart.getGetters(io.InternetAddressType.__proto__),
  name: core.String
}));
dart.setLibraryUri(io.InternetAddressType, "dart:io");
dart.setFieldSignature(io.InternetAddressType, () => ({
  __proto__: dart.getFields(io.InternetAddressType.__proto__),
  [_value$2]: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io.InternetAddressType, ['toString']);
dart.defineLazy(io.InternetAddressType, {
  /*io.InternetAddressType.IPv4*/get IPv4() {
    return dart.const(new io.InternetAddressType.__(0));
  },
  /*io.InternetAddressType.IPv6*/get IPv6() {
    return dart.const(new io.InternetAddressType.__(1));
  },
  /*io.InternetAddressType.any*/get any() {
    return dart.const(new io.InternetAddressType.__(-1));
  },
  /*io.InternetAddressType.IP_V4*/get IP_V4() {
    return io.InternetAddressType.IPv4;
  },
  /*io.InternetAddressType.IP_V6*/get IP_V6() {
    return io.InternetAddressType.IPv6;
  },
  /*io.InternetAddressType.ANY*/get ANY() {
    return io.InternetAddressType.any;
  }
});
io.InternetAddress = class InternetAddress extends core.Object {
  static get loopbackIPv4() {
    return io.InternetAddress.LOOPBACK_IP_V4;
  }
  static get LOOPBACK_IP_V4() {
    dart.throw(new core.UnsupportedError.new("InternetAddress.LOOPBACK_IP_V4"));
  }
  static get loopbackIPv6() {
    return io.InternetAddress.LOOPBACK_IP_V6;
  }
  static get LOOPBACK_IP_V6() {
    dart.throw(new core.UnsupportedError.new("InternetAddress.LOOPBACK_IP_V6"));
  }
  static get anyIPv4() {
    return io.InternetAddress.ANY_IP_V4;
  }
  static get ANY_IP_V4() {
    dart.throw(new core.UnsupportedError.new("InternetAddress.ANY_IP_V4"));
  }
  static get anyIPv6() {
    return io.InternetAddress.ANY_IP_V6;
  }
  static get ANY_IP_V6() {
    dart.throw(new core.UnsupportedError.new("InternetAddress.ANY_IP_V6"));
  }
  static new(address) {
    dart.throw(new core.UnsupportedError.new("InternetAddress"));
  }
  static lookup(host, opts) {
    let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.any;
    dart.throw(new core.UnsupportedError.new("InternetAddress.lookup"));
  }
  static _cloneWithNewHost(address, host) {
    dart.throw(new core.UnsupportedError.new("InternetAddress._cloneWithNewHost"));
  }
};
(io.InternetAddress[dart.mixinNew] = function() {
}).prototype = io.InternetAddress.prototype;
dart.addTypeTests(io.InternetAddress);
dart.setLibraryUri(io.InternetAddress, "dart:io");
io.NetworkInterface = class NetworkInterface extends core.Object {
  static get listSupported() {
    dart.throw(new core.UnsupportedError.new("NetworkInterface.listSupported"));
  }
  static list(opts) {
    let includeLoopback = opts && 'includeLoopback' in opts ? opts.includeLoopback : false;
    let includeLinkLocal = opts && 'includeLinkLocal' in opts ? opts.includeLinkLocal : false;
    let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.any;
    dart.throw(new core.UnsupportedError.new("NetworkInterface.list"));
  }
};
(io.NetworkInterface.new = function() {
}).prototype = io.NetworkInterface.prototype;
dart.addTypeTests(io.NetworkInterface);
dart.setLibraryUri(io.NetworkInterface, "dart:io");
io.RawServerSocket = class RawServerSocket extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    dart.throw(new core.UnsupportedError.new("RawServerSocket.bind"));
  }
};
(io.RawServerSocket.new = function() {
}).prototype = io.RawServerSocket.prototype;
io.RawServerSocket.prototype[dart.isStream] = true;
dart.addTypeTests(io.RawServerSocket);
io.RawServerSocket[dart.implements] = () => [StreamOfRawSocket()];
dart.setLibraryUri(io.RawServerSocket, "dart:io");
io.ServerSocket = class ServerSocket extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    dart.throw(new core.UnsupportedError.new("ServerSocket.bind"));
  }
};
(io.ServerSocket.new = function() {
}).prototype = io.ServerSocket.prototype;
io.ServerSocket.prototype[dart.isStream] = true;
dart.addTypeTests(io.ServerSocket);
io.ServerSocket[dart.implements] = () => [StreamOfSocket()];
dart.setLibraryUri(io.ServerSocket, "dart:io");
io.SocketDirection = class SocketDirection extends core.Object {};
(io.SocketDirection.__ = function(value) {
  this[_value$2] = value;
}).prototype = io.SocketDirection.prototype;
dart.addTypeTests(io.SocketDirection);
dart.setLibraryUri(io.SocketDirection, "dart:io");
dart.setFieldSignature(io.SocketDirection, () => ({
  __proto__: dart.getFields(io.SocketDirection.__proto__),
  [_value$2]: dart.finalFieldType(dart.dynamic)
}));
dart.defineLazy(io.SocketDirection, {
  /*io.SocketDirection.receive*/get receive() {
    return dart.const(new io.SocketDirection.__(0));
  },
  /*io.SocketDirection.send*/get send() {
    return dart.const(new io.SocketDirection.__(1));
  },
  /*io.SocketDirection.both*/get both() {
    return dart.const(new io.SocketDirection.__(2));
  },
  /*io.SocketDirection.RECEIVE*/get RECEIVE() {
    return io.SocketDirection.receive;
  },
  /*io.SocketDirection.SEND*/get SEND() {
    return io.SocketDirection.send;
  },
  /*io.SocketDirection.BOTH*/get BOTH() {
    return io.SocketDirection.both;
  }
});
io.SocketOption = class SocketOption extends core.Object {};
(io.SocketOption.__ = function(value) {
  this[_value$2] = value;
}).prototype = io.SocketOption.prototype;
dart.addTypeTests(io.SocketOption);
dart.setLibraryUri(io.SocketOption, "dart:io");
dart.setFieldSignature(io.SocketOption, () => ({
  __proto__: dart.getFields(io.SocketOption.__proto__),
  [_value$2]: dart.finalFieldType(dart.dynamic)
}));
dart.defineLazy(io.SocketOption, {
  /*io.SocketOption.tcpNoDelay*/get tcpNoDelay() {
    return dart.const(new io.SocketOption.__(0));
  },
  /*io.SocketOption.TCP_NODELAY*/get TCP_NODELAY() {
    return io.SocketOption.tcpNoDelay;
  },
  /*io.SocketOption._ipMulticastLoop*/get _ipMulticastLoop() {
    return dart.const(new io.SocketOption.__(1));
  },
  /*io.SocketOption._ipMulticastHops*/get _ipMulticastHops() {
    return dart.const(new io.SocketOption.__(2));
  },
  /*io.SocketOption._ipMulticastIf*/get _ipMulticastIf() {
    return dart.const(new io.SocketOption.__(3));
  },
  /*io.SocketOption._ipBroadcast*/get _ipBroadcast() {
    return dart.const(new io.SocketOption.__(4));
  }
});
io._RawSocketOptions = class _RawSocketOptions extends core.Object {
  toString() {
    return {
      0: "_RawSocketOptions.SOL_SOCKET",
      1: "_RawSocketOptions.IPPROTO_IP",
      2: "_RawSocketOptions.IP_MULTICAST_IF",
      3: "_RawSocketOptions.IPPROTO_IPV6",
      4: "_RawSocketOptions.IPV6_MULTICAST_IF",
      5: "_RawSocketOptions.IPPROTO_TCP",
      6: "_RawSocketOptions.IPPROTO_UDP"
    }[this.index];
  }
};
(io._RawSocketOptions.new = function(x) {
  this.index = x;
}).prototype = io._RawSocketOptions.prototype;
dart.addTypeTests(io._RawSocketOptions);
dart.setLibraryUri(io._RawSocketOptions, "dart:io");
dart.setFieldSignature(io._RawSocketOptions, () => ({
  __proto__: dart.getFields(io._RawSocketOptions.__proto__),
  index: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io._RawSocketOptions, ['toString']);
io._RawSocketOptions.SOL_SOCKET = dart.const(new io._RawSocketOptions.new(0));
io._RawSocketOptions.IPPROTO_IP = dart.const(new io._RawSocketOptions.new(1));
io._RawSocketOptions.IP_MULTICAST_IF = dart.const(new io._RawSocketOptions.new(2));
io._RawSocketOptions.IPPROTO_IPV6 = dart.const(new io._RawSocketOptions.new(3));
io._RawSocketOptions.IPV6_MULTICAST_IF = dart.const(new io._RawSocketOptions.new(4));
io._RawSocketOptions.IPPROTO_TCP = dart.const(new io._RawSocketOptions.new(5));
io._RawSocketOptions.IPPROTO_UDP = dart.const(new io._RawSocketOptions.new(6));
io._RawSocketOptions.values = dart.constList([io._RawSocketOptions.SOL_SOCKET, io._RawSocketOptions.IPPROTO_IP, io._RawSocketOptions.IP_MULTICAST_IF, io._RawSocketOptions.IPPROTO_IPV6, io._RawSocketOptions.IPV6_MULTICAST_IF, io._RawSocketOptions.IPPROTO_TCP, io._RawSocketOptions.IPPROTO_UDP], io._RawSocketOptions);
io.RawSocketOption = class RawSocketOption extends core.Object {
  static fromInt(level, option, value) {
    if (value == null) {
      value = 0;
    }
    let list = typed_data.Uint8List.new(4);
    let buffer = typed_data.ByteData.view(list[$buffer]);
    buffer[$setInt32](0, value);
    return new io.RawSocketOption.new(level, option, list);
  }
  static fromBool(level, option, value) {
    return io.RawSocketOption.fromInt(level, option, value === true ? 1 : 0);
  }
  get level() {
    return this[level$2];
  }
  set level(value) {
    super.level = value;
  }
  get option() {
    return this[option$];
  }
  set option(value) {
    super.option = value;
  }
  get value() {
    return this[value$];
  }
  set value(value) {
    super.value = value;
  }
  static get levelSocket() {
    return io.RawSocketOption._getOptionValue(io._RawSocketOptions.SOL_SOCKET.index);
  }
  static get levelIPv4() {
    return io.RawSocketOption._getOptionValue(io._RawSocketOptions.IPPROTO_IP.index);
  }
  static get IPv4MulticastInterface() {
    return io.RawSocketOption._getOptionValue(io._RawSocketOptions.IP_MULTICAST_IF.index);
  }
  static get levelIPv6() {
    return io.RawSocketOption._getOptionValue(io._RawSocketOptions.IPPROTO_IPV6.index);
  }
  static get IPv6MulticastInterface() {
    return io.RawSocketOption._getOptionValue(io._RawSocketOptions.IPV6_MULTICAST_IF.index);
  }
  static get levelTcp() {
    return io.RawSocketOption._getOptionValue(io._RawSocketOptions.IPPROTO_TCP.index);
  }
  static get levelUdp() {
    return io.RawSocketOption._getOptionValue(io._RawSocketOptions.IPPROTO_UDP.index);
  }
  static _getOptionValue(key) {
    dart.throw(new core.UnsupportedError.new("RawSocketOption._getOptionValue"));
  }
};
(io.RawSocketOption.new = function(level, option, value) {
  this[level$2] = level;
  this[option$] = option;
  this[value$] = value;
}).prototype = io.RawSocketOption.prototype;
dart.addTypeTests(io.RawSocketOption);
const level$2 = Symbol("RawSocketOption.level");
const option$ = Symbol("RawSocketOption.option");
const value$ = Symbol("RawSocketOption.value");
dart.setLibraryUri(io.RawSocketOption, "dart:io");
dart.setFieldSignature(io.RawSocketOption, () => ({
  __proto__: dart.getFields(io.RawSocketOption.__proto__),
  level: dart.finalFieldType(core.int),
  option: dart.finalFieldType(core.int),
  value: dart.finalFieldType(typed_data.Uint8List)
}));
const _is_ConnectionTask_default = Symbol('_is_ConnectionTask_default');
io.ConnectionTask$ = dart.generic(S => {
  let FutureOfS = () => (FutureOfS = dart.constFn(async.Future$(S)))();
  class ConnectionTask extends core.Object {
    get socket() {
      return this[socket$];
    }
    set socket(value) {
      super.socket = value;
    }
    cancel() {
      this[_onCancel$]();
    }
  }
  (ConnectionTask.__ = function(opts) {
    let socket = opts && 'socket' in opts ? opts.socket : null;
    let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
    if (!(socket != null)) dart.assertFailed(null, "dart:io/socket.dart", 569, 16, "socket != null");
    if (!(onCancel != null)) dart.assertFailed(null, "dart:io/socket.dart", 570, 16, "onCancel != null");
    this[socket$] = socket;
    this[_onCancel$] = onCancel;
  }).prototype = ConnectionTask.prototype;
  dart.addTypeTests(ConnectionTask);
  ConnectionTask.prototype[_is_ConnectionTask_default] = true;
  const socket$ = Symbol("ConnectionTask.socket");
  dart.setMethodSignature(ConnectionTask, () => ({
    __proto__: dart.getMethods(ConnectionTask.__proto__),
    cancel: dart.fnType(dart.void, [])
  }));
  dart.setLibraryUri(ConnectionTask, "dart:io");
  dart.setFieldSignature(ConnectionTask, () => ({
    __proto__: dart.getFields(ConnectionTask.__proto__),
    socket: dart.finalFieldType(FutureOfS()),
    [_onCancel$]: dart.finalFieldType(VoidTovoid())
  }));
  return ConnectionTask;
});
io.ConnectionTask = io.ConnectionTask$();
dart.addTypeTests(io.ConnectionTask, _is_ConnectionTask_default);
io.RawSocket = class RawSocket extends core.Object {
  get readEventsEnabled() {
    return this[readEventsEnabled];
  }
  set readEventsEnabled(value) {
    this[readEventsEnabled] = value;
  }
  get writeEventsEnabled() {
    return this[writeEventsEnabled];
  }
  set writeEventsEnabled(value) {
    this[writeEventsEnabled] = value;
  }
  static connect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    dart.throw(new core.UnsupportedError.new("RawSocket constructor"));
  }
  static startConnect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    dart.throw(new core.UnsupportedError.new("RawSocket constructor"));
  }
};
(io.RawSocket.new = function() {
  this[readEventsEnabled] = null;
  this[writeEventsEnabled] = null;
}).prototype = io.RawSocket.prototype;
io.RawSocket.prototype[dart.isStream] = true;
dart.addTypeTests(io.RawSocket);
const readEventsEnabled = Symbol("RawSocket.readEventsEnabled");
const writeEventsEnabled = Symbol("RawSocket.writeEventsEnabled");
io.RawSocket[dart.implements] = () => [StreamOfRawSocketEvent()];
dart.setLibraryUri(io.RawSocket, "dart:io");
dart.setFieldSignature(io.RawSocket, () => ({
  __proto__: dart.getFields(io.RawSocket.__proto__),
  readEventsEnabled: dart.fieldType(core.bool),
  writeEventsEnabled: dart.fieldType(core.bool)
}));
io.Socket = class Socket extends core.Object {
  static connect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io.Socket._connect(host, port, {sourceAddress: sourceAddress, timeout: timeout});
    }
    return overrides.socketConnect(host, port, {sourceAddress: sourceAddress, timeout: timeout});
  }
  static startConnect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    let overrides = io.IOOverrides.current;
    if (overrides == null) {
      return io.Socket._startConnect(host, port, {sourceAddress: sourceAddress});
    }
    return overrides.socketStartConnect(host, port, {sourceAddress: sourceAddress});
  }
  static _connect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    dart.throw(new core.UnsupportedError.new("Socket constructor"));
  }
  static _startConnect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    dart.throw(new core.UnsupportedError.new("Socket constructor"));
  }
};
(io.Socket.new = function() {
}).prototype = io.Socket.prototype;
io.Socket.prototype[dart.isStream] = true;
dart.addTypeTests(io.Socket);
io.Socket[dart.implements] = () => [StreamOfListOfint(), io.IOSink];
dart.setLibraryUri(io.Socket, "dart:io");
io.Datagram = class Datagram extends core.Object {
  get data() {
    return this[data$];
  }
  set data(value) {
    this[data$] = value;
  }
  get address() {
    return this[address$];
  }
  set address(value) {
    this[address$] = value;
  }
  get port() {
    return this[port$];
  }
  set port(value) {
    this[port$] = value;
  }
};
(io.Datagram.new = function(data, address, port) {
  this[data$] = data;
  this[address$] = address;
  this[port$] = port;
}).prototype = io.Datagram.prototype;
dart.addTypeTests(io.Datagram);
const data$ = Symbol("Datagram.data");
const address$ = Symbol("Datagram.address");
const port$ = Symbol("Datagram.port");
dart.setLibraryUri(io.Datagram, "dart:io");
dart.setFieldSignature(io.Datagram, () => ({
  __proto__: dart.getFields(io.Datagram.__proto__),
  data: dart.fieldType(ListOfint()),
  address: dart.fieldType(io.InternetAddress),
  port: dart.fieldType(core.int)
}));
io.RawDatagramSocket = class RawDatagramSocket extends async.Stream$(io.RawSocketEvent) {
  get readEventsEnabled() {
    return this[readEventsEnabled$];
  }
  set readEventsEnabled(value) {
    this[readEventsEnabled$] = value;
  }
  get writeEventsEnabled() {
    return this[writeEventsEnabled$];
  }
  set writeEventsEnabled(value) {
    this[writeEventsEnabled$] = value;
  }
  get multicastLoopback() {
    return this[multicastLoopback];
  }
  set multicastLoopback(value) {
    this[multicastLoopback] = value;
  }
  get multicastHops() {
    return this[multicastHops];
  }
  set multicastHops(value) {
    this[multicastHops] = value;
  }
  get multicastInterface() {
    return this[multicastInterface];
  }
  set multicastInterface(value) {
    this[multicastInterface] = value;
  }
  get broadcastEnabled() {
    return this[broadcastEnabled];
  }
  set broadcastEnabled(value) {
    this[broadcastEnabled] = value;
  }
  static bind(host, port, opts) {
    let reuseAddress = opts && 'reuseAddress' in opts ? opts.reuseAddress : true;
    let reusePort = opts && 'reusePort' in opts ? opts.reusePort : false;
    let ttl = opts && 'ttl' in opts ? opts.ttl : 1;
    dart.throw(new core.UnsupportedError.new("RawDatagramSocket.bind"));
  }
};
(io.RawDatagramSocket.new = function() {
  this[readEventsEnabled$] = null;
  this[writeEventsEnabled$] = null;
  this[multicastLoopback] = null;
  this[multicastHops] = null;
  this[multicastInterface] = null;
  this[broadcastEnabled] = null;
  io.RawDatagramSocket.__proto__.new.call(this);
}).prototype = io.RawDatagramSocket.prototype;
dart.addTypeTests(io.RawDatagramSocket);
const readEventsEnabled$ = Symbol("RawDatagramSocket.readEventsEnabled");
const writeEventsEnabled$ = Symbol("RawDatagramSocket.writeEventsEnabled");
const multicastLoopback = Symbol("RawDatagramSocket.multicastLoopback");
const multicastHops = Symbol("RawDatagramSocket.multicastHops");
const multicastInterface = Symbol("RawDatagramSocket.multicastInterface");
const broadcastEnabled = Symbol("RawDatagramSocket.broadcastEnabled");
dart.setLibraryUri(io.RawDatagramSocket, "dart:io");
dart.setFieldSignature(io.RawDatagramSocket, () => ({
  __proto__: dart.getFields(io.RawDatagramSocket.__proto__),
  readEventsEnabled: dart.fieldType(core.bool),
  writeEventsEnabled: dart.fieldType(core.bool),
  multicastLoopback: dart.fieldType(core.bool),
  multicastHops: dart.fieldType(core.int),
  multicastInterface: dart.fieldType(io.NetworkInterface),
  broadcastEnabled: dart.fieldType(core.bool)
}));
io.SocketException = class SocketException extends core.Object {
  get message() {
    return this[message$12];
  }
  set message(value) {
    super.message = value;
  }
  get osError() {
    return this[osError$2];
  }
  set osError(value) {
    super.osError = value;
  }
  get address() {
    return this[address$0];
  }
  set address(value) {
    super.address = value;
  }
  get port() {
    return this[port$0];
  }
  set port(value) {
    super.port = value;
  }
  toString() {
    let sb = new core.StringBuffer.new();
    sb.write("SocketException");
    if (this.message[$isNotEmpty]) {
      sb.write(": " + dart.str(this.message));
      if (this.osError != null) {
        sb.write(" (" + dart.str(this.osError) + ")");
      }
    } else if (this.osError != null) {
      sb.write(": " + dart.str(this.osError));
    }
    if (this.address != null) {
      sb.write(", address = " + dart.str(this.address.host));
    }
    if (this.port != null) {
      sb.write(", port = " + dart.str(this.port));
    }
    return sb.toString();
  }
};
(io.SocketException.new = function(message, opts) {
  let osError = opts && 'osError' in opts ? opts.osError : null;
  let address = opts && 'address' in opts ? opts.address : null;
  let port = opts && 'port' in opts ? opts.port : null;
  this[message$12] = message;
  this[osError$2] = osError;
  this[address$0] = address;
  this[port$0] = port;
}).prototype = io.SocketException.prototype;
(io.SocketException.closed = function() {
  this[message$12] = "Socket has been closed";
  this[osError$2] = null;
  this[address$0] = null;
  this[port$0] = null;
}).prototype = io.SocketException.prototype;
dart.addTypeTests(io.SocketException);
const message$12 = Symbol("SocketException.message");
const osError$2 = Symbol("SocketException.osError");
const address$0 = Symbol("SocketException.address");
const port$0 = Symbol("SocketException.port");
io.SocketException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(io.SocketException, "dart:io");
dart.setFieldSignature(io.SocketException, () => ({
  __proto__: dart.getFields(io.SocketException.__proto__),
  message: dart.finalFieldType(core.String),
  osError: dart.finalFieldType(io.OSError),
  address: dart.finalFieldType(io.InternetAddress),
  port: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(io.SocketException, ['toString']);
dart.defineLazy(io, {
  /*io._stdioHandleTypeTerminal*/get _stdioHandleTypeTerminal() {
    return 0;
  },
  /*io._stdioHandleTypePipe*/get _stdioHandleTypePipe() {
    return 1;
  },
  /*io._stdioHandleTypeFile*/get _stdioHandleTypeFile() {
    return 2;
  },
  /*io._stdioHandleTypeSocket*/get _stdioHandleTypeSocket() {
    return 3;
  },
  /*io._stdioHandleTypeOther*/get _stdioHandleTypeOther() {
    return 4;
  }
});
io._StdStream = class _StdStream extends async.Stream$(core.List$(core.int)) {
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
};
(io._StdStream.new = function(stream) {
  this[_stream$] = stream;
  io._StdStream.__proto__.new.call(this);
}).prototype = io._StdStream.prototype;
dart.addTypeTests(io._StdStream);
dart.setMethodSignature(io._StdStream, () => ({
  __proto__: dart.getMethods(io._StdStream.__proto__),
  listen: dart.fnType(async.StreamSubscription$(core.List$(core.int)), [dart.fnType(dart.void, [core.List$(core.int)])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool})
}));
dart.setLibraryUri(io._StdStream, "dart:io");
dart.setFieldSignature(io._StdStream, () => ({
  __proto__: dart.getFields(io._StdStream.__proto__),
  [_stream$]: dart.finalFieldType(StreamOfListOfint())
}));
const _fd = dart.privateName(io, "_fd");
io.Stdin = class Stdin extends io._StdStream {
  readLineSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : io.systemEncoding;
    let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
    let CR = 13;
    let LF = 10;
    let line = JSArrayOfint().of([]);
    let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.terminal) && !dart.test(this.lineMode);
    if (dart.test(retainNewlines)) {
      let byte = null;
      do {
        byte = this.readByteSync();
        if (dart.notNull(byte) < 0) {
          break;
        }
        line[$add](byte);
      } while (byte !== LF && !(byte === CR && crIsNewline));
      if (dart.test(line[$isEmpty])) {
        return null;
      }
    } else if (crIsNewline) {
      while (true) {
        let byte = this.readByteSync();
        if (dart.notNull(byte) < 0) {
          if (dart.test(line[$isEmpty])) return null;
          break;
        }
        if (byte === LF || byte === CR) break;
        line[$add](byte);
      }
    } else {
      outer:
        while (true) {
          let byte = this.readByteSync();
          if (byte === LF) break;
          if (byte === CR) {
            do {
              byte = this.readByteSync();
              if (byte === LF) break outer;
              line[$add](CR);
            } while (byte === CR);
          }
          if (dart.notNull(byte) < 0) {
            if (dart.test(line[$isEmpty])) return null;
            break;
          }
          line[$add](byte);
        }
    }
    return encoding.decode(line);
  }
  get echoMode() {
    dart.throw(new core.UnsupportedError.new("Stdin.echoMode"));
  }
  set echoMode(enabled) {
    dart.throw(new core.UnsupportedError.new("Stdin.echoMode"));
  }
  get lineMode() {
    dart.throw(new core.UnsupportedError.new("Stdin.lineMode"));
  }
  set lineMode(enabled) {
    dart.throw(new core.UnsupportedError.new("Stdin.lineMode"));
  }
  get supportsAnsiEscapes() {
    dart.throw(new core.UnsupportedError.new("Stdin.supportsAnsiEscapes"));
  }
  readByteSync() {
    dart.throw(new core.UnsupportedError.new("Stdin.readByteSync"));
  }
  get hasTerminal() {
    try {
      return dart.equals(io.stdioType(this), io.StdioType.terminal);
    } catch (e) {
      let _ = dart.getThrown(e);
      if (io.FileSystemException.is(_)) {
        return false;
      } else
        throw e;
    }
  }
};
(io.Stdin.__ = function(stream, fd) {
  this[_fd] = fd;
  io.Stdin.__proto__.new.call(this, stream);
}).prototype = io.Stdin.prototype;
io.Stdin.prototype[dart.isStream] = true;
dart.addTypeTests(io.Stdin);
io.Stdin[dart.implements] = () => [StreamOfListOfint()];
dart.setMethodSignature(io.Stdin, () => ({
  __proto__: dart.getMethods(io.Stdin.__proto__),
  readLineSync: dart.fnType(core.String, [], {encoding: convert.Encoding, retainNewlines: core.bool}),
  readByteSync: dart.fnType(core.int, [])
}));
dart.setGetterSignature(io.Stdin, () => ({
  __proto__: dart.getGetters(io.Stdin.__proto__),
  echoMode: core.bool,
  lineMode: core.bool,
  supportsAnsiEscapes: core.bool,
  hasTerminal: core.bool
}));
dart.setSetterSignature(io.Stdin, () => ({
  __proto__: dart.getSetters(io.Stdin.__proto__),
  echoMode: core.bool,
  lineMode: core.bool
}));
dart.setLibraryUri(io.Stdin, "dart:io");
dart.setFieldSignature(io.Stdin, () => ({
  __proto__: dart.getFields(io.Stdin.__proto__),
  [_fd]: dart.fieldType(core.int)
}));
const _nonBlocking = dart.privateName(io, "_nonBlocking");
const _hasTerminal = dart.privateName(io, "_hasTerminal");
const _terminalColumns = dart.privateName(io, "_terminalColumns");
const _terminalLines = dart.privateName(io, "_terminalLines");
io._StdSink = class _StdSink extends core.Object {
  get encoding() {
    return this[_sink$0].encoding;
  }
  set encoding(encoding) {
    this[_sink$0].encoding = encoding;
  }
  write(object) {
    this[_sink$0].write(object);
  }
  writeln(object) {
    if (object === void 0) object = "";
    this[_sink$0].writeln(object);
  }
  writeAll(objects, sep) {
    if (sep === void 0) sep = "";
    this[_sink$0].writeAll(objects, sep);
  }
  add(data) {
    ListOfint()._check(data);
    this[_sink$0].add(data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_sink$0].addError(error, stackTrace);
  }
  writeCharCode(charCode) {
    this[_sink$0].writeCharCode(charCode);
  }
  addStream(stream) {
    StreamOfListOfint()._check(stream);
    return this[_sink$0].addStream(stream);
  }
  flush() {
    return this[_sink$0].flush();
  }
  close() {
    return this[_sink$0].close();
  }
  get done() {
    return this[_sink$0].done;
  }
};
(io._StdSink.new = function(sink) {
  this[_sink$0] = sink;
}).prototype = io._StdSink.prototype;
dart.addTypeTests(io._StdSink);
io._StdSink[dart.implements] = () => [io.IOSink];
dart.setMethodSignature(io._StdSink, () => ({
  __proto__: dart.getMethods(io._StdSink.__proto__),
  write: dart.fnType(dart.void, [core.Object]),
  writeln: dart.fnType(dart.void, [], [core.Object]),
  writeAll: dart.fnType(dart.void, [core.Iterable], [core.String]),
  add: dart.fnType(dart.void, [core.Object]),
  addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
  writeCharCode: dart.fnType(dart.void, [core.int]),
  addStream: dart.fnType(async.Future, [core.Object]),
  flush: dart.fnType(async.Future, []),
  close: dart.fnType(async.Future, [])
}));
dart.setGetterSignature(io._StdSink, () => ({
  __proto__: dart.getGetters(io._StdSink.__proto__),
  encoding: convert.Encoding,
  done: async.Future
}));
dart.setSetterSignature(io._StdSink, () => ({
  __proto__: dart.getSetters(io._StdSink.__proto__),
  encoding: convert.Encoding
}));
dart.setLibraryUri(io._StdSink, "dart:io");
dart.setFieldSignature(io._StdSink, () => ({
  __proto__: dart.getFields(io._StdSink.__proto__),
  [_sink$0]: dart.finalFieldType(io.IOSink)
}));
io.Stdout = class Stdout extends io._StdSink {
  get hasTerminal() {
    return this[_hasTerminal](this[_fd]);
  }
  get terminalColumns() {
    return this[_terminalColumns](this[_fd]);
  }
  get terminalLines() {
    return this[_terminalLines](this[_fd]);
  }
  get supportsAnsiEscapes() {
    return io.Stdout._supportsAnsiEscapes(this[_fd]);
  }
  [_hasTerminal](fd) {
    dart.throw(new core.UnsupportedError.new("Stdout.hasTerminal"));
  }
  [_terminalColumns](fd) {
    dart.throw(new core.UnsupportedError.new("Stdout.terminalColumns"));
  }
  [_terminalLines](fd) {
    dart.throw(new core.UnsupportedError.new("Stdout.terminalLines"));
  }
  static _supportsAnsiEscapes(fd) {
    dart.throw(new core.UnsupportedError.new("Stdout.supportsAnsiEscapes"));
  }
  get nonBlocking() {
    let t = this[_nonBlocking];
    t == null ? this[_nonBlocking] = io.IOSink.new(new io._FileStreamConsumer.fromStdio(this[_fd])) : t;
    return this[_nonBlocking];
  }
};
(io.Stdout.__ = function(sink, fd) {
  this[_nonBlocking] = null;
  this[_fd] = fd;
  io.Stdout.__proto__.new.call(this, sink);
}).prototype = io.Stdout.prototype;
dart.addTypeTests(io.Stdout);
io.Stdout[dart.implements] = () => [io.IOSink];
dart.setMethodSignature(io.Stdout, () => ({
  __proto__: dart.getMethods(io.Stdout.__proto__),
  [_hasTerminal]: dart.fnType(core.bool, [core.int]),
  [_terminalColumns]: dart.fnType(core.int, [core.int]),
  [_terminalLines]: dart.fnType(core.int, [core.int])
}));
dart.setGetterSignature(io.Stdout, () => ({
  __proto__: dart.getGetters(io.Stdout.__proto__),
  hasTerminal: core.bool,
  terminalColumns: core.int,
  terminalLines: core.int,
  supportsAnsiEscapes: core.bool,
  nonBlocking: io.IOSink
}));
dart.setLibraryUri(io.Stdout, "dart:io");
dart.setFieldSignature(io.Stdout, () => ({
  __proto__: dart.getFields(io.Stdout.__proto__),
  [_fd]: dart.finalFieldType(core.int),
  [_nonBlocking]: dart.fieldType(io.IOSink)
}));
io.StdoutException = class StdoutException extends core.Object {
  get message() {
    return this[message$13];
  }
  set message(value) {
    super.message = value;
  }
  get osError() {
    return this[osError$3];
  }
  set osError(value) {
    super.osError = value;
  }
  toString() {
    return "StdoutException: " + dart.str(this.message) + (this.osError == null ? "" : ", " + dart.str(this.osError));
  }
};
(io.StdoutException.new = function(message, osError) {
  if (osError === void 0) osError = null;
  this[message$13] = message;
  this[osError$3] = osError;
}).prototype = io.StdoutException.prototype;
dart.addTypeTests(io.StdoutException);
const message$13 = Symbol("StdoutException.message");
const osError$3 = Symbol("StdoutException.osError");
io.StdoutException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(io.StdoutException, "dart:io");
dart.setFieldSignature(io.StdoutException, () => ({
  __proto__: dart.getFields(io.StdoutException.__proto__),
  message: dart.finalFieldType(core.String),
  osError: dart.finalFieldType(io.OSError)
}));
dart.defineExtensionMethods(io.StdoutException, ['toString']);
io.StdinException = class StdinException extends core.Object {
  get message() {
    return this[message$14];
  }
  set message(value) {
    super.message = value;
  }
  get osError() {
    return this[osError$4];
  }
  set osError(value) {
    super.osError = value;
  }
  toString() {
    return "StdinException: " + dart.str(this.message) + (this.osError == null ? "" : ", " + dart.str(this.osError));
  }
};
(io.StdinException.new = function(message, osError) {
  if (osError === void 0) osError = null;
  this[message$14] = message;
  this[osError$4] = osError;
}).prototype = io.StdinException.prototype;
dart.addTypeTests(io.StdinException);
const message$14 = Symbol("StdinException.message");
const osError$4 = Symbol("StdinException.osError");
io.StdinException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(io.StdinException, "dart:io");
dart.setFieldSignature(io.StdinException, () => ({
  __proto__: dart.getFields(io.StdinException.__proto__),
  message: dart.finalFieldType(core.String),
  osError: dart.finalFieldType(io.OSError)
}));
dart.defineExtensionMethods(io.StdinException, ['toString']);
io._StdConsumer = class _StdConsumer extends core.Object {
  addStream(stream) {
    StreamOfListOfint()._check(stream);
    let completer = async.Completer.new();
    let sub = null;
    sub = stream.listen(dart.fn(data => {
      try {
        dart.dsend(this[_file], 'writeFromSync', [data]);
      } catch (e$) {
        let e = dart.getThrown(e$);
        let s = dart.stackTrace(e$);
        dart.dsend(sub, 'cancel', []);
        completer.completeError(e, s);
      }
    }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
    return completer.future;
  }
  close() {
    dart.dsend(this[_file], 'closeSync', []);
    return async.Future.value();
  }
};
(io._StdConsumer.new = function(fd) {
  this[_file] = io._File._openStdioSync(fd);
}).prototype = io._StdConsumer.prototype;
dart.addTypeTests(io._StdConsumer);
io._StdConsumer[dart.implements] = () => [StreamConsumerOfListOfint()];
dart.setMethodSignature(io._StdConsumer, () => ({
  __proto__: dart.getMethods(io._StdConsumer.__proto__),
  addStream: dart.fnType(async.Future, [core.Object]),
  close: dart.fnType(async.Future, [])
}));
dart.setLibraryUri(io._StdConsumer, "dart:io");
dart.setFieldSignature(io._StdConsumer, () => ({
  __proto__: dart.getFields(io._StdConsumer.__proto__),
  [_file]: dart.finalFieldType(dart.dynamic)
}));
io.StdioType = class StdioType extends core.Object {
  get name() {
    return this[name$3];
  }
  set name(value) {
    super.name = value;
  }
  toString() {
    return "StdioType: " + dart.str(this.name);
  }
};
(io.StdioType.__ = function(name) {
  this[name$3] = name;
}).prototype = io.StdioType.prototype;
dart.addTypeTests(io.StdioType);
const name$3 = Symbol("StdioType.name");
dart.setLibraryUri(io.StdioType, "dart:io");
dart.setFieldSignature(io.StdioType, () => ({
  __proto__: dart.getFields(io.StdioType.__proto__),
  name: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(io.StdioType, ['toString']);
dart.defineLazy(io.StdioType, {
  /*io.StdioType.terminal*/get terminal() {
    return dart.const(new io.StdioType.__("terminal"));
  },
  /*io.StdioType.pipe*/get pipe() {
    return dart.const(new io.StdioType.__("pipe"));
  },
  /*io.StdioType.file*/get file() {
    return dart.const(new io.StdioType.__("file"));
  },
  /*io.StdioType.other*/get other() {
    return dart.const(new io.StdioType.__("other"));
  },
  /*io.StdioType.TERMINAL*/get TERMINAL() {
    return io.StdioType.terminal;
  },
  /*io.StdioType.PIPE*/get PIPE() {
    return io.StdioType.pipe;
  },
  /*io.StdioType.FILE*/get FILE() {
    return io.StdioType.file;
  },
  /*io.StdioType.OTHER*/get OTHER() {
    return io.StdioType.other;
  }
});
dart.defineLazy(io, {
  /*io._stdin*/get _stdin() {
    return null;
  },
  set _stdin(_) {},
  /*io._stdout*/get _stdout() {
    return null;
  },
  set _stdout(_) {},
  /*io._stderr*/get _stderr() {
    return null;
  },
  set _stderr(_) {},
  /*io._stdinFD*/get _stdinFD() {
    return 0;
  },
  set _stdinFD(_) {},
  /*io._stdoutFD*/get _stdoutFD() {
    return 1;
  },
  set _stdoutFD(_) {},
  /*io._stderrFD*/get _stderrFD() {
    return 2;
  },
  set _stderrFD(_) {}
});
io._setStdioFDs = function(stdin, stdout, stderr) {
  io._stdinFD = stdin;
  io._stdoutFD = stdout;
  io._stderrFD = stderr;
};
dart.copyProperties(io, {
  get stdin() {
    let t = io._stdin;
    t == null ? io._stdin = io._StdIOUtils._getStdioInputStream(io._stdinFD) : t;
    return io._stdin;
  }
});
dart.copyProperties(io, {
  get stdout() {
    let t = io._stdout;
    t == null ? io._stdout = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(io._stdoutFD)) : t;
    return io._stdout;
  }
});
dart.copyProperties(io, {
  get stderr() {
    let t = io._stderr;
    t == null ? io._stderr = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(io._stderrFD)) : t;
    return io._stderr;
  }
});
io.stdioType = function(object) {
  if (io._StdStream.is(object)) {
    object = dart.dload(object, _stream$);
  } else if (dart.equals(object, io.stdout) || dart.equals(object, io.stderr)) {
    let stdiofd = dart.equals(object, io.stdout) ? io._stdoutFD : io._stderrFD;
    switch (io._StdIOUtils._getStdioHandleType(stdiofd)) {
      case 0:
      {
        return io.StdioType.terminal;
      }
      case 1:
      {
        return io.StdioType.pipe;
      }
      case 2:
      {
        return io.StdioType.file;
      }
    }
  }
  if (io._FileStream.is(object)) {
    return io.StdioType.file;
  }
  if (io.Socket.is(object)) {
    let socketType = io._StdIOUtils._socketType(object);
    if (socketType == null) return io.StdioType.other;
    switch (socketType) {
      case 0:
      {
        return io.StdioType.terminal;
      }
      case 1:
      {
        return io.StdioType.pipe;
      }
      case 2:
      {
        return io.StdioType.file;
      }
    }
  }
  if (io._IOSinkImpl.is(object)) {
    try {
      if (io._FileStreamConsumer.is(object[_target$])) {
        return io.StdioType.file;
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
  }
  return io.StdioType.other;
};
io._StdIOUtils = class _StdIOUtils extends core.Object {
  static _getStdioOutputStream(fd) {
    dart.throw(new core.UnsupportedError.new("StdIOUtils._getStdioOutputStream"));
  }
  static _getStdioInputStream(fd) {
    dart.throw(new core.UnsupportedError.new("StdIOUtils._getStdioInputStream"));
  }
  static _socketType(socket) {
    dart.throw(new core.UnsupportedError.new("StdIOUtils._socketType"));
  }
  static _getStdioHandleType(fd) {
    dart.throw(new core.UnsupportedError.new("StdIOUtils._getStdioHandleType"));
  }
};
(io._StdIOUtils.new = function() {
}).prototype = io._StdIOUtils.prototype;
dart.addTypeTests(io._StdIOUtils);
dart.setLibraryUri(io._StdIOUtils, "dart:io");
dart.defineLazy(io, {
  /*io.systemEncoding*/get systemEncoding() {
    return dart.const(new io.SystemEncoding.new());
  },
  /*io.SYSTEM_ENCODING*/get SYSTEM_ENCODING() {
    return dart.const(new io.SystemEncoding.new());
  }
});
let const$73;
let const$74;
let const$75;
let const$76;
io.SystemEncoding = class SystemEncoding extends convert.Encoding {
  get name() {
    return "system";
  }
  encode(input) {
    core.String._check(input);
    return this.encoder.convert(input);
  }
  decode(encoded) {
    ListOfint()._check(encoded);
    return this.decoder.convert(encoded);
  }
  get encoder() {
    if (io.Platform.operatingSystem === "windows") {
      return const$73 || (const$73 = dart.const(new io._WindowsCodePageEncoder.new()));
    } else {
      return const$74 || (const$74 = dart.const(new convert.Utf8Encoder.new()));
    }
  }
  get decoder() {
    if (io.Platform.operatingSystem === "windows") {
      return const$75 || (const$75 = dart.const(new io._WindowsCodePageDecoder.new()));
    } else {
      return const$76 || (const$76 = dart.const(new convert.Utf8Decoder.new()));
    }
  }
};
(io.SystemEncoding.new = function() {
  io.SystemEncoding.__proto__.new.call(this);
}).prototype = io.SystemEncoding.prototype;
dart.addTypeTests(io.SystemEncoding);
dart.setMethodSignature(io.SystemEncoding, () => ({
  __proto__: dart.getMethods(io.SystemEncoding.__proto__),
  encode: dart.fnType(core.List$(core.int), [core.Object]),
  decode: dart.fnType(core.String, [core.Object])
}));
dart.setGetterSignature(io.SystemEncoding, () => ({
  __proto__: dart.getGetters(io.SystemEncoding.__proto__),
  name: core.String,
  encoder: convert.Converter$(core.String, core.List$(core.int)),
  decoder: convert.Converter$(core.List$(core.int), core.String)
}));
dart.setLibraryUri(io.SystemEncoding, "dart:io");
io._WindowsCodePageEncoder = class _WindowsCodePageEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
  convert(input) {
    core.String._check(input);
    let encoded = io._WindowsCodePageEncoder._encodeString(input);
    if (encoded == null) {
      dart.throw(new core.FormatException.new("Invalid character for encoding"));
    }
    return encoded;
  }
  startChunkedConversion(sink) {
    SinkOfListOfint()._check(sink);
    return new io._WindowsCodePageEncoderSink.new(sink);
  }
  static _encodeString(string) {
    dart.throw(new core.UnsupportedError.new("_WindowsCodePageEncoder._encodeString"));
  }
};
(io._WindowsCodePageEncoder.new = function() {
  io._WindowsCodePageEncoder.__proto__.new.call(this);
}).prototype = io._WindowsCodePageEncoder.prototype;
dart.addTypeTests(io._WindowsCodePageEncoder);
dart.setMethodSignature(io._WindowsCodePageEncoder, () => ({
  __proto__: dart.getMethods(io._WindowsCodePageEncoder.__proto__),
  convert: dart.fnType(core.List$(core.int), [core.Object]),
  startChunkedConversion: dart.fnType(convert.StringConversionSink, [core.Object])
}));
dart.setLibraryUri(io._WindowsCodePageEncoder, "dart:io");
io._WindowsCodePageEncoderSink = class _WindowsCodePageEncoderSink extends convert.StringConversionSinkBase {
  close() {
    this[_sink$0].close();
  }
  add(string) {
    core.String._check(string);
    let encoded = io._WindowsCodePageEncoder._encodeString(string);
    if (encoded == null) {
      dart.throw(new core.FormatException.new("Invalid character for encoding"));
    }
    this[_sink$0].add(encoded);
  }
  addSlice(source, start, end, isLast) {
    if (start !== 0 || end !== source.length) {
      source = source[$substring](start, end);
    }
    this.add(source);
    if (dart.test(isLast)) this.close();
  }
};
(io._WindowsCodePageEncoderSink.new = function(sink) {
  this[_sink$0] = sink;
}).prototype = io._WindowsCodePageEncoderSink.prototype;
dart.addTypeTests(io._WindowsCodePageEncoderSink);
dart.setMethodSignature(io._WindowsCodePageEncoderSink, () => ({
  __proto__: dart.getMethods(io._WindowsCodePageEncoderSink.__proto__),
  close: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [core.Object]),
  addSlice: dart.fnType(dart.void, [core.String, core.int, core.int, core.bool])
}));
dart.setLibraryUri(io._WindowsCodePageEncoderSink, "dart:io");
dart.setFieldSignature(io._WindowsCodePageEncoderSink, () => ({
  __proto__: dart.getFields(io._WindowsCodePageEncoderSink.__proto__),
  [_sink$0]: dart.finalFieldType(SinkOfListOfint())
}));
io._WindowsCodePageDecoder = class _WindowsCodePageDecoder extends convert.Converter$(core.List$(core.int), core.String) {
  convert(input) {
    ListOfint()._check(input);
    return io._WindowsCodePageDecoder._decodeBytes(input);
  }
  startChunkedConversion(sink) {
    SinkOfString()._check(sink);
    return new io._WindowsCodePageDecoderSink.new(sink);
  }
  static _decodeBytes(bytes) {
    dart.throw(new core.UnsupportedError.new("_WindowsCodePageDecoder._decodeBytes"));
  }
};
(io._WindowsCodePageDecoder.new = function() {
  io._WindowsCodePageDecoder.__proto__.new.call(this);
}).prototype = io._WindowsCodePageDecoder.prototype;
dart.addTypeTests(io._WindowsCodePageDecoder);
dart.setMethodSignature(io._WindowsCodePageDecoder, () => ({
  __proto__: dart.getMethods(io._WindowsCodePageDecoder.__proto__),
  convert: dart.fnType(core.String, [core.Object]),
  startChunkedConversion: dart.fnType(convert.ByteConversionSink, [core.Object])
}));
dart.setLibraryUri(io._WindowsCodePageDecoder, "dart:io");
io._WindowsCodePageDecoderSink = class _WindowsCodePageDecoderSink extends convert.ByteConversionSinkBase {
  close() {
    this[_sink$0].close();
  }
  add(bytes) {
    ListOfint()._check(bytes);
    this[_sink$0].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
  }
};
(io._WindowsCodePageDecoderSink.new = function(sink) {
  this[_sink$0] = sink;
  io._WindowsCodePageDecoderSink.__proto__.new.call(this);
}).prototype = io._WindowsCodePageDecoderSink.prototype;
dart.addTypeTests(io._WindowsCodePageDecoderSink);
dart.setMethodSignature(io._WindowsCodePageDecoderSink, () => ({
  __proto__: dart.getMethods(io._WindowsCodePageDecoderSink.__proto__),
  close: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [core.Object])
}));
dart.setLibraryUri(io._WindowsCodePageDecoderSink, "dart:io");
dart.setFieldSignature(io._WindowsCodePageDecoderSink, () => ({
  __proto__: dart.getFields(io._WindowsCodePageDecoderSink.__proto__),
  [_sink$0]: dart.finalFieldType(SinkOfString())
}));
io.RawSynchronousSocket = class RawSynchronousSocket extends core.Object {
  static connectSync(host, port) {
    dart.throw(new core.UnsupportedError.new("RawSynchronousSocket.connectSync"));
  }
};
(io.RawSynchronousSocket.new = function() {
}).prototype = io.RawSynchronousSocket.prototype;
dart.addTypeTests(io.RawSynchronousSocket);
dart.setLibraryUri(io.RawSynchronousSocket, "dart:io");
isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
  get message() {
    return this[message$15];
  }
  set message(value) {
    super.message = value;
  }
  toString() {
    return "IsolateSpawnException: " + dart.str(this.message);
  }
};
(isolate.IsolateSpawnException.new = function(message) {
  this[message$15] = message;
}).prototype = isolate.IsolateSpawnException.prototype;
dart.addTypeTests(isolate.IsolateSpawnException);
const message$15 = Symbol("IsolateSpawnException.message");
isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
dart.setLibraryUri(isolate.IsolateSpawnException, "dart:isolate");
dart.setFieldSignature(isolate.IsolateSpawnException, () => ({
  __proto__: dart.getFields(isolate.IsolateSpawnException.__proto__),
  message: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(isolate.IsolateSpawnException, ['toString']);
const _pause = dart.privateName(isolate, "_pause");
isolate.Isolate = class Isolate extends core.Object {
  get controlPort() {
    return this[controlPort$];
  }
  set controlPort(value) {
    super.controlPort = value;
  }
  get pauseCapability() {
    return this[pauseCapability$];
  }
  set pauseCapability(value) {
    super.pauseCapability = value;
  }
  get terminateCapability() {
    return this[terminateCapability$];
  }
  set terminateCapability(value) {
    super.terminateCapability = value;
  }
  get debugName() {
    return isolate._unsupported();
  }
  static get current() {
    return isolate._unsupported();
  }
  static get packageRoot() {
    return isolate._unsupported();
  }
  static get packageConfig() {
    return isolate._unsupported();
  }
  static resolvePackageUri(packageUri) {
    return isolate._unsupported();
  }
  static spawn(T, entryPoint, message, opts) {
    let paused = opts && 'paused' in opts ? opts.paused : false;
    let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
    let onExit = opts && 'onExit' in opts ? opts.onExit : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    return isolate._unsupported();
  }
  static spawnUri(uri, args, message, opts) {
    let paused = opts && 'paused' in opts ? opts.paused : false;
    let onExit = opts && 'onExit' in opts ? opts.onExit : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
    let checked = opts && 'checked' in opts ? opts.checked : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
    let packageConfig = opts && 'packageConfig' in opts ? opts.packageConfig : null;
    let automaticPackageResolution = opts && 'automaticPackageResolution' in opts ? opts.automaticPackageResolution : false;
    return isolate._unsupported();
  }
  pause(resumeCapability) {
    if (resumeCapability === void 0) resumeCapability = null;
    let t = resumeCapability;
    t == null ? resumeCapability = isolate.Capability.new() : t;
    this[_pause](resumeCapability);
    return resumeCapability;
  }
  [_pause](resumeCapability) {
    return isolate._unsupported();
  }
  resume(resumeCapability) {
    return isolate._unsupported();
  }
  addOnExitListener(responsePort, opts) {
    let response = opts && 'response' in opts ? opts.response : null;
    return isolate._unsupported();
  }
  removeOnExitListener(responsePort) {
    return isolate._unsupported();
  }
  setErrorsFatal(errorsAreFatal) {
    return isolate._unsupported();
  }
  kill(opts) {
    let priority = opts && 'priority' in opts ? opts.priority : 1;
    return isolate._unsupported();
  }
  ping(responsePort, opts) {
    let response = opts && 'response' in opts ? opts.response : null;
    let priority = opts && 'priority' in opts ? opts.priority : 0;
    return isolate._unsupported();
  }
  addErrorListener(port) {
    return isolate._unsupported();
  }
  removeErrorListener(port) {
    return isolate._unsupported();
  }
  get errors() {
    let controller = null;
    let port = null;
    function handleError(message) {
      let listMessage = core.List._check(message);
      let errorDescription = core.String._check(listMessage[$_get](0));
      let stackDescription = core.String._check(listMessage[$_get](1));
      let error = new isolate.RemoteError.new(errorDescription, stackDescription);
      controller.addError(error, error.stackTrace);
    }
    dart.fn(handleError, dynamicTovoid());
    controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
        port = isolate.RawReceivePort.new(handleError);
        this.addErrorListener(port.sendPort);
      }, VoidToNull()), onCancel: dart.fn(() => {
        this.removeErrorListener(port.sendPort);
        port.close();
        port = null;
      }, VoidToNull())});
    return controller.stream;
  }
};
(isolate.Isolate.new = function(controlPort, opts) {
  let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
  let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
  this[controlPort$] = controlPort;
  this[pauseCapability$] = pauseCapability;
  this[terminateCapability$] = terminateCapability;
}).prototype = isolate.Isolate.prototype;
dart.addTypeTests(isolate.Isolate);
const controlPort$ = Symbol("Isolate.controlPort");
const pauseCapability$ = Symbol("Isolate.pauseCapability");
const terminateCapability$ = Symbol("Isolate.terminateCapability");
dart.setMethodSignature(isolate.Isolate, () => ({
  __proto__: dart.getMethods(isolate.Isolate.__proto__),
  pause: dart.fnType(isolate.Capability, [], [isolate.Capability]),
  [_pause]: dart.fnType(dart.void, [isolate.Capability]),
  resume: dart.fnType(dart.void, [isolate.Capability]),
  addOnExitListener: dart.fnType(dart.void, [isolate.SendPort], {response: core.Object}),
  removeOnExitListener: dart.fnType(dart.void, [isolate.SendPort]),
  setErrorsFatal: dart.fnType(dart.void, [core.bool]),
  kill: dart.fnType(dart.void, [], {priority: core.int}),
  ping: dart.fnType(dart.void, [isolate.SendPort], {response: core.Object, priority: core.int}),
  addErrorListener: dart.fnType(dart.void, [isolate.SendPort]),
  removeErrorListener: dart.fnType(dart.void, [isolate.SendPort])
}));
dart.setGetterSignature(isolate.Isolate, () => ({
  __proto__: dart.getGetters(isolate.Isolate.__proto__),
  debugName: core.String,
  errors: async.Stream
}));
dart.setLibraryUri(isolate.Isolate, "dart:isolate");
dart.setFieldSignature(isolate.Isolate, () => ({
  __proto__: dart.getFields(isolate.Isolate.__proto__),
  controlPort: dart.finalFieldType(isolate.SendPort),
  pauseCapability: dart.finalFieldType(isolate.Capability),
  terminateCapability: dart.finalFieldType(isolate.Capability)
}));
dart.defineLazy(isolate.Isolate, {
  /*isolate.Isolate.immediate*/get immediate() {
    return 0;
  },
  /*isolate.Isolate.beforeNextEvent*/get beforeNextEvent() {
    return 1;
  }
});
isolate.SendPort = class SendPort extends core.Object {};
(isolate.SendPort.new = function() {
}).prototype = isolate.SendPort.prototype;
dart.addTypeTests(isolate.SendPort);
isolate.SendPort[dart.implements] = () => [isolate.Capability];
dart.setLibraryUri(isolate.SendPort, "dart:isolate");
isolate.ReceivePort = class ReceivePort extends core.Object {
  static new() {
    return new isolate._ReceivePort.new();
  }
  static fromRawReceivePort(rawPort) {
    return isolate._unsupported();
  }
};
(isolate.ReceivePort[dart.mixinNew] = function() {
}).prototype = isolate.ReceivePort.prototype;
isolate.ReceivePort.prototype[dart.isStream] = true;
dart.addTypeTests(isolate.ReceivePort);
isolate.ReceivePort[dart.implements] = () => [async.Stream];
dart.setLibraryUri(isolate.ReceivePort, "dart:isolate");
isolate.RawReceivePort = class RawReceivePort extends core.Object {
  static new(handler) {
    if (handler === void 0) handler = null;
    return isolate._unsupported();
  }
};
(isolate.RawReceivePort[dart.mixinNew] = function() {
}).prototype = isolate.RawReceivePort.prototype;
dart.addTypeTests(isolate.RawReceivePort);
dart.setLibraryUri(isolate.RawReceivePort, "dart:isolate");
const _description = dart.privateName(isolate, "_description");
isolate.RemoteError = class RemoteError extends core.Object {
  get stackTrace() {
    return this[stackTrace];
  }
  set stackTrace(value) {
    super.stackTrace = value;
  }
  toString() {
    return this[_description];
  }
};
(isolate.RemoteError.new = function(description, stackDescription) {
  this[_description] = description;
  this[stackTrace] = core.StackTrace.fromString(stackDescription);
}).prototype = isolate.RemoteError.prototype;
dart.addTypeTests(isolate.RemoteError);
const stackTrace = Symbol("RemoteError.stackTrace");
isolate.RemoteError[dart.implements] = () => [core.Error];
dart.setLibraryUri(isolate.RemoteError, "dart:isolate");
dart.setFieldSignature(isolate.RemoteError, () => ({
  __proto__: dart.getFields(isolate.RemoteError.__proto__),
  [_description]: dart.finalFieldType(core.String),
  stackTrace: dart.finalFieldType(core.StackTrace)
}));
dart.defineExtensionMethods(isolate.RemoteError, ['toString']);
dart.defineExtensionAccessors(isolate.RemoteError, ['stackTrace']);
isolate.TransferableTypedData = class TransferableTypedData extends core.Object {
  static fromList(list) {
    return isolate._unsupported();
  }
};
(isolate.TransferableTypedData[dart.mixinNew] = function() {
}).prototype = isolate.TransferableTypedData.prototype;
dart.addTypeTests(isolate.TransferableTypedData);
dart.setLibraryUri(isolate.TransferableTypedData, "dart:isolate");
isolate._ReceivePort = class _ReceivePort extends async.Stream {
  close() {}
  get sendPort() {
    return isolate._unsupported();
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return isolate._unsupported();
  }
};
(isolate._ReceivePort.new = function() {
  isolate._ReceivePort.__proto__.new.call(this);
}).prototype = isolate._ReceivePort.prototype;
dart.addTypeTests(isolate._ReceivePort);
isolate._ReceivePort[dart.implements] = () => [isolate.ReceivePort];
dart.setMethodSignature(isolate._ReceivePort, () => ({
  __proto__: dart.getMethods(isolate._ReceivePort.__proto__),
  close: dart.fnType(dart.void, []),
  listen: dart.fnType(async.StreamSubscription, [dart.dynamic], {onError: core.Function, onDone: dart.dynamic, cancelOnError: core.bool})
}));
dart.setGetterSignature(isolate._ReceivePort, () => ({
  __proto__: dart.getGetters(isolate._ReceivePort.__proto__),
  sendPort: isolate.SendPort
}));
dart.setLibraryUri(isolate._ReceivePort, "dart:isolate");
isolate._unsupported = function() {
  dart.throw(new core.UnsupportedError.new("dart:isolate is not supported on dart4web"));
};
isolate.Capability = class Capability extends core.Object {
  static new() {
    return isolate._unsupported();
  }
};
(isolate.Capability[dart.mixinNew] = function() {
}).prototype = isolate.Capability.prototype;
dart.addTypeTests(isolate.Capability);
dart.setLibraryUri(isolate.Capability, "dart:isolate");
dart.defineLazy(js, {
  /*js.context*/get context() {
    return js.JsObject._check(js._wrapToDart(dart.global));
  }
});
const _jsObject = dart.privateName(js, "_jsObject");
js.JsObject = class JsObject extends core.Object {
  static new(constructor, arguments$0) {
    if (arguments$0 === void 0) arguments$0 = null;
    let ctor = constructor[_jsObject];
    if (arguments$0 == null) {
      return js.JsObject._check(js._wrapToDart(new ctor()));
    }
    let unwrapped = core.List.from(arguments$0[$map](dart.dynamic, dart.fn(js._convertToJS, dynamicTodynamic())));
    return js.JsObject._check(js._wrapToDart(new ctor(...unwrapped)));
  }
  static fromBrowserObject(object) {
    if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
      dart.throw(new core.ArgumentError.new("object cannot be a num, string, bool, or null"));
    }
    return js.JsObject._check(js._wrapToDart(js._convertToJS(object)));
  }
  static jsify(object) {
    if (!core.Map.is(object) && !core.Iterable.is(object)) {
      dart.throw(new core.ArgumentError.new("object must be a Map or Iterable"));
    }
    return js.JsObject._check(js._wrapToDart(js.JsObject._convertDataTree(object)));
  }
  static _convertDataTree(data) {
    let _convertedObjects = new _js_helper.IdentityMap.new();
    function _convert(o) {
      if (dart.test(_convertedObjects.containsKey(o))) {
        return _convertedObjects._get(o);
      }
      if (core.Map.is(o)) {
        let convertedMap = {};
        _convertedObjects._set(o, convertedMap);
        for (let key of o[$keys]) {
          convertedMap[key] = _convert(o[$_get](key));
        }
        return convertedMap;
      } else if (core.Iterable.is(o)) {
        let convertedList = [];
        _convertedObjects._set(o, convertedList);
        convertedList[$addAll](o[$map](dart.dynamic, _convert));
        return convertedList;
      } else {
        return js._convertToJS(o);
      }
    }
    dart.fn(_convert, dynamicTodynamic());
    return _convert(data);
  }
  _get(property) {
    if (!(typeof property == 'string') && !(typeof property == 'number')) {
      dart.throw(new core.ArgumentError.new("property is not a String or num"));
    }
    return js._convertToDart(this[_jsObject][property]);
  }
  _set(property, value) {
    if (!(typeof property == 'string') && !(typeof property == 'number')) {
      dart.throw(new core.ArgumentError.new("property is not a String or num"));
    }
    this[_jsObject][property] = js._convertToJS(value);
    return value;
  }
  get hashCode() {
    return 0;
  }
  _equals(other) {
    return js.JsObject.is(other) && this[_jsObject] === other[_jsObject];
  }
  hasProperty(property) {
    if (!(typeof property == 'string') && !(typeof property == 'number')) {
      dart.throw(new core.ArgumentError.new("property is not a String or num"));
    }
    return property in this[_jsObject];
  }
  deleteProperty(property) {
    if (!(typeof property == 'string') && !(typeof property == 'number')) {
      dart.throw(new core.ArgumentError.new("property is not a String or num"));
    }
    delete this[_jsObject][property];
  }
  instanceof(type) {
    return this[_jsObject] instanceof js._convertToJS(type);
  }
  toString() {
    try {
      return String(this[_jsObject]);
    } catch (e$) {
      let e = dart.getThrown(e$);
      return super.toString();
    }
  }
  callMethod(method, args) {
    if (args === void 0) args = null;
    if (!(typeof method == 'string') && !(typeof method == 'number')) {
      dart.throw(new core.ArgumentError.new("method is not a String or num"));
    }
    if (args != null) args = core.List.from(args[$map](dart.dynamic, dart.fn(js._convertToJS, dynamicTodynamic())));
    let fn = this[_jsObject][method];
    if (typeof fn !== "function") {
      dart.throw(new core.NoSuchMethodError.new(this[_jsObject], core.Symbol.new(core.String._check(method)), args, new (LinkedMapOfSymbol$dynamic()).new()));
    }
    return js._convertToDart(fn.apply(this[_jsObject], args));
  }
};
(js.JsObject._fromJs = function(jsObject) {
  this[_jsObject] = jsObject;
  if (!(this[_jsObject] != null)) dart.assertFailed(null, "dart:js", 110, 12, "_jsObject != null");
}).prototype = js.JsObject.prototype;
dart.addTypeTests(js.JsObject);
dart.setMethodSignature(js.JsObject, () => ({
  __proto__: dart.getMethods(js.JsObject.__proto__),
  _get: dart.fnType(dart.dynamic, [core.Object]),
  _set: dart.fnType(dart.void, [core.Object, dart.dynamic]),
  hasProperty: dart.fnType(core.bool, [dart.dynamic]),
  deleteProperty: dart.fnType(dart.void, [dart.dynamic]),
  instanceof: dart.fnType(core.bool, [js.JsFunction]),
  callMethod: dart.fnType(dart.dynamic, [dart.dynamic], [core.List])
}));
dart.setLibraryUri(js.JsObject, "dart:js");
dart.setFieldSignature(js.JsObject, () => ({
  __proto__: dart.getFields(js.JsObject.__proto__),
  [_jsObject]: dart.finalFieldType(dart.dynamic)
}));
dart.defineExtensionMethods(js.JsObject, ['_equals', 'toString']);
dart.defineExtensionAccessors(js.JsObject, ['hashCode']);
js.JsFunction = class JsFunction extends js.JsObject {
  static withThis(f) {
    return new js.JsFunction._fromJs(function() {
      let args = [js._convertToDart(this)];
      for (let arg of arguments) {
        args.push(js._convertToDart(arg));
      }
      return js._convertToJS(f(...args));
    });
  }
  apply(args, opts) {
    let thisArg = opts && 'thisArg' in opts ? opts.thisArg : null;
    return js._convertToDart(this[_jsObject].apply(js._convertToJS(thisArg), args == null ? null : core.List.from(args[$map](dart.dynamic, js._convertToJS))));
  }
};
(js.JsFunction._fromJs = function(jsObject) {
  js.JsFunction.__proto__._fromJs.call(this, jsObject);
}).prototype = js.JsFunction.prototype;
dart.addTypeTests(js.JsFunction);
dart.setMethodSignature(js.JsFunction, () => ({
  __proto__: dart.getMethods(js.JsFunction.__proto__),
  apply: dart.fnType(dart.dynamic, [core.List], {thisArg: dart.dynamic})
}));
dart.setLibraryUri(js.JsFunction, "dart:js");
const _checkIndex = dart.privateName(js, "_checkIndex");
const _checkInsertIndex = dart.privateName(js, "_checkInsertIndex");
const _is_JsArray_default = Symbol('_is_JsArray_default');
js.JsArray$ = dart.generic(E => {
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  const JsObject_ListMixin$ = class JsObject_ListMixin extends js.JsObject {};
  (JsObject_ListMixin$._fromJs = function(_jsObject) {
    JsObject_ListMixin$.__proto__._fromJs.call(this, _jsObject);
  }).prototype = JsObject_ListMixin$.prototype;
  (JsObject_ListMixin$.new = function(constructor, arguments$0) {
    JsObject_ListMixin$.__proto__.new.call(this, constructor, arguments$0);
  }).prototype = JsObject_ListMixin$.prototype;
  (JsObject_ListMixin$.fromBrowserObject = function(object) {
    JsObject_ListMixin$.__proto__.fromBrowserObject.call(this, object);
  }).prototype = JsObject_ListMixin$.prototype;
  (JsObject_ListMixin$.jsify = function(object) {
    JsObject_ListMixin$.__proto__.jsify.call(this, object);
  }).prototype = JsObject_ListMixin$.prototype;
  dart.applyMixin(JsObject_ListMixin$, collection.ListMixin$(E));
  class JsArray extends JsObject_ListMixin$ {
    [_checkIndex](index) {
      if (core.int.is(index) && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length))) {
        dart.throw(new core.RangeError.range(index, 0, this.length));
      }
    }
    [_checkInsertIndex](index) {
      if (core.int.is(index) && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length) + 1)) {
        dart.throw(new core.RangeError.range(index, 0, this.length));
      }
    }
    static _checkRange(start, end, length) {
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(length)) {
        dart.throw(new core.RangeError.range(start, 0, length));
      }
      if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(length)) {
        dart.throw(new core.RangeError.range(end, start, length));
      }
    }
    _get(index) {
      if (typeof index == 'number' && index === index[$toInt]()) {
        this[_checkIndex](dart.asInt(index));
      }
      return E.as(super._get(index));
    }
    _set(index, value) {
      if (typeof index == 'number' && index === index[$toInt]()) {
        this[_checkIndex](dart.asInt(index));
      }
      super._set(index, value);
      return value;
    }
    get length() {
      let len = this[_jsObject].length;
      if (typeof len === "number" && len >>> 0 === len) {
        return len;
      }
      dart.throw(new core.StateError.new("Bad JsArray length"));
    }
    set length(length) {
      super._set("length", length);
    }
    add(value) {
      E._check(value);
      this.callMethod("push", [value]);
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      let list = iterable instanceof Array ? iterable : core.List.from(iterable);
      this.callMethod("push", core.List._check(list));
    }
    insert(index, element) {
      E._check(element);
      this[_checkInsertIndex](index);
      this.callMethod("splice", [index, 0, element]);
    }
    removeAt(index) {
      this[_checkIndex](index);
      return E.as(dart.dindex(this.callMethod("splice", [index, 1]), 0));
    }
    removeLast() {
      if (this.length === 0) dart.throw(new core.RangeError.new(-1));
      return E.as(this.callMethod("pop"));
    }
    removeRange(start, end) {
      js.JsArray._checkRange(start, end, this.length);
      this.callMethod("splice", [start, dart.notNull(end) - dart.notNull(start)]);
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      js.JsArray._checkRange(start, end, this.length);
      let length = dart.notNull(end) - dart.notNull(start);
      if (length === 0) return;
      if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError.new(skipCount));
      let args = JSArrayOfObject().of([start, length]);
      args[$addAll](iterable[$skip](skipCount)[$take](length));
      this.callMethod("splice", args);
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      this.callMethod("sort", compare == null ? [] : [compare]);
    }
  }
  (JsArray.new = function() {
    JsArray.__proto__._fromJs.call(this, []);
  }).prototype = JsArray.prototype;
  (JsArray.from = function(other) {
    JsArray.__proto__._fromJs.call(this, (() => {
      let _ = [];
      _[$addAll](other[$map](dart.dynamic, dart.fn(js._convertToJS, dynamicTodynamic())));
      return _;
    })());
  }).prototype = JsArray.prototype;
  (JsArray._fromJs = function(jsObject) {
    JsArray.__proto__._fromJs.call(this, jsObject);
  }).prototype = JsArray.prototype;
  dart.addTypeTests(JsArray);
  JsArray.prototype[_is_JsArray_default] = true;
  dart.setMethodSignature(JsArray, () => ({
    __proto__: dart.getMethods(JsArray.__proto__),
    [_checkIndex]: dart.fnType(dart.dynamic, [core.int]),
    [_checkInsertIndex]: dart.fnType(dart.dynamic, [core.int]),
    _get: dart.fnType(E, [core.Object]),
    [$_get]: dart.fnType(E, [core.Object]),
    _set: dart.fnType(dart.void, [core.Object, dart.dynamic]),
    [$_set]: dart.fnType(dart.void, [core.Object, dart.dynamic]),
    add: dart.fnType(dart.void, [core.Object]),
    [$add]: dart.fnType(dart.void, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    insert: dart.fnType(dart.void, [core.int, core.Object]),
    [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
    setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int])
  }));
  dart.setGetterSignature(JsArray, () => ({
    __proto__: dart.getGetters(JsArray.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setSetterSignature(JsArray, () => ({
    __proto__: dart.getSetters(JsArray.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(JsArray, "dart:js");
  dart.defineExtensionMethods(JsArray, [
    '_get',
    '_set',
    'add',
    'addAll',
    'insert',
    'removeAt',
    'removeLast',
    'removeRange',
    'setRange',
    'sort'
  ]);
  dart.defineExtensionAccessors(JsArray, ['length']);
  return JsArray;
});
js.JsArray = js.JsArray$();
dart.addTypeTests(js.JsArray, _is_JsArray_default);
js._isBrowserType = function(o) {
  return o instanceof Object && (o instanceof Blob || o instanceof Event || window.KeyRange && o instanceof KeyRange || window.IDBKeyRange && o instanceof IDBKeyRange || o instanceof ImageData || o instanceof Node || window.Int8Array && o instanceof Int8Array.__proto__ || o instanceof Window);
};
const _dartObj = dart.privateName(js, "_dartObj");
js._DartObject = class _DartObject extends core.Object {};
(js._DartObject.new = function(dartObj) {
  this[_dartObj] = dartObj;
}).prototype = js._DartObject.prototype;
dart.addTypeTests(js._DartObject);
dart.setLibraryUri(js._DartObject, "dart:js");
dart.setFieldSignature(js._DartObject, () => ({
  __proto__: dart.getFields(js._DartObject.__proto__),
  [_dartObj]: dart.finalFieldType(dart.dynamic)
}));
js._convertToJS = function(o) {
  if (o == null || typeof o == 'string' || typeof o == 'number' || typeof o == 'boolean' || dart.test(js._isBrowserType(o))) {
    return o;
  } else if (core.DateTime.is(o)) {
    return _js_helper.Primitives.lazyAsJsDate(o);
  } else if (js.JsObject.is(o)) {
    return o[_jsObject];
  } else if (core.Function.is(o)) {
    return js._putIfAbsent(js._jsProxies, o, dart.fn(js._wrapDartFunction, dynamicTodynamic()));
  } else {
    return js._putIfAbsent(js._jsProxies, o, dart.fn(o => new js._DartObject.new(o), dynamicTo_DartObject()));
  }
};
js._wrapDartFunction = function(f) {
  let wrapper = function() {
    let args = Array.prototype.map.call(arguments, js._convertToDart);
    return js._convertToJS(f(...args));
  };
  js._dartProxies.set(wrapper, f);
  return wrapper;
};
js._convertToDart = function(o) {
  if (o == null || typeof o == 'string' || typeof o == 'number' || typeof o == 'boolean' || dart.test(js._isBrowserType(o))) {
    return o;
  } else if (o instanceof Date) {
    let ms = o.getTime();
    return new core.DateTime.fromMillisecondsSinceEpoch(dart.asInt(ms));
  } else if (js._DartObject.is(o) && !core.identical(dart.getReifiedType(o), dart.jsobject)) {
    return o[_dartObj];
  } else {
    return js._wrapToDart(o);
  }
};
js._wrapToDart = function(o) {
  return js._putIfAbsent(js._dartProxies, o, dart.fn(js._wrapToDartHelper, dynamicToObject()));
};
js._wrapToDartHelper = function(o) {
  if (typeof o == "function") {
    return new js.JsFunction._fromJs(o);
  }
  if (o instanceof Array) {
    return new js.JsArray._fromJs(o);
  }
  return new js.JsObject._fromJs(o);
};
dart.defineLazy(js, {
  /*js._dartProxies*/get _dartProxies() {
    return new WeakMap();
  },
  /*js._jsProxies*/get _jsProxies() {
    return new WeakMap();
  }
});
js._putIfAbsent = function(weakMap, o, getValue) {
  let value = weakMap.get(o);
  if (value == null) {
    value = getValue(o);
    weakMap.set(o, value);
  }
  return value;
};
js.allowInterop = function(F, f) {
  return f;
};
dart.defineLazy(js, {
  /*js._interopCaptureThisExpando*/get _interopCaptureThisExpando() {
    return new (ExpandoOfFunction()).new();
  },
  set _interopCaptureThisExpando(_) {}
});
js.allowInteropCaptureThis = function(f) {
  let ret = js._interopCaptureThisExpando._get(f);
  if (ret == null) {
    ret = function() {
      let args = [this];
      for (let arg of arguments) {
        args.push(arg);
      }
      return f(...args);
    };
    js._interopCaptureThisExpando._set(f, ret);
  }
  return ret;
};
js_util.jsify = function(object) {
  if (!core.Map.is(object) && !core.Iterable.is(object)) {
    dart.throw(new core.ArgumentError.new("object must be a Map or Iterable"));
  }
  return js_util._convertDataTree(object);
};
js_util._convertDataTree = function(data) {
  let _convertedObjects = new _js_helper.IdentityMap.new();
  function _convert(o) {
    if (dart.test(_convertedObjects.containsKey(o))) {
      return _convertedObjects._get(o);
    }
    if (core.Map.is(o)) {
      let convertedMap = {};
      _convertedObjects._set(o, convertedMap);
      for (let key of o[$keys]) {
        convertedMap[key] = _convert(o[$_get](key));
      }
      return convertedMap;
    } else if (core.Iterable.is(o)) {
      let convertedList = [];
      _convertedObjects._set(o, convertedList);
      convertedList[$addAll](o[$map](dart.dynamic, _convert));
      return convertedList;
    } else {
      return o;
    }
  }
  dart.fn(_convert, dynamicTodynamic());
  return _convert(data);
};
js_util.newObject = function() {
  return {};
};
js_util.hasProperty = function(o, name) {
  return name in o;
};
js_util.getProperty = function(o, name) {
  return o[name];
};
js_util.setProperty = function(o, name, value) {
  return o[name] = value;
};
js_util.callMethod = function(o, method, args) {
  return o[method].apply(o, args);
};
js_util.instanceof = function(o, type) {
  return o instanceof type;
};
js_util.callConstructor = function(constr, arguments$0) {
  if (arguments$0 == null) {
    return new constr();
  }
  if (arguments$0 instanceof Array) {
    let argumentCount = arguments$0.length;
    switch (argumentCount) {
      case 0:
      {
        return new constr();
      }
      case 1:
      {
        let arg0 = arguments$0[0];
        return new constr(arg0);
      }
      case 2:
      {
        let arg0 = arguments$0[0];
        let arg1 = arguments$0[1];
        return new constr(arg0, arg1);
      }
      case 3:
      {
        let arg0 = arguments$0[0];
        let arg1 = arguments$0[1];
        let arg2 = arguments$0[2];
        return new constr(arg0, arg1, arg2);
      }
      case 4:
      {
        let arg0 = arguments$0[0];
        let arg1 = arguments$0[1];
        let arg2 = arguments$0[2];
        let arg3 = arguments$0[3];
        return new constr(arg0, arg1, arg2, arg3);
      }
    }
  }
  let args = [null];
  args[$addAll](arguments$0);
  let factoryFunction = constr.bind.apply(constr, args);
  String(factoryFunction);
  return new factoryFunction();
};
dart.defineLazy(math, {
  /*math.e*/get e() {
    return 2.718281828459045;
  },
  /*math.ln10*/get ln10() {
    return 2.302585092994046;
  },
  /*math.ln2*/get ln2() {
    return 0.6931471805599453;
  },
  /*math.log2e*/get log2e() {
    return 1.4426950408889634;
  },
  /*math.log10e*/get log10e() {
    return 0.4342944819032518;
  },
  /*math.pi*/get pi() {
    return 3.141592653589793;
  },
  /*math.sqrt1_2*/get sqrt1_2() {
    return 0.7071067811865476;
  },
  /*math.sqrt2*/get sqrt2() {
    return 1.4142135623730951;
  }
});
math.min = function(T, a, b) {
  if (a == null) dart.argumentError(a);
  if (b == null) dart.argumentError(b);
  return Math.min(a, b);
};
math.max = function(T, a, b) {
  if (a == null) dart.argumentError(a);
  if (b == null) dart.argumentError(b);
  return Math.max(a, b);
};
math.atan2 = function(a, b) {
  if (a == null) dart.argumentError(a);
  if (b == null) dart.argumentError(b);
  return Math.atan2(a, b);
};
math.pow = function(x, exponent) {
  if (x == null) dart.argumentError(x);
  if (exponent == null) dart.argumentError(exponent);
  return Math.pow(x, exponent);
};
math.sin = function(radians) {
  if (radians == null) dart.argumentError(radians);
  return Math.sin(radians);
};
math.cos = function(radians) {
  if (radians == null) dart.argumentError(radians);
  return Math.cos(radians);
};
math.tan = function(radians) {
  if (radians == null) dart.argumentError(radians);
  return Math.tan(radians);
};
math.acos = function(x) {
  if (x == null) dart.argumentError(x);
  return Math.acos(x);
};
math.asin = function(x) {
  if (x == null) dart.argumentError(x);
  return Math.asin(x);
};
math.atan = function(x) {
  if (x == null) dart.argumentError(x);
  return Math.atan(x);
};
math.sqrt = function(x) {
  if (x == null) dart.argumentError(x);
  return Math.sqrt(x);
};
math.exp = function(x) {
  if (x == null) dart.argumentError(x);
  return Math.exp(x);
};
math.log = function(x) {
  if (x == null) dart.argumentError(x);
  return Math.log(x);
};
dart.defineLazy(math, {
  /*math._POW2_32*/get _POW2_32() {
    return 4294967296;
  }
});
math._JSRandom = class _JSRandom extends core.Object {
  nextInt(max) {
    if (dart.notNull(max) <= 0 || dart.notNull(max) > 4294967296) {
      dart.throw(new core.RangeError.new("max must be in range 0 < max ≤ 2^32, was " + dart.str(max)));
    }
    return Math.random() * max >>> 0;
  }
  nextDouble() {
    return Math.random();
  }
  nextBool() {
    return Math.random() < 0.5;
  }
};
(math._JSRandom.new = function() {
}).prototype = math._JSRandom.prototype;
dart.addTypeTests(math._JSRandom);
math._JSRandom[dart.implements] = () => [math.Random];
dart.setMethodSignature(math._JSRandom, () => ({
  __proto__: dart.getMethods(math._JSRandom.__proto__),
  nextInt: dart.fnType(core.int, [core.int]),
  nextDouble: dart.fnType(core.double, []),
  nextBool: dart.fnType(core.bool, [])
}));
dart.setLibraryUri(math._JSRandom, "dart:math");
const _lo = dart.privateName(math, "_lo");
const _hi = dart.privateName(math, "_hi");
const _nextState = dart.privateName(math, "_nextState");
math._Random = class _Random extends core.Object {
  [_nextState]() {
    let tmpHi = 4294901760 * this[_lo];
    let tmpHiLo = (tmpHi & 4294967295) >>> 0;
    let tmpHiHi = tmpHi - tmpHiLo;
    let tmpLo = 55905 * this[_lo];
    let tmpLoLo = (tmpLo & 4294967295) >>> 0;
    let tmpLoHi = tmpLo - tmpLoLo;
    let newLo = tmpLoLo + tmpHiLo + this[_hi];
    this[_lo] = (newLo & 4294967295) >>> 0;
    let newLoHi = newLo - this[_lo];
    this[_hi] = (((tmpLoHi + tmpHiHi + newLoHi) / 4294967296)[$truncate]() & 4294967295) >>> 0;
    if (!(this[_lo] < 4294967296)) dart.assertFailed(null, "dart:math", 342, 12, "_lo < _POW2_32");
    if (!(this[_hi] < 4294967296)) dart.assertFailed(null, "dart:math", 343, 12, "_hi < _POW2_32");
  }
  nextInt(max) {
    if (max == null) dart.argumentError(max);
    if (max <= 0 || max > 4294967296) {
      dart.throw(new core.RangeError.new("max must be in range 0 < max ≤ 2^32, was " + dart.str(max)));
    }
    if ((max & max - 1) === 0) {
      this[_nextState]();
      return (this[_lo] & max - 1) >>> 0;
    }
    let rnd32 = null;
    let result = null;
    do {
      this[_nextState]();
      rnd32 = this[_lo];
      result = dart.asInt(rnd32[$remainder](max));
    } while (dart.notNull(rnd32) - dart.notNull(result) + max >= 4294967296);
    return result;
  }
  nextDouble() {
    this[_nextState]();
    let bits26 = (this[_lo] & (1 << 26) - 1) >>> 0;
    this[_nextState]();
    let bits27 = (this[_lo] & (1 << 27) - 1) >>> 0;
    return (bits26 * 134217728.0 + bits27) / 9007199254740992.0;
  }
  nextBool() {
    this[_nextState]();
    return (this[_lo] & 1) === 0;
  }
};
(math._Random.new = function(seed) {
  this[_lo] = 0;
  this[_hi] = 0;
  let empty_seed = 0;
  if (dart.notNull(seed) < 0) {
    empty_seed = -1;
  }
  do {
    let low = (dart.notNull(seed) & 4294967295) >>> 0;
    seed = ((dart.notNull(seed) - low) / 4294967296)[$truncate]();
    let high = (dart.notNull(seed) & 4294967295) >>> 0;
    seed = ((dart.notNull(seed) - high) / 4294967296)[$truncate]();
    let tmplow = low << 21 >>> 0;
    let tmphigh = (high << 21 | low[$rightShift](11)) >>> 0;
    tmplow = ((~low & 4294967295) >>> 0) + tmplow;
    low = (tmplow & 4294967295) >>> 0;
    high = ((~high >>> 0) + tmphigh + ((tmplow - low) / 4294967296)[$truncate]() & 4294967295) >>> 0;
    tmphigh = high[$rightShift](24);
    tmplow = (low[$rightShift](24) | high << 8) >>> 0;
    low = (low ^ tmplow) >>> 0;
    high = (high ^ tmphigh) >>> 0;
    tmplow = low * 265;
    low = (tmplow & 4294967295) >>> 0;
    high = (high * 265 + ((tmplow - low) / 4294967296)[$truncate]() & 4294967295) >>> 0;
    tmphigh = high[$rightShift](14);
    tmplow = (low[$rightShift](14) | high << 18) >>> 0;
    low = (low ^ tmplow) >>> 0;
    high = (high ^ tmphigh) >>> 0;
    tmplow = low * 21;
    low = (tmplow & 4294967295) >>> 0;
    high = (high * 21 + ((tmplow - low) / 4294967296)[$truncate]() & 4294967295) >>> 0;
    tmphigh = high[$rightShift](28);
    tmplow = (low[$rightShift](28) | high << 4) >>> 0;
    low = (low ^ tmplow) >>> 0;
    high = (high ^ tmphigh) >>> 0;
    tmplow = low << 31 >>> 0;
    tmphigh = (high << 31 | low[$rightShift](1)) >>> 0;
    tmplow = tmplow + low;
    low = (tmplow & 4294967295) >>> 0;
    high = (high + tmphigh + ((tmplow - low) / 4294967296)[$truncate]() & 4294967295) >>> 0;
    tmplow = this[_lo] * 1037;
    this[_lo] = (tmplow & 4294967295) >>> 0;
    this[_hi] = (this[_hi] * 1037 + ((tmplow - this[_lo]) / 4294967296)[$truncate]() & 4294967295) >>> 0;
    this[_lo] = (this[_lo] ^ low) >>> 0;
    this[_hi] = (this[_hi] ^ high) >>> 0;
  } while (seed !== empty_seed);
  if (this[_hi] === 0 && this[_lo] === 0) {
    this[_lo] = 23063;
  }
  this[_nextState]();
  this[_nextState]();
  this[_nextState]();
  this[_nextState]();
}).prototype = math._Random.prototype;
dart.addTypeTests(math._Random);
math._Random[dart.implements] = () => [math.Random];
dart.setMethodSignature(math._Random, () => ({
  __proto__: dart.getMethods(math._Random.__proto__),
  [_nextState]: dart.fnType(dart.void, []),
  nextInt: dart.fnType(core.int, [core.int]),
  nextDouble: dart.fnType(core.double, []),
  nextBool: dart.fnType(core.bool, [])
}));
dart.setLibraryUri(math._Random, "dart:math");
dart.setFieldSignature(math._Random, () => ({
  __proto__: dart.getFields(math._Random.__proto__),
  [_lo]: dart.fieldType(core.int),
  [_hi]: dart.fieldType(core.int)
}));
dart.defineLazy(math._Random, {
  /*math._Random._POW2_53_D*/get _POW2_53_D() {
    return 1.0 * 9007199254740992;
  },
  /*math._Random._POW2_27_D*/get _POW2_27_D() {
    return 1.0 * (1 << 27);
  },
  /*math._Random._MASK32*/get _MASK32() {
    return 4294967295;
  }
});
const _buffer$0 = dart.privateName(math, "_buffer");
const _getRandomBytes = dart.privateName(math, "_getRandomBytes");
math._JSSecureRandom = class _JSSecureRandom extends core.Object {
  [_getRandomBytes](start, length) {
    crypto.getRandomValues(this[_buffer$0][$buffer][$asUint8List](start, length));
  }
  nextBool() {
    this[_getRandomBytes](0, 1);
    return this[_buffer$0][$getUint8](0)[$isOdd];
  }
  nextDouble() {
    this[_getRandomBytes](1, 7);
    this[_buffer$0][$setUint8](0, 63);
    let highByte = this[_buffer$0][$getUint8](1);
    this[_buffer$0][$setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
    let result = dart.notNull(this[_buffer$0][$getFloat64](0)) - 1.0;
    if ((dart.notNull(highByte) & 16) !== 0) {
      result = result + 1.1102230246251565e-16;
    }
    return result;
  }
  nextInt(max) {
    if (max == null) dart.argumentError(max);
    if (max <= 0 || max > 4294967296) {
      dart.throw(new core.RangeError.new("max must be in range 0 < max ≤ 2^32, was " + dart.str(max)));
    }
    let byteCount = 1;
    if (max > 255) {
      byteCount++;
      if (max > 65535) {
        byteCount++;
        if (max > 16777215) {
          byteCount++;
        }
      }
    }
    this[_buffer$0][$setUint32](0, 0);
    let start = 4 - byteCount;
    let randomLimit = dart.asInt(math.pow(256, byteCount));
    while (true) {
      this[_getRandomBytes](start, byteCount);
      let random = this[_buffer$0][$getUint32](0);
      if ((max & max - 1) === 0) {
        return (dart.notNull(random) & max - 1) >>> 0;
      }
      let result = dart.asInt(random[$remainder](max));
      if (dart.notNull(random) - dart.notNull(result) + max < dart.notNull(randomLimit)) {
        return result;
      }
    }
  }
};
(math._JSSecureRandom.new = function() {
  this[_buffer$0] = typed_data.ByteData.new(8);
  let crypto = self.crypto;
  if (crypto != null) {
    let getRandomValues = crypto.getRandomValues;
    if (getRandomValues != null) {
      return;
    }
  }
  dart.throw(new core.UnsupportedError.new("No source of cryptographically secure random numbers available."));
}).prototype = math._JSSecureRandom.prototype;
dart.addTypeTests(math._JSSecureRandom);
math._JSSecureRandom[dart.implements] = () => [math.Random];
dart.setMethodSignature(math._JSSecureRandom, () => ({
  __proto__: dart.getMethods(math._JSSecureRandom.__proto__),
  [_getRandomBytes]: dart.fnType(dart.void, [core.int, core.int]),
  nextBool: dart.fnType(core.bool, []),
  nextDouble: dart.fnType(core.double, []),
  nextInt: dart.fnType(core.int, [core.int])
}));
dart.setLibraryUri(math._JSSecureRandom, "dart:math");
dart.setFieldSignature(math._JSSecureRandom, () => ({
  __proto__: dart.getFields(math._JSSecureRandom.__proto__),
  [_buffer$0]: dart.finalFieldType(typed_data.ByteData)
}));
math._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
  static combine(hash, value) {
    hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
    hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
    return (dart.notNull(hash) ^ hash[$rightShift](6)) >>> 0;
  }
  static finish(hash) {
    hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
    hash = (dart.notNull(hash) ^ hash[$rightShift](11)) >>> 0;
    return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
  }
  static hash2(a, b) {
    return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
  }
  static hash4(a, b, c, d) {
    return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
  }
};
(math._JenkinsSmiHash.new = function() {
}).prototype = math._JenkinsSmiHash.prototype;
dart.addTypeTests(math._JenkinsSmiHash);
dart.setLibraryUri(math._JenkinsSmiHash, "dart:math");
const _is_Point_default = Symbol('_is_Point_default');
math.Point$ = dart.generic(T => {
  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
  class Point extends core.Object {
    get x() {
      return this[x$];
    }
    set x(value) {
      super.x = value;
    }
    get y() {
      return this[y$];
    }
    set y(value) {
      super.y = value;
    }
    toString() {
      return "Point(" + dart.str(this.x) + ", " + dart.str(this.y) + ")";
    }
    _equals(other) {
      return PointOfnum().is(other) && this.x == other.x && this.y == other.y;
    }
    get hashCode() {
      return math._JenkinsSmiHash.hash2(dart.hashCode(this.x), dart.hashCode(this.y));
    }
    ['+'](other) {
      PointOfT()._check(other);
      return new (PointOfT()).new(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
    }
    ['-'](other) {
      PointOfT()._check(other);
      return new (PointOfT()).new(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
    }
    ['*'](factor) {
      return new (PointOfT()).new(dart.notNull(this.x) * dart.notNull(factor), dart.notNull(this.y) * dart.notNull(factor));
    }
    get magnitude() {
      return math.sqrt(dart.notNull(this.x) * dart.notNull(this.x) + dart.notNull(this.y) * dart.notNull(this.y));
    }
    distanceTo(other) {
      PointOfT()._check(other);
      let dx = dart.notNull(this.x) - dart.notNull(other.x);
      let dy = dart.notNull(this.y) - dart.notNull(other.y);
      return math.sqrt(dx * dx + dy * dy);
    }
    squaredDistanceTo(other) {
      PointOfT()._check(other);
      let dx = dart.notNull(this.x) - dart.notNull(other.x);
      let dy = dart.notNull(this.y) - dart.notNull(other.y);
      return dx * dx + dy * dy;
    }
  }
  (Point.new = function(x, y) {
    this[x$] = x;
    this[y$] = y;
  }).prototype = Point.prototype;
  dart.addTypeTests(Point);
  Point.prototype[_is_Point_default] = true;
  const x$ = Symbol("Point.x");
  const y$ = Symbol("Point.y");
  dart.setMethodSignature(Point, () => ({
    __proto__: dart.getMethods(Point.__proto__),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, []),
    _equals: dart.fnType(core.bool, [dart.dynamic]),
    [$_equals]: dart.fnType(core.bool, [dart.dynamic]),
    '+': dart.fnType(math.Point$(T), [core.Object]),
    '-': dart.fnType(math.Point$(T), [core.Object]),
    '*': dart.fnType(math.Point$(T), [core.num]),
    distanceTo: dart.fnType(core.double, [core.Object]),
    squaredDistanceTo: dart.fnType(T, [core.Object])
  }));
  dart.setGetterSignature(Point, () => ({
    __proto__: dart.getGetters(Point.__proto__),
    hashCode: core.int,
    [$hashCode]: core.int,
    magnitude: core.double
  }));
  dart.setLibraryUri(Point, "dart:math");
  dart.setFieldSignature(Point, () => ({
    __proto__: dart.getFields(Point.__proto__),
    x: dart.finalFieldType(T),
    y: dart.finalFieldType(T)
  }));
  dart.defineExtensionMethods(Point, ['toString', '_equals']);
  dart.defineExtensionAccessors(Point, ['hashCode']);
  return Point;
});
math.Point = math.Point$();
dart.addTypeTests(math.Point, _is_Point_default);
let const$77;
math.Random = class Random extends core.Object {
  static new(seed) {
    if (seed === void 0) seed = null;
    return seed == null ? const$77 || (const$77 = dart.const(new math._JSRandom.new())) : new math._Random.new(seed);
  }
  static secure() {
    let t = math.Random._secureRandom;
    return t == null ? math.Random._secureRandom = new math._JSSecureRandom.new() : t;
  }
};
(math.Random[dart.mixinNew] = function() {
}).prototype = math.Random.prototype;
dart.addTypeTests(math.Random);
dart.setLibraryUri(math.Random, "dart:math");
dart.defineLazy(math.Random, {
  /*math.Random._secureRandom*/get _secureRandom() {
    return null;
  },
  set _secureRandom(_) {}
});
const _is__RectangleBase_default = Symbol('_is__RectangleBase_default');
math._RectangleBase$ = dart.generic(T => {
  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
  class _RectangleBase extends core.Object {
    get right() {
      return dart.notNull(this[$left]) + dart.notNull(this[$width]);
    }
    get bottom() {
      return dart.notNull(this[$top]) + dart.notNull(this[$height]);
    }
    toString() {
      return "Rectangle (" + dart.str(this[$left]) + ", " + dart.str(this[$top]) + ") " + dart.str(this[$width]) + " x " + dart.str(this[$height]);
    }
    _equals(other) {
      return RectangleOfnum().is(other) && this[$left] == other[$left] && this[$top] == other[$top] && this[$right] == other[$right] && this[$bottom] == other[$bottom];
    }
    get hashCode() {
      return math._JenkinsSmiHash.hash4(dart.hashCode(this[$left]), dart.hashCode(this[$top]), dart.hashCode(this[$right]), dart.hashCode(this[$bottom]));
    }
    intersection(other) {
      RectangleOfT()._check(other);
      let x0 = math.max(T, this[$left], other[$left]);
      let x1 = math.min(T, dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(other[$left]) + dart.notNull(other[$width]));
      if (x0 <= x1) {
        let y0 = math.max(T, this[$top], other[$top]);
        let y1 = math.min(T, dart.notNull(this[$top]) + dart.notNull(this[$height]), dart.notNull(other[$top]) + dart.notNull(other[$height]));
        if (y0 <= y1) {
          return new (RectangleOfT()).new(x0, y0, x1 - x0, y1 - y0);
        }
      }
      return null;
    }
    intersects(other) {
      return dart.notNull(this[$left]) <= dart.notNull(other[$left]) + dart.notNull(other[$width]) && dart.notNull(other[$left]) <= dart.notNull(this[$left]) + dart.notNull(this[$width]) && dart.notNull(this[$top]) <= dart.notNull(other[$top]) + dart.notNull(other[$height]) && dart.notNull(other[$top]) <= dart.notNull(this[$top]) + dart.notNull(this[$height]);
    }
    boundingBox(other) {
      RectangleOfT()._check(other);
      let right = math.max(T, dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(other[$left]) + dart.notNull(other[$width]));
      let bottom = math.max(T, dart.notNull(this[$top]) + dart.notNull(this[$height]), dart.notNull(other[$top]) + dart.notNull(other[$height]));
      let left = math.min(T, this[$left], other[$left]);
      let top = math.min(T, this[$top], other[$top]);
      return new (RectangleOfT()).new(left, top, right - left, bottom - top);
    }
    containsRectangle(another) {
      return dart.notNull(this[$left]) <= dart.notNull(another[$left]) && dart.notNull(this[$left]) + dart.notNull(this[$width]) >= dart.notNull(another[$left]) + dart.notNull(another[$width]) && dart.notNull(this[$top]) <= dart.notNull(another[$top]) && dart.notNull(this[$top]) + dart.notNull(this[$height]) >= dart.notNull(another[$top]) + dart.notNull(another[$height]);
    }
    containsPoint(another) {
      return dart.notNull(another.x) >= dart.notNull(this[$left]) && dart.notNull(another.x) <= dart.notNull(this[$left]) + dart.notNull(this[$width]) && dart.notNull(another.y) >= dart.notNull(this[$top]) && dart.notNull(another.y) <= dart.notNull(this[$top]) + dart.notNull(this[$height]);
    }
    get topLeft() {
      return new (PointOfT()).new(this[$left], this[$top]);
    }
    get topRight() {
      return new (PointOfT()).new(dart.notNull(this[$left]) + dart.notNull(this[$width]), this[$top]);
    }
    get bottomRight() {
      return new (PointOfT()).new(dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(this[$top]) + dart.notNull(this[$height]));
    }
    get bottomLeft() {
      return new (PointOfT()).new(this[$left], dart.notNull(this[$top]) + dart.notNull(this[$height]));
    }
  }
  (_RectangleBase.new = function() {
  }).prototype = _RectangleBase.prototype;
  dart.addTypeTests(_RectangleBase);
  _RectangleBase.prototype[_is__RectangleBase_default] = true;
  dart.setMethodSignature(_RectangleBase, () => ({
    __proto__: dart.getMethods(_RectangleBase.__proto__),
    toString: dart.fnType(core.String, []),
    [$toString]: dart.fnType(core.String, []),
    _equals: dart.fnType(core.bool, [dart.dynamic]),
    [$_equals]: dart.fnType(core.bool, [dart.dynamic]),
    intersection: dart.fnType(math.Rectangle$(T), [core.Object]),
    [$intersection]: dart.fnType(math.Rectangle$(T), [core.Object]),
    intersects: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
    [$intersects]: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
    boundingBox: dart.fnType(math.Rectangle$(T), [core.Object]),
    [$boundingBox]: dart.fnType(math.Rectangle$(T), [core.Object]),
    containsRectangle: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
    [$containsRectangle]: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
    containsPoint: dart.fnType(core.bool, [math.Point$(core.num)]),
    [$containsPoint]: dart.fnType(core.bool, [math.Point$(core.num)])
  }));
  dart.setGetterSignature(_RectangleBase, () => ({
    __proto__: dart.getGetters(_RectangleBase.__proto__),
    right: T,
    [$right]: T,
    bottom: T,
    [$bottom]: T,
    hashCode: core.int,
    [$hashCode]: core.int,
    topLeft: math.Point$(T),
    [$topLeft]: math.Point$(T),
    topRight: math.Point$(T),
    [$topRight]: math.Point$(T),
    bottomRight: math.Point$(T),
    [$bottomRight]: math.Point$(T),
    bottomLeft: math.Point$(T),
    [$bottomLeft]: math.Point$(T)
  }));
  dart.setLibraryUri(_RectangleBase, "dart:math");
  dart.defineExtensionMethods(_RectangleBase, [
    'toString',
    '_equals',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint'
  ]);
  dart.defineExtensionAccessors(_RectangleBase, [
    'right',
    'bottom',
    'hashCode',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft'
  ]);
  return _RectangleBase;
});
math._RectangleBase = math._RectangleBase$();
dart.addTypeTests(math._RectangleBase, _is__RectangleBase_default);
const _is_Rectangle_default = Symbol('_is_Rectangle_default');
math.Rectangle$ = dart.generic(T => {
  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
  class Rectangle extends math._RectangleBase$(T) {
    get left() {
      return this[left$];
    }
    set left(value) {
      super.left = value;
    }
    get top() {
      return this[top$];
    }
    set top(value) {
      super.top = value;
    }
    get width() {
      return this[width$];
    }
    set width(value) {
      super.width = value;
    }
    get height() {
      return this[height$];
    }
    set height(value) {
      super.height = value;
    }
    static fromPoints(a, b) {
      let left = math.min(T, a.x, b.x);
      let width = math.max(T, a.x, b.x) - left;
      let top = math.min(T, a.y, b.y);
      let height = math.max(T, a.y, b.y) - top;
      return new (RectangleOfT()).new(left, top, width, height);
    }
  }
  (Rectangle.new = function(left, top, width, height) {
    this[left$] = left;
    this[top$] = top;
    this[width$] = dart.notNull(width) < 0 ? -dart.notNull(width) * 0 : width;
    this[height$] = dart.notNull(height) < 0 ? -dart.notNull(height) * 0 : height;
    Rectangle.__proto__.new.call(this);
  }).prototype = Rectangle.prototype;
  dart.addTypeTests(Rectangle);
  Rectangle.prototype[_is_Rectangle_default] = true;
  const left$ = Symbol("Rectangle.left");
  const top$ = Symbol("Rectangle.top");
  const width$ = Symbol("Rectangle.width");
  const height$ = Symbol("Rectangle.height");
  dart.setLibraryUri(Rectangle, "dart:math");
  dart.setFieldSignature(Rectangle, () => ({
    __proto__: dart.getFields(Rectangle.__proto__),
    left: dart.finalFieldType(T),
    top: dart.finalFieldType(T),
    width: dart.finalFieldType(T),
    height: dart.finalFieldType(T)
  }));
  dart.defineExtensionAccessors(Rectangle, ['left', 'top', 'width', 'height']);
  return Rectangle;
});
math.Rectangle = math.Rectangle$();
dart.addTypeTests(math.Rectangle, _is_Rectangle_default);
const _width = dart.privateName(math, "_width");
const _height = dart.privateName(math, "_height");
const _is_MutableRectangle_default = Symbol('_is_MutableRectangle_default');
math.MutableRectangle$ = dart.generic(T => {
  let MutableRectangleOfT = () => (MutableRectangleOfT = dart.constFn(math.MutableRectangle$(T)))();
  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
  class MutableRectangle extends math._RectangleBase$(T) {
    get left() {
      return this[left$];
    }
    set left(value) {
      this[left$] = T._check(value);
    }
    get top() {
      return this[top$];
    }
    set top(value) {
      this[top$] = T._check(value);
    }
    static fromPoints(a, b) {
      let left = math.min(T, a.x, b.x);
      let width = math.max(T, a.x, b.x) - left;
      let top = math.min(T, a.y, b.y);
      let height = math.max(T, a.y, b.y) - top;
      return new (MutableRectangleOfT()).new(left, top, width, height);
    }
    get width() {
      return this[_width];
    }
    set width(width) {
      T._check(width);
      if (dart.notNull(width) < 0) width = math._clampToZero(T, width);
      this[_width] = width;
    }
    get height() {
      return this[_height];
    }
    set height(height) {
      T._check(height);
      if (dart.notNull(height) < 0) height = math._clampToZero(T, height);
      this[_height] = height;
    }
  }
  (MutableRectangle.new = function(left, top, width, height) {
    this[left$] = left;
    this[top$] = top;
    this[_width] = dart.notNull(width) < 0 ? math._clampToZero(T, width) : width;
    this[_height] = dart.notNull(height) < 0 ? math._clampToZero(T, height) : height;
    MutableRectangle.__proto__.new.call(this);
  }).prototype = MutableRectangle.prototype;
  dart.addTypeTests(MutableRectangle);
  MutableRectangle.prototype[_is_MutableRectangle_default] = true;
  const left$ = Symbol("MutableRectangle.left");
  const top$ = Symbol("MutableRectangle.top");
  MutableRectangle[dart.implements] = () => [RectangleOfT()];
  dart.setGetterSignature(MutableRectangle, () => ({
    __proto__: dart.getGetters(MutableRectangle.__proto__),
    width: T,
    [$width]: T,
    height: T,
    [$height]: T
  }));
  dart.setSetterSignature(MutableRectangle, () => ({
    __proto__: dart.getSetters(MutableRectangle.__proto__),
    width: T,
    [$width]: T,
    height: T,
    [$height]: T
  }));
  dart.setLibraryUri(MutableRectangle, "dart:math");
  dart.setFieldSignature(MutableRectangle, () => ({
    __proto__: dart.getFields(MutableRectangle.__proto__),
    left: dart.fieldType(T),
    top: dart.fieldType(T),
    [_width]: dart.fieldType(T),
    [_height]: dart.fieldType(T)
  }));
  dart.defineExtensionAccessors(MutableRectangle, ['width', 'height', 'left', 'top']);
  return MutableRectangle;
});
math.MutableRectangle = math.MutableRectangle$();
dart.addTypeTests(math.MutableRectangle, _is_MutableRectangle_default);
math._clampToZero = function(T, value) {
  if (!(dart.notNull(value) < 0)) dart.assertFailed(null, "dart:math/rectangle.dart", 245, 10, "value < 0");
  return -dart.notNull(value) * 0;
};
mirrors.MirrorSystem = class MirrorSystem extends core.Object {
  findLibrary(libraryName) {
    return this.libraries[$values][$singleWhere](dart.fn(library => dart.equals(library.simpleName, libraryName), LibraryMirrorTobool()));
  }
  static getName(symbol) {
    return _js_mirrors.getName(symbol);
  }
  static getSymbol(name, library) {
    if (library === void 0) library = null;
    return _js_mirrors.getSymbol(name, library);
  }
};
(mirrors.MirrorSystem.new = function() {
}).prototype = mirrors.MirrorSystem.prototype;
dart.addTypeTests(mirrors.MirrorSystem);
dart.setMethodSignature(mirrors.MirrorSystem, () => ({
  __proto__: dart.getMethods(mirrors.MirrorSystem.__proto__),
  findLibrary: dart.fnType(mirrors.LibraryMirror, [core.Symbol])
}));
dart.setLibraryUri(mirrors.MirrorSystem, "dart:mirrors");
mirrors.currentMirrorSystem = function() {
  return _js_mirrors.currentJsMirrorSystem;
};
mirrors.reflect = function(reflectee) {
  return _js_mirrors.reflect(reflectee);
};
mirrors.reflectClass = function(key) {
  if (!core.Type.is(key) || dart.equals(key, dart.wrapType(dart.dynamic))) {
    dart.throw(new core.ArgumentError.new(dart.str(key) + " does not denote a class"));
  }
  let tm = mirrors.reflectType(key);
  if (!mirrors.ClassMirror.is(tm)) {
    dart.throw(new core.ArgumentError.new(dart.str(key) + " does not denote a class"));
  }
  return mirrors.ClassMirror._check(mirrors.ClassMirror.as(tm).originalDeclaration);
};
mirrors.reflectType = function(type, typeArguments) {
  if (typeArguments === void 0) typeArguments = null;
  if (typeArguments != null) {
    type = mirrors._instantiateClass(type, typeArguments);
  }
  return _js_mirrors.reflectType(type);
};
mirrors.Mirror = class Mirror extends core.Object {};
(mirrors.Mirror.new = function() {
}).prototype = mirrors.Mirror.prototype;
dart.addTypeTests(mirrors.Mirror);
dart.setLibraryUri(mirrors.Mirror, "dart:mirrors");
mirrors.IsolateMirror = class IsolateMirror extends core.Object {};
(mirrors.IsolateMirror.new = function() {
}).prototype = mirrors.IsolateMirror.prototype;
dart.addTypeTests(mirrors.IsolateMirror);
mirrors.IsolateMirror[dart.implements] = () => [mirrors.Mirror];
dart.setLibraryUri(mirrors.IsolateMirror, "dart:mirrors");
mirrors.DeclarationMirror = class DeclarationMirror extends core.Object {};
(mirrors.DeclarationMirror.new = function() {
}).prototype = mirrors.DeclarationMirror.prototype;
dart.addTypeTests(mirrors.DeclarationMirror);
mirrors.DeclarationMirror[dart.implements] = () => [mirrors.Mirror];
dart.setLibraryUri(mirrors.DeclarationMirror, "dart:mirrors");
mirrors.ObjectMirror = class ObjectMirror extends core.Object {};
(mirrors.ObjectMirror.new = function() {
}).prototype = mirrors.ObjectMirror.prototype;
dart.addTypeTests(mirrors.ObjectMirror);
mirrors.ObjectMirror[dart.implements] = () => [mirrors.Mirror];
dart.setLibraryUri(mirrors.ObjectMirror, "dart:mirrors");
mirrors.InstanceMirror = class InstanceMirror extends core.Object {};
(mirrors.InstanceMirror.new = function() {
}).prototype = mirrors.InstanceMirror.prototype;
dart.addTypeTests(mirrors.InstanceMirror);
mirrors.InstanceMirror[dart.implements] = () => [mirrors.ObjectMirror];
dart.setLibraryUri(mirrors.InstanceMirror, "dart:mirrors");
mirrors.ClosureMirror = class ClosureMirror extends core.Object {};
(mirrors.ClosureMirror.new = function() {
}).prototype = mirrors.ClosureMirror.prototype;
dart.addTypeTests(mirrors.ClosureMirror);
mirrors.ClosureMirror[dart.implements] = () => [mirrors.InstanceMirror];
dart.setLibraryUri(mirrors.ClosureMirror, "dart:mirrors");
mirrors.LibraryMirror = class LibraryMirror extends core.Object {};
(mirrors.LibraryMirror.new = function() {
}).prototype = mirrors.LibraryMirror.prototype;
dart.addTypeTests(mirrors.LibraryMirror);
mirrors.LibraryMirror[dart.implements] = () => [mirrors.DeclarationMirror, mirrors.ObjectMirror];
dart.setLibraryUri(mirrors.LibraryMirror, "dart:mirrors");
mirrors.LibraryDependencyMirror = class LibraryDependencyMirror extends core.Object {};
(mirrors.LibraryDependencyMirror.new = function() {
}).prototype = mirrors.LibraryDependencyMirror.prototype;
dart.addTypeTests(mirrors.LibraryDependencyMirror);
mirrors.LibraryDependencyMirror[dart.implements] = () => [mirrors.Mirror];
dart.setLibraryUri(mirrors.LibraryDependencyMirror, "dart:mirrors");
mirrors.CombinatorMirror = class CombinatorMirror extends core.Object {};
(mirrors.CombinatorMirror.new = function() {
}).prototype = mirrors.CombinatorMirror.prototype;
dart.addTypeTests(mirrors.CombinatorMirror);
mirrors.CombinatorMirror[dart.implements] = () => [mirrors.Mirror];
dart.setLibraryUri(mirrors.CombinatorMirror, "dart:mirrors");
mirrors.TypeMirror = class TypeMirror extends core.Object {};
(mirrors.TypeMirror.new = function() {
}).prototype = mirrors.TypeMirror.prototype;
dart.addTypeTests(mirrors.TypeMirror);
mirrors.TypeMirror[dart.implements] = () => [mirrors.DeclarationMirror];
dart.setLibraryUri(mirrors.TypeMirror, "dart:mirrors");
mirrors.ClassMirror = class ClassMirror extends core.Object {};
(mirrors.ClassMirror.new = function() {
}).prototype = mirrors.ClassMirror.prototype;
dart.addTypeTests(mirrors.ClassMirror);
mirrors.ClassMirror[dart.implements] = () => [mirrors.TypeMirror, mirrors.ObjectMirror];
dart.setLibraryUri(mirrors.ClassMirror, "dart:mirrors");
mirrors.FunctionTypeMirror = class FunctionTypeMirror extends core.Object {};
(mirrors.FunctionTypeMirror.new = function() {
}).prototype = mirrors.FunctionTypeMirror.prototype;
dart.addTypeTests(mirrors.FunctionTypeMirror);
mirrors.FunctionTypeMirror[dart.implements] = () => [mirrors.ClassMirror];
dart.setLibraryUri(mirrors.FunctionTypeMirror, "dart:mirrors");
mirrors.TypeVariableMirror = class TypeVariableMirror extends mirrors.TypeMirror {};
(mirrors.TypeVariableMirror.new = function() {
}).prototype = mirrors.TypeVariableMirror.prototype;
dart.addTypeTests(mirrors.TypeVariableMirror);
dart.setLibraryUri(mirrors.TypeVariableMirror, "dart:mirrors");
mirrors.TypedefMirror = class TypedefMirror extends core.Object {};
(mirrors.TypedefMirror.new = function() {
}).prototype = mirrors.TypedefMirror.prototype;
dart.addTypeTests(mirrors.TypedefMirror);
mirrors.TypedefMirror[dart.implements] = () => [mirrors.TypeMirror];
dart.setLibraryUri(mirrors.TypedefMirror, "dart:mirrors");
mirrors.MethodMirror = class MethodMirror extends core.Object {};
(mirrors.MethodMirror.new = function() {
}).prototype = mirrors.MethodMirror.prototype;
dart.addTypeTests(mirrors.MethodMirror);
mirrors.MethodMirror[dart.implements] = () => [mirrors.DeclarationMirror];
dart.setLibraryUri(mirrors.MethodMirror, "dart:mirrors");
mirrors.VariableMirror = class VariableMirror extends core.Object {};
(mirrors.VariableMirror.new = function() {
}).prototype = mirrors.VariableMirror.prototype;
dart.addTypeTests(mirrors.VariableMirror);
mirrors.VariableMirror[dart.implements] = () => [mirrors.DeclarationMirror];
dart.setLibraryUri(mirrors.VariableMirror, "dart:mirrors");
mirrors.ParameterMirror = class ParameterMirror extends core.Object {};
(mirrors.ParameterMirror.new = function() {
}).prototype = mirrors.ParameterMirror.prototype;
dart.addTypeTests(mirrors.ParameterMirror);
mirrors.ParameterMirror[dart.implements] = () => [mirrors.VariableMirror];
dart.setLibraryUri(mirrors.ParameterMirror, "dart:mirrors");
mirrors.SourceLocation = class SourceLocation extends core.Object {};
(mirrors.SourceLocation.new = function() {
}).prototype = mirrors.SourceLocation.prototype;
dart.addTypeTests(mirrors.SourceLocation);
dart.setLibraryUri(mirrors.SourceLocation, "dart:mirrors");
mirrors.Comment = class Comment extends core.Object {
  get text() {
    return this[text$];
  }
  set text(value) {
    super.text = value;
  }
  get trimmedText() {
    return this[trimmedText$];
  }
  set trimmedText(value) {
    super.trimmedText = value;
  }
  get isDocComment() {
    return this[isDocComment$];
  }
  set isDocComment(value) {
    super.isDocComment = value;
  }
};
(mirrors.Comment.new = function(text, trimmedText, isDocComment) {
  this[text$] = text;
  this[trimmedText$] = trimmedText;
  this[isDocComment$] = isDocComment;
}).prototype = mirrors.Comment.prototype;
dart.addTypeTests(mirrors.Comment);
const text$ = Symbol("Comment.text");
const trimmedText$ = Symbol("Comment.trimmedText");
const isDocComment$ = Symbol("Comment.isDocComment");
dart.setLibraryUri(mirrors.Comment, "dart:mirrors");
dart.setFieldSignature(mirrors.Comment, () => ({
  __proto__: dart.getFields(mirrors.Comment.__proto__),
  text: dart.finalFieldType(core.String),
  trimmedText: dart.finalFieldType(core.String),
  isDocComment: dart.finalFieldType(core.bool)
}));
mirrors.MirrorsUsed = class MirrorsUsed extends core.Object {
  get symbols() {
    return this[symbols$];
  }
  set symbols(value) {
    super.symbols = value;
  }
  get targets() {
    return this[targets$];
  }
  set targets(value) {
    super.targets = value;
  }
  get metaTargets() {
    return this[metaTargets$];
  }
  set metaTargets(value) {
    super.metaTargets = value;
  }
  get override() {
    return this[override$];
  }
  set override(value) {
    super.override = value;
  }
};
(mirrors.MirrorsUsed.new = function(opts) {
  let symbols = opts && 'symbols' in opts ? opts.symbols : null;
  let targets = opts && 'targets' in opts ? opts.targets : null;
  let metaTargets = opts && 'metaTargets' in opts ? opts.metaTargets : null;
  let override = opts && 'override' in opts ? opts.override : null;
  this[symbols$] = symbols;
  this[targets$] = targets;
  this[metaTargets$] = metaTargets;
  this[override$] = override;
}).prototype = mirrors.MirrorsUsed.prototype;
dart.addTypeTests(mirrors.MirrorsUsed);
const symbols$ = Symbol("MirrorsUsed.symbols");
const targets$ = Symbol("MirrorsUsed.targets");
const metaTargets$ = Symbol("MirrorsUsed.metaTargets");
const override$ = Symbol("MirrorsUsed.override");
dart.setLibraryUri(mirrors.MirrorsUsed, "dart:mirrors");
dart.setFieldSignature(mirrors.MirrorsUsed, () => ({
  __proto__: dart.getFields(mirrors.MirrorsUsed.__proto__),
  symbols: dart.finalFieldType(dart.dynamic),
  targets: dart.finalFieldType(dart.dynamic),
  metaTargets: dart.finalFieldType(dart.dynamic),
  override: dart.finalFieldType(dart.dynamic)
}));
mirrors._instantiateClass = function(type, typeArguments) {
  let unwrapped = dart.unwrapType(type);
  let genericClass = dart.getGenericClass(unwrapped);
  if (genericClass == null) {
    dart.throw(new core.ArgumentError.new("Type `" + dart.str(type) + "` must be generic to apply " + ("type arguments: `" + dart.str(typeArguments) + "`.")));
  }
  let typeArgsLenth = typeArguments[$length];
  let unwrappedArgs = core.List.new(typeArgsLenth);
  for (let i = 0; i < dart.notNull(typeArgsLenth); i++) {
    unwrappedArgs[$_set](i, dart.unwrapType(typeArguments[$_get](i)));
  }
  let typeFormals = dart.getGenericTypeFormals(genericClass);
  if (typeFormals[$length] != typeArgsLenth) {
    dart.throw(new core.ArgumentError.new("Type `" + dart.str(type) + "` has " + dart.str(typeFormals[$length]) + " type " + ("parameters, but " + dart.str(typeArgsLenth) + " type arguments were ") + ("passed: `" + dart.str(typeArguments) + "`.")));
  }
  return dart.wrapType(dart.instantiateClass(genericClass, unwrappedArgs));
};
typed_data.ByteBuffer = class ByteBuffer extends core.Object {};
(typed_data.ByteBuffer.new = function() {
}).prototype = typed_data.ByteBuffer.prototype;
dart.addTypeTests(typed_data.ByteBuffer);
dart.setLibraryUri(typed_data.ByteBuffer, "dart:typed_data");
typed_data.TypedData = class TypedData extends core.Object {};
(typed_data.TypedData.new = function() {
}).prototype = typed_data.TypedData.prototype;
dart.addTypeTests(typed_data.TypedData);
dart.setLibraryUri(typed_data.TypedData, "dart:typed_data");
typed_data._TypedIntList = class _TypedIntList extends typed_data.TypedData {};
(typed_data._TypedIntList.new = function() {
}).prototype = typed_data._TypedIntList.prototype;
dart.addTypeTests(typed_data._TypedIntList);
dart.setLibraryUri(typed_data._TypedIntList, "dart:typed_data");
typed_data._TypedFloatList = class _TypedFloatList extends typed_data.TypedData {};
(typed_data._TypedFloatList.new = function() {
}).prototype = typed_data._TypedFloatList.prototype;
dart.addTypeTests(typed_data._TypedFloatList);
dart.setLibraryUri(typed_data._TypedFloatList, "dart:typed_data");
const _littleEndian = dart.privateName(typed_data, "_littleEndian");
typed_data.Endian = class Endian extends core.Object {};
(typed_data.Endian.__ = function(littleEndian) {
  this[_littleEndian] = littleEndian;
}).prototype = typed_data.Endian.prototype;
dart.addTypeTests(typed_data.Endian);
dart.setLibraryUri(typed_data.Endian, "dart:typed_data");
dart.setFieldSignature(typed_data.Endian, () => ({
  __proto__: dart.getFields(typed_data.Endian.__proto__),
  [_littleEndian]: dart.finalFieldType(core.bool)
}));
dart.defineLazy(typed_data.Endian, {
  /*typed_data.Endian.big*/get big() {
    return dart.const(new typed_data.Endian.__(false));
  },
  /*typed_data.Endian.little*/get little() {
    return dart.const(new typed_data.Endian.__(true));
  },
  /*typed_data.Endian.host*/get host() {
    return typed_data.ByteData.view(typed_data.Uint16List.fromList(JSArrayOfint().of([1]))[$buffer])[$getInt8](0) === 1 ? typed_data.Endian.little : typed_data.Endian.big;
  }
});
typed_data.ByteData = class ByteData extends core.Object {
  static new(length) {
    return _native_typed_data.NativeByteData.new(length);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asByteData](offsetInBytes, length);
  }
};
(typed_data.ByteData[dart.mixinNew] = function() {
}).prototype = typed_data.ByteData.prototype;
dart.addTypeTests(typed_data.ByteData);
typed_data.ByteData[dart.implements] = () => [typed_data.TypedData];
dart.setLibraryUri(typed_data.ByteData, "dart:typed_data");
typed_data.Int8List = class Int8List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeInt8List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt8List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asInt8List](offsetInBytes, length);
  }
};
(typed_data.Int8List[dart.mixinNew] = function() {
}).prototype = typed_data.Int8List.prototype;
typed_data.Int8List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Int8List);
typed_data.Int8List[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Int8List, "dart:typed_data");
dart.defineLazy(typed_data.Int8List, {
  /*typed_data.Int8List.bytesPerElement*/get bytesPerElement() {
    return 1;
  }
});
typed_data.Uint8List = class Uint8List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeUint8List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint8List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asUint8List](offsetInBytes, length);
  }
};
(typed_data.Uint8List[dart.mixinNew] = function() {
}).prototype = typed_data.Uint8List.prototype;
typed_data.Uint8List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Uint8List);
typed_data.Uint8List[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Uint8List, "dart:typed_data");
dart.defineLazy(typed_data.Uint8List, {
  /*typed_data.Uint8List.bytesPerElement*/get bytesPerElement() {
    return 1;
  }
});
typed_data.Uint8ClampedList = class Uint8ClampedList extends core.Object {
  static new(length) {
    return _native_typed_data.NativeUint8ClampedList.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint8ClampedList.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asUint8ClampedList](offsetInBytes, length);
  }
};
(typed_data.Uint8ClampedList[dart.mixinNew] = function() {
}).prototype = typed_data.Uint8ClampedList.prototype;
typed_data.Uint8ClampedList.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Uint8ClampedList);
typed_data.Uint8ClampedList[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Uint8ClampedList, "dart:typed_data");
dart.defineLazy(typed_data.Uint8ClampedList, {
  /*typed_data.Uint8ClampedList.bytesPerElement*/get bytesPerElement() {
    return 1;
  }
});
typed_data.Int16List = class Int16List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeInt16List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt16List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asInt16List](offsetInBytes, length);
  }
};
(typed_data.Int16List[dart.mixinNew] = function() {
}).prototype = typed_data.Int16List.prototype;
typed_data.Int16List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Int16List);
typed_data.Int16List[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Int16List, "dart:typed_data");
dart.defineLazy(typed_data.Int16List, {
  /*typed_data.Int16List.bytesPerElement*/get bytesPerElement() {
    return 2;
  }
});
typed_data.Uint16List = class Uint16List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeUint16List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint16List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asUint16List](offsetInBytes, length);
  }
};
(typed_data.Uint16List[dart.mixinNew] = function() {
}).prototype = typed_data.Uint16List.prototype;
typed_data.Uint16List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Uint16List);
typed_data.Uint16List[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Uint16List, "dart:typed_data");
dart.defineLazy(typed_data.Uint16List, {
  /*typed_data.Uint16List.bytesPerElement*/get bytesPerElement() {
    return 2;
  }
});
typed_data.Int32List = class Int32List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeInt32List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt32List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asInt32List](offsetInBytes, length);
  }
};
(typed_data.Int32List[dart.mixinNew] = function() {
}).prototype = typed_data.Int32List.prototype;
typed_data.Int32List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Int32List);
typed_data.Int32List[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Int32List, "dart:typed_data");
dart.defineLazy(typed_data.Int32List, {
  /*typed_data.Int32List.bytesPerElement*/get bytesPerElement() {
    return 4;
  }
});
typed_data.Uint32List = class Uint32List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeUint32List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeUint32List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asUint32List](offsetInBytes, length);
  }
};
(typed_data.Uint32List[dart.mixinNew] = function() {
}).prototype = typed_data.Uint32List.prototype;
typed_data.Uint32List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Uint32List);
typed_data.Uint32List[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Uint32List, "dart:typed_data");
dart.defineLazy(typed_data.Uint32List, {
  /*typed_data.Uint32List.bytesPerElement*/get bytesPerElement() {
    return 4;
  }
});
typed_data.Int64List = class Int64List extends core.Object {
  static new(length) {
    dart.throw(new core.UnsupportedError.new("Int64List not supported by dart2js."));
  }
  static fromList(elements) {
    dart.throw(new core.UnsupportedError.new("Int64List not supported by dart2js."));
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asInt64List](offsetInBytes, length);
  }
};
(typed_data.Int64List[dart.mixinNew] = function() {
}).prototype = typed_data.Int64List.prototype;
typed_data.Int64List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Int64List);
typed_data.Int64List[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Int64List, "dart:typed_data");
dart.defineLazy(typed_data.Int64List, {
  /*typed_data.Int64List.bytesPerElement*/get bytesPerElement() {
    return 8;
  }
});
typed_data.Uint64List = class Uint64List extends core.Object {
  static new(length) {
    dart.throw(new core.UnsupportedError.new("Uint64List not supported by dart2js."));
  }
  static fromList(elements) {
    dart.throw(new core.UnsupportedError.new("Uint64List not supported by dart2js."));
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asUint64List](offsetInBytes, length);
  }
};
(typed_data.Uint64List[dart.mixinNew] = function() {
}).prototype = typed_data.Uint64List.prototype;
typed_data.Uint64List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Uint64List);
typed_data.Uint64List[dart.implements] = () => [ListOfint(), typed_data._TypedIntList];
dart.setLibraryUri(typed_data.Uint64List, "dart:typed_data");
dart.defineLazy(typed_data.Uint64List, {
  /*typed_data.Uint64List.bytesPerElement*/get bytesPerElement() {
    return 8;
  }
});
typed_data.Float32List = class Float32List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeFloat32List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat32List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asFloat32List](offsetInBytes, length);
  }
};
(typed_data.Float32List[dart.mixinNew] = function() {
}).prototype = typed_data.Float32List.prototype;
typed_data.Float32List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Float32List);
typed_data.Float32List[dart.implements] = () => [ListOfdouble(), typed_data._TypedFloatList];
dart.setLibraryUri(typed_data.Float32List, "dart:typed_data");
dart.defineLazy(typed_data.Float32List, {
  /*typed_data.Float32List.bytesPerElement*/get bytesPerElement() {
    return 4;
  }
});
typed_data.Float64List = class Float64List extends core.Object {
  static new(length) {
    return _native_typed_data.NativeFloat64List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat64List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asFloat64List](offsetInBytes, length);
  }
};
(typed_data.Float64List[dart.mixinNew] = function() {
}).prototype = typed_data.Float64List.prototype;
typed_data.Float64List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Float64List);
typed_data.Float64List[dart.implements] = () => [ListOfdouble(), typed_data._TypedFloatList];
dart.setLibraryUri(typed_data.Float64List, "dart:typed_data");
dart.defineLazy(typed_data.Float64List, {
  /*typed_data.Float64List.bytesPerElement*/get bytesPerElement() {
    return 8;
  }
});
typed_data.Float32x4List = class Float32x4List extends core.Object {
  static new(length) {
    return new _native_typed_data.NativeFloat32x4List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat32x4List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asFloat32x4List](offsetInBytes, length);
  }
};
(typed_data.Float32x4List[dart.mixinNew] = function() {
}).prototype = typed_data.Float32x4List.prototype;
typed_data.Float32x4List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Float32x4List);
typed_data.Float32x4List[dart.implements] = () => [ListOfFloat32x4(), typed_data.TypedData];
dart.setLibraryUri(typed_data.Float32x4List, "dart:typed_data");
dart.defineLazy(typed_data.Float32x4List, {
  /*typed_data.Float32x4List.bytesPerElement*/get bytesPerElement() {
    return 16;
  }
});
typed_data.Int32x4List = class Int32x4List extends core.Object {
  static new(length) {
    return new _native_typed_data.NativeInt32x4List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeInt32x4List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asInt32x4List](offsetInBytes, length);
  }
};
(typed_data.Int32x4List[dart.mixinNew] = function() {
}).prototype = typed_data.Int32x4List.prototype;
typed_data.Int32x4List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Int32x4List);
typed_data.Int32x4List[dart.implements] = () => [ListOfInt32x4(), typed_data.TypedData];
dart.setLibraryUri(typed_data.Int32x4List, "dart:typed_data");
dart.defineLazy(typed_data.Int32x4List, {
  /*typed_data.Int32x4List.bytesPerElement*/get bytesPerElement() {
    return 16;
  }
});
typed_data.Float64x2List = class Float64x2List extends core.Object {
  static new(length) {
    return new _native_typed_data.NativeFloat64x2List.new(length);
  }
  static fromList(elements) {
    return _native_typed_data.NativeFloat64x2List.fromList(elements);
  }
  static view(buffer, offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return buffer[$asFloat64x2List](offsetInBytes, length);
  }
};
(typed_data.Float64x2List[dart.mixinNew] = function() {
}).prototype = typed_data.Float64x2List.prototype;
typed_data.Float64x2List.prototype[dart.isList] = true;
dart.addTypeTests(typed_data.Float64x2List);
typed_data.Float64x2List[dart.implements] = () => [ListOfFloat64x2(), typed_data.TypedData];
dart.setLibraryUri(typed_data.Float64x2List, "dart:typed_data");
dart.defineLazy(typed_data.Float64x2List, {
  /*typed_data.Float64x2List.bytesPerElement*/get bytesPerElement() {
    return 16;
  }
});
const _data$0 = dart.privateName(typed_data, "_data");
typed_data.UnmodifiableByteBufferView = class UnmodifiableByteBufferView extends core.Object {
  get lengthInBytes() {
    return this[_data$0][$lengthInBytes];
  }
  asUint8List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableUint8ListView.new(this[_data$0][$asUint8List](offsetInBytes, length));
  }
  asInt8List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableInt8ListView.new(this[_data$0][$asInt8List](offsetInBytes, length));
  }
  asUint8ClampedList(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableUint8ClampedListView.new(this[_data$0][$asUint8ClampedList](offsetInBytes, length));
  }
  asUint16List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableUint16ListView.new(this[_data$0][$asUint16List](offsetInBytes, length));
  }
  asInt16List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableInt16ListView.new(this[_data$0][$asInt16List](offsetInBytes, length));
  }
  asUint32List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableUint32ListView.new(this[_data$0][$asUint32List](offsetInBytes, length));
  }
  asInt32List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableInt32ListView.new(this[_data$0][$asInt32List](offsetInBytes, length));
  }
  asUint64List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableUint64ListView.new(this[_data$0][$asUint64List](offsetInBytes, length));
  }
  asInt64List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableInt64ListView.new(this[_data$0][$asInt64List](offsetInBytes, length));
  }
  asInt32x4List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableInt32x4ListView.new(this[_data$0][$asInt32x4List](offsetInBytes, length));
  }
  asFloat32List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableFloat32ListView.new(this[_data$0][$asFloat32List](offsetInBytes, length));
  }
  asFloat64List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableFloat64ListView.new(this[_data$0][$asFloat64List](offsetInBytes, length));
  }
  asFloat32x4List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableFloat32x4ListView.new(this[_data$0][$asFloat32x4List](offsetInBytes, length));
  }
  asFloat64x2List(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableFloat64x2ListView.new(this[_data$0][$asFloat64x2List](offsetInBytes, length));
  }
  asByteData(offsetInBytes, length) {
    if (offsetInBytes === void 0) offsetInBytes = 0;
    if (length === void 0) length = null;
    return new typed_data.UnmodifiableByteDataView.new(this[_data$0][$asByteData](offsetInBytes, length));
  }
};
(typed_data.UnmodifiableByteBufferView.new = function(data) {
  this[_data$0] = data;
}).prototype = typed_data.UnmodifiableByteBufferView.prototype;
dart.addTypeTests(typed_data.UnmodifiableByteBufferView);
typed_data.UnmodifiableByteBufferView[dart.implements] = () => [typed_data.ByteBuffer];
dart.setMethodSignature(typed_data.UnmodifiableByteBufferView, () => ({
  __proto__: dart.getMethods(typed_data.UnmodifiableByteBufferView.__proto__),
  asUint8List: dart.fnType(typed_data.Uint8List, [], [core.int, core.int]),
  [$asUint8List]: dart.fnType(typed_data.Uint8List, [], [core.int, core.int]),
  asInt8List: dart.fnType(typed_data.Int8List, [], [core.int, core.int]),
  [$asInt8List]: dart.fnType(typed_data.Int8List, [], [core.int, core.int]),
  asUint8ClampedList: dart.fnType(typed_data.Uint8ClampedList, [], [core.int, core.int]),
  [$asUint8ClampedList]: dart.fnType(typed_data.Uint8ClampedList, [], [core.int, core.int]),
  asUint16List: dart.fnType(typed_data.Uint16List, [], [core.int, core.int]),
  [$asUint16List]: dart.fnType(typed_data.Uint16List, [], [core.int, core.int]),
  asInt16List: dart.fnType(typed_data.Int16List, [], [core.int, core.int]),
  [$asInt16List]: dart.fnType(typed_data.Int16List, [], [core.int, core.int]),
  asUint32List: dart.fnType(typed_data.Uint32List, [], [core.int, core.int]),
  [$asUint32List]: dart.fnType(typed_data.Uint32List, [], [core.int, core.int]),
  asInt32List: dart.fnType(typed_data.Int32List, [], [core.int, core.int]),
  [$asInt32List]: dart.fnType(typed_data.Int32List, [], [core.int, core.int]),
  asUint64List: dart.fnType(typed_data.Uint64List, [], [core.int, core.int]),
  [$asUint64List]: dart.fnType(typed_data.Uint64List, [], [core.int, core.int]),
  asInt64List: dart.fnType(typed_data.Int64List, [], [core.int, core.int]),
  [$asInt64List]: dart.fnType(typed_data.Int64List, [], [core.int, core.int]),
  asInt32x4List: dart.fnType(typed_data.Int32x4List, [], [core.int, core.int]),
  [$asInt32x4List]: dart.fnType(typed_data.Int32x4List, [], [core.int, core.int]),
  asFloat32List: dart.fnType(typed_data.Float32List, [], [core.int, core.int]),
  [$asFloat32List]: dart.fnType(typed_data.Float32List, [], [core.int, core.int]),
  asFloat64List: dart.fnType(typed_data.Float64List, [], [core.int, core.int]),
  [$asFloat64List]: dart.fnType(typed_data.Float64List, [], [core.int, core.int]),
  asFloat32x4List: dart.fnType(typed_data.Float32x4List, [], [core.int, core.int]),
  [$asFloat32x4List]: dart.fnType(typed_data.Float32x4List, [], [core.int, core.int]),
  asFloat64x2List: dart.fnType(typed_data.Float64x2List, [], [core.int, core.int]),
  [$asFloat64x2List]: dart.fnType(typed_data.Float64x2List, [], [core.int, core.int]),
  asByteData: dart.fnType(typed_data.ByteData, [], [core.int, core.int]),
  [$asByteData]: dart.fnType(typed_data.ByteData, [], [core.int, core.int])
}));
dart.setGetterSignature(typed_data.UnmodifiableByteBufferView, () => ({
  __proto__: dart.getGetters(typed_data.UnmodifiableByteBufferView.__proto__),
  lengthInBytes: core.int,
  [$lengthInBytes]: core.int
}));
dart.setLibraryUri(typed_data.UnmodifiableByteBufferView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableByteBufferView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableByteBufferView.__proto__),
  [_data$0]: dart.finalFieldType(typed_data.ByteBuffer)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableByteBufferView, [
  'asUint8List',
  'asInt8List',
  'asUint8ClampedList',
  'asUint16List',
  'asInt16List',
  'asUint32List',
  'asInt32List',
  'asUint64List',
  'asInt64List',
  'asInt32x4List',
  'asFloat32List',
  'asFloat64List',
  'asFloat32x4List',
  'asFloat64x2List',
  'asByteData'
]);
dart.defineExtensionAccessors(typed_data.UnmodifiableByteBufferView, ['lengthInBytes']);
const _unsupported = dart.privateName(typed_data, "_unsupported");
typed_data.UnmodifiableByteDataView = class UnmodifiableByteDataView extends core.Object {
  getInt8(byteOffset) {
    return this[_data$0][$getInt8](byteOffset);
  }
  setInt8(byteOffset, value) {
    return this[_unsupported]();
  }
  getUint8(byteOffset) {
    return this[_data$0][$getUint8](byteOffset);
  }
  setUint8(byteOffset, value) {
    return this[_unsupported]();
  }
  getInt16(byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_data$0][$getInt16](byteOffset, endian);
  }
  setInt16(byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_unsupported]();
  }
  getUint16(byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_data$0][$getUint16](byteOffset, endian);
  }
  setUint16(byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_unsupported]();
  }
  getInt32(byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_data$0][$getInt32](byteOffset, endian);
  }
  setInt32(byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_unsupported]();
  }
  getUint32(byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_data$0][$getUint32](byteOffset, endian);
  }
  setUint32(byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_unsupported]();
  }
  getInt64(byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_data$0][$getInt64](byteOffset, endian);
  }
  setInt64(byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_unsupported]();
  }
  getUint64(byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_data$0][$getUint64](byteOffset, endian);
  }
  setUint64(byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_unsupported]();
  }
  getFloat32(byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_data$0][$getFloat32](byteOffset, endian);
  }
  setFloat32(byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_unsupported]();
  }
  getFloat64(byteOffset, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_data$0][$getFloat64](byteOffset, endian);
  }
  setFloat64(byteOffset, value, endian) {
    if (endian === void 0) endian = typed_data.Endian.big;
    return this[_unsupported]();
  }
  get elementSizeInBytes() {
    return this[_data$0][$elementSizeInBytes];
  }
  get offsetInBytes() {
    return this[_data$0][$offsetInBytes];
  }
  get lengthInBytes() {
    return this[_data$0][$lengthInBytes];
  }
  get buffer() {
    return new typed_data.UnmodifiableByteBufferView.new(this[_data$0][$buffer]);
  }
  [_unsupported]() {
    dart.throw(new core.UnsupportedError.new("An UnmodifiableByteDataView may not be modified"));
  }
};
(typed_data.UnmodifiableByteDataView.new = function(data) {
  this[_data$0] = data;
}).prototype = typed_data.UnmodifiableByteDataView.prototype;
dart.addTypeTests(typed_data.UnmodifiableByteDataView);
typed_data.UnmodifiableByteDataView[dart.implements] = () => [typed_data.ByteData];
dart.setMethodSignature(typed_data.UnmodifiableByteDataView, () => ({
  __proto__: dart.getMethods(typed_data.UnmodifiableByteDataView.__proto__),
  getInt8: dart.fnType(core.int, [core.int]),
  [$getInt8]: dart.fnType(core.int, [core.int]),
  setInt8: dart.fnType(dart.void, [core.int, core.int]),
  [$setInt8]: dart.fnType(dart.void, [core.int, core.int]),
  getUint8: dart.fnType(core.int, [core.int]),
  [$getUint8]: dart.fnType(core.int, [core.int]),
  setUint8: dart.fnType(dart.void, [core.int, core.int]),
  [$setUint8]: dart.fnType(dart.void, [core.int, core.int]),
  getInt16: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [$getInt16]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  setInt16: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [$setInt16]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  getUint16: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [$getUint16]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  setUint16: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [$setUint16]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  getInt32: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [$getInt32]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  setInt32: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [$setInt32]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  getUint32: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [$getUint32]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  setUint32: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [$setUint32]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  getInt64: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [$getInt64]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  setInt64: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [$setInt64]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  getUint64: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  [$getUint64]: dart.fnType(core.int, [core.int], [typed_data.Endian]),
  setUint64: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  [$setUint64]: dart.fnType(dart.void, [core.int, core.int], [typed_data.Endian]),
  getFloat32: dart.fnType(core.double, [core.int], [typed_data.Endian]),
  [$getFloat32]: dart.fnType(core.double, [core.int], [typed_data.Endian]),
  setFloat32: dart.fnType(dart.void, [core.int, core.double], [typed_data.Endian]),
  [$setFloat32]: dart.fnType(dart.void, [core.int, core.double], [typed_data.Endian]),
  getFloat64: dart.fnType(core.double, [core.int], [typed_data.Endian]),
  [$getFloat64]: dart.fnType(core.double, [core.int], [typed_data.Endian]),
  setFloat64: dart.fnType(dart.void, [core.int, core.double], [typed_data.Endian]),
  [$setFloat64]: dart.fnType(dart.void, [core.int, core.double], [typed_data.Endian]),
  [_unsupported]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(typed_data.UnmodifiableByteDataView, () => ({
  __proto__: dart.getGetters(typed_data.UnmodifiableByteDataView.__proto__),
  elementSizeInBytes: core.int,
  [$elementSizeInBytes]: core.int,
  offsetInBytes: core.int,
  [$offsetInBytes]: core.int,
  lengthInBytes: core.int,
  [$lengthInBytes]: core.int,
  buffer: typed_data.ByteBuffer,
  [$buffer]: typed_data.ByteBuffer
}));
dart.setLibraryUri(typed_data.UnmodifiableByteDataView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableByteDataView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableByteDataView.__proto__),
  [_data$0]: dart.finalFieldType(typed_data.ByteData)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableByteDataView, [
  'getInt8',
  'setInt8',
  'getUint8',
  'setUint8',
  'getInt16',
  'setInt16',
  'getUint16',
  'setUint16',
  'getInt32',
  'setInt32',
  'getUint32',
  'setUint32',
  'getInt64',
  'setInt64',
  'getUint64',
  'setUint64',
  'getFloat32',
  'setFloat32',
  'getFloat64',
  'setFloat64'
]);
dart.defineExtensionAccessors(typed_data.UnmodifiableByteDataView, ['elementSizeInBytes', 'offsetInBytes', 'lengthInBytes', 'buffer']);
const _list$0 = dart.privateName(typed_data, "_list");
const _is__UnmodifiableListMixin_default = Symbol('_is__UnmodifiableListMixin_default');
typed_data._UnmodifiableListMixin$ = dart.generic((N, L, TD) => {
  class _UnmodifiableListMixin extends core.Object {
    get [_data$0]() {
      return TD.as(this[_list$0]);
    }
    get length() {
      return this[_list$0][$length];
    }
    _get(index) {
      return this[_list$0][$_get](index);
    }
    get elementSizeInBytes() {
      return this[_data$0][$elementSizeInBytes];
    }
    get offsetInBytes() {
      return this[_data$0][$offsetInBytes];
    }
    get lengthInBytes() {
      return this[_data$0][$lengthInBytes];
    }
    get buffer() {
      return new typed_data.UnmodifiableByteBufferView.new(this[_data$0][$buffer]);
    }
  }
  (_UnmodifiableListMixin.new = function() {
  }).prototype = _UnmodifiableListMixin.prototype;
  dart.addTypeTests(_UnmodifiableListMixin);
  _UnmodifiableListMixin.prototype[_is__UnmodifiableListMixin_default] = true;
  dart.setMethodSignature(_UnmodifiableListMixin, () => ({
    __proto__: dart.getMethods(_UnmodifiableListMixin.__proto__),
    _get: dart.fnType(N, [core.int])
  }));
  dart.setGetterSignature(_UnmodifiableListMixin, () => ({
    __proto__: dart.getGetters(_UnmodifiableListMixin.__proto__),
    [_data$0]: TD,
    length: core.int,
    elementSizeInBytes: core.int,
    offsetInBytes: core.int,
    lengthInBytes: core.int,
    buffer: typed_data.ByteBuffer
  }));
  dart.setLibraryUri(_UnmodifiableListMixin, "dart:typed_data");
  return _UnmodifiableListMixin;
});
typed_data._UnmodifiableListMixin = typed_data._UnmodifiableListMixin$();
dart.addTypeTests(typed_data._UnmodifiableListMixin, _is__UnmodifiableListMixin_default);
const UnmodifiableListBase__UnmodifiableListMixin$ = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$, typed_data._UnmodifiableListMixin$(core.int, typed_data.Uint8List, typed_data.Uint8List));
typed_data.UnmodifiableUint8ListView = class UnmodifiableUint8ListView extends UnmodifiableListBase__UnmodifiableListMixin$ {};
(typed_data.UnmodifiableUint8ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableUint8ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableUint8ListView);
typed_data.UnmodifiableUint8ListView[dart.implements] = () => [typed_data.Uint8List];
dart.setLibraryUri(typed_data.UnmodifiableUint8ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableUint8ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableUint8ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Uint8List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableUint8ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableUint8ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$ = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$$.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$, typed_data._UnmodifiableListMixin$(core.int, typed_data.Int8List, typed_data.Int8List));
typed_data.UnmodifiableInt8ListView = class UnmodifiableInt8ListView extends UnmodifiableListBase__UnmodifiableListMixin$$ {};
(typed_data.UnmodifiableInt8ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableInt8ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableInt8ListView);
typed_data.UnmodifiableInt8ListView[dart.implements] = () => [typed_data.Int8List];
dart.setLibraryUri(typed_data.UnmodifiableInt8ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableInt8ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableInt8ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Int8List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableInt8ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableInt8ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$0 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$$0.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$0.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$0, typed_data._UnmodifiableListMixin$(core.int, typed_data.Uint8ClampedList, typed_data.Uint8ClampedList));
typed_data.UnmodifiableUint8ClampedListView = class UnmodifiableUint8ClampedListView extends UnmodifiableListBase__UnmodifiableListMixin$$0 {};
(typed_data.UnmodifiableUint8ClampedListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableUint8ClampedListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableUint8ClampedListView);
typed_data.UnmodifiableUint8ClampedListView[dart.implements] = () => [typed_data.Uint8ClampedList];
dart.setLibraryUri(typed_data.UnmodifiableUint8ClampedListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableUint8ClampedListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableUint8ClampedListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Uint8ClampedList)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableUint8ClampedListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableUint8ClampedListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$1 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$$1.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$1.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$1, typed_data._UnmodifiableListMixin$(core.int, typed_data.Uint16List, typed_data.Uint16List));
typed_data.UnmodifiableUint16ListView = class UnmodifiableUint16ListView extends UnmodifiableListBase__UnmodifiableListMixin$$1 {};
(typed_data.UnmodifiableUint16ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableUint16ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableUint16ListView);
typed_data.UnmodifiableUint16ListView[dart.implements] = () => [typed_data.Uint16List];
dart.setLibraryUri(typed_data.UnmodifiableUint16ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableUint16ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableUint16ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Uint16List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableUint16ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableUint16ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$2 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$$2.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$2.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$2, typed_data._UnmodifiableListMixin$(core.int, typed_data.Int16List, typed_data.Int16List));
typed_data.UnmodifiableInt16ListView = class UnmodifiableInt16ListView extends UnmodifiableListBase__UnmodifiableListMixin$$2 {};
(typed_data.UnmodifiableInt16ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableInt16ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableInt16ListView);
typed_data.UnmodifiableInt16ListView[dart.implements] = () => [typed_data.Int16List];
dart.setLibraryUri(typed_data.UnmodifiableInt16ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableInt16ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableInt16ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Int16List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableInt16ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableInt16ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$3 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$$3.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$3.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$3, typed_data._UnmodifiableListMixin$(core.int, typed_data.Uint32List, typed_data.Uint32List));
typed_data.UnmodifiableUint32ListView = class UnmodifiableUint32ListView extends UnmodifiableListBase__UnmodifiableListMixin$$3 {};
(typed_data.UnmodifiableUint32ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableUint32ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableUint32ListView);
typed_data.UnmodifiableUint32ListView[dart.implements] = () => [typed_data.Uint32List];
dart.setLibraryUri(typed_data.UnmodifiableUint32ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableUint32ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableUint32ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Uint32List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableUint32ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableUint32ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$4 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$$4.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$4.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$4, typed_data._UnmodifiableListMixin$(core.int, typed_data.Int32List, typed_data.Int32List));
typed_data.UnmodifiableInt32ListView = class UnmodifiableInt32ListView extends UnmodifiableListBase__UnmodifiableListMixin$$4 {};
(typed_data.UnmodifiableInt32ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableInt32ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableInt32ListView);
typed_data.UnmodifiableInt32ListView[dart.implements] = () => [typed_data.Int32List];
dart.setLibraryUri(typed_data.UnmodifiableInt32ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableInt32ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableInt32ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Int32List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableInt32ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableInt32ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$5 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$$5.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$5.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$5, typed_data._UnmodifiableListMixin$(core.int, typed_data.Uint64List, typed_data.Uint64List));
typed_data.UnmodifiableUint64ListView = class UnmodifiableUint64ListView extends UnmodifiableListBase__UnmodifiableListMixin$$5 {};
(typed_data.UnmodifiableUint64ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableUint64ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableUint64ListView);
typed_data.UnmodifiableUint64ListView[dart.implements] = () => [typed_data.Uint64List];
dart.setLibraryUri(typed_data.UnmodifiableUint64ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableUint64ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableUint64ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Uint64List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableUint64ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableUint64ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$6 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.int) {};
(UnmodifiableListBase__UnmodifiableListMixin$$6.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$6.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$6, typed_data._UnmodifiableListMixin$(core.int, typed_data.Int64List, typed_data.Int64List));
typed_data.UnmodifiableInt64ListView = class UnmodifiableInt64ListView extends UnmodifiableListBase__UnmodifiableListMixin$$6 {};
(typed_data.UnmodifiableInt64ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableInt64ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableInt64ListView);
typed_data.UnmodifiableInt64ListView[dart.implements] = () => [typed_data.Int64List];
dart.setLibraryUri(typed_data.UnmodifiableInt64ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableInt64ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableInt64ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Int64List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableInt64ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableInt64ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$7 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(typed_data.Int32x4) {};
(UnmodifiableListBase__UnmodifiableListMixin$$7.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$7.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$7, typed_data._UnmodifiableListMixin$(typed_data.Int32x4, typed_data.Int32x4List, typed_data.Int32x4List));
typed_data.UnmodifiableInt32x4ListView = class UnmodifiableInt32x4ListView extends UnmodifiableListBase__UnmodifiableListMixin$$7 {};
(typed_data.UnmodifiableInt32x4ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableInt32x4ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableInt32x4ListView);
typed_data.UnmodifiableInt32x4ListView[dart.implements] = () => [typed_data.Int32x4List];
dart.setLibraryUri(typed_data.UnmodifiableInt32x4ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableInt32x4ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableInt32x4ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Int32x4List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableInt32x4ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableInt32x4ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$8 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(typed_data.Float32x4) {};
(UnmodifiableListBase__UnmodifiableListMixin$$8.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$8.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$8, typed_data._UnmodifiableListMixin$(typed_data.Float32x4, typed_data.Float32x4List, typed_data.Float32x4List));
typed_data.UnmodifiableFloat32x4ListView = class UnmodifiableFloat32x4ListView extends UnmodifiableListBase__UnmodifiableListMixin$$8 {};
(typed_data.UnmodifiableFloat32x4ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableFloat32x4ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableFloat32x4ListView);
typed_data.UnmodifiableFloat32x4ListView[dart.implements] = () => [typed_data.Float32x4List];
dart.setLibraryUri(typed_data.UnmodifiableFloat32x4ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableFloat32x4ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableFloat32x4ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Float32x4List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableFloat32x4ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableFloat32x4ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$9 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(typed_data.Float64x2) {};
(UnmodifiableListBase__UnmodifiableListMixin$$9.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$9.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$9, typed_data._UnmodifiableListMixin$(typed_data.Float64x2, typed_data.Float64x2List, typed_data.Float64x2List));
typed_data.UnmodifiableFloat64x2ListView = class UnmodifiableFloat64x2ListView extends UnmodifiableListBase__UnmodifiableListMixin$$9 {};
(typed_data.UnmodifiableFloat64x2ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableFloat64x2ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableFloat64x2ListView);
typed_data.UnmodifiableFloat64x2ListView[dart.implements] = () => [typed_data.Float64x2List];
dart.setLibraryUri(typed_data.UnmodifiableFloat64x2ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableFloat64x2ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableFloat64x2ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Float64x2List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableFloat64x2ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableFloat64x2ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$10 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.double) {};
(UnmodifiableListBase__UnmodifiableListMixin$$10.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$10.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$10, typed_data._UnmodifiableListMixin$(core.double, typed_data.Float32List, typed_data.Float32List));
typed_data.UnmodifiableFloat32ListView = class UnmodifiableFloat32ListView extends UnmodifiableListBase__UnmodifiableListMixin$$10 {};
(typed_data.UnmodifiableFloat32ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableFloat32ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableFloat32ListView);
typed_data.UnmodifiableFloat32ListView[dart.implements] = () => [typed_data.Float32List];
dart.setLibraryUri(typed_data.UnmodifiableFloat32ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableFloat32ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableFloat32ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Float32List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableFloat32ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableFloat32ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
const UnmodifiableListBase__UnmodifiableListMixin$$11 = class UnmodifiableListBase__UnmodifiableListMixin extends _internal.UnmodifiableListBase$(core.double) {};
(UnmodifiableListBase__UnmodifiableListMixin$$11.new = function() {
}).prototype = UnmodifiableListBase__UnmodifiableListMixin$$11.prototype;
dart.applyMixin(UnmodifiableListBase__UnmodifiableListMixin$$11, typed_data._UnmodifiableListMixin$(core.double, typed_data.Float64List, typed_data.Float64List));
typed_data.UnmodifiableFloat64ListView = class UnmodifiableFloat64ListView extends UnmodifiableListBase__UnmodifiableListMixin$$11 {};
(typed_data.UnmodifiableFloat64ListView.new = function(list) {
  this[_list$0] = list;
}).prototype = typed_data.UnmodifiableFloat64ListView.prototype;
dart.addTypeTests(typed_data.UnmodifiableFloat64ListView);
typed_data.UnmodifiableFloat64ListView[dart.implements] = () => [typed_data.Float64List];
dart.setLibraryUri(typed_data.UnmodifiableFloat64ListView, "dart:typed_data");
dart.setFieldSignature(typed_data.UnmodifiableFloat64ListView, () => ({
  __proto__: dart.getFields(typed_data.UnmodifiableFloat64ListView.__proto__),
  [_list$0]: dart.finalFieldType(typed_data.Float64List)
}));
dart.defineExtensionMethods(typed_data.UnmodifiableFloat64ListView, ['_get']);
dart.defineExtensionAccessors(typed_data.UnmodifiableFloat64ListView, [
  'length',
  'elementSizeInBytes',
  'offsetInBytes',
  'lengthInBytes',
  'buffer'
]);
indexed_db._KeyRangeFactoryProvider = class _KeyRangeFactoryProvider extends core.Object {
  static createKeyRange_only(value) {
    return indexed_db._KeyRangeFactoryProvider._only(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(value));
  }
  static createKeyRange_lowerBound(bound, open) {
    if (open === void 0) open = false;
    return indexed_db._KeyRangeFactoryProvider._lowerBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
  }
  static createKeyRange_upperBound(bound, open) {
    if (open === void 0) open = false;
    return indexed_db._KeyRangeFactoryProvider._upperBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
  }
  static createKeyRange_bound(lower, upper, lowerOpen, upperOpen) {
    if (lowerOpen === void 0) lowerOpen = false;
    if (upperOpen === void 0) upperOpen = false;
    return indexed_db._KeyRangeFactoryProvider._bound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(lower), indexed_db._KeyRangeFactoryProvider._translateKey(upper), lowerOpen, upperOpen);
  }
  static _class() {
    if (indexed_db._KeyRangeFactoryProvider._cachedClass != null) return indexed_db._KeyRangeFactoryProvider._cachedClass;
    return indexed_db._KeyRangeFactoryProvider._cachedClass = indexed_db._KeyRangeFactoryProvider._uncachedClass();
  }
  static _uncachedClass() {
    return window.webkitIDBKeyRange || window.mozIDBKeyRange || window.msIDBKeyRange || window.IDBKeyRange;
  }
  static _translateKey(idbkey) {
    return idbkey;
  }
  static _only(cls, value) {
    return cls.only(value);
  }
  static _lowerBound(cls, bound, open) {
    return cls.lowerBound(bound, open);
  }
  static _upperBound(cls, bound, open) {
    return cls.upperBound(bound, open);
  }
  static _bound(cls, lower, upper, lowerOpen, upperOpen) {
    return cls.bound(lower, upper, lowerOpen, upperOpen);
  }
};
(indexed_db._KeyRangeFactoryProvider.new = function() {
}).prototype = indexed_db._KeyRangeFactoryProvider.prototype;
dart.addTypeTests(indexed_db._KeyRangeFactoryProvider);
dart.setLibraryUri(indexed_db._KeyRangeFactoryProvider, "dart:indexed_db");
dart.defineLazy(indexed_db._KeyRangeFactoryProvider, {
  /*indexed_db._KeyRangeFactoryProvider._cachedClass*/get _cachedClass() {
    return null;
  },
  set _cachedClass(_) {}
});
indexed_db._convertNativeToDart_IDBKey = function(nativeKey) {
  function containsDate(object) {
    if (dart.test(html_common.isJavaScriptDate(object))) return true;
    if (core.List.is(object)) {
      for (let i = 0; i < dart.notNull(object[$length]); i++) {
        if (dart.dtest(containsDate(object[$_get](i)))) return true;
      }
    }
    return false;
  }
  dart.fn(containsDate, dynamicTobool());
  if (dart.test(containsDate(nativeKey))) {
    dart.throw(new core.UnimplementedError.new("Key containing DateTime"));
  }
  return nativeKey;
};
indexed_db._convertDartToNative_IDBKey = function(dartKey) {
  return dartKey;
};
indexed_db._convertNativeToDart_IDBAny = function(object) {
  return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false});
};
dart.defineLazy(indexed_db, {
  /*indexed_db._idbKey*/get _idbKey() {
    return "JSExtendableArray|=Object|num|String";
  },
  /*indexed_db._annotation_Creates_IDBKey*/get _annotation_Creates_IDBKey() {
    return dart.const(new _js_helper.Creates.new("JSExtendableArray|=Object|num|String"));
  },
  /*indexed_db._annotation_Returns_IDBKey*/get _annotation_Returns_IDBKey() {
    return dart.const(new _js_helper.Returns.new("JSExtendableArray|=Object|num|String"));
  }
});
const _delete$ = dart.privateName(indexed_db, "_delete");
const _update = dart.privateName(indexed_db, "_update");
const _update_1 = dart.privateName(indexed_db, "_update_1");
indexed_db.Cursor = class Cursor extends _interceptors.Interceptor {
  [$delete]() {
    try {
      return indexed_db._completeRequest(dart.dynamic, this[_delete$]());
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$update](value) {
    try {
      return indexed_db._completeRequest(dart.dynamic, this[_update](value));
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$next](key) {
    if (key === void 0) key = null;
    if (key == null) {
      this.continue();
    } else {
      this.continue(key);
    }
  }
  get [$direction]() {
    return this.direction;
  }
  get [$key]() {
    return this.key;
  }
  get [$primaryKey]() {
    return this.primaryKey;
  }
  get [$source]() {
    return this.source;
  }
  [$advance](...args) {
    return this.advance.apply(this, args);
  }
  [$continuePrimaryKey](...args) {
    return this.continuePrimaryKey.apply(this, args);
  }
  [_delete$](...args) {
    return this.delete.apply(this, args);
  }
  [_update](value) {
    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
    return this[_update_1](value_1);
  }
  [_update_1](...args) {
    return this.update.apply(this, args);
  }
};
dart.addTypeTests(indexed_db.Cursor);
const direction = Symbol("Cursor.direction");
const key = Symbol("Cursor.key");
const primaryKey = Symbol("Cursor.primaryKey");
const source = Symbol("Cursor.source");
dart.setMethodSignature(indexed_db.Cursor, () => ({
  __proto__: dart.getMethods(indexed_db.Cursor.__proto__),
  [$delete]: dart.fnType(async.Future, []),
  [$update]: dart.fnType(async.Future, [dart.dynamic]),
  [$next]: dart.fnType(dart.void, [], [core.Object]),
  [$advance]: dart.fnType(dart.void, [core.int]),
  [$continuePrimaryKey]: dart.fnType(dart.void, [core.Object, core.Object]),
  [_delete$]: dart.fnType(indexed_db.Request, []),
  [_update]: dart.fnType(indexed_db.Request, [dart.dynamic]),
  [_update_1]: dart.fnType(indexed_db.Request, [dart.dynamic])
}));
dart.setLibraryUri(indexed_db.Cursor, "dart:indexed_db");
dart.setFieldSignature(indexed_db.Cursor, () => ({
  __proto__: dart.getFields(indexed_db.Cursor.__proto__),
  [$direction]: dart.finalFieldType(core.String),
  [$key]: dart.finalFieldType(core.Object),
  [$primaryKey]: dart.finalFieldType(core.Object),
  [$source]: dart.finalFieldType(core.Object)
}));
dart.registerExtension("IDBCursor", indexed_db.Cursor);
const _get_value = dart.privateName(indexed_db, "_get_value");
indexed_db.CursorWithValue = class CursorWithValue extends indexed_db.Cursor {
  get [$value]() {
    return indexed_db._convertNativeToDart_IDBAny(this[_get_value]);
  }
  get [_get_value]() {
    return this.value;
  }
};
dart.addTypeTests(indexed_db.CursorWithValue);
dart.setGetterSignature(indexed_db.CursorWithValue, () => ({
  __proto__: dart.getGetters(indexed_db.CursorWithValue.__proto__),
  [$value]: dart.dynamic
}));
dart.setLibraryUri(indexed_db.CursorWithValue, "dart:indexed_db");
dart.setFieldSignature(indexed_db.CursorWithValue, () => ({
  __proto__: dart.getFields(indexed_db.CursorWithValue.__proto__),
  [_get_value]: dart.finalFieldType(dart.dynamic)
}));
dart.registerExtension("IDBCursorWithValue", indexed_db.CursorWithValue);
const _createObjectStore = dart.privateName(indexed_db, "_createObjectStore");
const _transaction = dart.privateName(indexed_db, "_transaction");
const _createObjectStore_1 = dart.privateName(indexed_db, "_createObjectStore_1");
const _createObjectStore_2 = dart.privateName(indexed_db, "_createObjectStore_2");
const _addEventListener = dart.privateName(html$, "_addEventListener");
const _removeEventListener = dart.privateName(html$, "_removeEventListener");
html$.EventTarget = class EventTarget extends _interceptors.Interceptor {
  get [$on]() {
    return new html$.Events.new(this);
  }
  [$addEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    if (listener != null) {
      this[_addEventListener](type, listener, useCapture);
    }
  }
  [$removeEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    if (listener != null) {
      this[_removeEventListener](type, listener, useCapture);
    }
  }
  [_addEventListener](...args) {
    return this.addEventListener.apply(this, args);
  }
  [$dispatchEvent](...args) {
    return this.dispatchEvent.apply(this, args);
  }
  [_removeEventListener](...args) {
    return this.removeEventListener.apply(this, args);
  }
};
(html$.EventTarget._created = function() {
  html$.EventTarget.__proto__.new.call(this);
}).prototype = html$.EventTarget.prototype;
dart.addTypeTests(html$.EventTarget);
dart.setMethodSignature(html$.EventTarget, () => ({
  __proto__: dart.getMethods(html$.EventTarget.__proto__),
  [$addEventListener]: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool]),
  [$removeEventListener]: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool]),
  [_addEventListener]: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool]),
  [$dispatchEvent]: dart.fnType(core.bool, [html$.Event]),
  [_removeEventListener]: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool])
}));
dart.setGetterSignature(html$.EventTarget, () => ({
  __proto__: dart.getGetters(html$.EventTarget.__proto__),
  [$on]: html$.Events
}));
dart.setLibraryUri(html$.EventTarget, "dart:html");
dart.registerExtension("EventTarget", html$.EventTarget);
indexed_db.Database = class Database extends html$.EventTarget {
  [$createObjectStore](name, opts) {
    let keyPath = opts && 'keyPath' in opts ? opts.keyPath : null;
    let autoIncrement = opts && 'autoIncrement' in opts ? opts.autoIncrement : null;
    let options = new _js_helper.LinkedMap.new();
    if (keyPath != null) {
      options[$_set]("keyPath", keyPath);
    }
    if (autoIncrement != null) {
      options[$_set]("autoIncrement", autoIncrement);
    }
    return this[_createObjectStore](name, options);
  }
  [$transaction](storeName_OR_storeNames, mode) {
    if (mode !== "readonly" && mode !== "readwrite") {
      dart.throw(new core.ArgumentError.new(mode));
    }
    return this[_transaction](storeName_OR_storeNames, mode);
  }
  [$transactionStore](storeName, mode) {
    if (mode !== "readonly" && mode !== "readwrite") {
      dart.throw(new core.ArgumentError.new(mode));
    }
    return this[_transaction](storeName, mode);
  }
  [$transactionList](storeNames, mode) {
    if (mode !== "readonly" && mode !== "readwrite") {
      dart.throw(new core.ArgumentError.new(mode));
    }
    let storeNames_1 = html_common.convertDartToNative_StringArray(storeNames);
    return this[_transaction](storeNames_1, mode);
  }
  [$transactionStores](storeNames, mode) {
    if (mode !== "readonly" && mode !== "readwrite") {
      dart.throw(new core.ArgumentError.new(mode));
    }
    return this[_transaction](storeNames, mode);
  }
  [_transaction](...args) {
    return this.transaction.apply(this, args);
  }
  get [$name]() {
    return this.name;
  }
  get [$objectStoreNames]() {
    return this.objectStoreNames;
  }
  get [$version]() {
    return this.version;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [_createObjectStore](name, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_createObjectStore_1](name, options_1);
    }
    return this[_createObjectStore_2](name);
  }
  [_createObjectStore_1](...args) {
    return this.createObjectStore.apply(this, args);
  }
  [_createObjectStore_2](...args) {
    return this.createObjectStore.apply(this, args);
  }
  [$deleteObjectStore](...args) {
    return this.deleteObjectStore.apply(this, args);
  }
  get [$onAbort]() {
    return indexed_db.Database.abortEvent.forTarget(this);
  }
  get [$onClose]() {
    return indexed_db.Database.closeEvent.forTarget(this);
  }
  get [$onError]() {
    return indexed_db.Database.errorEvent.forTarget(this);
  }
  get [$onVersionChange]() {
    return indexed_db.Database.versionChangeEvent.forTarget(this);
  }
};
dart.addTypeTests(indexed_db.Database);
const name = Symbol("Database.name");
const objectStoreNames = Symbol("Database.objectStoreNames");
const version$ = Symbol("Database.version");
dart.setMethodSignature(indexed_db.Database, () => ({
  __proto__: dart.getMethods(indexed_db.Database.__proto__),
  [$createObjectStore]: dart.fnType(indexed_db.ObjectStore, [core.String], {keyPath: dart.dynamic, autoIncrement: core.bool}),
  [$transaction]: dart.fnType(indexed_db.Transaction, [dart.dynamic, core.String]),
  [$transactionStore]: dart.fnType(indexed_db.Transaction, [core.String, core.String]),
  [$transactionList]: dart.fnType(indexed_db.Transaction, [core.List$(core.String), core.String]),
  [$transactionStores]: dart.fnType(indexed_db.Transaction, [html$.DomStringList, core.String]),
  [_transaction]: dart.fnType(indexed_db.Transaction, [dart.dynamic, dart.dynamic]),
  [$close]: dart.fnType(dart.void, []),
  [_createObjectStore]: dart.fnType(indexed_db.ObjectStore, [core.String], [core.Map]),
  [_createObjectStore_1]: dart.fnType(indexed_db.ObjectStore, [dart.dynamic, dart.dynamic]),
  [_createObjectStore_2]: dart.fnType(indexed_db.ObjectStore, [dart.dynamic]),
  [$deleteObjectStore]: dart.fnType(dart.void, [core.String])
}));
dart.setGetterSignature(indexed_db.Database, () => ({
  __proto__: dart.getGetters(indexed_db.Database.__proto__),
  [$onAbort]: async.Stream$(html$.Event),
  [$onClose]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event),
  [$onVersionChange]: async.Stream$(indexed_db.VersionChangeEvent)
}));
dart.setLibraryUri(indexed_db.Database, "dart:indexed_db");
dart.setFieldSignature(indexed_db.Database, () => ({
  __proto__: dart.getFields(indexed_db.Database.__proto__),
  [$name]: dart.finalFieldType(core.String),
  [$objectStoreNames]: dart.finalFieldType(ListOfString()),
  [$version]: dart.finalFieldType(core.int)
}));
dart.defineLazy(indexed_db.Database, {
  /*indexed_db.Database.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("abort"));
  },
  /*indexed_db.Database.closeEvent*/get closeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("close"));
  },
  /*indexed_db.Database.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*indexed_db.Database.versionChangeEvent*/get versionChangeEvent() {
    return dart.const(new (EventStreamProviderOfVersionChangeEvent()).new("versionchange"));
  }
});
dart.registerExtension("IDBDatabase", indexed_db.Database);
const _open = dart.privateName(indexed_db, "_open");
const _deleteDatabase = dart.privateName(indexed_db, "_deleteDatabase");
indexed_db.IdbFactory = class IdbFactory extends _interceptors.Interceptor {
  static get supported() {
    return !!(window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB);
  }
  [$open](name, opts) {
    let version = opts && 'version' in opts ? opts.version : null;
    let onUpgradeNeeded = opts && 'onUpgradeNeeded' in opts ? opts.onUpgradeNeeded : null;
    let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
    if (version == null !== (onUpgradeNeeded == null)) {
      return FutureOfDatabase().error(new core.ArgumentError.new("version and onUpgradeNeeded must be specified together"));
    }
    try {
      let request = null;
      if (version != null) {
        request = this[_open](name, version);
      } else {
        request = this[_open](name);
      }
      if (onUpgradeNeeded != null) {
        dart.dsend(dart.dload(request, 'onUpgradeNeeded'), 'listen', [onUpgradeNeeded]);
      }
      if (onBlocked != null) {
        dart.dsend(dart.dload(request, 'onBlocked'), 'listen', [onBlocked]);
      }
      return indexed_db._completeRequest(indexed_db.Database, indexed_db.Request._check(request));
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return FutureOfDatabase().error(e, stacktrace);
    }
  }
  [$deleteDatabase](name, opts) {
    let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
    try {
      let request = this[_deleteDatabase](name);
      if (onBlocked != null) {
        request[$onBlocked].listen(onBlocked);
      }
      let completer = CompleterOfIdbFactory().sync();
      request[$onSuccess].listen(dart.fn(e => {
        completer.complete(this);
      }, EventToNull()));
      request[$onError].listen(dart.bind(completer, 'completeError'));
      return completer.future;
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return FutureOfIdbFactory().error(e, stacktrace);
    }
  }
  get [$supportsDatabaseNames]() {
    return dart.test(indexed_db.IdbFactory.supported) && !!(this.getDatabaseNames || this.webkitGetDatabaseNames);
  }
  [$cmp](...args) {
    return this.cmp.apply(this, args);
  }
  [_deleteDatabase](...args) {
    return this.deleteDatabase.apply(this, args);
  }
  [_open](...args) {
    return this.open.apply(this, args);
  }
};
dart.addTypeTests(indexed_db.IdbFactory);
dart.setMethodSignature(indexed_db.IdbFactory, () => ({
  __proto__: dart.getMethods(indexed_db.IdbFactory.__proto__),
  [$open]: dart.fnType(async.Future$(indexed_db.Database), [core.String], {version: core.int, onUpgradeNeeded: dart.fnType(dart.void, [indexed_db.VersionChangeEvent]), onBlocked: dart.fnType(dart.void, [html$.Event])}),
  [$deleteDatabase]: dart.fnType(async.Future$(indexed_db.IdbFactory), [core.String], {onBlocked: dart.fnType(dart.void, [html$.Event])}),
  [$cmp]: dart.fnType(core.int, [core.Object, core.Object]),
  [_deleteDatabase]: dart.fnType(indexed_db.OpenDBRequest, [core.String]),
  [_open]: dart.fnType(indexed_db.OpenDBRequest, [core.String], [core.int])
}));
dart.setGetterSignature(indexed_db.IdbFactory, () => ({
  __proto__: dart.getGetters(indexed_db.IdbFactory.__proto__),
  [$supportsDatabaseNames]: core.bool
}));
dart.setLibraryUri(indexed_db.IdbFactory, "dart:indexed_db");
dart.registerExtension("IDBFactory", indexed_db.IdbFactory);
indexed_db._completeRequest = function(T, request) {
  let completer = async.Completer$(T).sync();
  request[$onSuccess].listen(dart.fn(e => {
    let result = T._check(request[$result]);
    completer.complete(result);
  }, EventToNull()));
  request[$onError].listen(dart.bind(completer, 'completeError'));
  return completer.future;
};
const _count$0 = dart.privateName(indexed_db, "_count");
const _get = dart.privateName(indexed_db, "_get");
const _getKey$ = dart.privateName(indexed_db, "_getKey");
const _openCursor = dart.privateName(indexed_db, "_openCursor");
const _openKeyCursor = dart.privateName(indexed_db, "_openKeyCursor");
indexed_db.Index = class Index extends _interceptors.Interceptor {
  [$count](key_OR_range) {
    if (key_OR_range === void 0) key_OR_range = null;
    try {
      let request = this[_count$0](key_OR_range);
      return indexed_db._completeRequest(core.int, request);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return FutureOfint().error(e, stacktrace);
    }
  }
  [$get](key) {
    try {
      let request = this[_get](key);
      return indexed_db._completeRequest(dart.dynamic, request);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$getKey](key) {
    try {
      let request = this[_getKey$](key);
      return indexed_db._completeRequest(dart.dynamic, request);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$openCursor](opts) {
    let key = opts && 'key' in opts ? opts.key : null;
    let range = opts && 'range' in opts ? opts.range : null;
    let direction = opts && 'direction' in opts ? opts.direction : null;
    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
    let key_OR_range = null;
    if (key != null) {
      if (range != null) {
        dart.throw(new core.ArgumentError.new("Cannot specify both key and range."));
      }
      key_OR_range = key;
    } else {
      key_OR_range = range;
    }
    let request = null;
    if (direction == null) {
      request = this[_openCursor](key_OR_range, "next");
    } else {
      request = this[_openCursor](key_OR_range, direction);
    }
    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue, indexed_db.Request._check(request), autoAdvance);
  }
  [$openKeyCursor](opts) {
    let key = opts && 'key' in opts ? opts.key : null;
    let range = opts && 'range' in opts ? opts.range : null;
    let direction = opts && 'direction' in opts ? opts.direction : null;
    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
    let key_OR_range = null;
    if (key != null) {
      if (range != null) {
        dart.throw(new core.ArgumentError.new("Cannot specify both key and range."));
      }
      key_OR_range = key;
    } else {
      key_OR_range = range;
    }
    let request = null;
    if (direction == null) {
      request = this[_openKeyCursor](key_OR_range, "next");
    } else {
      request = this[_openKeyCursor](key_OR_range, direction);
    }
    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.Cursor, indexed_db.Request._check(request), autoAdvance);
  }
  get [$keyPath]() {
    return this.keyPath;
  }
  get [$multiEntry]() {
    return this.multiEntry;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$objectStore]() {
    return this.objectStore;
  }
  get [$unique]() {
    return this.unique;
  }
  [_count$0](...args) {
    return this.count.apply(this, args);
  }
  [_get](...args) {
    return this.get.apply(this, args);
  }
  [$getAll](...args) {
    return this.getAll.apply(this, args);
  }
  [$getAllKeys](...args) {
    return this.getAllKeys.apply(this, args);
  }
  [_getKey$](...args) {
    return this.getKey.apply(this, args);
  }
  [_openCursor](...args) {
    return this.openCursor.apply(this, args);
  }
  [_openKeyCursor](...args) {
    return this.openKeyCursor.apply(this, args);
  }
};
dart.addTypeTests(indexed_db.Index);
const keyPath = Symbol("Index.keyPath");
const multiEntry = Symbol("Index.multiEntry");
const name$4 = Symbol("Index.name");
const objectStore = Symbol("Index.objectStore");
const unique = Symbol("Index.unique");
dart.setMethodSignature(indexed_db.Index, () => ({
  __proto__: dart.getMethods(indexed_db.Index.__proto__),
  [$count]: dart.fnType(async.Future$(core.int), [], [dart.dynamic]),
  [$get]: dart.fnType(async.Future, [dart.dynamic]),
  [$getKey]: dart.fnType(async.Future, [dart.dynamic]),
  [$openCursor]: dart.fnType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
  [$openKeyCursor]: dart.fnType(async.Stream$(indexed_db.Cursor), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
  [_count$0]: dart.fnType(indexed_db.Request, [core.Object]),
  [_get]: dart.fnType(indexed_db.Request, [core.Object]),
  [$getAll]: dart.fnType(indexed_db.Request, [core.Object], [core.int]),
  [$getAllKeys]: dart.fnType(indexed_db.Request, [core.Object], [core.int]),
  [_getKey$]: dart.fnType(indexed_db.Request, [core.Object]),
  [_openCursor]: dart.fnType(indexed_db.Request, [core.Object], [core.String]),
  [_openKeyCursor]: dart.fnType(indexed_db.Request, [core.Object], [core.String])
}));
dart.setLibraryUri(indexed_db.Index, "dart:indexed_db");
dart.setFieldSignature(indexed_db.Index, () => ({
  __proto__: dart.getFields(indexed_db.Index.__proto__),
  [$keyPath]: dart.finalFieldType(core.Object),
  [$multiEntry]: dart.finalFieldType(core.bool),
  [$name]: dart.fieldType(core.String),
  [$objectStore]: dart.finalFieldType(indexed_db.ObjectStore),
  [$unique]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("IDBIndex", indexed_db.Index);
indexed_db.KeyRange = class KeyRange extends _interceptors.Interceptor {
  static only(value) {
    return indexed_db._KeyRangeFactoryProvider.createKeyRange_only(value);
  }
  static lowerBound(bound, open) {
    if (open === void 0) open = false;
    return indexed_db._KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
  }
  static upperBound(bound, open) {
    if (open === void 0) open = false;
    return indexed_db._KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
  }
  static bound(lower, upper, lowerOpen, upperOpen) {
    if (lowerOpen === void 0) lowerOpen = false;
    if (upperOpen === void 0) upperOpen = false;
    return indexed_db._KeyRangeFactoryProvider.createKeyRange_bound(lower, upper, lowerOpen, upperOpen);
  }
  get [$lower]() {
    return this.lower;
  }
  get [$lowerOpen]() {
    return this.lowerOpen;
  }
  get [$upper]() {
    return this.upper;
  }
  get [$upperOpen]() {
    return this.upperOpen;
  }
  [$includes](...args) {
    return this.includes.apply(this, args);
  }
};
dart.addTypeTests(indexed_db.KeyRange);
const lower = Symbol("KeyRange.lower");
const lowerOpen = Symbol("KeyRange.lowerOpen");
const upper = Symbol("KeyRange.upper");
const upperOpen = Symbol("KeyRange.upperOpen");
dart.setMethodSignature(indexed_db.KeyRange, () => ({
  __proto__: dart.getMethods(indexed_db.KeyRange.__proto__),
  [$includes]: dart.fnType(core.bool, [core.Object])
}));
dart.setLibraryUri(indexed_db.KeyRange, "dart:indexed_db");
dart.setFieldSignature(indexed_db.KeyRange, () => ({
  __proto__: dart.getFields(indexed_db.KeyRange.__proto__),
  [$lower]: dart.finalFieldType(core.Object),
  [$lowerOpen]: dart.finalFieldType(core.bool),
  [$upper]: dart.finalFieldType(core.Object),
  [$upperOpen]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("IDBKeyRange", indexed_db.KeyRange);
const _add$1 = dart.privateName(indexed_db, "_add");
const _clear$ = dart.privateName(indexed_db, "_clear");
const _put = dart.privateName(indexed_db, "_put");
const _createIndex = dart.privateName(indexed_db, "_createIndex");
const _add_1 = dart.privateName(indexed_db, "_add_1");
const _add_2 = dart.privateName(indexed_db, "_add_2");
const _createIndex_1 = dart.privateName(indexed_db, "_createIndex_1");
const _createIndex_2 = dart.privateName(indexed_db, "_createIndex_2");
const _put_1 = dart.privateName(indexed_db, "_put_1");
const _put_2 = dart.privateName(indexed_db, "_put_2");
indexed_db.ObjectStore = class ObjectStore extends _interceptors.Interceptor {
  [$add](value, key) {
    if (key === void 0) key = null;
    try {
      let request = null;
      if (key != null) {
        request = this[_add$1](value, key);
      } else {
        request = this[_add$1](value);
      }
      return indexed_db._completeRequest(dart.dynamic, indexed_db.Request._check(request));
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$clear]() {
    try {
      return indexed_db._completeRequest(dart.dynamic, this[_clear$]());
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$delete](key_OR_keyRange) {
    try {
      return indexed_db._completeRequest(dart.dynamic, this[_delete$](key_OR_keyRange));
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$count](key_OR_range) {
    if (key_OR_range === void 0) key_OR_range = null;
    try {
      let request = this[_count$0](key_OR_range);
      return indexed_db._completeRequest(core.int, request);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return FutureOfint().error(e, stacktrace);
    }
  }
  [$put](value, key) {
    if (key === void 0) key = null;
    try {
      let request = null;
      if (key != null) {
        request = this[_put](value, key);
      } else {
        request = this[_put](value);
      }
      return indexed_db._completeRequest(dart.dynamic, indexed_db.Request._check(request));
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$getObject](key) {
    try {
      let request = this[_get](key);
      return indexed_db._completeRequest(dart.dynamic, request);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      return async.Future.error(e, stacktrace);
    }
  }
  [$openCursor](opts) {
    let key = opts && 'key' in opts ? opts.key : null;
    let range = opts && 'range' in opts ? opts.range : null;
    let direction = opts && 'direction' in opts ? opts.direction : null;
    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
    let key_OR_range = null;
    if (key != null) {
      if (range != null) {
        dart.throw(new core.ArgumentError.new("Cannot specify both key and range."));
      }
      key_OR_range = key;
    } else {
      key_OR_range = range;
    }
    let request = null;
    if (direction == null) {
      request = this[_openCursor](key_OR_range);
    } else {
      request = this[_openCursor](key_OR_range, direction);
    }
    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue, indexed_db.Request._check(request), autoAdvance);
  }
  [$createIndex](name, keyPath, opts) {
    let unique = opts && 'unique' in opts ? opts.unique : null;
    let multiEntry = opts && 'multiEntry' in opts ? opts.multiEntry : null;
    let options = new _js_helper.LinkedMap.new();
    if (unique != null) {
      options[$_set]("unique", unique);
    }
    if (multiEntry != null) {
      options[$_set]("multiEntry", multiEntry);
    }
    return this[_createIndex](name, keyPath, options);
  }
  get [$autoIncrement]() {
    return this.autoIncrement;
  }
  get [$indexNames]() {
    return this.indexNames;
  }
  get [$keyPath]() {
    return this.keyPath;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$transaction]() {
    return this.transaction;
  }
  [_add$1](value, key) {
    if (key === void 0) key = null;
    if (key != null) {
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
      return this[_add_1](value_1, key_2);
    }
    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
    return this[_add_2](value_1);
  }
  [_add_1](...args) {
    return this.add.apply(this, args);
  }
  [_add_2](...args) {
    return this.add.apply(this, args);
  }
  [_clear$](...args) {
    return this.clear.apply(this, args);
  }
  [_count$0](...args) {
    return this.count.apply(this, args);
  }
  [_createIndex](name, keyPath, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_createIndex_1](name, keyPath, options_1);
    }
    return this[_createIndex_2](name, keyPath);
  }
  [_createIndex_1](...args) {
    return this.createIndex.apply(this, args);
  }
  [_createIndex_2](...args) {
    return this.createIndex.apply(this, args);
  }
  [_delete$](...args) {
    return this.delete.apply(this, args);
  }
  [$deleteIndex](...args) {
    return this.deleteIndex.apply(this, args);
  }
  [_get](...args) {
    return this.get.apply(this, args);
  }
  [$getAll](...args) {
    return this.getAll.apply(this, args);
  }
  [$getAllKeys](...args) {
    return this.getAllKeys.apply(this, args);
  }
  [$getKey](...args) {
    return this.getKey.apply(this, args);
  }
  [$index](...args) {
    return this.index.apply(this, args);
  }
  [_openCursor](...args) {
    return this.openCursor.apply(this, args);
  }
  [$openKeyCursor](...args) {
    return this.openKeyCursor.apply(this, args);
  }
  [_put](value, key) {
    if (key === void 0) key = null;
    if (key != null) {
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
      return this[_put_1](value_1, key_2);
    }
    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
    return this[_put_2](value_1);
  }
  [_put_1](...args) {
    return this.put.apply(this, args);
  }
  [_put_2](...args) {
    return this.put.apply(this, args);
  }
  static _cursorStreamFromResult(T, request, autoAdvance) {
    let controller = async.StreamController$(T).new({sync: true});
    request[$onError].listen(dart.bind(controller, 'addError'));
    request[$onSuccess].listen(dart.fn(e => {
      let cursor = T._check(request[$result]);
      if (cursor == null) {
        controller.close();
      } else {
        controller.add(cursor);
        if (autoAdvance === true && dart.test(controller.hasListener)) {
          cursor[$next]();
        }
      }
    }, EventToNull()));
    return controller.stream;
  }
};
dart.addTypeTests(indexed_db.ObjectStore);
const autoIncrement = Symbol("ObjectStore.autoIncrement");
const indexNames = Symbol("ObjectStore.indexNames");
const keyPath$ = Symbol("ObjectStore.keyPath");
const name$5 = Symbol("ObjectStore.name");
const transaction = Symbol("ObjectStore.transaction");
dart.setMethodSignature(indexed_db.ObjectStore, () => ({
  __proto__: dart.getMethods(indexed_db.ObjectStore.__proto__),
  [$add]: dart.fnType(async.Future, [dart.dynamic], [dart.dynamic]),
  [$clear]: dart.fnType(async.Future, []),
  [$delete]: dart.fnType(async.Future, [dart.dynamic]),
  [$count]: dart.fnType(async.Future$(core.int), [], [dart.dynamic]),
  [$put]: dart.fnType(async.Future, [dart.dynamic], [dart.dynamic]),
  [$getObject]: dart.fnType(async.Future, [dart.dynamic]),
  [$openCursor]: dart.fnType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
  [$createIndex]: dart.fnType(indexed_db.Index, [core.String, dart.dynamic], {unique: core.bool, multiEntry: core.bool}),
  [_add$1]: dart.fnType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
  [_add_1]: dart.fnType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
  [_add_2]: dart.fnType(indexed_db.Request, [dart.dynamic]),
  [_clear$]: dart.fnType(indexed_db.Request, []),
  [_count$0]: dart.fnType(indexed_db.Request, [core.Object]),
  [_createIndex]: dart.fnType(indexed_db.Index, [core.String, core.Object], [core.Map]),
  [_createIndex_1]: dart.fnType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
  [_createIndex_2]: dart.fnType(indexed_db.Index, [dart.dynamic, dart.dynamic]),
  [_delete$]: dart.fnType(indexed_db.Request, [core.Object]),
  [$deleteIndex]: dart.fnType(dart.void, [core.String]),
  [_get]: dart.fnType(indexed_db.Request, [core.Object]),
  [$getAll]: dart.fnType(indexed_db.Request, [core.Object], [core.int]),
  [$getAllKeys]: dart.fnType(indexed_db.Request, [core.Object], [core.int]),
  [$getKey]: dart.fnType(indexed_db.Request, [core.Object]),
  [$index]: dart.fnType(indexed_db.Index, [core.String]),
  [_openCursor]: dart.fnType(indexed_db.Request, [core.Object], [core.String]),
  [$openKeyCursor]: dart.fnType(indexed_db.Request, [core.Object], [core.String]),
  [_put]: dart.fnType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
  [_put_1]: dart.fnType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
  [_put_2]: dart.fnType(indexed_db.Request, [dart.dynamic])
}));
dart.setLibraryUri(indexed_db.ObjectStore, "dart:indexed_db");
dart.setFieldSignature(indexed_db.ObjectStore, () => ({
  __proto__: dart.getFields(indexed_db.ObjectStore.__proto__),
  [$autoIncrement]: dart.finalFieldType(core.bool),
  [$indexNames]: dart.finalFieldType(ListOfString()),
  [$keyPath]: dart.finalFieldType(core.Object),
  [$name]: dart.fieldType(core.String),
  [$transaction]: dart.finalFieldType(indexed_db.Transaction)
}));
dart.registerExtension("IDBObjectStore", indexed_db.ObjectStore);
indexed_db.Observation = class Observation extends _interceptors.Interceptor {
  get [$key]() {
    return this.key;
  }
  get [$type]() {
    return this.type;
  }
  get [$value]() {
    return this.value;
  }
};
dart.addTypeTests(indexed_db.Observation);
const key$ = Symbol("Observation.key");
const type = Symbol("Observation.type");
const value = Symbol("Observation.value");
dart.setLibraryUri(indexed_db.Observation, "dart:indexed_db");
dart.setFieldSignature(indexed_db.Observation, () => ({
  __proto__: dart.getFields(indexed_db.Observation.__proto__),
  [$key]: dart.finalFieldType(core.Object),
  [$type]: dart.finalFieldType(core.String),
  [$value]: dart.finalFieldType(core.Object)
}));
dart.registerExtension("IDBObservation", indexed_db.Observation);
const _observe_1 = dart.privateName(indexed_db, "_observe_1");
indexed_db.Observer = class Observer extends _interceptors.Interceptor {
  static new(callback) {
    let callback_1 = _js_helper.convertDartClosureToJS(ObserverChangesTovoid(), callback, 1);
    return indexed_db.Observer._create_1(callback_1);
  }
  static _create_1(callback) {
    return new IDBObserver(callback);
  }
  [$observe](db, tx, options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    this[_observe_1](db, tx, options_1);
    return;
  }
  [_observe_1](...args) {
    return this.observe.apply(this, args);
  }
  [$unobserve](...args) {
    return this.unobserve.apply(this, args);
  }
};
dart.addTypeTests(indexed_db.Observer);
dart.setMethodSignature(indexed_db.Observer, () => ({
  __proto__: dart.getMethods(indexed_db.Observer.__proto__),
  [$observe]: dart.fnType(dart.void, [indexed_db.Database, indexed_db.Transaction, core.Map]),
  [_observe_1]: dart.fnType(dart.void, [indexed_db.Database, indexed_db.Transaction, dart.dynamic]),
  [$unobserve]: dart.fnType(dart.void, [indexed_db.Database])
}));
dart.setLibraryUri(indexed_db.Observer, "dart:indexed_db");
dart.registerExtension("IDBObserver", indexed_db.Observer);
indexed_db.ObserverChanges = class ObserverChanges extends _interceptors.Interceptor {
  get [$database]() {
    return this.database;
  }
  get [$records]() {
    return this.records;
  }
  get [$transaction]() {
    return this.transaction;
  }
};
dart.addTypeTests(indexed_db.ObserverChanges);
const database = Symbol("ObserverChanges.database");
const records = Symbol("ObserverChanges.records");
const transaction$ = Symbol("ObserverChanges.transaction");
dart.setLibraryUri(indexed_db.ObserverChanges, "dart:indexed_db");
dart.setFieldSignature(indexed_db.ObserverChanges, () => ({
  __proto__: dart.getFields(indexed_db.ObserverChanges.__proto__),
  [$database]: dart.finalFieldType(indexed_db.Database),
  [$records]: dart.finalFieldType(core.Object),
  [$transaction]: dart.finalFieldType(indexed_db.Transaction)
}));
dart.registerExtension("IDBObserverChanges", indexed_db.ObserverChanges);
const _get_result = dart.privateName(indexed_db, "_get_result");
indexed_db.Request = class Request extends html$.EventTarget {
  get [$error]() {
    return this.error;
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [$result]() {
    return indexed_db._convertNativeToDart_IDBAny(this[_get_result]);
  }
  get [_get_result]() {
    return this.result;
  }
  get [$source]() {
    return this.source;
  }
  get [$transaction]() {
    return this.transaction;
  }
  get [$onError]() {
    return indexed_db.Request.errorEvent.forTarget(this);
  }
  get [$onSuccess]() {
    return indexed_db.Request.successEvent.forTarget(this);
  }
};
dart.addTypeTests(indexed_db.Request);
const error = Symbol("Request.error");
const readyState = Symbol("Request.readyState");
const source$0 = Symbol("Request.source");
const transaction$0 = Symbol("Request.transaction");
dart.setGetterSignature(indexed_db.Request, () => ({
  __proto__: dart.getGetters(indexed_db.Request.__proto__),
  [$result]: dart.dynamic,
  [$onError]: async.Stream$(html$.Event),
  [$onSuccess]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(indexed_db.Request, "dart:indexed_db");
dart.setFieldSignature(indexed_db.Request, () => ({
  __proto__: dart.getFields(indexed_db.Request.__proto__),
  [$error]: dart.finalFieldType(html$.DomException),
  [$readyState]: dart.finalFieldType(core.String),
  [_get_result]: dart.finalFieldType(dart.dynamic),
  [$source]: dart.finalFieldType(core.Object),
  [$transaction]: dart.finalFieldType(indexed_db.Transaction)
}));
dart.defineLazy(indexed_db.Request, {
  /*indexed_db.Request.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*indexed_db.Request.successEvent*/get successEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("success"));
  }
});
dart.registerExtension("IDBRequest", indexed_db.Request);
indexed_db.OpenDBRequest = class OpenDBRequest extends indexed_db.Request {
  get [$onBlocked]() {
    return indexed_db.OpenDBRequest.blockedEvent.forTarget(this);
  }
  get [$onUpgradeNeeded]() {
    return indexed_db.OpenDBRequest.upgradeNeededEvent.forTarget(this);
  }
};
dart.addTypeTests(indexed_db.OpenDBRequest);
dart.setGetterSignature(indexed_db.OpenDBRequest, () => ({
  __proto__: dart.getGetters(indexed_db.OpenDBRequest.__proto__),
  [$onBlocked]: async.Stream$(html$.Event),
  [$onUpgradeNeeded]: async.Stream$(indexed_db.VersionChangeEvent)
}));
dart.setLibraryUri(indexed_db.OpenDBRequest, "dart:indexed_db");
dart.defineLazy(indexed_db.OpenDBRequest, {
  /*indexed_db.OpenDBRequest.blockedEvent*/get blockedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("blocked"));
  },
  /*indexed_db.OpenDBRequest.upgradeNeededEvent*/get upgradeNeededEvent() {
    return dart.const(new (EventStreamProviderOfVersionChangeEvent()).new("upgradeneeded"));
  }
});
dart.registerExtension("IDBOpenDBRequest", indexed_db.OpenDBRequest);
dart.registerExtension("IDBVersionChangeRequest", indexed_db.OpenDBRequest);
indexed_db.Transaction = class Transaction extends html$.EventTarget {
  get [$completed]() {
    let completer = CompleterOfDatabase().new();
    FutureOfNull()._check(this[$onComplete].first.then(core.Null, dart.fn(_ => {
      completer.complete(this.db);
    }, EventToNull())));
    FutureOfNull()._check(this[$onError].first.then(core.Null, dart.fn(e => {
      completer.completeError(e);
    }, EventToNull())));
    FutureOfNull()._check(this[$onAbort].first.then(core.Null, dart.fn(e => {
      if (!dart.test(completer.isCompleted)) {
        completer.completeError(e);
      }
    }, EventToNull())));
    return completer.future;
  }
  get [$db]() {
    return this.db;
  }
  get [$error]() {
    return this.error;
  }
  get [$mode]() {
    return this.mode;
  }
  get [$objectStoreNames]() {
    return this.objectStoreNames;
  }
  [$abort](...args) {
    return this.abort.apply(this, args);
  }
  [$objectStore](...args) {
    return this.objectStore.apply(this, args);
  }
  get [$onAbort]() {
    return indexed_db.Transaction.abortEvent.forTarget(this);
  }
  get [$onComplete]() {
    return indexed_db.Transaction.completeEvent.forTarget(this);
  }
  get [$onError]() {
    return indexed_db.Transaction.errorEvent.forTarget(this);
  }
};
dart.addTypeTests(indexed_db.Transaction);
const db = Symbol("Transaction.db");
const error$0 = Symbol("Transaction.error");
const mode = Symbol("Transaction.mode");
const objectStoreNames$ = Symbol("Transaction.objectStoreNames");
dart.setMethodSignature(indexed_db.Transaction, () => ({
  __proto__: dart.getMethods(indexed_db.Transaction.__proto__),
  [$abort]: dart.fnType(dart.void, []),
  [$objectStore]: dart.fnType(indexed_db.ObjectStore, [core.String])
}));
dart.setGetterSignature(indexed_db.Transaction, () => ({
  __proto__: dart.getGetters(indexed_db.Transaction.__proto__),
  [$completed]: async.Future$(indexed_db.Database),
  [$onAbort]: async.Stream$(html$.Event),
  [$onComplete]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(indexed_db.Transaction, "dart:indexed_db");
dart.setFieldSignature(indexed_db.Transaction, () => ({
  __proto__: dart.getFields(indexed_db.Transaction.__proto__),
  [$db]: dart.finalFieldType(indexed_db.Database),
  [$error]: dart.finalFieldType(html$.DomException),
  [$mode]: dart.finalFieldType(core.String),
  [$objectStoreNames]: dart.finalFieldType(ListOfString())
}));
dart.defineLazy(indexed_db.Transaction, {
  /*indexed_db.Transaction.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("abort"));
  },
  /*indexed_db.Transaction.completeEvent*/get completeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("complete"));
  },
  /*indexed_db.Transaction.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  }
});
dart.registerExtension("IDBTransaction", indexed_db.Transaction);
const _createEvent = dart.privateName(html$, "_createEvent");
const _initEvent = dart.privateName(html$, "_initEvent");
const _selector = dart.privateName(html$, "_selector");
const _get_currentTarget = dart.privateName(html$, "_get_currentTarget");
const _get_target = dart.privateName(html$, "_get_target");
html$.Event = class Event$ extends _interceptors.Interceptor {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    return html$.Event.eventType("Event", type, {canBubble: canBubble, cancelable: cancelable});
  }
  static eventType(type, name, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let e = html$.document[_createEvent](type);
    e[_initEvent](name, canBubble, cancelable);
    return e;
  }
  get [_selector]() {
    return this._selector;
  }
  set [_selector](value) {
    this._selector = value;
  }
  get [$matchingTarget]() {
    if (this[_selector] == null) {
      dart.throw(new core.UnsupportedError.new("Cannot call matchingTarget if this Event did" + " not arise as a result of event delegation."));
    }
    let currentTarget = html$.Element._check(this[$currentTarget]);
    let target = html$.Element._check(this[$target]);
    let matchedTarget = null;
    do {
      if (dart.test(target[$matches](this[_selector]))) return target;
      target = target[$parent];
    } while (target != null && !dart.equals(target, currentTarget[$parent]));
    dart.throw(new core.StateError.new("No selector matched for populating matchedTarget."));
  }
  get [$path]() {
    return !!this.composedPath ? this.composedPath() : JSArrayOfEventTarget().of([]);
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.Event._create_1(type, eventInitDict_1);
    }
    return html$.Event._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new Event(type, eventInitDict);
  }
  static _create_2(type) {
    return new Event(type);
  }
  get [$bubbles]() {
    return this.bubbles;
  }
  get [$cancelable]() {
    return this.cancelable;
  }
  get [$composed]() {
    return this.composed;
  }
  get [$currentTarget]() {
    return html$._convertNativeToDart_EventTarget(this[_get_currentTarget]);
  }
  get [_get_currentTarget]() {
    return this.currentTarget;
  }
  get [$defaultPrevented]() {
    return this.defaultPrevented;
  }
  get [$eventPhase]() {
    return this.eventPhase;
  }
  get [$isTrusted]() {
    return this.isTrusted;
  }
  get [$target]() {
    return html$._convertNativeToDart_EventTarget(this[_get_target]);
  }
  get [_get_target]() {
    return this.target;
  }
  get [$timeStamp]() {
    return this.timeStamp;
  }
  get [$type]() {
    return this.type;
  }
  [$composedPath](...args) {
    return this.composedPath.apply(this, args);
  }
  [_initEvent](...args) {
    return this.initEvent.apply(this, args);
  }
  [$preventDefault](...args) {
    return this.preventDefault.apply(this, args);
  }
  [$stopImmediatePropagation](...args) {
    return this.stopImmediatePropagation.apply(this, args);
  }
  [$stopPropagation](...args) {
    return this.stopPropagation.apply(this, args);
  }
};
dart.addTypeTests(html$.Event);
const bubbles = Symbol("Event.bubbles");
const cancelable = Symbol("Event.cancelable");
const composed = Symbol("Event.composed");
const defaultPrevented = Symbol("Event.defaultPrevented");
const eventPhase = Symbol("Event.eventPhase");
const isTrusted = Symbol("Event.isTrusted");
const timeStamp = Symbol("Event.timeStamp");
const type$2 = Symbol("Event.type");
dart.setMethodSignature(html$.Event, () => ({
  __proto__: dart.getMethods(html$.Event.__proto__),
  [$composedPath]: dart.fnType(core.List$(html$.EventTarget), []),
  [_initEvent]: dart.fnType(dart.void, [core.String], [core.bool, core.bool]),
  [$preventDefault]: dart.fnType(dart.void, []),
  [$stopImmediatePropagation]: dart.fnType(dart.void, []),
  [$stopPropagation]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.Event, () => ({
  __proto__: dart.getGetters(html$.Event.__proto__),
  [$matchingTarget]: html$.Element,
  [$path]: core.List$(html$.EventTarget),
  [$currentTarget]: html$.EventTarget,
  [$target]: html$.EventTarget
}));
dart.setLibraryUri(html$.Event, "dart:html");
dart.setFieldSignature(html$.Event, () => ({
  __proto__: dart.getFields(html$.Event.__proto__),
  [_selector]: dart.fieldType(core.String),
  [$bubbles]: dart.finalFieldType(core.bool),
  [$cancelable]: dart.finalFieldType(core.bool),
  [$composed]: dart.finalFieldType(core.bool),
  [_get_currentTarget]: dart.finalFieldType(dart.dynamic),
  [$defaultPrevented]: dart.finalFieldType(core.bool),
  [$eventPhase]: dart.finalFieldType(core.int),
  [$isTrusted]: dart.finalFieldType(core.bool),
  [_get_target]: dart.finalFieldType(dart.dynamic),
  [$timeStamp]: dart.finalFieldType(core.num),
  [$type]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.Event, {
  /*html$.Event.AT_TARGET*/get AT_TARGET() {
    return 2;
  },
  /*html$.Event.BUBBLING_PHASE*/get BUBBLING_PHASE() {
    return 3;
  },
  /*html$.Event.CAPTURING_PHASE*/get CAPTURING_PHASE() {
    return 1;
  }
});
dart.registerExtension("Event", html$.Event);
dart.registerExtension("InputEvent", html$.Event);
indexed_db.VersionChangeEvent = class VersionChangeEvent extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return indexed_db.VersionChangeEvent._create_1(type, eventInitDict_1);
    }
    return indexed_db.VersionChangeEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new IDBVersionChangeEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new IDBVersionChangeEvent(type);
  }
  get [$dataLoss]() {
    return this.dataLoss;
  }
  get [$dataLossMessage]() {
    return this.dataLossMessage;
  }
  get [$newVersion]() {
    return this.newVersion;
  }
  get [$oldVersion]() {
    return this.oldVersion;
  }
  get [$target]() {
    return this.target;
  }
};
dart.addTypeTests(indexed_db.VersionChangeEvent);
const dataLoss = Symbol("VersionChangeEvent.dataLoss");
const dataLossMessage = Symbol("VersionChangeEvent.dataLossMessage");
const newVersion = Symbol("VersionChangeEvent.newVersion");
const oldVersion = Symbol("VersionChangeEvent.oldVersion");
const target = Symbol("VersionChangeEvent.target");
dart.setLibraryUri(indexed_db.VersionChangeEvent, "dart:indexed_db");
dart.setFieldSignature(indexed_db.VersionChangeEvent, () => ({
  __proto__: dart.getFields(indexed_db.VersionChangeEvent.__proto__),
  [$dataLoss]: dart.finalFieldType(core.String),
  [$dataLossMessage]: dart.finalFieldType(core.String),
  [$newVersion]: dart.finalFieldType(core.int),
  [$oldVersion]: dart.finalFieldType(core.int),
  [$target]: dart.finalFieldType(indexed_db.OpenDBRequest)
}));
dart.registerExtension("IDBVersionChangeEvent", indexed_db.VersionChangeEvent);
dart.copyProperties(html$, {
  get window() {
    return window;
  }
});
dart.copyProperties(html$, {
  get document() {
    return document;
  }
});
html$.promiseToFuture = function(T, jsPromise) {
  let completer = async.Completer$(T).new();
  let thenSuccessCode = promiseValue => completer.complete(async.FutureOr$(T)._check(promiseValue));
  dart.fn(thenSuccessCode, dynamicTovoid());
  let thenErrorCode = promiseError => completer.completeError(promiseError);
  dart.fn(thenErrorCode, dynamicTovoid());
  jsPromise.then(_js_helper.convertDartClosureToJS(dynamicTovoid(), thenSuccessCode, 1), _js_helper.convertDartClosureToJS(dynamicTovoid(), thenErrorCode, 1));
  return completer.future;
};
html$.promiseToFutureAsMap = function(jsPromise) {
  let completer = CompleterOfMapOfString$dynamic().new();
  let thenSuccessCode = promiseValue => completer.complete(html_common.convertNativeToDart_Dictionary(promiseValue));
  dart.fn(thenSuccessCode, dynamicTovoid());
  let thenErrorCode = promiseError => completer.completeError(promiseError);
  dart.fn(thenErrorCode, dynamicTovoid());
  jsPromise.then(_js_helper.convertDartClosureToJS(dynamicTovoid(), thenSuccessCode, 1), _js_helper.convertDartClosureToJS(dynamicTovoid(), thenErrorCode, 1));
  return completer.future;
};
const _attributes$ = dart.privateName(html$, "_attributes");
const _innerHtml = dart.privateName(html$, "_innerHtml");
const _localName = dart.privateName(html$, "_localName");
const _namespaceUri = dart.privateName(html$, "_namespaceUri");
const _scrollHeight = dart.privateName(html$, "_scrollHeight");
const _scrollLeft = dart.privateName(html$, "_scrollLeft");
const _scrollTop = dart.privateName(html$, "_scrollTop");
const _scrollWidth = dart.privateName(html$, "_scrollWidth");
const _childElementCount = dart.privateName(html$, "_childElementCount");
const _children = dart.privateName(html$, "_children");
const _firstElementChild = dart.privateName(html$, "_firstElementChild");
const _lastElementChild = dart.privateName(html$, "_lastElementChild");
const _getAttribute = dart.privateName(html$, "_getAttribute");
const _getAttributeNS = dart.privateName(html$, "_getAttributeNS");
const _hasAttribute = dart.privateName(html$, "_hasAttribute");
const _hasAttributeNS = dart.privateName(html$, "_hasAttributeNS");
const _removeAttribute = dart.privateName(html$, "_removeAttribute");
const _removeAttributeNS = dart.privateName(html$, "_removeAttributeNS");
const _setAttribute = dart.privateName(html$, "_setAttribute");
const _setAttributeNS = dart.privateName(html$, "_setAttributeNS");
const _querySelectorAll = dart.privateName(html$, "_querySelectorAll");
const _setApplyScroll = dart.privateName(html$, "_setApplyScroll");
const _setDistributeScroll = dart.privateName(html$, "_setDistributeScroll");
const _getComputedStyle = dart.privateName(html$, "_getComputedStyle");
const _getClientRects = dart.privateName(html$, "_getClientRects");
const _animate = dart.privateName(html$, "_animate");
const _scrollIntoView = dart.privateName(html$, "_scrollIntoView");
const _scrollIntoViewIfNeeded = dart.privateName(html$, "_scrollIntoViewIfNeeded");
const _insertAdjacentText = dart.privateName(html$, "_insertAdjacentText");
const _insertAdjacentNode = dart.privateName(html$, "_insertAdjacentNode");
const _insertAdjacentHtml = dart.privateName(html$, "_insertAdjacentHtml");
const _insertAdjacentElement = dart.privateName(html$, "_insertAdjacentElement");
const _canBeUsedToCreateContextualFragment = dart.privateName(html$, "_canBeUsedToCreateContextualFragment");
const _cannotBeUsedToCreateContextualFragment = dart.privateName(html$, "_cannotBeUsedToCreateContextualFragment");
const _attachShadow_1 = dart.privateName(html$, "_attachShadow_1");
const _getElementsByTagName = dart.privateName(html$, "_getElementsByTagName");
const _scroll_1 = dart.privateName(html$, "_scroll_1");
const _scroll_2 = dart.privateName(html$, "_scroll_2");
const _scroll_3 = dart.privateName(html$, "_scroll_3");
const _scrollBy_1 = dart.privateName(html$, "_scrollBy_1");
const _scrollBy_2 = dart.privateName(html$, "_scrollBy_2");
const _scrollBy_3 = dart.privateName(html$, "_scrollBy_3");
const _scrollTo_1 = dart.privateName(html$, "_scrollTo_1");
const _scrollTo_2 = dart.privateName(html$, "_scrollTo_2");
const _scrollTo_3 = dart.privateName(html$, "_scrollTo_3");
const _removeChild = dart.privateName(html$, "_removeChild");
const _replaceChild = dart.privateName(html$, "_replaceChild");
const _this = dart.privateName(html$, "_this");
const _clearChildren = dart.privateName(html$, "_clearChildren");
const _getRootNode_1 = dart.privateName(html$, "_getRootNode_1");
const _getRootNode_2 = dart.privateName(html$, "_getRootNode_2");
html$.Node = class Node extends html$.EventTarget {
  get [$nodes]() {
    return new html$._ChildNodeListLazy.new(this);
  }
  set [$nodes](value) {
    let copy = value[$toList]();
    this[$text] = "";
    for (let node of copy) {
      this[$append](node);
    }
  }
  [$remove]() {
    if (this.parentNode != null) {
      let parent = this.parentNode;
      this.parentNode[_removeChild](this);
    }
  }
  [$replaceWith](otherNode) {
    try {
      let parent = this.parentNode;
      parent[_replaceChild](otherNode, this);
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    ;
    return this;
  }
  [$insertAllBefore](newNodes, refChild) {
    if (html$._ChildNodeListLazy.is(newNodes)) {
      let otherList = newNodes;
      if (otherList[_this] === this) {
        dart.throw(new core.ArgumentError.new(newNodes));
      }
      for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
        this.insertBefore(otherList[_this].firstChild, refChild);
      }
    } else {
      for (let node of newNodes) {
        this.insertBefore(node, refChild);
      }
    }
  }
  [_clearChildren]() {
    while (this.firstChild != null) {
      this[_removeChild](this.firstChild);
    }
  }
  [$toString]() {
    let value = this.nodeValue;
    return value == null ? super[$toString]() : value;
  }
  get [$childNodes]() {
    return this.childNodes;
  }
  get [$baseUri]() {
    return this.baseURI;
  }
  get [$firstChild]() {
    return this.firstChild;
  }
  get [$isConnected]() {
    return this.isConnected;
  }
  get [$lastChild]() {
    return this.lastChild;
  }
  get [$nextNode]() {
    return this.nextSibling;
  }
  get [$nodeName]() {
    return this.nodeName;
  }
  get [$nodeType]() {
    return this.nodeType;
  }
  get [$nodeValue]() {
    return this.nodeValue;
  }
  get [$ownerDocument]() {
    return this.ownerDocument;
  }
  get [$parent]() {
    return this.parentElement;
  }
  get [$parentNode]() {
    return this.parentNode;
  }
  get [$previousNode]() {
    return this.previousSibling;
  }
  get [$text]() {
    return this.textContent;
  }
  set [$text](value) {
    this.textContent = value;
  }
  [$append](...args) {
    return this.appendChild.apply(this, args);
  }
  [$clone](...args) {
    return this.cloneNode.apply(this, args);
  }
  [$contains](...args) {
    return this.contains.apply(this, args);
  }
  [$getRootNode](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_getRootNode_1](options_1);
    }
    return this[_getRootNode_2]();
  }
  [_getRootNode_1](...args) {
    return this.getRootNode.apply(this, args);
  }
  [_getRootNode_2](...args) {
    return this.getRootNode.apply(this, args);
  }
  [$hasChildNodes](...args) {
    return this.hasChildNodes.apply(this, args);
  }
  [$insertBefore](...args) {
    return this.insertBefore.apply(this, args);
  }
  [_removeChild](...args) {
    return this.removeChild.apply(this, args);
  }
  [_replaceChild](...args) {
    return this.replaceChild.apply(this, args);
  }
};
(html$.Node._created = function() {
  this[childNodes] = null;
  this[baseUri] = null;
  this[firstChild] = null;
  this[isConnected] = null;
  this[lastChild] = null;
  this[nextNode] = null;
  this[nodeName] = null;
  this[nodeType] = null;
  this[nodeValue] = null;
  this[ownerDocument] = null;
  this[parent] = null;
  this[parentNode] = null;
  this[previousNode] = null;
  this[text] = null;
  html$.Node.__proto__._created.call(this);
}).prototype = html$.Node.prototype;
dart.addTypeTests(html$.Node);
const childNodes = Symbol("Node.childNodes");
const baseUri = Symbol("Node.baseUri");
const firstChild = Symbol("Node.firstChild");
const isConnected = Symbol("Node.isConnected");
const lastChild = Symbol("Node.lastChild");
const nextNode = Symbol("Node.nextNode");
const nodeName = Symbol("Node.nodeName");
const nodeType = Symbol("Node.nodeType");
const nodeValue = Symbol("Node.nodeValue");
const ownerDocument = Symbol("Node.ownerDocument");
const parent = Symbol("Node.parent");
const parentNode = Symbol("Node.parentNode");
const previousNode = Symbol("Node.previousNode");
const text = Symbol("Node.text");
dart.setMethodSignature(html$.Node, () => ({
  __proto__: dart.getMethods(html$.Node.__proto__),
  [$remove]: dart.fnType(dart.void, []),
  [$replaceWith]: dart.fnType(html$.Node, [html$.Node]),
  [$insertAllBefore]: dart.fnType(html$.Node, [core.Iterable$(html$.Node), html$.Node]),
  [_clearChildren]: dart.fnType(dart.void, []),
  [$append]: dart.fnType(html$.Node, [html$.Node]),
  [$clone]: dart.fnType(html$.Node, [core.bool]),
  [$contains]: dart.fnType(core.bool, [html$.Node]),
  [$getRootNode]: dart.fnType(html$.Node, [], [core.Map]),
  [_getRootNode_1]: dart.fnType(html$.Node, [dart.dynamic]),
  [_getRootNode_2]: dart.fnType(html$.Node, []),
  [$hasChildNodes]: dart.fnType(core.bool, []),
  [$insertBefore]: dart.fnType(html$.Node, [html$.Node, html$.Node]),
  [_removeChild]: dart.fnType(html$.Node, [html$.Node]),
  [_replaceChild]: dart.fnType(html$.Node, [html$.Node, html$.Node])
}));
dart.setGetterSignature(html$.Node, () => ({
  __proto__: dart.getGetters(html$.Node.__proto__),
  [$nodes]: core.List$(html$.Node)
}));
dart.setSetterSignature(html$.Node, () => ({
  __proto__: dart.getSetters(html$.Node.__proto__),
  [$nodes]: core.Iterable$(html$.Node)
}));
dart.setLibraryUri(html$.Node, "dart:html");
dart.setFieldSignature(html$.Node, () => ({
  __proto__: dart.getFields(html$.Node.__proto__),
  [$childNodes]: dart.finalFieldType(ListOfNode()),
  [$baseUri]: dart.finalFieldType(core.String),
  [$firstChild]: dart.finalFieldType(html$.Node),
  [$isConnected]: dart.finalFieldType(core.bool),
  [$lastChild]: dart.finalFieldType(html$.Node),
  [$nextNode]: dart.finalFieldType(html$.Node),
  [$nodeName]: dart.finalFieldType(core.String),
  [$nodeType]: dart.finalFieldType(core.int),
  [$nodeValue]: dart.finalFieldType(core.String),
  [$ownerDocument]: dart.finalFieldType(html$.Document),
  [$parent]: dart.finalFieldType(html$.Element),
  [$parentNode]: dart.finalFieldType(html$.Node),
  [$previousNode]: dart.finalFieldType(html$.Node),
  [$text]: dart.fieldType(core.String)
}));
dart.defineLazy(html$.Node, {
  /*html$.Node.ATTRIBUTE_NODE*/get ATTRIBUTE_NODE() {
    return 2;
  },
  /*html$.Node.CDATA_SECTION_NODE*/get CDATA_SECTION_NODE() {
    return 4;
  },
  /*html$.Node.COMMENT_NODE*/get COMMENT_NODE() {
    return 8;
  },
  /*html$.Node.DOCUMENT_FRAGMENT_NODE*/get DOCUMENT_FRAGMENT_NODE() {
    return 11;
  },
  /*html$.Node.DOCUMENT_NODE*/get DOCUMENT_NODE() {
    return 9;
  },
  /*html$.Node.DOCUMENT_TYPE_NODE*/get DOCUMENT_TYPE_NODE() {
    return 10;
  },
  /*html$.Node.ELEMENT_NODE*/get ELEMENT_NODE() {
    return 1;
  },
  /*html$.Node.ENTITY_NODE*/get ENTITY_NODE() {
    return 6;
  },
  /*html$.Node.ENTITY_REFERENCE_NODE*/get ENTITY_REFERENCE_NODE() {
    return 5;
  },
  /*html$.Node.NOTATION_NODE*/get NOTATION_NODE() {
    return 12;
  },
  /*html$.Node.PROCESSING_INSTRUCTION_NODE*/get PROCESSING_INSTRUCTION_NODE() {
    return 7;
  },
  /*html$.Node.TEXT_NODE*/get TEXT_NODE() {
    return 3;
  }
});
dart.registerExtension("Node", html$.Node);
html$.Element = class Element extends html$.Node {
  static html(html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    let fragment = html$.document.body[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    return html$.Element._check(fragment[$nodes][$where](dart.fn(e => html$.Element.is(e), NodeTobool()))[$single]);
  }
  static tag(tag, typeExtention) {
    if (typeExtention === void 0) typeExtention = null;
    return html$.Element._check(html$._ElementFactoryProvider.createElement_tag(tag, typeExtention));
  }
  static a() {
    return html$.AnchorElement.new();
  }
  static article() {
    return html$.Element.tag("article");
  }
  static aside() {
    return html$.Element.tag("aside");
  }
  static audio() {
    return html$.Element.tag("audio");
  }
  static br() {
    return html$.BRElement.new();
  }
  static canvas() {
    return html$.CanvasElement.new();
  }
  static div() {
    return html$.DivElement.new();
  }
  static footer() {
    return html$.Element.tag("footer");
  }
  static header() {
    return html$.Element.tag("header");
  }
  static hr() {
    return html$.Element.tag("hr");
  }
  static iframe() {
    return html$.Element.tag("iframe");
  }
  static img() {
    return html$.Element.tag("img");
  }
  static li() {
    return html$.Element.tag("li");
  }
  static nav() {
    return html$.Element.tag("nav");
  }
  static ol() {
    return html$.Element.tag("ol");
  }
  static option() {
    return html$.Element.tag("option");
  }
  static p() {
    return html$.Element.tag("p");
  }
  static pre() {
    return html$.Element.tag("pre");
  }
  static section() {
    return html$.Element.tag("section");
  }
  static select() {
    return html$.Element.tag("select");
  }
  static span() {
    return html$.Element.tag("span");
  }
  static svg() {
    return html$.Element.tag("svg");
  }
  static table() {
    return html$.Element.tag("table");
  }
  static td() {
    return html$.Element.tag("td");
  }
  static textarea() {
    return html$.Element.tag("textarea");
  }
  static th() {
    return html$.Element.tag("th");
  }
  static tr() {
    return html$.Element.tag("tr");
  }
  static ul() {
    return html$.Element.tag("ul");
  }
  static video() {
    return html$.Element.tag("video");
  }
  get [$attributes]() {
    return new html$._ElementAttributeMap.new(this);
  }
  set [$attributes](value) {
    let attributes = this[$attributes];
    attributes[$clear]();
    for (let key of value[$keys]) {
      attributes[$_set](key, value[$_get](key));
    }
  }
  [$getAttribute](name) {
    if (!(name != null)) dart.assertFailed("Attribute name cannot be null", "dart:html", 12321, 12, "name != null");
    return this[_getAttribute](name);
  }
  [$getAttributeNS](namespaceURI, name) {
    if (!(name != null)) dart.assertFailed("Attribute name cannot be null", "dart:html", 12329, 12, "name != null");
    return this[_getAttributeNS](namespaceURI, name);
  }
  [$hasAttribute](name) {
    if (!(name != null)) dart.assertFailed("Attribute name cannot be null", "dart:html", 12336, 12, "name != null");
    return this[_hasAttribute](name);
  }
  [$hasAttributeNS](namespaceURI, name) {
    if (!(name != null)) dart.assertFailed("Attribute name cannot be null", "dart:html", 12344, 12, "name != null");
    return this[_hasAttributeNS](namespaceURI, name);
  }
  [$removeAttribute](name) {
    if (!(name != null)) dart.assertFailed("Attribute name cannot be null", "dart:html", 12351, 12, "name != null");
    this[_removeAttribute](name);
  }
  [$removeAttributeNS](namespaceURI, name) {
    if (!(name != null)) dart.assertFailed("Attribute name cannot be null", "dart:html", 12358, 12, "name != null");
    this[_removeAttributeNS](namespaceURI, name);
  }
  [$setAttribute](name, value) {
    if (!(name != null)) dart.assertFailed("Attribute name cannot be null", "dart:html", 12365, 12, "name != null");
    this[_setAttribute](name, value);
  }
  [$setAttributeNS](namespaceURI, name, value) {
    if (!(name != null)) dart.assertFailed("Attribute name cannot be null", "dart:html", 12373, 12, "name != null");
    this[_setAttributeNS](namespaceURI, name, value);
  }
  get [$children]() {
    return new html$._ChildrenElementList._wrap(this);
  }
  set [$children](value) {
    let copy = value[$toList]();
    let children = this[$children];
    children[$clear]();
    children[$addAll](copy);
  }
  [$querySelectorAll](T, selectors) {
    return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
  }
  [_setApplyScroll](...args) {
    return this.setApplyScroll.apply(this, args);
  }
  [$setApplyScroll](nativeScrollBehavior) {
    let completer = CompleterOfScrollState().new();
    this[_setApplyScroll](dart.fn(value => {
      completer.complete(value);
    }, ScrollStateToNull()), nativeScrollBehavior);
    return completer.future;
  }
  [_setDistributeScroll](...args) {
    return this.setDistributeScroll.apply(this, args);
  }
  [$setDistributeScroll](nativeScrollBehavior) {
    let completer = CompleterOfScrollState().new();
    this[_setDistributeScroll](dart.fn(value => {
      completer.complete(value);
    }, ScrollStateToNull()), nativeScrollBehavior);
    return completer.future;
  }
  get [$classes]() {
    return new html$._ElementCssClassSet.new(this);
  }
  set [$classes](value) {
    let classSet = this[$classes];
    classSet.clear();
    classSet.addAll(value);
  }
  get [$dataset]() {
    return new html$._DataAttributeMap.new(this[$attributes]);
  }
  set [$dataset](value) {
    let data = this[$dataset];
    data[$clear]();
    for (let key of value[$keys]) {
      data[$_set](key, value[$_get](key));
    }
  }
  [$getNamespacedAttributes](namespace) {
    return new html$._NamespacedAttributeMap.new(this, namespace);
  }
  [$getComputedStyle](pseudoElement) {
    if (pseudoElement === void 0) pseudoElement = null;
    if (pseudoElement == null) {
      pseudoElement = "";
    }
    return html$.window[_getComputedStyle](this, pseudoElement);
  }
  get [$client]() {
    return new (RectangleOfnum()).new(this.clientLeft, this.clientTop, this.clientWidth, this.clientHeight);
  }
  get [$offset]() {
    return new (RectangleOfnum()).new(this[$offsetLeft], this[$offsetTop], this[$offsetWidth], this[$offsetHeight]);
  }
  [$appendText](text) {
    this[$append](html$.Text.new(text));
  }
  [$appendHtml](text, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[$insertAdjacentHtml]("beforeend", text, {validator: validator, treeSanitizer: treeSanitizer});
  }
  static isTagSupported(tag) {
    let e = html$._ElementFactoryProvider.createElement_tag(tag, null);
    return html$.Element.is(e) && !html$.UnknownElement.is(e);
  }
  [$attached]() {
    this[$enteredView]();
  }
  [$detached]() {
    this[$leftView]();
  }
  [$enteredView]() {}
  [$getClientRects]() {
    let value = this[_getClientRects]();
    let jsProto = value.prototype;
    if (jsProto == null) {
      value.prototype = Object.create(null);
    }
    _js_helper.applyExtension("DOMRectList", value);
    return value;
  }
  [$leftView]() {}
  [$animate](frames, timing) {
    if (timing === void 0) timing = null;
    if (!core.Iterable.is(frames) || !dart.test(frames[$every](dart.fn(x => core.Map.is(x), MapOfString$dynamicTobool())))) {
      dart.throw(new core.ArgumentError.new("The frames parameter should be a List of Maps " + "with frame information"));
    }
    let convertedFrames = null;
    if (core.Iterable.is(frames)) {
      convertedFrames = frames[$map](dart.dynamic, dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic()))[$toList]();
    } else {
      convertedFrames = frames;
    }
    let convertedTiming = core.Map.is(timing) ? html_common.convertDartToNative_Dictionary(timing) : timing;
    return convertedTiming == null ? this[_animate](convertedFrames) : this[_animate](convertedFrames, convertedTiming);
  }
  [_animate](...args) {
    return this.animate.apply(this, args);
  }
  [$attributeChanged](name, oldValue, newValue) {}
  get [$localName]() {
    return this[_localName];
  }
  get [$namespaceUri]() {
    return this[_namespaceUri];
  }
  [$toString]() {
    return this[$localName];
  }
  [$scrollIntoView](alignment) {
    if (alignment === void 0) alignment = null;
    let hasScrollIntoViewIfNeeded = true;
    hasScrollIntoViewIfNeeded = !!this.scrollIntoViewIfNeeded;
    if (dart.equals(alignment, html$.ScrollAlignment.TOP)) {
      this[_scrollIntoView](true);
    } else if (dart.equals(alignment, html$.ScrollAlignment.BOTTOM)) {
      this[_scrollIntoView](false);
    } else if (hasScrollIntoViewIfNeeded) {
      if (dart.equals(alignment, html$.ScrollAlignment.CENTER)) {
        this[_scrollIntoViewIfNeeded](true);
      } else {
        this[_scrollIntoViewIfNeeded]();
      }
    } else {
      this[_scrollIntoView]();
    }
  }
  static _determineMouseWheelEventType(e) {
    return "wheel";
  }
  static _determineTransitionEventType(e) {
    if (dart.test(html_common.Device.isWebKit)) {
      return "webkitTransitionEnd";
    } else if (dart.test(html_common.Device.isOpera)) {
      return "oTransitionEnd";
    }
    return "transitionend";
  }
  [$insertAdjacentText](where, text) {
    if (!!this.insertAdjacentText) {
      this[_insertAdjacentText](where, text);
    } else {
      this[_insertAdjacentNode](where, html$.Text.new(text));
    }
  }
  [_insertAdjacentText](...args) {
    return this.insertAdjacentText.apply(this, args);
  }
  [$insertAdjacentHtml](where, html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
      this[_insertAdjacentHtml](where, html);
    } else {
      this[_insertAdjacentNode](where, this[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
    }
  }
  [_insertAdjacentHtml](...args) {
    return this.insertAdjacentHTML.apply(this, args);
  }
  [$insertAdjacentElement](where, element) {
    if (!!this.insertAdjacentElement) {
      this[_insertAdjacentElement](where, element);
    } else {
      this[_insertAdjacentNode](where, element);
    }
    return element;
  }
  [_insertAdjacentElement](...args) {
    return this.insertAdjacentElement.apply(this, args);
  }
  [_insertAdjacentNode](where, node) {
    switch (where[$toLowerCase]()) {
      case "beforebegin":
      {
        this.parentNode.insertBefore(node, this);
        break;
      }
      case "afterbegin":
      {
        let first = dart.notNull(this[$nodes][$length]) > 0 ? this[$nodes][$_get](0) : null;
        this.insertBefore(node, first);
        break;
      }
      case "beforeend":
      {
        this[$append](node);
        break;
      }
      case "afterend":
      {
        this.parentNode.insertBefore(node, this[$nextNode]);
        break;
      }
      default:
      {
        dart.throw(new core.ArgumentError.new("Invalid position " + dart.str(where)));
      }
    }
  }
  [$matches](selectors) {
    if (!!this.matches) {
      return this.matches(selectors);
    } else if (!!this.webkitMatchesSelector) {
      return this.webkitMatchesSelector(selectors);
    } else if (!!this.mozMatchesSelector) {
      return this.mozMatchesSelector(selectors);
    } else if (!!this.msMatchesSelector) {
      return this.msMatchesSelector(selectors);
    } else if (!!this.oMatchesSelector) {
      return this.oMatchesSelector(selectors);
    } else {
      dart.throw(new core.UnsupportedError.new("Not supported on this platform"));
    }
  }
  [$matchesWithAncestors](selectors) {
    let elem = this;
    do {
      if (dart.test(elem[$matches](selectors))) return true;
      elem = elem[$parent];
    } while (elem != null);
    return false;
  }
  [$createShadowRoot]() {
    return (this.createShadowRoot || this.webkitCreateShadowRoot).call(this);
  }
  get [$shadowRoot]() {
    return this.shadowRoot || this.webkitShadowRoot;
  }
  get [$contentEdge]() {
    return new html$._ContentCssRect.new(this);
  }
  get [$paddingEdge]() {
    return new html$._PaddingCssRect.new(this);
  }
  get [$borderEdge]() {
    return new html$._BorderCssRect.new(this);
  }
  get [$marginEdge]() {
    return new html$._MarginCssRect.new(this);
  }
  get [$documentOffset]() {
    return this[$offsetTo](html$.document.documentElement);
  }
  [$offsetTo](parent) {
    return html$.Element._offsetToHelper(this, parent);
  }
  static _offsetToHelper(current, parent) {
    let sameAsParent = current == parent;
    let foundAsParent = sameAsParent || parent.tagName === "HTML";
    if (current == null || sameAsParent) {
      if (foundAsParent) return new (PointOfnum()).new(0, 0);
      dart.throw(new core.ArgumentError.new("Specified element is not a transitive offset " + "parent of this element."));
    }
    let parentOffset = current.offsetParent;
    let p = html$.Element._offsetToHelper(parentOffset, parent);
    return new (PointOfnum()).new(dart.notNull(p.x) + dart.notNull(current[$offsetLeft]), dart.notNull(p.y) + dart.notNull(current[$offsetTop]));
  }
  [$createFragment](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (treeSanitizer == null) {
      if (validator == null) {
        if (html$.Element._defaultValidator == null) {
          html$.Element._defaultValidator = new html$.NodeValidatorBuilder.common();
        }
        validator = html$.Element._defaultValidator;
      }
      if (html$.Element._defaultSanitizer == null) {
        html$.Element._defaultSanitizer = new html$._ValidatingTreeSanitizer.new(validator);
      } else {
        html$.Element._defaultSanitizer.validator = validator;
      }
      treeSanitizer = html$.Element._defaultSanitizer;
    } else if (validator != null) {
      dart.throw(new core.ArgumentError.new("validator can only be passed if treeSanitizer is null"));
    }
    if (html$.Element._parseDocument == null) {
      html$.Element._parseDocument = html$.document.implementation[$createHtmlDocument]("");
      html$.Element._parseRange = html$.Element._parseDocument.createRange();
      let base = html$.BaseElement._check(html$.Element._parseDocument[$createElement]("base"));
      base.href = html$.document[$baseUri];
      html$.Element._parseDocument[$head][$append](base);
    }
    if (html$.Element._parseDocument.body == null) {
      html$.Element._parseDocument.body = html$.BodyElement._check(html$.Element._parseDocument[$createElement]("body"));
    }
    let contextElement = null;
    if (html$.BodyElement.is(this)) {
      contextElement = html$.Element._parseDocument.body;
    } else {
      contextElement = html$.Element._parseDocument[$createElement](this.tagName);
      html$.Element._parseDocument.body[$append](html$.Node._check(contextElement));
    }
    let fragment = null;
    if (dart.test(html$.Range.supportsCreateContextualFragment) && dart.test(this[_canBeUsedToCreateContextualFragment])) {
      html$.Element._parseRange.selectNodeContents(html$.Node._check(contextElement));
      fragment = html$.Element._parseRange.createContextualFragment(html);
    } else {
      dart.dput(contextElement, _innerHtml, html);
      fragment = html$.Element._parseDocument.createDocumentFragment();
      while (dart.dload(contextElement, 'firstChild') != null) {
        dart.dsend(fragment, 'append', [dart.dload(contextElement, 'firstChild')]);
      }
    }
    if (!dart.equals(contextElement, html$.Element._parseDocument.body)) {
      dart.dsend(contextElement, 'remove', []);
    }
    treeSanitizer.sanitizeTree(html$.Node._check(fragment));
    html$.document.adoptNode(html$.Node._check(fragment));
    return html$.DocumentFragment._check(fragment);
  }
  get [_canBeUsedToCreateContextualFragment]() {
    return !dart.test(this[_cannotBeUsedToCreateContextualFragment]);
  }
  get [_cannotBeUsedToCreateContextualFragment]() {
    return html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported[$contains](this.tagName);
  }
  set [$innerHtml](html) {
    this[$setInnerHtml](html);
  }
  [$setInnerHtml](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[$text] = null;
    if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
      this[_innerHtml] = html;
    } else {
      this[$append](this[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
    }
  }
  get [$innerHtml]() {
    return this[_innerHtml];
  }
  get [$on]() {
    return new html$.ElementEvents.new(this);
  }
  static _hasCorruptedAttributes(element) {
    return (function(element) {
      if (!(element.attributes instanceof NamedNodeMap)) {
        return true;
      }
      var childNodes = element.childNodes;
      if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1]) {
        return true;
      }
      if (element.children) {
        if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList)) {
          return true;
        }
      }
      var length = 0;
      if (element.children) {
        length = element.children.length;
      }
      for (var i = 0; i < length; i++) {
        var child = element.children[i];
        if (child.id == 'attributes' || child.name == 'attributes' || child.id == 'lastChild' || child.name == 'lastChild' || child.id == 'children' || child.name == 'children') {
          return true;
        }
      }
      return false;
    })(element);
  }
  static _hasCorruptedAttributesAdditionalCheck(element) {
    return !(element.attributes instanceof NamedNodeMap);
  }
  static _safeTagName(element) {
    let result = "element tag unavailable";
    try {
      if (typeof dart.dload(element, 'tagName') == 'string') {
        result = core.String._check(dart.dload(element, 'tagName'));
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    return result;
  }
  get [$offsetParent]() {
    return this.offsetParent;
  }
  get [$offsetHeight]() {
    return this.offsetHeight[$round]();
  }
  get [$offsetLeft]() {
    return this.offsetLeft[$round]();
  }
  get [$offsetTop]() {
    return this.offsetTop[$round]();
  }
  get [$offsetWidth]() {
    return this.offsetWidth[$round]();
  }
  get [$scrollHeight]() {
    return this.scrollHeight[$round]();
  }
  get [$scrollLeft]() {
    return this.scrollLeft[$round]();
  }
  set [$scrollLeft](value) {
    this.scrollLeft = value[$round]();
  }
  get [$scrollTop]() {
    return this.scrollTop[$round]();
  }
  set [$scrollTop](value) {
    this.scrollTop = value[$round]();
  }
  get [$scrollWidth]() {
    return this.scrollWidth[$round]();
  }
  get [$contentEditable]() {
    return this.contentEditable;
  }
  set [$contentEditable](value) {
    this.contentEditable = value;
  }
  get [$dir]() {
    return this.dir;
  }
  set [$dir](value) {
    this.dir = value;
  }
  get [$draggable]() {
    return this.draggable;
  }
  set [$draggable](value) {
    this.draggable = value;
  }
  get [$hidden]() {
    return this.hidden;
  }
  set [$hidden](value) {
    this.hidden = value;
  }
  get [$inert]() {
    return this.inert;
  }
  set [$inert](value) {
    this.inert = value;
  }
  get [$inputMode]() {
    return this.inputMode;
  }
  set [$inputMode](value) {
    this.inputMode = value;
  }
  get [$isContentEditable]() {
    return this.isContentEditable;
  }
  get [$lang]() {
    return this.lang;
  }
  set [$lang](value) {
    this.lang = value;
  }
  get [$spellcheck]() {
    return this.spellcheck;
  }
  set [$spellcheck](value) {
    this.spellcheck = value;
  }
  get [$style]() {
    return this.style;
  }
  get [$tabIndex]() {
    return this.tabIndex;
  }
  set [$tabIndex](value) {
    this.tabIndex = value;
  }
  get [$title]() {
    return this.title;
  }
  set [$title](value) {
    this.title = value;
  }
  get [$translate]() {
    return this.translate;
  }
  set [$translate](value) {
    this.translate = value;
  }
  [$blur](...args) {
    return this.blur.apply(this, args);
  }
  [$click](...args) {
    return this.click.apply(this, args);
  }
  [$focus](...args) {
    return this.focus.apply(this, args);
  }
  get [$accessibleNode]() {
    return this.accessibleNode;
  }
  get [$assignedSlot]() {
    return this.assignedSlot;
  }
  get [_attributes$]() {
    return this.attributes;
  }
  get [$className]() {
    return this.className;
  }
  set [$className](value) {
    this.className = value;
  }
  get [$clientHeight]() {
    return this.clientHeight;
  }
  get [$clientLeft]() {
    return this.clientLeft;
  }
  get [$clientTop]() {
    return this.clientTop;
  }
  get [$clientWidth]() {
    return this.clientWidth;
  }
  get [$computedName]() {
    return this.computedName;
  }
  get [$computedRole]() {
    return this.computedRole;
  }
  get [$id]() {
    return this.id;
  }
  set [$id](value) {
    this.id = value;
  }
  get [_innerHtml]() {
    return this.innerHTML;
  }
  set [_innerHtml](value) {
    this.innerHTML = value;
  }
  get [$innerText]() {
    return this.innerText;
  }
  set [$innerText](value) {
    this.innerText = value;
  }
  get [_localName]() {
    return this.localName;
  }
  get [_namespaceUri]() {
    return this.namespaceURI;
  }
  get [$outerHtml]() {
    return this.outerHTML;
  }
  get [_scrollHeight]() {
    return this.scrollHeight;
  }
  get [_scrollLeft]() {
    return this.scrollLeft;
  }
  set [_scrollLeft](value) {
    this.scrollLeft = value;
  }
  get [_scrollTop]() {
    return this.scrollTop;
  }
  set [_scrollTop](value) {
    this.scrollTop = value;
  }
  get [_scrollWidth]() {
    return this.scrollWidth;
  }
  get [$slot]() {
    return this.slot;
  }
  set [$slot](value) {
    this.slot = value;
  }
  get [$styleMap]() {
    return this.styleMap;
  }
  get [$tagName]() {
    return this.tagName;
  }
  [$attachShadow](shadowRootInitDict) {
    let shadowRootInitDict_1 = html_common.convertDartToNative_Dictionary(shadowRootInitDict);
    return this[_attachShadow_1](shadowRootInitDict_1);
  }
  [_attachShadow_1](...args) {
    return this.attachShadow.apply(this, args);
  }
  [$closest](...args) {
    return this.closest.apply(this, args);
  }
  [$getAnimations](...args) {
    return this.getAnimations.apply(this, args);
  }
  [_getAttribute](...args) {
    return this.getAttribute.apply(this, args);
  }
  [_getAttributeNS](...args) {
    return this.getAttributeNS.apply(this, args);
  }
  [$getAttributeNames](...args) {
    return this.getAttributeNames.apply(this, args);
  }
  [$getBoundingClientRect](...args) {
    return this.getBoundingClientRect.apply(this, args);
  }
  [_getClientRects](...args) {
    return this.getClientRects.apply(this, args);
  }
  [$getDestinationInsertionPoints](...args) {
    return this.getDestinationInsertionPoints.apply(this, args);
  }
  [$getElementsByClassName](...args) {
    return this.getElementsByClassName.apply(this, args);
  }
  [_getElementsByTagName](...args) {
    return this.getElementsByTagName.apply(this, args);
  }
  [_hasAttribute](...args) {
    return this.hasAttribute.apply(this, args);
  }
  [_hasAttributeNS](...args) {
    return this.hasAttributeNS.apply(this, args);
  }
  [$hasPointerCapture](...args) {
    return this.hasPointerCapture.apply(this, args);
  }
  [$releasePointerCapture](...args) {
    return this.releasePointerCapture.apply(this, args);
  }
  [_removeAttribute](...args) {
    return this.removeAttribute.apply(this, args);
  }
  [_removeAttributeNS](...args) {
    return this.removeAttributeNS.apply(this, args);
  }
  [$requestPointerLock](...args) {
    return this.requestPointerLock.apply(this, args);
  }
  [$scroll](options_OR_x, y) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (options_OR_x == null && y == null) {
      this[_scroll_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scroll_2](options_1);
      return;
    }
    if (y != null && typeof options_OR_x == 'number') {
      this[_scroll_3](options_OR_x, y);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_scroll_1](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_2](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_3](...args) {
    return this.scroll.apply(this, args);
  }
  [$scrollBy](options_OR_x, y) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (options_OR_x == null && y == null) {
      this[_scrollBy_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scrollBy_2](options_1);
      return;
    }
    if (y != null && typeof options_OR_x == 'number') {
      this[_scrollBy_3](options_OR_x, y);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_scrollBy_1](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_2](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_3](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollIntoView](...args) {
    return this.scrollIntoView.apply(this, args);
  }
  [_scrollIntoViewIfNeeded](...args) {
    return this.scrollIntoViewIfNeeded.apply(this, args);
  }
  [$scrollTo](options_OR_x, y) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (options_OR_x == null && y == null) {
      this[_scrollTo_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scrollTo_2](options_1);
      return;
    }
    if (y != null && typeof options_OR_x == 'number') {
      this[_scrollTo_3](options_OR_x, y);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_scrollTo_1](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_2](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_3](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_setAttribute](...args) {
    return this.setAttribute.apply(this, args);
  }
  [_setAttributeNS](...args) {
    return this.setAttributeNS.apply(this, args);
  }
  [$setPointerCapture](...args) {
    return this.setPointerCapture.apply(this, args);
  }
  [$requestFullscreen](...args) {
    return this.webkitRequestFullscreen.apply(this, args);
  }
  [$after](...args) {
    return this.after.apply(this, args);
  }
  [$before](...args) {
    return this.before.apply(this, args);
  }
  get [$nextElementSibling]() {
    return this.nextElementSibling;
  }
  get [$previousElementSibling]() {
    return this.previousElementSibling;
  }
  get [_childElementCount]() {
    return this.childElementCount;
  }
  get [_children]() {
    return this.children;
  }
  get [_firstElementChild]() {
    return this.firstElementChild;
  }
  get [_lastElementChild]() {
    return this.lastElementChild;
  }
  [$querySelector](...args) {
    return this.querySelector.apply(this, args);
  }
  [_querySelectorAll](...args) {
    return this.querySelectorAll.apply(this, args);
  }
  get [$onAbort]() {
    return html$.Element.abortEvent.forElement(this);
  }
  get [$onBeforeCopy]() {
    return html$.Element.beforeCopyEvent.forElement(this);
  }
  get [$onBeforeCut]() {
    return html$.Element.beforeCutEvent.forElement(this);
  }
  get [$onBeforePaste]() {
    return html$.Element.beforePasteEvent.forElement(this);
  }
  get [$onBlur]() {
    return html$.Element.blurEvent.forElement(this);
  }
  get [$onCanPlay]() {
    return html$.Element.canPlayEvent.forElement(this);
  }
  get [$onCanPlayThrough]() {
    return html$.Element.canPlayThroughEvent.forElement(this);
  }
  get [$onChange]() {
    return html$.Element.changeEvent.forElement(this);
  }
  get [$onClick]() {
    return html$.Element.clickEvent.forElement(this);
  }
  get [$onContextMenu]() {
    return html$.Element.contextMenuEvent.forElement(this);
  }
  get [$onCopy]() {
    return html$.Element.copyEvent.forElement(this);
  }
  get [$onCut]() {
    return html$.Element.cutEvent.forElement(this);
  }
  get [$onDoubleClick]() {
    return html$.Element.doubleClickEvent.forElement(this);
  }
  get [$onDrag]() {
    return html$.Element.dragEvent.forElement(this);
  }
  get [$onDragEnd]() {
    return html$.Element.dragEndEvent.forElement(this);
  }
  get [$onDragEnter]() {
    return html$.Element.dragEnterEvent.forElement(this);
  }
  get [$onDragLeave]() {
    return html$.Element.dragLeaveEvent.forElement(this);
  }
  get [$onDragOver]() {
    return html$.Element.dragOverEvent.forElement(this);
  }
  get [$onDragStart]() {
    return html$.Element.dragStartEvent.forElement(this);
  }
  get [$onDrop]() {
    return html$.Element.dropEvent.forElement(this);
  }
  get [$onDurationChange]() {
    return html$.Element.durationChangeEvent.forElement(this);
  }
  get [$onEmptied]() {
    return html$.Element.emptiedEvent.forElement(this);
  }
  get [$onEnded]() {
    return html$.Element.endedEvent.forElement(this);
  }
  get [$onError]() {
    return html$.Element.errorEvent.forElement(this);
  }
  get [$onFocus]() {
    return html$.Element.focusEvent.forElement(this);
  }
  get [$onInput]() {
    return html$.Element.inputEvent.forElement(this);
  }
  get [$onInvalid]() {
    return html$.Element.invalidEvent.forElement(this);
  }
  get [$onKeyDown]() {
    return html$.Element.keyDownEvent.forElement(this);
  }
  get [$onKeyPress]() {
    return html$.Element.keyPressEvent.forElement(this);
  }
  get [$onKeyUp]() {
    return html$.Element.keyUpEvent.forElement(this);
  }
  get [$onLoad]() {
    return html$.Element.loadEvent.forElement(this);
  }
  get [$onLoadedData]() {
    return html$.Element.loadedDataEvent.forElement(this);
  }
  get [$onLoadedMetadata]() {
    return html$.Element.loadedMetadataEvent.forElement(this);
  }
  get [$onMouseDown]() {
    return html$.Element.mouseDownEvent.forElement(this);
  }
  get [$onMouseEnter]() {
    return html$.Element.mouseEnterEvent.forElement(this);
  }
  get [$onMouseLeave]() {
    return html$.Element.mouseLeaveEvent.forElement(this);
  }
  get [$onMouseMove]() {
    return html$.Element.mouseMoveEvent.forElement(this);
  }
  get [$onMouseOut]() {
    return html$.Element.mouseOutEvent.forElement(this);
  }
  get [$onMouseOver]() {
    return html$.Element.mouseOverEvent.forElement(this);
  }
  get [$onMouseUp]() {
    return html$.Element.mouseUpEvent.forElement(this);
  }
  get [$onMouseWheel]() {
    return html$.Element.mouseWheelEvent.forElement(this);
  }
  get [$onPaste]() {
    return html$.Element.pasteEvent.forElement(this);
  }
  get [$onPause]() {
    return html$.Element.pauseEvent.forElement(this);
  }
  get [$onPlay]() {
    return html$.Element.playEvent.forElement(this);
  }
  get [$onPlaying]() {
    return html$.Element.playingEvent.forElement(this);
  }
  get [$onRateChange]() {
    return html$.Element.rateChangeEvent.forElement(this);
  }
  get [$onReset]() {
    return html$.Element.resetEvent.forElement(this);
  }
  get [$onResize]() {
    return html$.Element.resizeEvent.forElement(this);
  }
  get [$onScroll]() {
    return html$.Element.scrollEvent.forElement(this);
  }
  get [$onSearch]() {
    return html$.Element.searchEvent.forElement(this);
  }
  get [$onSeeked]() {
    return html$.Element.seekedEvent.forElement(this);
  }
  get [$onSeeking]() {
    return html$.Element.seekingEvent.forElement(this);
  }
  get [$onSelect]() {
    return html$.Element.selectEvent.forElement(this);
  }
  get [$onSelectStart]() {
    return html$.Element.selectStartEvent.forElement(this);
  }
  get [$onStalled]() {
    return html$.Element.stalledEvent.forElement(this);
  }
  get [$onSubmit]() {
    return html$.Element.submitEvent.forElement(this);
  }
  get [$onSuspend]() {
    return html$.Element.suspendEvent.forElement(this);
  }
  get [$onTimeUpdate]() {
    return html$.Element.timeUpdateEvent.forElement(this);
  }
  get [$onTouchCancel]() {
    return html$.Element.touchCancelEvent.forElement(this);
  }
  get [$onTouchEnd]() {
    return html$.Element.touchEndEvent.forElement(this);
  }
  get [$onTouchEnter]() {
    return html$.Element.touchEnterEvent.forElement(this);
  }
  get [$onTouchLeave]() {
    return html$.Element.touchLeaveEvent.forElement(this);
  }
  get [$onTouchMove]() {
    return html$.Element.touchMoveEvent.forElement(this);
  }
  get [$onTouchStart]() {
    return html$.Element.touchStartEvent.forElement(this);
  }
  get [$onTransitionEnd]() {
    return html$.Element.transitionEndEvent.forElement(this);
  }
  get [$onVolumeChange]() {
    return html$.Element.volumeChangeEvent.forElement(this);
  }
  get [$onWaiting]() {
    return html$.Element.waitingEvent.forElement(this);
  }
  get [$onFullscreenChange]() {
    return html$.Element.fullscreenChangeEvent.forElement(this);
  }
  get [$onFullscreenError]() {
    return html$.Element.fullscreenErrorEvent.forElement(this);
  }
  get [$onWheel]() {
    return html$.Element.wheelEvent.forElement(this);
  }
};
(html$.Element.created = function() {
  this[offsetParent] = null;
  this[contentEditable] = null;
  this[dir] = null;
  this[draggable] = null;
  this[hidden] = null;
  this[inert] = null;
  this[inputMode] = null;
  this[lang] = null;
  this[spellcheck] = null;
  this[style] = null;
  this[tabIndex] = null;
  this[title] = null;
  this[translate] = null;
  this[accessibleNode] = null;
  this[assignedSlot] = null;
  this[_attributes$] = null;
  this[className] = null;
  this[clientHeight] = null;
  this[clientLeft] = null;
  this[clientTop] = null;
  this[clientWidth] = null;
  this[computedName] = null;
  this[computedRole] = null;
  this[id] = null;
  this[_innerHtml] = null;
  this[innerText] = null;
  this[_localName] = null;
  this[_namespaceUri] = null;
  this[_scrollHeight] = null;
  this[_scrollLeft] = null;
  this[_scrollTop] = null;
  this[_scrollWidth] = null;
  this[slot] = null;
  this[styleMap] = null;
  this[tagName] = null;
  this[nextElementSibling] = null;
  this[previousElementSibling] = null;
  this[_childElementCount] = null;
  this[_children] = null;
  this[_firstElementChild] = null;
  this[_lastElementChild] = null;
  html$.Element.__proto__._created.call(this);
}).prototype = html$.Element.prototype;
dart.addTypeTests(html$.Element);
const offsetParent = Symbol("Element.offsetParent");
const contentEditable = Symbol("Element.contentEditable");
const dir = Symbol("Element.dir");
const draggable = Symbol("Element.draggable");
const hidden = Symbol("Element.hidden");
const inert = Symbol("Element.inert");
const inputMode = Symbol("Element.inputMode");
const lang = Symbol("Element.lang");
const spellcheck = Symbol("Element.spellcheck");
const style = Symbol("Element.style");
const tabIndex = Symbol("Element.tabIndex");
const title = Symbol("Element.title");
const translate = Symbol("Element.translate");
const accessibleNode = Symbol("Element.accessibleNode");
const assignedSlot = Symbol("Element.assignedSlot");
const className = Symbol("Element.className");
const clientHeight = Symbol("Element.clientHeight");
const clientLeft = Symbol("Element.clientLeft");
const clientTop = Symbol("Element.clientTop");
const clientWidth = Symbol("Element.clientWidth");
const computedName = Symbol("Element.computedName");
const computedRole = Symbol("Element.computedRole");
const id = Symbol("Element.id");
const innerText = Symbol("Element.innerText");
const slot = Symbol("Element.slot");
const styleMap = Symbol("Element.styleMap");
const tagName = Symbol("Element.tagName");
const nextElementSibling = Symbol("Element.nextElementSibling");
const previousElementSibling = Symbol("Element.previousElementSibling");
html$.Element[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.GlobalEventHandlers, html$.ParentNode, html$.ChildNode];
dart.setMethodSignature(html$.Element, () => ({
  __proto__: dart.getMethods(html$.Element.__proto__),
  [$getAttribute]: dart.fnType(core.String, [core.String]),
  [$getAttributeNS]: dart.fnType(core.String, [core.String, core.String]),
  [$hasAttribute]: dart.fnType(core.bool, [core.String]),
  [$hasAttributeNS]: dart.fnType(core.bool, [core.String, core.String]),
  [$removeAttribute]: dart.fnType(dart.void, [core.String]),
  [$removeAttributeNS]: dart.fnType(dart.void, [core.String, core.String]),
  [$setAttribute]: dart.fnType(dart.void, [core.String, core.String]),
  [$setAttributeNS]: dart.fnType(dart.void, [core.String, core.String, core.String]),
  [$querySelectorAll]: dart.gFnType(T => [html$.ElementList$(T), [core.String]], T => [html$.Element]),
  [_setApplyScroll]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.ScrollState]), core.String]),
  [$setApplyScroll]: dart.fnType(async.Future$(html$.ScrollState), [core.String]),
  [_setDistributeScroll]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.ScrollState]), core.String]),
  [$setDistributeScroll]: dart.fnType(async.Future$(html$.ScrollState), [core.String]),
  [$getNamespacedAttributes]: dart.fnType(core.Map$(core.String, core.String), [core.String]),
  [$getComputedStyle]: dart.fnType(html$.CssStyleDeclaration, [], [core.String]),
  [$appendText]: dart.fnType(dart.void, [core.String]),
  [$appendHtml]: dart.fnType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
  [$attached]: dart.fnType(dart.void, []),
  [$detached]: dart.fnType(dart.void, []),
  [$enteredView]: dart.fnType(dart.void, []),
  [$getClientRects]: dart.fnType(core.List$(math.Rectangle$(core.num)), []),
  [$leftView]: dart.fnType(dart.void, []),
  [$animate]: dart.fnType(html$.Animation, [core.Iterable$(core.Map$(core.String, dart.dynamic))], [dart.dynamic]),
  [_animate]: dart.fnType(html$.Animation, [core.Object], [dart.dynamic]),
  [$attributeChanged]: dart.fnType(dart.void, [core.String, core.String, core.String]),
  [$scrollIntoView]: dart.fnType(dart.void, [], [html$.ScrollAlignment]),
  [$insertAdjacentText]: dart.fnType(dart.void, [core.String, core.String]),
  [_insertAdjacentText]: dart.fnType(dart.void, [core.String, core.String]),
  [$insertAdjacentHtml]: dart.fnType(dart.void, [core.String, core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
  [_insertAdjacentHtml]: dart.fnType(dart.void, [core.String, core.String]),
  [$insertAdjacentElement]: dart.fnType(html$.Element, [core.String, html$.Element]),
  [_insertAdjacentElement]: dart.fnType(dart.void, [core.String, html$.Element]),
  [_insertAdjacentNode]: dart.fnType(dart.void, [core.String, html$.Node]),
  [$matches]: dart.fnType(core.bool, [core.String]),
  [$matchesWithAncestors]: dart.fnType(core.bool, [core.String]),
  [$createShadowRoot]: dart.fnType(html$.ShadowRoot, []),
  [$offsetTo]: dart.fnType(math.Point$(core.num), [html$.Element]),
  [$createFragment]: dart.fnType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
  [$setInnerHtml]: dart.fnType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
  [$blur]: dart.fnType(dart.void, []),
  [$click]: dart.fnType(dart.void, []),
  [$focus]: dart.fnType(dart.void, []),
  [$attachShadow]: dart.fnType(html$.ShadowRoot, [core.Map]),
  [_attachShadow_1]: dart.fnType(html$.ShadowRoot, [dart.dynamic]),
  [$closest]: dart.fnType(html$.Element, [core.String]),
  [$getAnimations]: dart.fnType(core.List$(html$.Animation), []),
  [_getAttribute]: dart.fnType(core.String, [core.String]),
  [_getAttributeNS]: dart.fnType(core.String, [core.String, core.String]),
  [$getAttributeNames]: dart.fnType(core.List$(core.String), []),
  [$getBoundingClientRect]: dart.fnType(math.Rectangle$(core.num), []),
  [_getClientRects]: dart.fnType(core.List$(math.Rectangle$(core.num)), []),
  [$getDestinationInsertionPoints]: dart.fnType(core.List$(html$.Node), []),
  [$getElementsByClassName]: dart.fnType(core.List$(html$.Node), [core.String]),
  [_getElementsByTagName]: dart.fnType(core.List$(html$.Node), [core.String]),
  [_hasAttribute]: dart.fnType(core.bool, [core.String]),
  [_hasAttributeNS]: dart.fnType(core.bool, [core.String, core.String]),
  [$hasPointerCapture]: dart.fnType(core.bool, [core.int]),
  [$releasePointerCapture]: dart.fnType(dart.void, [core.int]),
  [_removeAttribute]: dart.fnType(dart.void, [core.String]),
  [_removeAttributeNS]: dart.fnType(dart.void, [core.String, core.String]),
  [$requestPointerLock]: dart.fnType(dart.void, []),
  [$scroll]: dart.fnType(dart.void, [], [dart.dynamic, core.num]),
  [_scroll_1]: dart.fnType(dart.void, []),
  [_scroll_2]: dart.fnType(dart.void, [dart.dynamic]),
  [_scroll_3]: dart.fnType(dart.void, [core.num, dart.dynamic]),
  [$scrollBy]: dart.fnType(dart.void, [], [dart.dynamic, core.num]),
  [_scrollBy_1]: dart.fnType(dart.void, []),
  [_scrollBy_2]: dart.fnType(dart.void, [dart.dynamic]),
  [_scrollBy_3]: dart.fnType(dart.void, [core.num, dart.dynamic]),
  [_scrollIntoView]: dart.fnType(dart.void, [], [core.Object]),
  [_scrollIntoViewIfNeeded]: dart.fnType(dart.void, [], [core.bool]),
  [$scrollTo]: dart.fnType(dart.void, [], [dart.dynamic, core.num]),
  [_scrollTo_1]: dart.fnType(dart.void, []),
  [_scrollTo_2]: dart.fnType(dart.void, [dart.dynamic]),
  [_scrollTo_3]: dart.fnType(dart.void, [core.num, dart.dynamic]),
  [_setAttribute]: dart.fnType(dart.void, [core.String, core.String]),
  [_setAttributeNS]: dart.fnType(dart.void, [core.String, core.String, core.String]),
  [$setPointerCapture]: dart.fnType(dart.void, [core.int]),
  [$requestFullscreen]: dart.fnType(dart.void, []),
  [$after]: dart.fnType(dart.void, [core.Object]),
  [$before]: dart.fnType(dart.void, [core.Object]),
  [$querySelector]: dart.fnType(html$.Element, [core.String]),
  [_querySelectorAll]: dart.fnType(core.List$(html$.Node), [core.String])
}));
dart.setGetterSignature(html$.Element, () => ({
  __proto__: dart.getGetters(html$.Element.__proto__),
  [$attributes]: core.Map$(core.String, core.String),
  [$children]: core.List$(html$.Element),
  [$classes]: html$.CssClassSet,
  [$dataset]: core.Map$(core.String, core.String),
  [$client]: math.Rectangle$(core.num),
  [$offset]: math.Rectangle$(core.num),
  [$localName]: core.String,
  [$namespaceUri]: core.String,
  [$shadowRoot]: html$.ShadowRoot,
  [$contentEdge]: html$.CssRect,
  [$paddingEdge]: html$.CssRect,
  [$borderEdge]: html$.CssRect,
  [$marginEdge]: html$.CssRect,
  [$documentOffset]: math.Point$(core.num),
  [_canBeUsedToCreateContextualFragment]: core.bool,
  [_cannotBeUsedToCreateContextualFragment]: core.bool,
  [$innerHtml]: core.String,
  [$on]: html$.ElementEvents,
  [$offsetHeight]: core.int,
  [$offsetLeft]: core.int,
  [$offsetTop]: core.int,
  [$offsetWidth]: core.int,
  [$scrollHeight]: core.int,
  [$scrollLeft]: core.int,
  [$scrollTop]: core.int,
  [$scrollWidth]: core.int,
  [$isContentEditable]: core.bool,
  [$outerHtml]: core.String,
  [$onAbort]: html$.ElementStream$(html$.Event),
  [$onBeforeCopy]: html$.ElementStream$(html$.Event),
  [$onBeforeCut]: html$.ElementStream$(html$.Event),
  [$onBeforePaste]: html$.ElementStream$(html$.Event),
  [$onBlur]: html$.ElementStream$(html$.Event),
  [$onCanPlay]: html$.ElementStream$(html$.Event),
  [$onCanPlayThrough]: html$.ElementStream$(html$.Event),
  [$onChange]: html$.ElementStream$(html$.Event),
  [$onClick]: html$.ElementStream$(html$.MouseEvent),
  [$onContextMenu]: html$.ElementStream$(html$.MouseEvent),
  [$onCopy]: html$.ElementStream$(html$.ClipboardEvent),
  [$onCut]: html$.ElementStream$(html$.ClipboardEvent),
  [$onDoubleClick]: html$.ElementStream$(html$.Event),
  [$onDrag]: html$.ElementStream$(html$.MouseEvent),
  [$onDragEnd]: html$.ElementStream$(html$.MouseEvent),
  [$onDragEnter]: html$.ElementStream$(html$.MouseEvent),
  [$onDragLeave]: html$.ElementStream$(html$.MouseEvent),
  [$onDragOver]: html$.ElementStream$(html$.MouseEvent),
  [$onDragStart]: html$.ElementStream$(html$.MouseEvent),
  [$onDrop]: html$.ElementStream$(html$.MouseEvent),
  [$onDurationChange]: html$.ElementStream$(html$.Event),
  [$onEmptied]: html$.ElementStream$(html$.Event),
  [$onEnded]: html$.ElementStream$(html$.Event),
  [$onError]: html$.ElementStream$(html$.Event),
  [$onFocus]: html$.ElementStream$(html$.Event),
  [$onInput]: html$.ElementStream$(html$.Event),
  [$onInvalid]: html$.ElementStream$(html$.Event),
  [$onKeyDown]: html$.ElementStream$(html$.KeyboardEvent),
  [$onKeyPress]: html$.ElementStream$(html$.KeyboardEvent),
  [$onKeyUp]: html$.ElementStream$(html$.KeyboardEvent),
  [$onLoad]: html$.ElementStream$(html$.Event),
  [$onLoadedData]: html$.ElementStream$(html$.Event),
  [$onLoadedMetadata]: html$.ElementStream$(html$.Event),
  [$onMouseDown]: html$.ElementStream$(html$.MouseEvent),
  [$onMouseEnter]: html$.ElementStream$(html$.MouseEvent),
  [$onMouseLeave]: html$.ElementStream$(html$.MouseEvent),
  [$onMouseMove]: html$.ElementStream$(html$.MouseEvent),
  [$onMouseOut]: html$.ElementStream$(html$.MouseEvent),
  [$onMouseOver]: html$.ElementStream$(html$.MouseEvent),
  [$onMouseUp]: html$.ElementStream$(html$.MouseEvent),
  [$onMouseWheel]: html$.ElementStream$(html$.WheelEvent),
  [$onPaste]: html$.ElementStream$(html$.ClipboardEvent),
  [$onPause]: html$.ElementStream$(html$.Event),
  [$onPlay]: html$.ElementStream$(html$.Event),
  [$onPlaying]: html$.ElementStream$(html$.Event),
  [$onRateChange]: html$.ElementStream$(html$.Event),
  [$onReset]: html$.ElementStream$(html$.Event),
  [$onResize]: html$.ElementStream$(html$.Event),
  [$onScroll]: html$.ElementStream$(html$.Event),
  [$onSearch]: html$.ElementStream$(html$.Event),
  [$onSeeked]: html$.ElementStream$(html$.Event),
  [$onSeeking]: html$.ElementStream$(html$.Event),
  [$onSelect]: html$.ElementStream$(html$.Event),
  [$onSelectStart]: html$.ElementStream$(html$.Event),
  [$onStalled]: html$.ElementStream$(html$.Event),
  [$onSubmit]: html$.ElementStream$(html$.Event),
  [$onSuspend]: html$.ElementStream$(html$.Event),
  [$onTimeUpdate]: html$.ElementStream$(html$.Event),
  [$onTouchCancel]: html$.ElementStream$(html$.TouchEvent),
  [$onTouchEnd]: html$.ElementStream$(html$.TouchEvent),
  [$onTouchEnter]: html$.ElementStream$(html$.TouchEvent),
  [$onTouchLeave]: html$.ElementStream$(html$.TouchEvent),
  [$onTouchMove]: html$.ElementStream$(html$.TouchEvent),
  [$onTouchStart]: html$.ElementStream$(html$.TouchEvent),
  [$onTransitionEnd]: html$.ElementStream$(html$.TransitionEvent),
  [$onVolumeChange]: html$.ElementStream$(html$.Event),
  [$onWaiting]: html$.ElementStream$(html$.Event),
  [$onFullscreenChange]: html$.ElementStream$(html$.Event),
  [$onFullscreenError]: html$.ElementStream$(html$.Event),
  [$onWheel]: html$.ElementStream$(html$.WheelEvent)
}));
dart.setSetterSignature(html$.Element, () => ({
  __proto__: dart.getSetters(html$.Element.__proto__),
  [$attributes]: core.Map$(core.String, core.String),
  [$children]: core.List$(html$.Element),
  [$classes]: core.Iterable$(core.String),
  [$dataset]: core.Map$(core.String, core.String),
  [$innerHtml]: core.String,
  [$scrollLeft]: core.int,
  [$scrollTop]: core.int
}));
dart.setLibraryUri(html$.Element, "dart:html");
dart.setFieldSignature(html$.Element, () => ({
  __proto__: dart.getFields(html$.Element.__proto__),
  [$offsetParent]: dart.finalFieldType(html$.Element),
  [$contentEditable]: dart.fieldType(core.String),
  [$dir]: dart.fieldType(core.String),
  [$draggable]: dart.fieldType(core.bool),
  [$hidden]: dart.fieldType(core.bool),
  [$inert]: dart.fieldType(core.bool),
  [$inputMode]: dart.fieldType(core.String),
  [$lang]: dart.fieldType(core.String),
  [$spellcheck]: dart.fieldType(core.bool),
  [$style]: dart.finalFieldType(html$.CssStyleDeclaration),
  [$tabIndex]: dart.fieldType(core.int),
  [$title]: dart.fieldType(core.String),
  [$translate]: dart.fieldType(core.bool),
  [$accessibleNode]: dart.finalFieldType(html$.AccessibleNode),
  [$assignedSlot]: dart.finalFieldType(html$.SlotElement),
  [_attributes$]: dart.finalFieldType(html$._NamedNodeMap),
  [$className]: dart.fieldType(core.String),
  [$clientHeight]: dart.finalFieldType(core.int),
  [$clientLeft]: dart.finalFieldType(core.int),
  [$clientTop]: dart.finalFieldType(core.int),
  [$clientWidth]: dart.finalFieldType(core.int),
  [$computedName]: dart.finalFieldType(core.String),
  [$computedRole]: dart.finalFieldType(core.String),
  [$id]: dart.fieldType(core.String),
  [_innerHtml]: dart.fieldType(core.String),
  [$innerText]: dart.fieldType(core.String),
  [_localName]: dart.finalFieldType(core.String),
  [_namespaceUri]: dart.finalFieldType(core.String),
  [_scrollHeight]: dart.finalFieldType(core.int),
  [_scrollLeft]: dart.fieldType(core.num),
  [_scrollTop]: dart.fieldType(core.num),
  [_scrollWidth]: dart.finalFieldType(core.int),
  [$slot]: dart.fieldType(core.String),
  [$styleMap]: dart.finalFieldType(html$.StylePropertyMap),
  [$tagName]: dart.finalFieldType(core.String),
  [$nextElementSibling]: dart.finalFieldType(html$.Element),
  [$previousElementSibling]: dart.finalFieldType(html$.Element),
  [_childElementCount]: dart.finalFieldType(core.int),
  [_children]: dart.finalFieldType(ListOfNode()),
  [_firstElementChild]: dart.finalFieldType(html$.Element),
  [_lastElementChild]: dart.finalFieldType(html$.Element)
}));
dart.defineLazy(html$.Element, {
  /*html$.Element.mouseWheelEvent*/get mouseWheelEvent() {
    return dart.const(new (_CustomEventStreamProviderOfWheelEvent()).new(dart.fn(html$.Element._determineMouseWheelEventType, EventTargetToString())));
  },
  /*html$.Element.transitionEndEvent*/get transitionEndEvent() {
    return dart.const(new (_CustomEventStreamProviderOfTransitionEvent()).new(dart.fn(html$.Element._determineTransitionEventType, EventTargetToString())));
  },
  /*html$.Element._parseDocument*/get _parseDocument() {
    return null;
  },
  set _parseDocument(_) {},
  /*html$.Element._parseRange*/get _parseRange() {
    return null;
  },
  set _parseRange(_) {},
  /*html$.Element._defaultValidator*/get _defaultValidator() {
    return null;
  },
  set _defaultValidator(_) {},
  /*html$.Element._defaultSanitizer*/get _defaultSanitizer() {
    return null;
  },
  set _defaultSanitizer(_) {},
  /*html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported*/get _tagsForWhichCreateContextualFragmentIsNotSupported() {
    return dart.constList(["HEAD", "AREA", "BASE", "BASEFONT", "BR", "COL", "COLGROUP", "EMBED", "FRAME", "FRAMESET", "HR", "IMAGE", "IMG", "INPUT", "ISINDEX", "LINK", "META", "PARAM", "SOURCE", "STYLE", "TITLE", "WBR"], core.String);
  },
  /*html$.Element.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("abort"));
  },
  /*html$.Element.beforeCopyEvent*/get beforeCopyEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("beforecopy"));
  },
  /*html$.Element.beforeCutEvent*/get beforeCutEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("beforecut"));
  },
  /*html$.Element.beforePasteEvent*/get beforePasteEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("beforepaste"));
  },
  /*html$.Element.blurEvent*/get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("blur"));
  },
  /*html$.Element.canPlayEvent*/get canPlayEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("canplay"));
  },
  /*html$.Element.canPlayThroughEvent*/get canPlayThroughEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("canplaythrough"));
  },
  /*html$.Element.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  },
  /*html$.Element.clickEvent*/get clickEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("click"));
  },
  /*html$.Element.contextMenuEvent*/get contextMenuEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("contextmenu"));
  },
  /*html$.Element.copyEvent*/get copyEvent() {
    return dart.const(new (EventStreamProviderOfClipboardEvent()).new("copy"));
  },
  /*html$.Element.cutEvent*/get cutEvent() {
    return dart.const(new (EventStreamProviderOfClipboardEvent()).new("cut"));
  },
  /*html$.Element.doubleClickEvent*/get doubleClickEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("dblclick"));
  },
  /*html$.Element.dragEvent*/get dragEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("drag"));
  },
  /*html$.Element.dragEndEvent*/get dragEndEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragend"));
  },
  /*html$.Element.dragEnterEvent*/get dragEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragenter"));
  },
  /*html$.Element.dragLeaveEvent*/get dragLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragleave"));
  },
  /*html$.Element.dragOverEvent*/get dragOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragover"));
  },
  /*html$.Element.dragStartEvent*/get dragStartEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragstart"));
  },
  /*html$.Element.dropEvent*/get dropEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("drop"));
  },
  /*html$.Element.durationChangeEvent*/get durationChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("durationchange"));
  },
  /*html$.Element.emptiedEvent*/get emptiedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("emptied"));
  },
  /*html$.Element.endedEvent*/get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("ended"));
  },
  /*html$.Element.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.Element.focusEvent*/get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("focus"));
  },
  /*html$.Element.inputEvent*/get inputEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("input"));
  },
  /*html$.Element.invalidEvent*/get invalidEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("invalid"));
  },
  /*html$.Element.keyDownEvent*/get keyDownEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keydown"));
  },
  /*html$.Element.keyPressEvent*/get keyPressEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keypress"));
  },
  /*html$.Element.keyUpEvent*/get keyUpEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keyup"));
  },
  /*html$.Element.loadEvent*/get loadEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("load"));
  },
  /*html$.Element.loadedDataEvent*/get loadedDataEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("loadeddata"));
  },
  /*html$.Element.loadedMetadataEvent*/get loadedMetadataEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("loadedmetadata"));
  },
  /*html$.Element.mouseDownEvent*/get mouseDownEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mousedown"));
  },
  /*html$.Element.mouseEnterEvent*/get mouseEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseenter"));
  },
  /*html$.Element.mouseLeaveEvent*/get mouseLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseleave"));
  },
  /*html$.Element.mouseMoveEvent*/get mouseMoveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mousemove"));
  },
  /*html$.Element.mouseOutEvent*/get mouseOutEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseout"));
  },
  /*html$.Element.mouseOverEvent*/get mouseOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseover"));
  },
  /*html$.Element.mouseUpEvent*/get mouseUpEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseup"));
  },
  /*html$.Element.pasteEvent*/get pasteEvent() {
    return dart.const(new (EventStreamProviderOfClipboardEvent()).new("paste"));
  },
  /*html$.Element.pauseEvent*/get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pause"));
  },
  /*html$.Element.playEvent*/get playEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("play"));
  },
  /*html$.Element.playingEvent*/get playingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("playing"));
  },
  /*html$.Element.rateChangeEvent*/get rateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("ratechange"));
  },
  /*html$.Element.resetEvent*/get resetEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("reset"));
  },
  /*html$.Element.resizeEvent*/get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("resize"));
  },
  /*html$.Element.scrollEvent*/get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("scroll"));
  },
  /*html$.Element.searchEvent*/get searchEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("search"));
  },
  /*html$.Element.seekedEvent*/get seekedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("seeked"));
  },
  /*html$.Element.seekingEvent*/get seekingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("seeking"));
  },
  /*html$.Element.selectEvent*/get selectEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("select"));
  },
  /*html$.Element.selectStartEvent*/get selectStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("selectstart"));
  },
  /*html$.Element.stalledEvent*/get stalledEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("stalled"));
  },
  /*html$.Element.submitEvent*/get submitEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("submit"));
  },
  /*html$.Element.suspendEvent*/get suspendEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("suspend"));
  },
  /*html$.Element.timeUpdateEvent*/get timeUpdateEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("timeupdate"));
  },
  /*html$.Element.touchCancelEvent*/get touchCancelEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchcancel"));
  },
  /*html$.Element.touchEndEvent*/get touchEndEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchend"));
  },
  /*html$.Element.touchEnterEvent*/get touchEnterEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchenter"));
  },
  /*html$.Element.touchLeaveEvent*/get touchLeaveEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchleave"));
  },
  /*html$.Element.touchMoveEvent*/get touchMoveEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchmove"));
  },
  /*html$.Element.touchStartEvent*/get touchStartEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchstart"));
  },
  /*html$.Element.volumeChangeEvent*/get volumeChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("volumechange"));
  },
  /*html$.Element.waitingEvent*/get waitingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("waiting"));
  },
  /*html$.Element.fullscreenChangeEvent*/get fullscreenChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("webkitfullscreenchange"));
  },
  /*html$.Element.fullscreenErrorEvent*/get fullscreenErrorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("webkitfullscreenerror"));
  },
  /*html$.Element.wheelEvent*/get wheelEvent() {
    return dart.const(new (EventStreamProviderOfWheelEvent()).new("wheel"));
  }
});
dart.registerExtension("Element", html$.Element);
html$.HtmlElement = class HtmlElement extends html$.Element {
  static new() {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  get [$nonce]() {
    return this.nonce;
  }
  set [$nonce](value) {
    this.nonce = value;
  }
};
(html$.HtmlElement.created = function() {
  this[nonce] = null;
  html$.HtmlElement.__proto__.created.call(this);
}).prototype = html$.HtmlElement.prototype;
dart.addTypeTests(html$.HtmlElement);
const nonce = Symbol("HtmlElement.nonce");
html$.HtmlElement[dart.implements] = () => [html$.NoncedElement];
dart.setLibraryUri(html$.HtmlElement, "dart:html");
dart.setFieldSignature(html$.HtmlElement, () => ({
  __proto__: dart.getFields(html$.HtmlElement.__proto__),
  [$nonce]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLElement", html$.HtmlElement);
dart.copyProperties(html$, {
  get _workerSelf() {
    return self;
  }
});
html$.ExtendableEvent = class ExtendableEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ExtendableEvent._create_1(type, eventInitDict_1);
    }
    return html$.ExtendableEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new ExtendableEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new ExtendableEvent(type);
  }
  [$waitUntil](...args) {
    return this.waitUntil.apply(this, args);
  }
};
dart.addTypeTests(html$.ExtendableEvent);
dart.setMethodSignature(html$.ExtendableEvent, () => ({
  __proto__: dart.getMethods(html$.ExtendableEvent.__proto__),
  [$waitUntil]: dart.fnType(dart.void, [async.Future])
}));
dart.setLibraryUri(html$.ExtendableEvent, "dart:html");
dart.registerExtension("ExtendableEvent", html$.ExtendableEvent);
html$.AbortPaymentEvent = class AbortPaymentEvent$ extends html$.ExtendableEvent {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.AbortPaymentEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new AbortPaymentEvent(type, eventInitDict);
  }
  [$respondWith](...args) {
    return this.respondWith.apply(this, args);
  }
};
dart.addTypeTests(html$.AbortPaymentEvent);
dart.setMethodSignature(html$.AbortPaymentEvent, () => ({
  __proto__: dart.getMethods(html$.AbortPaymentEvent.__proto__),
  [$respondWith]: dart.fnType(dart.void, [async.Future])
}));
dart.setLibraryUri(html$.AbortPaymentEvent, "dart:html");
dart.registerExtension("AbortPaymentEvent", html$.AbortPaymentEvent);
html$.Sensor = class Sensor extends html$.EventTarget {
  get [$activated]() {
    return this.activated;
  }
  get [$hasReading]() {
    return this.hasReading;
  }
  get [$timestamp]() {
    return this.timestamp;
  }
  [$start](...args) {
    return this.start.apply(this, args);
  }
  [$stop](...args) {
    return this.stop.apply(this, args);
  }
  get [$onError]() {
    return html$.Sensor.errorEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.Sensor);
const activated = Symbol("Sensor.activated");
const hasReading = Symbol("Sensor.hasReading");
const timestamp = Symbol("Sensor.timestamp");
dart.setMethodSignature(html$.Sensor, () => ({
  __proto__: dart.getMethods(html$.Sensor.__proto__),
  [$start]: dart.fnType(dart.void, []),
  [$stop]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.Sensor, () => ({
  __proto__: dart.getGetters(html$.Sensor.__proto__),
  [$onError]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.Sensor, "dart:html");
dart.setFieldSignature(html$.Sensor, () => ({
  __proto__: dart.getFields(html$.Sensor.__proto__),
  [$activated]: dart.finalFieldType(core.bool),
  [$hasReading]: dart.finalFieldType(core.bool),
  [$timestamp]: dart.finalFieldType(core.num)
}));
dart.defineLazy(html$.Sensor, {
  /*html$.Sensor.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  }
});
dart.registerExtension("Sensor", html$.Sensor);
html$.OrientationSensor = class OrientationSensor extends html$.Sensor {
  get [$quaternion]() {
    return this.quaternion;
  }
  [$populateMatrix](...args) {
    return this.populateMatrix.apply(this, args);
  }
};
dart.addTypeTests(html$.OrientationSensor);
const quaternion = Symbol("OrientationSensor.quaternion");
dart.setMethodSignature(html$.OrientationSensor, () => ({
  __proto__: dart.getMethods(html$.OrientationSensor.__proto__),
  [$populateMatrix]: dart.fnType(dart.void, [core.Object])
}));
dart.setLibraryUri(html$.OrientationSensor, "dart:html");
dart.setFieldSignature(html$.OrientationSensor, () => ({
  __proto__: dart.getFields(html$.OrientationSensor.__proto__),
  [$quaternion]: dart.finalFieldType(ListOfnum())
}));
dart.registerExtension("OrientationSensor", html$.OrientationSensor);
html$.AbsoluteOrientationSensor = class AbsoluteOrientationSensor$ extends html$.OrientationSensor {
  static new(sensorOptions) {
    if (sensorOptions === void 0) sensorOptions = null;
    if (sensorOptions != null) {
      let sensorOptions_1 = html_common.convertDartToNative_Dictionary(sensorOptions);
      return html$.AbsoluteOrientationSensor._create_1(sensorOptions_1);
    }
    return html$.AbsoluteOrientationSensor._create_2();
  }
  static _create_1(sensorOptions) {
    return new AbsoluteOrientationSensor(sensorOptions);
  }
  static _create_2() {
    return new AbsoluteOrientationSensor();
  }
};
dart.addTypeTests(html$.AbsoluteOrientationSensor);
dart.setLibraryUri(html$.AbsoluteOrientationSensor, "dart:html");
dart.registerExtension("AbsoluteOrientationSensor", html$.AbsoluteOrientationSensor);
html$.AbstractWorker = class AbstractWorker extends _interceptors.Interceptor {
  get onError() {
    return html$.AbstractWorker.errorEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.AbstractWorker);
html$.AbstractWorker[dart.implements] = () => [html$.EventTarget];
dart.setGetterSignature(html$.AbstractWorker, () => ({
  __proto__: dart.getGetters(html$.AbstractWorker.__proto__),
  onError: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.AbstractWorker, "dart:html");
dart.defineExtensionAccessors(html$.AbstractWorker, ['onError']);
dart.defineLazy(html$.AbstractWorker, {
  /*html$.AbstractWorker.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  }
});
html$.Accelerometer = class Accelerometer$ extends html$.Sensor {
  static new(sensorOptions) {
    if (sensorOptions === void 0) sensorOptions = null;
    if (sensorOptions != null) {
      let sensorOptions_1 = html_common.convertDartToNative_Dictionary(sensorOptions);
      return html$.Accelerometer._create_1(sensorOptions_1);
    }
    return html$.Accelerometer._create_2();
  }
  static _create_1(sensorOptions) {
    return new Accelerometer(sensorOptions);
  }
  static _create_2() {
    return new Accelerometer();
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$z]() {
    return this.z;
  }
};
dart.addTypeTests(html$.Accelerometer);
const x = Symbol("Accelerometer.x");
const y = Symbol("Accelerometer.y");
const z = Symbol("Accelerometer.z");
dart.setLibraryUri(html$.Accelerometer, "dart:html");
dart.setFieldSignature(html$.Accelerometer, () => ({
  __proto__: dart.getFields(html$.Accelerometer.__proto__),
  [$x]: dart.finalFieldType(core.num),
  [$y]: dart.finalFieldType(core.num),
  [$z]: dart.finalFieldType(core.num)
}));
dart.registerExtension("Accelerometer", html$.Accelerometer);
html$.AccessibleNode = class AccessibleNode$ extends html$.EventTarget {
  static new() {
    return html$.AccessibleNode._create_1();
  }
  static _create_1() {
    return new AccessibleNode();
  }
  get [$activeDescendant]() {
    return this.activeDescendant;
  }
  set [$activeDescendant](value) {
    this.activeDescendant = value;
  }
  get [$atomic]() {
    return this.atomic;
  }
  set [$atomic](value) {
    this.atomic = value;
  }
  get [$autocomplete]() {
    return this.autocomplete;
  }
  set [$autocomplete](value) {
    this.autocomplete = value;
  }
  get [$busy]() {
    return this.busy;
  }
  set [$busy](value) {
    this.busy = value;
  }
  get [$checked]() {
    return this.checked;
  }
  set [$checked](value) {
    this.checked = value;
  }
  get [$colCount]() {
    return this.colCount;
  }
  set [$colCount](value) {
    this.colCount = value;
  }
  get [$colIndex]() {
    return this.colIndex;
  }
  set [$colIndex](value) {
    this.colIndex = value;
  }
  get [$colSpan]() {
    return this.colSpan;
  }
  set [$colSpan](value) {
    this.colSpan = value;
  }
  get [$controls]() {
    return this.controls;
  }
  set [$controls](value) {
    this.controls = value;
  }
  get [$current]() {
    return this.current;
  }
  set [$current](value) {
    this.current = value;
  }
  get [$describedBy]() {
    return this.describedBy;
  }
  set [$describedBy](value) {
    this.describedBy = value;
  }
  get [$details]() {
    return this.details;
  }
  set [$details](value) {
    this.details = value;
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$errorMessage]() {
    return this.errorMessage;
  }
  set [$errorMessage](value) {
    this.errorMessage = value;
  }
  get [$expanded]() {
    return this.expanded;
  }
  set [$expanded](value) {
    this.expanded = value;
  }
  get [$flowTo]() {
    return this.flowTo;
  }
  set [$flowTo](value) {
    this.flowTo = value;
  }
  get [$hasPopUp]() {
    return this.hasPopUp;
  }
  set [$hasPopUp](value) {
    this.hasPopUp = value;
  }
  get [$hidden]() {
    return this.hidden;
  }
  set [$hidden](value) {
    this.hidden = value;
  }
  get [$invalid]() {
    return this.invalid;
  }
  set [$invalid](value) {
    this.invalid = value;
  }
  get [$keyShortcuts]() {
    return this.keyShortcuts;
  }
  set [$keyShortcuts](value) {
    this.keyShortcuts = value;
  }
  get [$label]() {
    return this.label;
  }
  set [$label](value) {
    this.label = value;
  }
  get [$labeledBy]() {
    return this.labeledBy;
  }
  set [$labeledBy](value) {
    this.labeledBy = value;
  }
  get [$level]() {
    return this.level;
  }
  set [$level](value) {
    this.level = value;
  }
  get [$live]() {
    return this.live;
  }
  set [$live](value) {
    this.live = value;
  }
  get [$modal]() {
    return this.modal;
  }
  set [$modal](value) {
    this.modal = value;
  }
  get [$multiline]() {
    return this.multiline;
  }
  set [$multiline](value) {
    this.multiline = value;
  }
  get [$multiselectable]() {
    return this.multiselectable;
  }
  set [$multiselectable](value) {
    this.multiselectable = value;
  }
  get [$orientation]() {
    return this.orientation;
  }
  set [$orientation](value) {
    this.orientation = value;
  }
  get [$owns]() {
    return this.owns;
  }
  set [$owns](value) {
    this.owns = value;
  }
  get [$placeholder]() {
    return this.placeholder;
  }
  set [$placeholder](value) {
    this.placeholder = value;
  }
  get [$posInSet]() {
    return this.posInSet;
  }
  set [$posInSet](value) {
    this.posInSet = value;
  }
  get [$pressed]() {
    return this.pressed;
  }
  set [$pressed](value) {
    this.pressed = value;
  }
  get [$readOnly]() {
    return this.readOnly;
  }
  set [$readOnly](value) {
    this.readOnly = value;
  }
  get [$relevant]() {
    return this.relevant;
  }
  set [$relevant](value) {
    this.relevant = value;
  }
  get [$required]() {
    return this.required;
  }
  set [$required](value) {
    this.required = value;
  }
  get [$role]() {
    return this.role;
  }
  set [$role](value) {
    this.role = value;
  }
  get [$roleDescription]() {
    return this.roleDescription;
  }
  set [$roleDescription](value) {
    this.roleDescription = value;
  }
  get [$rowCount]() {
    return this.rowCount;
  }
  set [$rowCount](value) {
    this.rowCount = value;
  }
  get [$rowIndex]() {
    return this.rowIndex;
  }
  set [$rowIndex](value) {
    this.rowIndex = value;
  }
  get [$rowSpan]() {
    return this.rowSpan;
  }
  set [$rowSpan](value) {
    this.rowSpan = value;
  }
  get [$selected]() {
    return this.selected;
  }
  set [$selected](value) {
    this.selected = value;
  }
  get [$setSize]() {
    return this.setSize;
  }
  set [$setSize](value) {
    this.setSize = value;
  }
  get [$sort]() {
    return this.sort;
  }
  set [$sort](value) {
    this.sort = value;
  }
  get [$valueMax]() {
    return this.valueMax;
  }
  set [$valueMax](value) {
    this.valueMax = value;
  }
  get [$valueMin]() {
    return this.valueMin;
  }
  set [$valueMin](value) {
    this.valueMin = value;
  }
  get [$valueNow]() {
    return this.valueNow;
  }
  set [$valueNow](value) {
    this.valueNow = value;
  }
  get [$valueText]() {
    return this.valueText;
  }
  set [$valueText](value) {
    this.valueText = value;
  }
  [$appendChild](...args) {
    return this.appendChild.apply(this, args);
  }
  get [$onAccessibleClick]() {
    return html$.AccessibleNode.accessibleClickEvent.forTarget(this);
  }
  get [$onAccessibleContextMenu]() {
    return html$.AccessibleNode.accessibleContextMenuEvent.forTarget(this);
  }
  get [$onAccessibleDecrement]() {
    return html$.AccessibleNode.accessibleDecrementEvent.forTarget(this);
  }
  get [$onAccessibleFocus]() {
    return html$.AccessibleNode.accessibleFocusEvent.forTarget(this);
  }
  get [$onAccessibleIncrement]() {
    return html$.AccessibleNode.accessibleIncrementEvent.forTarget(this);
  }
  get [$onAccessibleScrollIntoView]() {
    return html$.AccessibleNode.accessibleScrollIntoViewEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.AccessibleNode);
const activeDescendant = Symbol("AccessibleNode.activeDescendant");
const atomic = Symbol("AccessibleNode.atomic");
const autocomplete = Symbol("AccessibleNode.autocomplete");
const busy = Symbol("AccessibleNode.busy");
const checked = Symbol("AccessibleNode.checked");
const colCount = Symbol("AccessibleNode.colCount");
const colIndex = Symbol("AccessibleNode.colIndex");
const colSpan = Symbol("AccessibleNode.colSpan");
const controls = Symbol("AccessibleNode.controls");
const current = Symbol("AccessibleNode.current");
const describedBy = Symbol("AccessibleNode.describedBy");
const details = Symbol("AccessibleNode.details");
const disabled = Symbol("AccessibleNode.disabled");
const errorMessage = Symbol("AccessibleNode.errorMessage");
const expanded = Symbol("AccessibleNode.expanded");
const flowTo = Symbol("AccessibleNode.flowTo");
const hasPopUp = Symbol("AccessibleNode.hasPopUp");
const hidden$ = Symbol("AccessibleNode.hidden");
const invalid = Symbol("AccessibleNode.invalid");
const keyShortcuts = Symbol("AccessibleNode.keyShortcuts");
const label = Symbol("AccessibleNode.label");
const labeledBy = Symbol("AccessibleNode.labeledBy");
const level = Symbol("AccessibleNode.level");
const live = Symbol("AccessibleNode.live");
const modal = Symbol("AccessibleNode.modal");
const multiline = Symbol("AccessibleNode.multiline");
const multiselectable = Symbol("AccessibleNode.multiselectable");
const orientation = Symbol("AccessibleNode.orientation");
const owns = Symbol("AccessibleNode.owns");
const placeholder = Symbol("AccessibleNode.placeholder");
const posInSet = Symbol("AccessibleNode.posInSet");
const pressed = Symbol("AccessibleNode.pressed");
const readOnly = Symbol("AccessibleNode.readOnly");
const relevant = Symbol("AccessibleNode.relevant");
const required = Symbol("AccessibleNode.required");
const role = Symbol("AccessibleNode.role");
const roleDescription = Symbol("AccessibleNode.roleDescription");
const rowCount = Symbol("AccessibleNode.rowCount");
const rowIndex = Symbol("AccessibleNode.rowIndex");
const rowSpan = Symbol("AccessibleNode.rowSpan");
const selected = Symbol("AccessibleNode.selected");
const setSize = Symbol("AccessibleNode.setSize");
const sort = Symbol("AccessibleNode.sort");
const valueMax = Symbol("AccessibleNode.valueMax");
const valueMin = Symbol("AccessibleNode.valueMin");
const valueNow = Symbol("AccessibleNode.valueNow");
const valueText = Symbol("AccessibleNode.valueText");
dart.setMethodSignature(html$.AccessibleNode, () => ({
  __proto__: dart.getMethods(html$.AccessibleNode.__proto__),
  [$appendChild]: dart.fnType(dart.void, [html$.AccessibleNode])
}));
dart.setGetterSignature(html$.AccessibleNode, () => ({
  __proto__: dart.getGetters(html$.AccessibleNode.__proto__),
  [$onAccessibleClick]: async.Stream$(html$.Event),
  [$onAccessibleContextMenu]: async.Stream$(html$.Event),
  [$onAccessibleDecrement]: async.Stream$(html$.Event),
  [$onAccessibleFocus]: async.Stream$(html$.Event),
  [$onAccessibleIncrement]: async.Stream$(html$.Event),
  [$onAccessibleScrollIntoView]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.AccessibleNode, "dart:html");
dart.setFieldSignature(html$.AccessibleNode, () => ({
  __proto__: dart.getFields(html$.AccessibleNode.__proto__),
  [$activeDescendant]: dart.fieldType(html$.AccessibleNode),
  [$atomic]: dart.fieldType(core.bool),
  [$autocomplete]: dart.fieldType(core.String),
  [$busy]: dart.fieldType(core.bool),
  [$checked]: dart.fieldType(core.String),
  [$colCount]: dart.fieldType(core.int),
  [$colIndex]: dart.fieldType(core.int),
  [$colSpan]: dart.fieldType(core.int),
  [$controls]: dart.fieldType(html$.AccessibleNodeList),
  [$current]: dart.fieldType(core.String),
  [$describedBy]: dart.fieldType(html$.AccessibleNodeList),
  [$details]: dart.fieldType(html$.AccessibleNode),
  [$disabled]: dart.fieldType(core.bool),
  [$errorMessage]: dart.fieldType(html$.AccessibleNode),
  [$expanded]: dart.fieldType(core.bool),
  [$flowTo]: dart.fieldType(html$.AccessibleNodeList),
  [$hasPopUp]: dart.fieldType(core.String),
  [$hidden]: dart.fieldType(core.bool),
  [$invalid]: dart.fieldType(core.String),
  [$keyShortcuts]: dart.fieldType(core.String),
  [$label]: dart.fieldType(core.String),
  [$labeledBy]: dart.fieldType(html$.AccessibleNodeList),
  [$level]: dart.fieldType(core.int),
  [$live]: dart.fieldType(core.String),
  [$modal]: dart.fieldType(core.bool),
  [$multiline]: dart.fieldType(core.bool),
  [$multiselectable]: dart.fieldType(core.bool),
  [$orientation]: dart.fieldType(core.String),
  [$owns]: dart.fieldType(html$.AccessibleNodeList),
  [$placeholder]: dart.fieldType(core.String),
  [$posInSet]: dart.fieldType(core.int),
  [$pressed]: dart.fieldType(core.String),
  [$readOnly]: dart.fieldType(core.bool),
  [$relevant]: dart.fieldType(core.String),
  [$required]: dart.fieldType(core.bool),
  [$role]: dart.fieldType(core.String),
  [$roleDescription]: dart.fieldType(core.String),
  [$rowCount]: dart.fieldType(core.int),
  [$rowIndex]: dart.fieldType(core.int),
  [$rowSpan]: dart.fieldType(core.int),
  [$selected]: dart.fieldType(core.bool),
  [$setSize]: dart.fieldType(core.int),
  [$sort]: dart.fieldType(core.String),
  [$valueMax]: dart.fieldType(core.num),
  [$valueMin]: dart.fieldType(core.num),
  [$valueNow]: dart.fieldType(core.num),
  [$valueText]: dart.fieldType(core.String)
}));
dart.defineLazy(html$.AccessibleNode, {
  /*html$.AccessibleNode.accessibleClickEvent*/get accessibleClickEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("accessibleclick"));
  },
  /*html$.AccessibleNode.accessibleContextMenuEvent*/get accessibleContextMenuEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("accessiblecontextmenu"));
  },
  /*html$.AccessibleNode.accessibleDecrementEvent*/get accessibleDecrementEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("accessibledecrement"));
  },
  /*html$.AccessibleNode.accessibleFocusEvent*/get accessibleFocusEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("accessiblefocus"));
  },
  /*html$.AccessibleNode.accessibleIncrementEvent*/get accessibleIncrementEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("accessibleincrement"));
  },
  /*html$.AccessibleNode.accessibleScrollIntoViewEvent*/get accessibleScrollIntoViewEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("accessiblescrollintoview"));
  }
});
dart.registerExtension("AccessibleNode", html$.AccessibleNode);
const __setter__ = dart.privateName(html$, "__setter__");
html$.AccessibleNodeList = class AccessibleNodeList$ extends _interceptors.Interceptor {
  static new(nodes) {
    if (nodes === void 0) nodes = null;
    if (nodes != null) {
      return html$.AccessibleNodeList._create_1(nodes);
    }
    return html$.AccessibleNodeList._create_2();
  }
  static _create_1(nodes) {
    return new AccessibleNodeList(nodes);
  }
  static _create_2() {
    return new AccessibleNodeList();
  }
  get [$length]() {
    return this.length;
  }
  set [$length](value) {
    this.length = value;
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
  [$add](...args) {
    return this.add.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$remove](...args) {
    return this.remove.apply(this, args);
  }
};
dart.addTypeTests(html$.AccessibleNodeList);
const length = Symbol("AccessibleNodeList.length");
dart.setMethodSignature(html$.AccessibleNodeList, () => ({
  __proto__: dart.getMethods(html$.AccessibleNodeList.__proto__),
  [__setter__]: dart.fnType(dart.void, [core.int, html$.AccessibleNode]),
  [$add]: dart.fnType(dart.void, [html$.AccessibleNode, html$.AccessibleNode]),
  [$item]: dart.fnType(html$.AccessibleNode, [core.int]),
  [$remove]: dart.fnType(dart.void, [core.int])
}));
dart.setLibraryUri(html$.AccessibleNodeList, "dart:html");
dart.setFieldSignature(html$.AccessibleNodeList, () => ({
  __proto__: dart.getFields(html$.AccessibleNodeList.__proto__),
  [$length]: dart.fieldType(core.int)
}));
dart.registerExtension("AccessibleNodeList", html$.AccessibleNodeList);
html$.AmbientLightSensor = class AmbientLightSensor$ extends html$.Sensor {
  static new(sensorOptions) {
    if (sensorOptions === void 0) sensorOptions = null;
    if (sensorOptions != null) {
      let sensorOptions_1 = html_common.convertDartToNative_Dictionary(sensorOptions);
      return html$.AmbientLightSensor._create_1(sensorOptions_1);
    }
    return html$.AmbientLightSensor._create_2();
  }
  static _create_1(sensorOptions) {
    return new AmbientLightSensor(sensorOptions);
  }
  static _create_2() {
    return new AmbientLightSensor();
  }
  get [$illuminance]() {
    return this.illuminance;
  }
};
dart.addTypeTests(html$.AmbientLightSensor);
const illuminance = Symbol("AmbientLightSensor.illuminance");
dart.setLibraryUri(html$.AmbientLightSensor, "dart:html");
dart.setFieldSignature(html$.AmbientLightSensor, () => ({
  __proto__: dart.getFields(html$.AmbientLightSensor.__proto__),
  [$illuminance]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AmbientLightSensor", html$.AmbientLightSensor);
html$.AnchorElement = class AnchorElement extends html$.HtmlElement {
  static new(opts) {
    let href = opts && 'href' in opts ? opts.href : null;
    let e = html$.document.createElement("a");
    if (href != null) e.href = href;
    return e;
  }
  get [$download]() {
    return this.download;
  }
  set [$download](value) {
    this.download = value;
  }
  get [$hreflang]() {
    return this.hreflang;
  }
  set [$hreflang](value) {
    this.hreflang = value;
  }
  get [$referrerPolicy]() {
    return this.referrerPolicy;
  }
  set [$referrerPolicy](value) {
    this.referrerPolicy = value;
  }
  get [$rel]() {
    return this.rel;
  }
  set [$rel](value) {
    this.rel = value;
  }
  get [$target]() {
    return this.target;
  }
  set [$target](value) {
    this.target = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  get [$hash]() {
    return this.hash;
  }
  set [$hash](value) {
    this.hash = value;
  }
  get [$host]() {
    return this.host;
  }
  set [$host](value) {
    this.host = value;
  }
  get [$hostname]() {
    return this.hostname;
  }
  set [$hostname](value) {
    this.hostname = value;
  }
  get [$href]() {
    return this.href;
  }
  set [$href](value) {
    this.href = value;
  }
  get [$origin]() {
    return this.origin;
  }
  get [$password]() {
    return this.password;
  }
  set [$password](value) {
    this.password = value;
  }
  get [$pathname]() {
    return this.pathname;
  }
  set [$pathname](value) {
    this.pathname = value;
  }
  get [$port]() {
    return this.port;
  }
  set [$port](value) {
    this.port = value;
  }
  get [$protocol]() {
    return this.protocol;
  }
  set [$protocol](value) {
    this.protocol = value;
  }
  get [$search]() {
    return this.search;
  }
  set [$search](value) {
    this.search = value;
  }
  get [$username]() {
    return this.username;
  }
  set [$username](value) {
    this.username = value;
  }
  [$toString]() {
    return String(this);
  }
};
(html$.AnchorElement.created = function() {
  this[download] = null;
  this[hreflang] = null;
  this[referrerPolicy] = null;
  this[rel] = null;
  this[target$] = null;
  this[type$3] = null;
  this[hash] = null;
  this[host] = null;
  this[hostname] = null;
  this[href] = null;
  this[origin] = null;
  this[password] = null;
  this[pathname] = null;
  this[port] = null;
  this[protocol] = null;
  this[search] = null;
  this[username] = null;
  html$.AnchorElement.__proto__.created.call(this);
}).prototype = html$.AnchorElement.prototype;
dart.addTypeTests(html$.AnchorElement);
const download = Symbol("AnchorElement.download");
const hreflang = Symbol("AnchorElement.hreflang");
const referrerPolicy = Symbol("AnchorElement.referrerPolicy");
const rel = Symbol("AnchorElement.rel");
const target$ = Symbol("AnchorElement.target");
const type$3 = Symbol("AnchorElement.type");
const hash = Symbol("AnchorElement.hash");
const host = Symbol("AnchorElement.host");
const hostname = Symbol("AnchorElement.hostname");
const href = Symbol("AnchorElement.href");
const origin = Symbol("AnchorElement.origin");
const password = Symbol("AnchorElement.password");
const pathname = Symbol("AnchorElement.pathname");
const port = Symbol("AnchorElement.port");
const protocol = Symbol("AnchorElement.protocol");
const search = Symbol("AnchorElement.search");
const username = Symbol("AnchorElement.username");
html$.AnchorElement[dart.implements] = () => [html$.HtmlHyperlinkElementUtils];
dart.setLibraryUri(html$.AnchorElement, "dart:html");
dart.setFieldSignature(html$.AnchorElement, () => ({
  __proto__: dart.getFields(html$.AnchorElement.__proto__),
  [$download]: dart.fieldType(core.String),
  [$hreflang]: dart.fieldType(core.String),
  [$referrerPolicy]: dart.fieldType(core.String),
  [$rel]: dart.fieldType(core.String),
  [$target]: dart.fieldType(core.String),
  [$type]: dart.fieldType(core.String),
  [$hash]: dart.fieldType(core.String),
  [$host]: dart.fieldType(core.String),
  [$hostname]: dart.fieldType(core.String),
  [$href]: dart.fieldType(core.String),
  [$origin]: dart.finalFieldType(core.String),
  [$password]: dart.fieldType(core.String),
  [$pathname]: dart.fieldType(core.String),
  [$port]: dart.fieldType(core.String),
  [$protocol]: dart.fieldType(core.String),
  [$search]: dart.fieldType(core.String),
  [$username]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLAnchorElement", html$.AnchorElement);
html$.Animation = class Animation$ extends html$.EventTarget {
  static new(effect, timeline) {
    if (effect === void 0) effect = null;
    if (timeline === void 0) timeline = null;
    if (timeline != null) {
      return html$.Animation._create_1(effect, timeline);
    }
    if (effect != null) {
      return html$.Animation._create_2(effect);
    }
    return html$.Animation._create_3();
  }
  static _create_1(effect, timeline) {
    return new Animation(effect, timeline);
  }
  static _create_2(effect) {
    return new Animation(effect);
  }
  static _create_3() {
    return new Animation();
  }
  static get supported() {
    return !!document.body.animate;
  }
  get [$currentTime]() {
    return this.currentTime;
  }
  set [$currentTime](value) {
    this.currentTime = value;
  }
  get [$effect]() {
    return this.effect;
  }
  set [$effect](value) {
    this.effect = value;
  }
  get [$finished]() {
    return html$.promiseToFuture(html$.Animation, this.finished);
  }
  get [$id]() {
    return this.id;
  }
  set [$id](value) {
    this.id = value;
  }
  get [$playState]() {
    return this.playState;
  }
  get [$playbackRate]() {
    return this.playbackRate;
  }
  set [$playbackRate](value) {
    this.playbackRate = value;
  }
  get [$ready]() {
    return html$.promiseToFuture(html$.Animation, this.ready);
  }
  get [$startTime]() {
    return this.startTime;
  }
  set [$startTime](value) {
    this.startTime = value;
  }
  get [$timeline]() {
    return this.timeline;
  }
  [$cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [$finish](...args) {
    return this.finish.apply(this, args);
  }
  [$pause](...args) {
    return this.pause.apply(this, args);
  }
  [$play](...args) {
    return this.play.apply(this, args);
  }
  [$reverse](...args) {
    return this.reverse.apply(this, args);
  }
  get [$onCancel]() {
    return html$.Animation.cancelEvent.forTarget(this);
  }
  get [$onFinish]() {
    return html$.Animation.finishEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.Animation);
const currentTime = Symbol("Animation.currentTime");
const effect = Symbol("Animation.effect");
const id$0 = Symbol("Animation.id");
const playState = Symbol("Animation.playState");
const playbackRate = Symbol("Animation.playbackRate");
const startTime = Symbol("Animation.startTime");
const timeline = Symbol("Animation.timeline");
dart.setMethodSignature(html$.Animation, () => ({
  __proto__: dart.getMethods(html$.Animation.__proto__),
  [$cancel]: dart.fnType(dart.void, []),
  [$finish]: dart.fnType(dart.void, []),
  [$pause]: dart.fnType(dart.void, []),
  [$play]: dart.fnType(dart.void, []),
  [$reverse]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.Animation, () => ({
  __proto__: dart.getGetters(html$.Animation.__proto__),
  [$finished]: async.Future$(html$.Animation),
  [$ready]: async.Future$(html$.Animation),
  [$onCancel]: async.Stream$(html$.Event),
  [$onFinish]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.Animation, "dart:html");
dart.setFieldSignature(html$.Animation, () => ({
  __proto__: dart.getFields(html$.Animation.__proto__),
  [$currentTime]: dart.fieldType(core.num),
  [$effect]: dart.fieldType(html$.AnimationEffectReadOnly),
  [$id]: dart.fieldType(core.String),
  [$playState]: dart.finalFieldType(core.String),
  [$playbackRate]: dart.fieldType(core.num),
  [$startTime]: dart.fieldType(core.num),
  [$timeline]: dart.finalFieldType(html$.AnimationTimeline)
}));
dart.defineLazy(html$.Animation, {
  /*html$.Animation.cancelEvent*/get cancelEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("cancel"));
  },
  /*html$.Animation.finishEvent*/get finishEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("finish"));
  }
});
dart.registerExtension("Animation", html$.Animation);
const _getComputedTiming_1 = dart.privateName(html$, "_getComputedTiming_1");
html$.AnimationEffectReadOnly = class AnimationEffectReadOnly extends _interceptors.Interceptor {
  get [$timing]() {
    return this.timing;
  }
  [$getComputedTiming]() {
    return html_common.convertNativeToDart_Dictionary(this[_getComputedTiming_1]());
  }
  [_getComputedTiming_1](...args) {
    return this.getComputedTiming.apply(this, args);
  }
};
dart.addTypeTests(html$.AnimationEffectReadOnly);
const timing = Symbol("AnimationEffectReadOnly.timing");
dart.setMethodSignature(html$.AnimationEffectReadOnly, () => ({
  __proto__: dart.getMethods(html$.AnimationEffectReadOnly.__proto__),
  [$getComputedTiming]: dart.fnType(core.Map, []),
  [_getComputedTiming_1]: dart.fnType(dart.dynamic, [])
}));
dart.setLibraryUri(html$.AnimationEffectReadOnly, "dart:html");
dart.setFieldSignature(html$.AnimationEffectReadOnly, () => ({
  __proto__: dart.getFields(html$.AnimationEffectReadOnly.__proto__),
  [$timing]: dart.finalFieldType(html$.AnimationEffectTimingReadOnly)
}));
dart.registerExtension("AnimationEffectReadOnly", html$.AnimationEffectReadOnly);
html$.AnimationEffectTimingReadOnly = class AnimationEffectTimingReadOnly extends _interceptors.Interceptor {
  get [$delay]() {
    return this.delay;
  }
  get [$direction]() {
    return this.direction;
  }
  get [$duration]() {
    return this.duration;
  }
  get [$easing]() {
    return this.easing;
  }
  get [$endDelay]() {
    return this.endDelay;
  }
  get [$fill]() {
    return this.fill;
  }
  get [$iterationStart]() {
    return this.iterationStart;
  }
  get [$iterations]() {
    return this.iterations;
  }
};
dart.addTypeTests(html$.AnimationEffectTimingReadOnly);
const delay = Symbol("AnimationEffectTimingReadOnly.delay");
const direction$ = Symbol("AnimationEffectTimingReadOnly.direction");
const duration = Symbol("AnimationEffectTimingReadOnly.duration");
const easing = Symbol("AnimationEffectTimingReadOnly.easing");
const endDelay = Symbol("AnimationEffectTimingReadOnly.endDelay");
const fill = Symbol("AnimationEffectTimingReadOnly.fill");
const iterationStart = Symbol("AnimationEffectTimingReadOnly.iterationStart");
const iterations = Symbol("AnimationEffectTimingReadOnly.iterations");
dart.setLibraryUri(html$.AnimationEffectTimingReadOnly, "dart:html");
dart.setFieldSignature(html$.AnimationEffectTimingReadOnly, () => ({
  __proto__: dart.getFields(html$.AnimationEffectTimingReadOnly.__proto__),
  [$delay]: dart.finalFieldType(core.num),
  [$direction]: dart.finalFieldType(core.String),
  [$duration]: dart.finalFieldType(core.Object),
  [$easing]: dart.finalFieldType(core.String),
  [$endDelay]: dart.finalFieldType(core.num),
  [$fill]: dart.finalFieldType(core.String),
  [$iterationStart]: dart.finalFieldType(core.num),
  [$iterations]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AnimationEffectTimingReadOnly", html$.AnimationEffectTimingReadOnly);
html$.AnimationEffectTiming = class AnimationEffectTiming extends html$.AnimationEffectTimingReadOnly {
  get [$delay]() {
    return this.delay;
  }
  set [$delay](value) {
    this.delay = value;
  }
  get [$direction]() {
    return this.direction;
  }
  set [$direction](value) {
    this.direction = value;
  }
  get [$duration]() {
    return this.duration;
  }
  set [$duration](value) {
    this.duration = value;
  }
  get [$easing]() {
    return this.easing;
  }
  set [$easing](value) {
    this.easing = value;
  }
  get [$endDelay]() {
    return this.endDelay;
  }
  set [$endDelay](value) {
    this.endDelay = value;
  }
  get [$fill]() {
    return this.fill;
  }
  set [$fill](value) {
    this.fill = value;
  }
  get [$iterationStart]() {
    return this.iterationStart;
  }
  set [$iterationStart](value) {
    this.iterationStart = value;
  }
  get [$iterations]() {
    return this.iterations;
  }
  set [$iterations](value) {
    this.iterations = value;
  }
};
dart.addTypeTests(html$.AnimationEffectTiming);
dart.setSetterSignature(html$.AnimationEffectTiming, () => ({
  __proto__: dart.getSetters(html$.AnimationEffectTiming.__proto__),
  [$delay]: core.num,
  [$direction]: core.String,
  [$duration]: core.Object,
  [$easing]: core.String,
  [$endDelay]: core.num,
  [$fill]: core.String,
  [$iterationStart]: core.num,
  [$iterations]: core.num
}));
dart.setLibraryUri(html$.AnimationEffectTiming, "dart:html");
dart.registerExtension("AnimationEffectTiming", html$.AnimationEffectTiming);
html$.AnimationEvent = class AnimationEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.AnimationEvent._create_1(type, eventInitDict_1);
    }
    return html$.AnimationEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new AnimationEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new AnimationEvent(type);
  }
  get [$animationName]() {
    return this.animationName;
  }
  get [$elapsedTime]() {
    return this.elapsedTime;
  }
};
dart.addTypeTests(html$.AnimationEvent);
const animationName = Symbol("AnimationEvent.animationName");
const elapsedTime = Symbol("AnimationEvent.elapsedTime");
dart.setLibraryUri(html$.AnimationEvent, "dart:html");
dart.setFieldSignature(html$.AnimationEvent, () => ({
  __proto__: dart.getFields(html$.AnimationEvent.__proto__),
  [$animationName]: dart.finalFieldType(core.String),
  [$elapsedTime]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AnimationEvent", html$.AnimationEvent);
html$.AnimationPlaybackEvent = class AnimationPlaybackEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.AnimationPlaybackEvent._create_1(type, eventInitDict_1);
    }
    return html$.AnimationPlaybackEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new AnimationPlaybackEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new AnimationPlaybackEvent(type);
  }
  get [$currentTime]() {
    return this.currentTime;
  }
  get [$timelineTime]() {
    return this.timelineTime;
  }
};
dart.addTypeTests(html$.AnimationPlaybackEvent);
const currentTime$ = Symbol("AnimationPlaybackEvent.currentTime");
const timelineTime = Symbol("AnimationPlaybackEvent.timelineTime");
dart.setLibraryUri(html$.AnimationPlaybackEvent, "dart:html");
dart.setFieldSignature(html$.AnimationPlaybackEvent, () => ({
  __proto__: dart.getFields(html$.AnimationPlaybackEvent.__proto__),
  [$currentTime]: dart.finalFieldType(core.num),
  [$timelineTime]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AnimationPlaybackEvent", html$.AnimationPlaybackEvent);
html$.AnimationTimeline = class AnimationTimeline extends _interceptors.Interceptor {
  get [$currentTime]() {
    return this.currentTime;
  }
};
dart.addTypeTests(html$.AnimationTimeline);
const currentTime$0 = Symbol("AnimationTimeline.currentTime");
dart.setLibraryUri(html$.AnimationTimeline, "dart:html");
dart.setFieldSignature(html$.AnimationTimeline, () => ({
  __proto__: dart.getFields(html$.AnimationTimeline.__proto__),
  [$currentTime]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AnimationTimeline", html$.AnimationTimeline);
html$.WorkletGlobalScope = class WorkletGlobalScope extends _interceptors.Interceptor {};
dart.addTypeTests(html$.WorkletGlobalScope);
dart.setLibraryUri(html$.WorkletGlobalScope, "dart:html");
dart.registerExtension("WorkletGlobalScope", html$.WorkletGlobalScope);
html$.AnimationWorkletGlobalScope = class AnimationWorkletGlobalScope extends html$.WorkletGlobalScope {
  [$registerAnimator](...args) {
    return this.registerAnimator.apply(this, args);
  }
};
dart.addTypeTests(html$.AnimationWorkletGlobalScope);
dart.setMethodSignature(html$.AnimationWorkletGlobalScope, () => ({
  __proto__: dart.getMethods(html$.AnimationWorkletGlobalScope.__proto__),
  [$registerAnimator]: dart.fnType(dart.void, [core.String, core.Object])
}));
dart.setLibraryUri(html$.AnimationWorkletGlobalScope, "dart:html");
dart.registerExtension("AnimationWorkletGlobalScope", html$.AnimationWorkletGlobalScope);
html$.ApplicationCache = class ApplicationCache extends html$.EventTarget {
  static get supported() {
    return !!window.applicationCache;
  }
  get [$status]() {
    return this.status;
  }
  [$abort](...args) {
    return this.abort.apply(this, args);
  }
  [$swapCache](...args) {
    return this.swapCache.apply(this, args);
  }
  [$update](...args) {
    return this.update.apply(this, args);
  }
  get [$onCached]() {
    return html$.ApplicationCache.cachedEvent.forTarget(this);
  }
  get [$onChecking]() {
    return html$.ApplicationCache.checkingEvent.forTarget(this);
  }
  get [$onDownloading]() {
    return html$.ApplicationCache.downloadingEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.ApplicationCache.errorEvent.forTarget(this);
  }
  get [$onNoUpdate]() {
    return html$.ApplicationCache.noUpdateEvent.forTarget(this);
  }
  get [$onObsolete]() {
    return html$.ApplicationCache.obsoleteEvent.forTarget(this);
  }
  get [$onProgress]() {
    return html$.ApplicationCache.progressEvent.forTarget(this);
  }
  get [$onUpdateReady]() {
    return html$.ApplicationCache.updateReadyEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.ApplicationCache);
const status = Symbol("ApplicationCache.status");
dart.setMethodSignature(html$.ApplicationCache, () => ({
  __proto__: dart.getMethods(html$.ApplicationCache.__proto__),
  [$abort]: dart.fnType(dart.void, []),
  [$swapCache]: dart.fnType(dart.void, []),
  [$update]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.ApplicationCache, () => ({
  __proto__: dart.getGetters(html$.ApplicationCache.__proto__),
  [$onCached]: async.Stream$(html$.Event),
  [$onChecking]: async.Stream$(html$.Event),
  [$onDownloading]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event),
  [$onNoUpdate]: async.Stream$(html$.Event),
  [$onObsolete]: async.Stream$(html$.Event),
  [$onProgress]: async.Stream$(html$.ProgressEvent),
  [$onUpdateReady]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.ApplicationCache, "dart:html");
dart.setFieldSignature(html$.ApplicationCache, () => ({
  __proto__: dart.getFields(html$.ApplicationCache.__proto__),
  [$status]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.ApplicationCache, {
  /*html$.ApplicationCache.cachedEvent*/get cachedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("cached"));
  },
  /*html$.ApplicationCache.checkingEvent*/get checkingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("checking"));
  },
  /*html$.ApplicationCache.downloadingEvent*/get downloadingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("downloading"));
  },
  /*html$.ApplicationCache.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.ApplicationCache.noUpdateEvent*/get noUpdateEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("noupdate"));
  },
  /*html$.ApplicationCache.obsoleteEvent*/get obsoleteEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("obsolete"));
  },
  /*html$.ApplicationCache.progressEvent*/get progressEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("progress"));
  },
  /*html$.ApplicationCache.updateReadyEvent*/get updateReadyEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("updateready"));
  },
  /*html$.ApplicationCache.CHECKING*/get CHECKING() {
    return 2;
  },
  /*html$.ApplicationCache.DOWNLOADING*/get DOWNLOADING() {
    return 3;
  },
  /*html$.ApplicationCache.IDLE*/get IDLE() {
    return 1;
  },
  /*html$.ApplicationCache.OBSOLETE*/get OBSOLETE() {
    return 5;
  },
  /*html$.ApplicationCache.UNCACHED*/get UNCACHED() {
    return 0;
  },
  /*html$.ApplicationCache.UPDATEREADY*/get UPDATEREADY() {
    return 4;
  }
});
dart.registerExtension("ApplicationCache", html$.ApplicationCache);
dart.registerExtension("DOMApplicationCache", html$.ApplicationCache);
dart.registerExtension("OfflineResourceList", html$.ApplicationCache);
html$.ApplicationCacheErrorEvent = class ApplicationCacheErrorEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
    }
    return html$.ApplicationCacheErrorEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new ApplicationCacheErrorEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new ApplicationCacheErrorEvent(type);
  }
  get [$message]() {
    return this.message;
  }
  get [$reason]() {
    return this.reason;
  }
  get [$status]() {
    return this.status;
  }
  get [$url]() {
    return this.url;
  }
};
dart.addTypeTests(html$.ApplicationCacheErrorEvent);
const message = Symbol("ApplicationCacheErrorEvent.message");
const reason = Symbol("ApplicationCacheErrorEvent.reason");
const status$ = Symbol("ApplicationCacheErrorEvent.status");
const url = Symbol("ApplicationCacheErrorEvent.url");
dart.setLibraryUri(html$.ApplicationCacheErrorEvent, "dart:html");
dart.setFieldSignature(html$.ApplicationCacheErrorEvent, () => ({
  __proto__: dart.getFields(html$.ApplicationCacheErrorEvent.__proto__),
  [$message]: dart.finalFieldType(core.String),
  [$reason]: dart.finalFieldType(core.String),
  [$status]: dart.finalFieldType(core.int),
  [$url]: dart.finalFieldType(core.String)
}));
dart.registerExtension("ApplicationCacheErrorEvent", html$.ApplicationCacheErrorEvent);
html$.AreaElement = class AreaElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("area");
  }
  get [$alt]() {
    return this.alt;
  }
  set [$alt](value) {
    this.alt = value;
  }
  get [$coords]() {
    return this.coords;
  }
  set [$coords](value) {
    this.coords = value;
  }
  get [$download]() {
    return this.download;
  }
  set [$download](value) {
    this.download = value;
  }
  get [$referrerPolicy]() {
    return this.referrerPolicy;
  }
  set [$referrerPolicy](value) {
    this.referrerPolicy = value;
  }
  get [$rel]() {
    return this.rel;
  }
  set [$rel](value) {
    this.rel = value;
  }
  get [$shape]() {
    return this.shape;
  }
  set [$shape](value) {
    this.shape = value;
  }
  get [$target]() {
    return this.target;
  }
  set [$target](value) {
    this.target = value;
  }
  get [$hash]() {
    return this.hash;
  }
  set [$hash](value) {
    this.hash = value;
  }
  get [$host]() {
    return this.host;
  }
  set [$host](value) {
    this.host = value;
  }
  get [$hostname]() {
    return this.hostname;
  }
  set [$hostname](value) {
    this.hostname = value;
  }
  get [$href]() {
    return this.href;
  }
  set [$href](value) {
    this.href = value;
  }
  get [$origin]() {
    return this.origin;
  }
  get [$password]() {
    return this.password;
  }
  set [$password](value) {
    this.password = value;
  }
  get [$pathname]() {
    return this.pathname;
  }
  set [$pathname](value) {
    this.pathname = value;
  }
  get [$port]() {
    return this.port;
  }
  set [$port](value) {
    this.port = value;
  }
  get [$protocol]() {
    return this.protocol;
  }
  set [$protocol](value) {
    this.protocol = value;
  }
  get [$search]() {
    return this.search;
  }
  set [$search](value) {
    this.search = value;
  }
  get [$username]() {
    return this.username;
  }
  set [$username](value) {
    this.username = value;
  }
  [$toString]() {
    return String(this);
  }
};
(html$.AreaElement.created = function() {
  this[alt] = null;
  this[coords] = null;
  this[download$] = null;
  this[referrerPolicy$] = null;
  this[rel$] = null;
  this[shape] = null;
  this[target$0] = null;
  this[hash$] = null;
  this[host$] = null;
  this[hostname$] = null;
  this[href$] = null;
  this[origin$] = null;
  this[password$] = null;
  this[pathname$] = null;
  this[port$1] = null;
  this[protocol$] = null;
  this[search$] = null;
  this[username$] = null;
  html$.AreaElement.__proto__.created.call(this);
}).prototype = html$.AreaElement.prototype;
dart.addTypeTests(html$.AreaElement);
const alt = Symbol("AreaElement.alt");
const coords = Symbol("AreaElement.coords");
const download$ = Symbol("AreaElement.download");
const referrerPolicy$ = Symbol("AreaElement.referrerPolicy");
const rel$ = Symbol("AreaElement.rel");
const shape = Symbol("AreaElement.shape");
const target$0 = Symbol("AreaElement.target");
const hash$ = Symbol("AreaElement.hash");
const host$ = Symbol("AreaElement.host");
const hostname$ = Symbol("AreaElement.hostname");
const href$ = Symbol("AreaElement.href");
const origin$ = Symbol("AreaElement.origin");
const password$ = Symbol("AreaElement.password");
const pathname$ = Symbol("AreaElement.pathname");
const port$1 = Symbol("AreaElement.port");
const protocol$ = Symbol("AreaElement.protocol");
const search$ = Symbol("AreaElement.search");
const username$ = Symbol("AreaElement.username");
html$.AreaElement[dart.implements] = () => [html$.HtmlHyperlinkElementUtils];
dart.setLibraryUri(html$.AreaElement, "dart:html");
dart.setFieldSignature(html$.AreaElement, () => ({
  __proto__: dart.getFields(html$.AreaElement.__proto__),
  [$alt]: dart.fieldType(core.String),
  [$coords]: dart.fieldType(core.String),
  [$download]: dart.fieldType(core.String),
  [$referrerPolicy]: dart.fieldType(core.String),
  [$rel]: dart.fieldType(core.String),
  [$shape]: dart.fieldType(core.String),
  [$target]: dart.fieldType(core.String),
  [$hash]: dart.fieldType(core.String),
  [$host]: dart.fieldType(core.String),
  [$hostname]: dart.fieldType(core.String),
  [$href]: dart.fieldType(core.String),
  [$origin]: dart.finalFieldType(core.String),
  [$password]: dart.fieldType(core.String),
  [$pathname]: dart.fieldType(core.String),
  [$port]: dart.fieldType(core.String),
  [$protocol]: dart.fieldType(core.String),
  [$search]: dart.fieldType(core.String),
  [$username]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLAreaElement", html$.AreaElement);
html$.MediaElement = class MediaElement extends html$.HtmlElement {
  get [$audioTracks]() {
    return this.audioTracks;
  }
  get [$autoplay]() {
    return this.autoplay;
  }
  set [$autoplay](value) {
    this.autoplay = value;
  }
  get [$buffered]() {
    return this.buffered;
  }
  get [$controls]() {
    return this.controls;
  }
  set [$controls](value) {
    this.controls = value;
  }
  get [$controlsList]() {
    return this.controlsList;
  }
  get [$crossOrigin]() {
    return this.crossOrigin;
  }
  set [$crossOrigin](value) {
    this.crossOrigin = value;
  }
  get [$currentSrc]() {
    return this.currentSrc;
  }
  get [$currentTime]() {
    return this.currentTime;
  }
  set [$currentTime](value) {
    this.currentTime = value;
  }
  get [$defaultMuted]() {
    return this.defaultMuted;
  }
  set [$defaultMuted](value) {
    this.defaultMuted = value;
  }
  get [$defaultPlaybackRate]() {
    return this.defaultPlaybackRate;
  }
  set [$defaultPlaybackRate](value) {
    this.defaultPlaybackRate = value;
  }
  get [$disableRemotePlayback]() {
    return this.disableRemotePlayback;
  }
  set [$disableRemotePlayback](value) {
    this.disableRemotePlayback = value;
  }
  get [$duration]() {
    return this.duration;
  }
  get [$ended]() {
    return this.ended;
  }
  get [$error]() {
    return this.error;
  }
  get [$loop]() {
    return this.loop;
  }
  set [$loop](value) {
    this.loop = value;
  }
  get [$mediaKeys]() {
    return this.mediaKeys;
  }
  get [$muted]() {
    return this.muted;
  }
  set [$muted](value) {
    this.muted = value;
  }
  get [$networkState]() {
    return this.networkState;
  }
  get [$paused]() {
    return this.paused;
  }
  get [$playbackRate]() {
    return this.playbackRate;
  }
  set [$playbackRate](value) {
    this.playbackRate = value;
  }
  get [$played]() {
    return this.played;
  }
  get [$preload]() {
    return this.preload;
  }
  set [$preload](value) {
    this.preload = value;
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [$remote]() {
    return this.remote;
  }
  get [$seekable]() {
    return this.seekable;
  }
  get [$seeking]() {
    return this.seeking;
  }
  get [$sinkId]() {
    return this.sinkId;
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$srcObject]() {
    return this.srcObject;
  }
  set [$srcObject](value) {
    this.srcObject = value;
  }
  get [$textTracks]() {
    return this.textTracks;
  }
  get [$videoTracks]() {
    return this.videoTracks;
  }
  get [$volume]() {
    return this.volume;
  }
  set [$volume](value) {
    this.volume = value;
  }
  get [$audioDecodedByteCount]() {
    return this.webkitAudioDecodedByteCount;
  }
  get [$videoDecodedByteCount]() {
    return this.webkitVideoDecodedByteCount;
  }
  [$addTextTrack](...args) {
    return this.addTextTrack.apply(this, args);
  }
  [$canPlayType](...args) {
    return this.canPlayType.apply(this, args);
  }
  [$captureStream](...args) {
    return this.captureStream.apply(this, args);
  }
  [$load](...args) {
    return this.load.apply(this, args);
  }
  [$pause](...args) {
    return this.pause.apply(this, args);
  }
  [$play]() {
    return html$.promiseToFuture(dart.dynamic, this.play());
  }
  [$setMediaKeys](mediaKeys) {
    return html$.promiseToFuture(dart.dynamic, this.setMediaKeys(mediaKeys));
  }
  [$setSinkId](sinkId) {
    return html$.promiseToFuture(dart.dynamic, this.setSinkId(sinkId));
  }
};
(html$.MediaElement.created = function() {
  this[audioTracks] = null;
  this[autoplay] = null;
  this[buffered] = null;
  this[controls$] = null;
  this[controlsList] = null;
  this[crossOrigin] = null;
  this[currentSrc] = null;
  this[currentTime$1] = null;
  this[defaultMuted] = null;
  this[defaultPlaybackRate] = null;
  this[disableRemotePlayback] = null;
  this[duration$0] = null;
  this[ended] = null;
  this[error$1] = null;
  this[loop] = null;
  this[mediaKeys] = null;
  this[muted] = null;
  this[networkState] = null;
  this[paused] = null;
  this[playbackRate$] = null;
  this[played] = null;
  this[preload] = null;
  this[readyState$] = null;
  this[remote] = null;
  this[seekable] = null;
  this[seeking] = null;
  this[sinkId] = null;
  this[src] = null;
  this[srcObject] = null;
  this[textTracks] = null;
  this[videoTracks] = null;
  this[volume] = null;
  this[audioDecodedByteCount] = null;
  this[videoDecodedByteCount] = null;
  html$.MediaElement.__proto__.created.call(this);
}).prototype = html$.MediaElement.prototype;
dart.addTypeTests(html$.MediaElement);
const audioTracks = Symbol("MediaElement.audioTracks");
const autoplay = Symbol("MediaElement.autoplay");
const buffered = Symbol("MediaElement.buffered");
const controls$ = Symbol("MediaElement.controls");
const controlsList = Symbol("MediaElement.controlsList");
const crossOrigin = Symbol("MediaElement.crossOrigin");
const currentSrc = Symbol("MediaElement.currentSrc");
const currentTime$1 = Symbol("MediaElement.currentTime");
const defaultMuted = Symbol("MediaElement.defaultMuted");
const defaultPlaybackRate = Symbol("MediaElement.defaultPlaybackRate");
const disableRemotePlayback = Symbol("MediaElement.disableRemotePlayback");
const duration$0 = Symbol("MediaElement.duration");
const ended = Symbol("MediaElement.ended");
const error$1 = Symbol("MediaElement.error");
const loop = Symbol("MediaElement.loop");
const mediaKeys = Symbol("MediaElement.mediaKeys");
const muted = Symbol("MediaElement.muted");
const networkState = Symbol("MediaElement.networkState");
const paused = Symbol("MediaElement.paused");
const playbackRate$ = Symbol("MediaElement.playbackRate");
const played = Symbol("MediaElement.played");
const preload = Symbol("MediaElement.preload");
const readyState$ = Symbol("MediaElement.readyState");
const remote = Symbol("MediaElement.remote");
const seekable = Symbol("MediaElement.seekable");
const seeking = Symbol("MediaElement.seeking");
const sinkId = Symbol("MediaElement.sinkId");
const src = Symbol("MediaElement.src");
const srcObject = Symbol("MediaElement.srcObject");
const textTracks = Symbol("MediaElement.textTracks");
const videoTracks = Symbol("MediaElement.videoTracks");
const volume = Symbol("MediaElement.volume");
const audioDecodedByteCount = Symbol("MediaElement.audioDecodedByteCount");
const videoDecodedByteCount = Symbol("MediaElement.videoDecodedByteCount");
dart.setMethodSignature(html$.MediaElement, () => ({
  __proto__: dart.getMethods(html$.MediaElement.__proto__),
  [$addTextTrack]: dart.fnType(html$.TextTrack, [core.String], [core.String, core.String]),
  [$canPlayType]: dart.fnType(core.String, [core.String], [core.String]),
  [$captureStream]: dart.fnType(html$.MediaStream, []),
  [$load]: dart.fnType(dart.void, []),
  [$pause]: dart.fnType(dart.void, []),
  [$play]: dart.fnType(async.Future, []),
  [$setMediaKeys]: dart.fnType(async.Future, [html$.MediaKeys]),
  [$setSinkId]: dart.fnType(async.Future, [core.String])
}));
dart.setLibraryUri(html$.MediaElement, "dart:html");
dart.setFieldSignature(html$.MediaElement, () => ({
  __proto__: dart.getFields(html$.MediaElement.__proto__),
  [$audioTracks]: dart.finalFieldType(web_audio.AudioTrackList),
  [$autoplay]: dart.fieldType(core.bool),
  [$buffered]: dart.finalFieldType(html$.TimeRanges),
  [$controls]: dart.fieldType(core.bool),
  [$controlsList]: dart.finalFieldType(html$.DomTokenList),
  [$crossOrigin]: dart.fieldType(core.String),
  [$currentSrc]: dart.finalFieldType(core.String),
  [$currentTime]: dart.fieldType(core.num),
  [$defaultMuted]: dart.fieldType(core.bool),
  [$defaultPlaybackRate]: dart.fieldType(core.num),
  [$disableRemotePlayback]: dart.fieldType(core.bool),
  [$duration]: dart.finalFieldType(core.num),
  [$ended]: dart.finalFieldType(core.bool),
  [$error]: dart.finalFieldType(html$.MediaError),
  [$loop]: dart.fieldType(core.bool),
  [$mediaKeys]: dart.finalFieldType(html$.MediaKeys),
  [$muted]: dart.fieldType(core.bool),
  [$networkState]: dart.finalFieldType(core.int),
  [$paused]: dart.finalFieldType(core.bool),
  [$playbackRate]: dart.fieldType(core.num),
  [$played]: dart.finalFieldType(html$.TimeRanges),
  [$preload]: dart.fieldType(core.String),
  [$readyState]: dart.finalFieldType(core.int),
  [$remote]: dart.finalFieldType(html$.RemotePlayback),
  [$seekable]: dart.finalFieldType(html$.TimeRanges),
  [$seeking]: dart.finalFieldType(core.bool),
  [$sinkId]: dart.finalFieldType(core.String),
  [$src]: dart.fieldType(core.String),
  [$srcObject]: dart.fieldType(html$.MediaStream),
  [$textTracks]: dart.finalFieldType(html$.TextTrackList),
  [$videoTracks]: dart.finalFieldType(html$.VideoTrackList),
  [$volume]: dart.fieldType(core.num),
  [$audioDecodedByteCount]: dart.finalFieldType(core.int),
  [$videoDecodedByteCount]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.MediaElement, {
  /*html$.MediaElement.HAVE_CURRENT_DATA*/get HAVE_CURRENT_DATA() {
    return 2;
  },
  /*html$.MediaElement.HAVE_ENOUGH_DATA*/get HAVE_ENOUGH_DATA() {
    return 4;
  },
  /*html$.MediaElement.HAVE_FUTURE_DATA*/get HAVE_FUTURE_DATA() {
    return 3;
  },
  /*html$.MediaElement.HAVE_METADATA*/get HAVE_METADATA() {
    return 1;
  },
  /*html$.MediaElement.HAVE_NOTHING*/get HAVE_NOTHING() {
    return 0;
  },
  /*html$.MediaElement.NETWORK_EMPTY*/get NETWORK_EMPTY() {
    return 0;
  },
  /*html$.MediaElement.NETWORK_IDLE*/get NETWORK_IDLE() {
    return 1;
  },
  /*html$.MediaElement.NETWORK_LOADING*/get NETWORK_LOADING() {
    return 2;
  },
  /*html$.MediaElement.NETWORK_NO_SOURCE*/get NETWORK_NO_SOURCE() {
    return 3;
  }
});
dart.registerExtension("HTMLMediaElement", html$.MediaElement);
html$.AudioElement = class AudioElement extends html$.MediaElement {
  static __(src) {
    if (src === void 0) src = null;
    if (src != null) {
      return html$.AudioElement._create_1(src);
    }
    return html$.AudioElement._create_2();
  }
  static _create_1(src) {
    return new Audio(src);
  }
  static _create_2() {
    return new Audio();
  }
  static new(src) {
    if (src === void 0) src = null;
    return html$.AudioElement.__(src);
  }
};
(html$.AudioElement.created = function() {
  html$.AudioElement.__proto__.created.call(this);
}).prototype = html$.AudioElement.prototype;
dart.addTypeTests(html$.AudioElement);
dart.setLibraryUri(html$.AudioElement, "dart:html");
dart.registerExtension("HTMLAudioElement", html$.AudioElement);
html$.AuthenticatorResponse = class AuthenticatorResponse extends _interceptors.Interceptor {
  get [$clientDataJson]() {
    return this.clientDataJSON;
  }
};
dart.addTypeTests(html$.AuthenticatorResponse);
const clientDataJson = Symbol("AuthenticatorResponse.clientDataJson");
dart.setLibraryUri(html$.AuthenticatorResponse, "dart:html");
dart.setFieldSignature(html$.AuthenticatorResponse, () => ({
  __proto__: dart.getFields(html$.AuthenticatorResponse.__proto__),
  [$clientDataJson]: dart.finalFieldType(typed_data.ByteBuffer)
}));
dart.registerExtension("AuthenticatorResponse", html$.AuthenticatorResponse);
html$.AuthenticatorAssertionResponse = class AuthenticatorAssertionResponse extends html$.AuthenticatorResponse {
  get [$authenticatorData]() {
    return this.authenticatorData;
  }
  get [$signature]() {
    return this.signature;
  }
};
dart.addTypeTests(html$.AuthenticatorAssertionResponse);
const authenticatorData = Symbol("AuthenticatorAssertionResponse.authenticatorData");
const signature = Symbol("AuthenticatorAssertionResponse.signature");
dart.setLibraryUri(html$.AuthenticatorAssertionResponse, "dart:html");
dart.setFieldSignature(html$.AuthenticatorAssertionResponse, () => ({
  __proto__: dart.getFields(html$.AuthenticatorAssertionResponse.__proto__),
  [$authenticatorData]: dart.finalFieldType(typed_data.ByteBuffer),
  [$signature]: dart.finalFieldType(typed_data.ByteBuffer)
}));
dart.registerExtension("AuthenticatorAssertionResponse", html$.AuthenticatorAssertionResponse);
html$.AuthenticatorAttestationResponse = class AuthenticatorAttestationResponse extends html$.AuthenticatorResponse {
  get [$attestationObject]() {
    return this.attestationObject;
  }
};
dart.addTypeTests(html$.AuthenticatorAttestationResponse);
const attestationObject = Symbol("AuthenticatorAttestationResponse.attestationObject");
dart.setLibraryUri(html$.AuthenticatorAttestationResponse, "dart:html");
dart.setFieldSignature(html$.AuthenticatorAttestationResponse, () => ({
  __proto__: dart.getFields(html$.AuthenticatorAttestationResponse.__proto__),
  [$attestationObject]: dart.finalFieldType(typed_data.ByteBuffer)
}));
dart.registerExtension("AuthenticatorAttestationResponse", html$.AuthenticatorAttestationResponse);
html$.BRElement = class BRElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("br");
  }
};
(html$.BRElement.created = function() {
  html$.BRElement.__proto__.created.call(this);
}).prototype = html$.BRElement.prototype;
dart.addTypeTests(html$.BRElement);
dart.setLibraryUri(html$.BRElement, "dart:html");
dart.registerExtension("HTMLBRElement", html$.BRElement);
html$.BackgroundFetchEvent = class BackgroundFetchEvent$ extends html$.ExtendableEvent {
  static new(type, init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.BackgroundFetchEvent._create_1(type, init_1);
  }
  static _create_1(type, init) {
    return new BackgroundFetchEvent(type, init);
  }
  get [$id]() {
    return this.id;
  }
};
dart.addTypeTests(html$.BackgroundFetchEvent);
const id$1 = Symbol("BackgroundFetchEvent.id");
dart.setLibraryUri(html$.BackgroundFetchEvent, "dart:html");
dart.setFieldSignature(html$.BackgroundFetchEvent, () => ({
  __proto__: dart.getFields(html$.BackgroundFetchEvent.__proto__),
  [$id]: dart.finalFieldType(core.String)
}));
dart.registerExtension("BackgroundFetchEvent", html$.BackgroundFetchEvent);
html$.BackgroundFetchClickEvent = class BackgroundFetchClickEvent$ extends html$.BackgroundFetchEvent {
  static new(type, init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.BackgroundFetchClickEvent._create_1(type, init_1);
  }
  static _create_1(type, init) {
    return new BackgroundFetchClickEvent(type, init);
  }
  get [$state]() {
    return this.state;
  }
};
dart.addTypeTests(html$.BackgroundFetchClickEvent);
const state = Symbol("BackgroundFetchClickEvent.state");
dart.setLibraryUri(html$.BackgroundFetchClickEvent, "dart:html");
dart.setFieldSignature(html$.BackgroundFetchClickEvent, () => ({
  __proto__: dart.getFields(html$.BackgroundFetchClickEvent.__proto__),
  [$state]: dart.finalFieldType(core.String)
}));
dart.registerExtension("BackgroundFetchClickEvent", html$.BackgroundFetchClickEvent);
html$.BackgroundFetchFailEvent = class BackgroundFetchFailEvent$ extends html$.BackgroundFetchEvent {
  static new(type, init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.BackgroundFetchFailEvent._create_1(type, init_1);
  }
  static _create_1(type, init) {
    return new BackgroundFetchFailEvent(type, init);
  }
  get [$fetches]() {
    return this.fetches;
  }
};
dart.addTypeTests(html$.BackgroundFetchFailEvent);
const fetches = Symbol("BackgroundFetchFailEvent.fetches");
dart.setLibraryUri(html$.BackgroundFetchFailEvent, "dart:html");
dart.setFieldSignature(html$.BackgroundFetchFailEvent, () => ({
  __proto__: dart.getFields(html$.BackgroundFetchFailEvent.__proto__),
  [$fetches]: dart.finalFieldType(ListOfBackgroundFetchSettledFetch())
}));
dart.registerExtension("BackgroundFetchFailEvent", html$.BackgroundFetchFailEvent);
html$.BackgroundFetchFetch = class BackgroundFetchFetch extends _interceptors.Interceptor {
  get [$request]() {
    return this.request;
  }
};
dart.addTypeTests(html$.BackgroundFetchFetch);
const request = Symbol("BackgroundFetchFetch.request");
dart.setLibraryUri(html$.BackgroundFetchFetch, "dart:html");
dart.setFieldSignature(html$.BackgroundFetchFetch, () => ({
  __proto__: dart.getFields(html$.BackgroundFetchFetch.__proto__),
  [$request]: dart.finalFieldType(html$._Request)
}));
dart.registerExtension("BackgroundFetchFetch", html$.BackgroundFetchFetch);
html$.BackgroundFetchManager = class BackgroundFetchManager extends _interceptors.Interceptor {
  [$fetch](id, requests, options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(html$.BackgroundFetchRegistration, this.fetch(id, requests, options_dict));
  }
  [$get](id) {
    return html$.promiseToFuture(html$.BackgroundFetchRegistration, this.get(id));
  }
  [$getIds]() {
    return html$.promiseToFuture(ListOfString(), this.getIds());
  }
};
dart.addTypeTests(html$.BackgroundFetchManager);
dart.setMethodSignature(html$.BackgroundFetchManager, () => ({
  __proto__: dart.getMethods(html$.BackgroundFetchManager.__proto__),
  [$fetch]: dart.fnType(async.Future$(html$.BackgroundFetchRegistration), [core.String, core.Object], [core.Map]),
  [$get]: dart.fnType(async.Future$(html$.BackgroundFetchRegistration), [core.String]),
  [$getIds]: dart.fnType(async.Future$(core.List$(core.String)), [])
}));
dart.setLibraryUri(html$.BackgroundFetchManager, "dart:html");
dart.registerExtension("BackgroundFetchManager", html$.BackgroundFetchManager);
html$.BackgroundFetchRegistration = class BackgroundFetchRegistration extends html$.EventTarget {
  get [$downloadTotal]() {
    return this.downloadTotal;
  }
  get [$downloaded]() {
    return this.downloaded;
  }
  get [$id]() {
    return this.id;
  }
  get [$title]() {
    return this.title;
  }
  get [$totalDownloadSize]() {
    return this.totalDownloadSize;
  }
  get [$uploadTotal]() {
    return this.uploadTotal;
  }
  get [$uploaded]() {
    return this.uploaded;
  }
  [$abort]() {
    return html$.promiseToFuture(core.bool, this.abort());
  }
};
dart.addTypeTests(html$.BackgroundFetchRegistration);
const downloadTotal = Symbol("BackgroundFetchRegistration.downloadTotal");
const downloaded = Symbol("BackgroundFetchRegistration.downloaded");
const id$2 = Symbol("BackgroundFetchRegistration.id");
const title$ = Symbol("BackgroundFetchRegistration.title");
const totalDownloadSize = Symbol("BackgroundFetchRegistration.totalDownloadSize");
const uploadTotal = Symbol("BackgroundFetchRegistration.uploadTotal");
const uploaded = Symbol("BackgroundFetchRegistration.uploaded");
dart.setMethodSignature(html$.BackgroundFetchRegistration, () => ({
  __proto__: dart.getMethods(html$.BackgroundFetchRegistration.__proto__),
  [$abort]: dart.fnType(async.Future$(core.bool), [])
}));
dart.setLibraryUri(html$.BackgroundFetchRegistration, "dart:html");
dart.setFieldSignature(html$.BackgroundFetchRegistration, () => ({
  __proto__: dart.getFields(html$.BackgroundFetchRegistration.__proto__),
  [$downloadTotal]: dart.finalFieldType(core.int),
  [$downloaded]: dart.finalFieldType(core.int),
  [$id]: dart.finalFieldType(core.String),
  [$title]: dart.finalFieldType(core.String),
  [$totalDownloadSize]: dart.finalFieldType(core.int),
  [$uploadTotal]: dart.finalFieldType(core.int),
  [$uploaded]: dart.finalFieldType(core.int)
}));
dart.registerExtension("BackgroundFetchRegistration", html$.BackgroundFetchRegistration);
html$.BackgroundFetchSettledFetch = class BackgroundFetchSettledFetch$ extends html$.BackgroundFetchFetch {
  static new(request, response) {
    return html$.BackgroundFetchSettledFetch._create_1(request, response);
  }
  static _create_1(request, response) {
    return new BackgroundFetchSettledFetch(request, response);
  }
  get [$response]() {
    return this.response;
  }
};
dart.addTypeTests(html$.BackgroundFetchSettledFetch);
const response = Symbol("BackgroundFetchSettledFetch.response");
dart.setLibraryUri(html$.BackgroundFetchSettledFetch, "dart:html");
dart.setFieldSignature(html$.BackgroundFetchSettledFetch, () => ({
  __proto__: dart.getFields(html$.BackgroundFetchSettledFetch.__proto__),
  [$response]: dart.finalFieldType(html$._Response)
}));
dart.registerExtension("BackgroundFetchSettledFetch", html$.BackgroundFetchSettledFetch);
html$.BackgroundFetchedEvent = class BackgroundFetchedEvent$ extends html$.BackgroundFetchEvent {
  static new(type, init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.BackgroundFetchedEvent._create_1(type, init_1);
  }
  static _create_1(type, init) {
    return new BackgroundFetchedEvent(type, init);
  }
  get [$fetches]() {
    return this.fetches;
  }
  [$updateUI](title) {
    return html$.promiseToFuture(dart.dynamic, this.updateUI(title));
  }
};
dart.addTypeTests(html$.BackgroundFetchedEvent);
const fetches$ = Symbol("BackgroundFetchedEvent.fetches");
dart.setMethodSignature(html$.BackgroundFetchedEvent, () => ({
  __proto__: dart.getMethods(html$.BackgroundFetchedEvent.__proto__),
  [$updateUI]: dart.fnType(async.Future, [core.String])
}));
dart.setLibraryUri(html$.BackgroundFetchedEvent, "dart:html");
dart.setFieldSignature(html$.BackgroundFetchedEvent, () => ({
  __proto__: dart.getFields(html$.BackgroundFetchedEvent.__proto__),
  [$fetches]: dart.finalFieldType(ListOfBackgroundFetchSettledFetch())
}));
dart.registerExtension("BackgroundFetchedEvent", html$.BackgroundFetchedEvent);
html$.BarProp = class BarProp extends _interceptors.Interceptor {
  get [$visible]() {
    return this.visible;
  }
};
dart.addTypeTests(html$.BarProp);
const visible = Symbol("BarProp.visible");
dart.setLibraryUri(html$.BarProp, "dart:html");
dart.setFieldSignature(html$.BarProp, () => ({
  __proto__: dart.getFields(html$.BarProp.__proto__),
  [$visible]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("BarProp", html$.BarProp);
html$.BarcodeDetector = class BarcodeDetector$ extends _interceptors.Interceptor {
  static new() {
    return html$.BarcodeDetector._create_1();
  }
  static _create_1() {
    return new BarcodeDetector();
  }
  [$detect](image) {
    return html$.promiseToFuture(ListOfDetectedBarcode(), this.detect(image));
  }
};
dart.addTypeTests(html$.BarcodeDetector);
dart.setMethodSignature(html$.BarcodeDetector, () => ({
  __proto__: dart.getMethods(html$.BarcodeDetector.__proto__),
  [$detect]: dart.fnType(async.Future$(core.List$(html$.DetectedBarcode)), [dart.dynamic])
}));
dart.setLibraryUri(html$.BarcodeDetector, "dart:html");
dart.registerExtension("BarcodeDetector", html$.BarcodeDetector);
html$.BaseElement = class BaseElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("base");
  }
  get [$href]() {
    return this.href;
  }
  set [$href](value) {
    this.href = value;
  }
  get [$target]() {
    return this.target;
  }
  set [$target](value) {
    this.target = value;
  }
};
(html$.BaseElement.created = function() {
  this[href$0] = null;
  this[target$1] = null;
  html$.BaseElement.__proto__.created.call(this);
}).prototype = html$.BaseElement.prototype;
dart.addTypeTests(html$.BaseElement);
const href$0 = Symbol("BaseElement.href");
const target$1 = Symbol("BaseElement.target");
dart.setLibraryUri(html$.BaseElement, "dart:html");
dart.setFieldSignature(html$.BaseElement, () => ({
  __proto__: dart.getFields(html$.BaseElement.__proto__),
  [$href]: dart.fieldType(core.String),
  [$target]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLBaseElement", html$.BaseElement);
html$.BatteryManager = class BatteryManager extends html$.EventTarget {
  get [$charging]() {
    return this.charging;
  }
  get [$chargingTime]() {
    return this.chargingTime;
  }
  get [$dischargingTime]() {
    return this.dischargingTime;
  }
  get [$level]() {
    return this.level;
  }
};
dart.addTypeTests(html$.BatteryManager);
const charging = Symbol("BatteryManager.charging");
const chargingTime = Symbol("BatteryManager.chargingTime");
const dischargingTime = Symbol("BatteryManager.dischargingTime");
const level$3 = Symbol("BatteryManager.level");
dart.setLibraryUri(html$.BatteryManager, "dart:html");
dart.setFieldSignature(html$.BatteryManager, () => ({
  __proto__: dart.getFields(html$.BatteryManager.__proto__),
  [$charging]: dart.finalFieldType(core.bool),
  [$chargingTime]: dart.finalFieldType(core.num),
  [$dischargingTime]: dart.finalFieldType(core.num),
  [$level]: dart.finalFieldType(core.num)
}));
dart.registerExtension("BatteryManager", html$.BatteryManager);
html$.BeforeInstallPromptEvent = class BeforeInstallPromptEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
    }
    return html$.BeforeInstallPromptEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new BeforeInstallPromptEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new BeforeInstallPromptEvent(type);
  }
  get [$platforms]() {
    return this.platforms;
  }
  get [$userChoice]() {
    return html$.promiseToFutureAsMap(this.userChoice);
  }
  [$prompt]() {
    return html$.promiseToFuture(dart.dynamic, this.prompt());
  }
};
dart.addTypeTests(html$.BeforeInstallPromptEvent);
const platforms = Symbol("BeforeInstallPromptEvent.platforms");
dart.setMethodSignature(html$.BeforeInstallPromptEvent, () => ({
  __proto__: dart.getMethods(html$.BeforeInstallPromptEvent.__proto__),
  [$prompt]: dart.fnType(async.Future, [])
}));
dart.setGetterSignature(html$.BeforeInstallPromptEvent, () => ({
  __proto__: dart.getGetters(html$.BeforeInstallPromptEvent.__proto__),
  [$userChoice]: async.Future$(core.Map$(core.String, dart.dynamic))
}));
dart.setLibraryUri(html$.BeforeInstallPromptEvent, "dart:html");
dart.setFieldSignature(html$.BeforeInstallPromptEvent, () => ({
  __proto__: dart.getFields(html$.BeforeInstallPromptEvent.__proto__),
  [$platforms]: dart.finalFieldType(ListOfString())
}));
dart.registerExtension("BeforeInstallPromptEvent", html$.BeforeInstallPromptEvent);
html$.BeforeUnloadEvent = class BeforeUnloadEvent extends html$.Event {
  get [$returnValue]() {
    return this.returnValue;
  }
  set [$returnValue](value) {
    this.returnValue = value;
  }
};
dart.addTypeTests(html$.BeforeUnloadEvent);
dart.setGetterSignature(html$.BeforeUnloadEvent, () => ({
  __proto__: dart.getGetters(html$.BeforeUnloadEvent.__proto__),
  [$returnValue]: core.String
}));
dart.setSetterSignature(html$.BeforeUnloadEvent, () => ({
  __proto__: dart.getSetters(html$.BeforeUnloadEvent.__proto__),
  [$returnValue]: core.String
}));
dart.setLibraryUri(html$.BeforeUnloadEvent, "dart:html");
dart.registerExtension("BeforeUnloadEvent", html$.BeforeUnloadEvent);
html$.Blob = class Blob extends _interceptors.Interceptor {
  get [$size]() {
    return this.size;
  }
  get [$type]() {
    return this.type;
  }
  [$slice](...args) {
    return this.slice.apply(this, args);
  }
  static new(blobParts, type, endings) {
    if (type === void 0) type = null;
    if (endings === void 0) endings = null;
    if (type == null && endings == null) {
      return html$.Blob._check(html$.Blob._create_1(blobParts));
    }
    let bag = html$.Blob._create_bag();
    if (type != null) html$.Blob._bag_set(bag, "type", type);
    if (endings != null) html$.Blob._bag_set(bag, "endings", endings);
    return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
  }
  static _create_1(parts) {
    return new self.Blob(parts);
  }
  static _create_2(parts, bag) {
    return new self.Blob(parts, bag);
  }
  static _create_bag() {
    return {};
  }
  static _bag_set(bag, key, value) {
    bag[key] = value;
  }
};
dart.addTypeTests(html$.Blob);
const size = Symbol("Blob.size");
const type$4 = Symbol("Blob.type");
dart.setMethodSignature(html$.Blob, () => ({
  __proto__: dart.getMethods(html$.Blob.__proto__),
  [$slice]: dart.fnType(html$.Blob, [], [core.int, core.int, core.String])
}));
dart.setLibraryUri(html$.Blob, "dart:html");
dart.setFieldSignature(html$.Blob, () => ({
  __proto__: dart.getFields(html$.Blob.__proto__),
  [$size]: dart.finalFieldType(core.int),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Blob", html$.Blob);
html$.BlobEvent = class BlobEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.BlobEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new BlobEvent(type, eventInitDict);
  }
  get [$data]() {
    return this.data;
  }
  get [$timecode]() {
    return this.timecode;
  }
};
dart.addTypeTests(html$.BlobEvent);
const data = Symbol("BlobEvent.data");
const timecode = Symbol("BlobEvent.timecode");
dart.setLibraryUri(html$.BlobEvent, "dart:html");
dart.setFieldSignature(html$.BlobEvent, () => ({
  __proto__: dart.getFields(html$.BlobEvent.__proto__),
  [$data]: dart.finalFieldType(html$.Blob),
  [$timecode]: dart.finalFieldType(core.num)
}));
dart.registerExtension("BlobEvent", html$.BlobEvent);
html$.BluetoothRemoteGattDescriptor = class BluetoothRemoteGattDescriptor extends _interceptors.Interceptor {
  get [$characteristic]() {
    return this.characteristic;
  }
  get [$uuid]() {
    return this.uuid;
  }
  get [$value]() {
    return this.value;
  }
  [$readValue]() {
    return html$.promiseToFuture(dart.dynamic, this.readValue());
  }
  [$writeValue](value) {
    return html$.promiseToFuture(dart.dynamic, this.writeValue(value));
  }
};
dart.addTypeTests(html$.BluetoothRemoteGattDescriptor);
const characteristic = Symbol("BluetoothRemoteGattDescriptor.characteristic");
const uuid = Symbol("BluetoothRemoteGattDescriptor.uuid");
const value$0 = Symbol("BluetoothRemoteGattDescriptor.value");
dart.setMethodSignature(html$.BluetoothRemoteGattDescriptor, () => ({
  __proto__: dart.getMethods(html$.BluetoothRemoteGattDescriptor.__proto__),
  [$readValue]: dart.fnType(async.Future, []),
  [$writeValue]: dart.fnType(async.Future, [dart.dynamic])
}));
dart.setLibraryUri(html$.BluetoothRemoteGattDescriptor, "dart:html");
dart.setFieldSignature(html$.BluetoothRemoteGattDescriptor, () => ({
  __proto__: dart.getFields(html$.BluetoothRemoteGattDescriptor.__proto__),
  [$characteristic]: dart.finalFieldType(html$._BluetoothRemoteGATTCharacteristic),
  [$uuid]: dart.finalFieldType(core.String),
  [$value]: dart.finalFieldType(typed_data.ByteData)
}));
dart.registerExtension("BluetoothRemoteGATTDescriptor", html$.BluetoothRemoteGattDescriptor);
html$.Body = class Body extends _interceptors.Interceptor {
  get [$bodyUsed]() {
    return this.bodyUsed;
  }
  [$arrayBuffer]() {
    return html$.promiseToFuture(dart.dynamic, this.arrayBuffer());
  }
  [$blob]() {
    return html$.promiseToFuture(html$.Blob, this.blob());
  }
  [$formData]() {
    return html$.promiseToFuture(html$.FormData, this.formData());
  }
  [$json]() {
    return html$.promiseToFuture(dart.dynamic, this.json());
  }
  [$text]() {
    return html$.promiseToFuture(core.String, this.text());
  }
};
dart.addTypeTests(html$.Body);
const bodyUsed = Symbol("Body.bodyUsed");
dart.setMethodSignature(html$.Body, () => ({
  __proto__: dart.getMethods(html$.Body.__proto__),
  [$arrayBuffer]: dart.fnType(async.Future, []),
  [$blob]: dart.fnType(async.Future$(html$.Blob), []),
  [$formData]: dart.fnType(async.Future$(html$.FormData), []),
  [$json]: dart.fnType(async.Future, []),
  [$text]: dart.fnType(async.Future$(core.String), [])
}));
dart.setLibraryUri(html$.Body, "dart:html");
dart.setFieldSignature(html$.Body, () => ({
  __proto__: dart.getFields(html$.Body.__proto__),
  [$bodyUsed]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("Body", html$.Body);
html$.BodyElement = class BodyElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("body");
  }
  get [$onBlur]() {
    return html$.BodyElement.blurEvent.forElement(this);
  }
  get [$onError]() {
    return html$.BodyElement.errorEvent.forElement(this);
  }
  get [$onFocus]() {
    return html$.BodyElement.focusEvent.forElement(this);
  }
  get [$onHashChange]() {
    return html$.BodyElement.hashChangeEvent.forElement(this);
  }
  get [$onLoad]() {
    return html$.BodyElement.loadEvent.forElement(this);
  }
  get [$onMessage]() {
    return html$.BodyElement.messageEvent.forElement(this);
  }
  get [$onOffline]() {
    return html$.BodyElement.offlineEvent.forElement(this);
  }
  get [$onOnline]() {
    return html$.BodyElement.onlineEvent.forElement(this);
  }
  get [$onPopState]() {
    return html$.BodyElement.popStateEvent.forElement(this);
  }
  get [$onResize]() {
    return html$.BodyElement.resizeEvent.forElement(this);
  }
  get [$onScroll]() {
    return html$.BodyElement.scrollEvent.forElement(this);
  }
  get [$onStorage]() {
    return html$.BodyElement.storageEvent.forElement(this);
  }
  get [$onUnload]() {
    return html$.BodyElement.unloadEvent.forElement(this);
  }
};
(html$.BodyElement.created = function() {
  html$.BodyElement.__proto__.created.call(this);
}).prototype = html$.BodyElement.prototype;
dart.addTypeTests(html$.BodyElement);
html$.BodyElement[dart.implements] = () => [html$.WindowEventHandlers];
dart.setGetterSignature(html$.BodyElement, () => ({
  __proto__: dart.getGetters(html$.BodyElement.__proto__),
  [$onHashChange]: html$.ElementStream$(html$.Event),
  [$onMessage]: html$.ElementStream$(html$.MessageEvent),
  [$onOffline]: html$.ElementStream$(html$.Event),
  [$onOnline]: html$.ElementStream$(html$.Event),
  [$onPopState]: html$.ElementStream$(html$.PopStateEvent),
  [$onStorage]: html$.ElementStream$(html$.StorageEvent),
  [$onUnload]: html$.ElementStream$(html$.Event)
}));
dart.setLibraryUri(html$.BodyElement, "dart:html");
dart.defineLazy(html$.BodyElement, {
  /*html$.BodyElement.blurEvent*/get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("blur"));
  },
  /*html$.BodyElement.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.BodyElement.focusEvent*/get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("focus"));
  },
  /*html$.BodyElement.hashChangeEvent*/get hashChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("hashchange"));
  },
  /*html$.BodyElement.loadEvent*/get loadEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("load"));
  },
  /*html$.BodyElement.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  },
  /*html$.BodyElement.offlineEvent*/get offlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("offline"));
  },
  /*html$.BodyElement.onlineEvent*/get onlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("online"));
  },
  /*html$.BodyElement.popStateEvent*/get popStateEvent() {
    return dart.const(new (EventStreamProviderOfPopStateEvent()).new("popstate"));
  },
  /*html$.BodyElement.resizeEvent*/get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("resize"));
  },
  /*html$.BodyElement.scrollEvent*/get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("scroll"));
  },
  /*html$.BodyElement.storageEvent*/get storageEvent() {
    return dart.const(new (EventStreamProviderOfStorageEvent()).new("storage"));
  },
  /*html$.BodyElement.unloadEvent*/get unloadEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("unload"));
  }
});
dart.registerExtension("HTMLBodyElement", html$.BodyElement);
html$.BroadcastChannel = class BroadcastChannel$ extends html$.EventTarget {
  static new(name) {
    return html$.BroadcastChannel._create_1(name);
  }
  static _create_1(name) {
    return new BroadcastChannel(name);
  }
  get [$name]() {
    return this.name;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$postMessage](...args) {
    return this.postMessage.apply(this, args);
  }
  get [$onMessage]() {
    return html$.BroadcastChannel.messageEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.BroadcastChannel);
const name$6 = Symbol("BroadcastChannel.name");
dart.setMethodSignature(html$.BroadcastChannel, () => ({
  __proto__: dart.getMethods(html$.BroadcastChannel.__proto__),
  [$close]: dart.fnType(dart.void, []),
  [$postMessage]: dart.fnType(dart.void, [core.Object])
}));
dart.setGetterSignature(html$.BroadcastChannel, () => ({
  __proto__: dart.getGetters(html$.BroadcastChannel.__proto__),
  [$onMessage]: async.Stream$(html$.MessageEvent)
}));
dart.setLibraryUri(html$.BroadcastChannel, "dart:html");
dart.setFieldSignature(html$.BroadcastChannel, () => ({
  __proto__: dart.getFields(html$.BroadcastChannel.__proto__),
  [$name]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.BroadcastChannel, {
  /*html$.BroadcastChannel.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  }
});
dart.registerExtension("BroadcastChannel", html$.BroadcastChannel);
html$.BudgetState = class BudgetState extends _interceptors.Interceptor {
  get [$budgetAt]() {
    return this.budgetAt;
  }
  get [$time]() {
    return this.time;
  }
};
dart.addTypeTests(html$.BudgetState);
const budgetAt = Symbol("BudgetState.budgetAt");
const time = Symbol("BudgetState.time");
dart.setLibraryUri(html$.BudgetState, "dart:html");
dart.setFieldSignature(html$.BudgetState, () => ({
  __proto__: dart.getFields(html$.BudgetState.__proto__),
  [$budgetAt]: dart.finalFieldType(core.num),
  [$time]: dart.finalFieldType(core.int)
}));
dart.registerExtension("BudgetState", html$.BudgetState);
html$.ButtonElement = class ButtonElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("button");
  }
  get [$autofocus]() {
    return this.autofocus;
  }
  set [$autofocus](value) {
    this.autofocus = value;
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$form]() {
    return this.form;
  }
  get [$formAction]() {
    return this.formAction;
  }
  set [$formAction](value) {
    this.formAction = value;
  }
  get [$formEnctype]() {
    return this.formEnctype;
  }
  set [$formEnctype](value) {
    this.formEnctype = value;
  }
  get [$formMethod]() {
    return this.formMethod;
  }
  set [$formMethod](value) {
    this.formMethod = value;
  }
  get [$formNoValidate]() {
    return this.formNoValidate;
  }
  set [$formNoValidate](value) {
    this.formNoValidate = value;
  }
  get [$formTarget]() {
    return this.formTarget;
  }
  set [$formTarget](value) {
    this.formTarget = value;
  }
  get [$labels]() {
    return this.labels;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  get [$validationMessage]() {
    return this.validationMessage;
  }
  get [$validity]() {
    return this.validity;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  get [$willValidate]() {
    return this.willValidate;
  }
  [$checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [$reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [$setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
(html$.ButtonElement.created = function() {
  this[autofocus] = null;
  this[disabled$] = null;
  this[form] = null;
  this[formAction] = null;
  this[formEnctype] = null;
  this[formMethod] = null;
  this[formNoValidate] = null;
  this[formTarget] = null;
  this[labels] = null;
  this[name$7] = null;
  this[type$5] = null;
  this[validationMessage] = null;
  this[validity] = null;
  this[value$1] = null;
  this[willValidate] = null;
  html$.ButtonElement.__proto__.created.call(this);
}).prototype = html$.ButtonElement.prototype;
dart.addTypeTests(html$.ButtonElement);
const autofocus = Symbol("ButtonElement.autofocus");
const disabled$ = Symbol("ButtonElement.disabled");
const form = Symbol("ButtonElement.form");
const formAction = Symbol("ButtonElement.formAction");
const formEnctype = Symbol("ButtonElement.formEnctype");
const formMethod = Symbol("ButtonElement.formMethod");
const formNoValidate = Symbol("ButtonElement.formNoValidate");
const formTarget = Symbol("ButtonElement.formTarget");
const labels = Symbol("ButtonElement.labels");
const name$7 = Symbol("ButtonElement.name");
const type$5 = Symbol("ButtonElement.type");
const validationMessage = Symbol("ButtonElement.validationMessage");
const validity = Symbol("ButtonElement.validity");
const value$1 = Symbol("ButtonElement.value");
const willValidate = Symbol("ButtonElement.willValidate");
dart.setMethodSignature(html$.ButtonElement, () => ({
  __proto__: dart.getMethods(html$.ButtonElement.__proto__),
  [$checkValidity]: dart.fnType(core.bool, []),
  [$reportValidity]: dart.fnType(core.bool, []),
  [$setCustomValidity]: dart.fnType(dart.void, [core.String])
}));
dart.setLibraryUri(html$.ButtonElement, "dart:html");
dart.setFieldSignature(html$.ButtonElement, () => ({
  __proto__: dart.getFields(html$.ButtonElement.__proto__),
  [$autofocus]: dart.fieldType(core.bool),
  [$disabled]: dart.fieldType(core.bool),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$formAction]: dart.fieldType(core.String),
  [$formEnctype]: dart.fieldType(core.String),
  [$formMethod]: dart.fieldType(core.String),
  [$formNoValidate]: dart.fieldType(core.bool),
  [$formTarget]: dart.fieldType(core.String),
  [$labels]: dart.finalFieldType(ListOfNode()),
  [$name]: dart.fieldType(core.String),
  [$type]: dart.fieldType(core.String),
  [$validationMessage]: dart.finalFieldType(core.String),
  [$validity]: dart.finalFieldType(html$.ValidityState),
  [$value]: dart.fieldType(core.String),
  [$willValidate]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("HTMLButtonElement", html$.ButtonElement);
html$.CharacterData = class CharacterData extends html$.Node {
  get [$data]() {
    return this.data;
  }
  set [$data](value) {
    this.data = value;
  }
  get [$length]() {
    return this.length;
  }
  [$appendData](...args) {
    return this.appendData.apply(this, args);
  }
  [$deleteData](...args) {
    return this.deleteData.apply(this, args);
  }
  [$insertData](...args) {
    return this.insertData.apply(this, args);
  }
  [$replaceData](...args) {
    return this.replaceData.apply(this, args);
  }
  [$substringData](...args) {
    return this.substringData.apply(this, args);
  }
  [$after](...args) {
    return this.after.apply(this, args);
  }
  [$before](...args) {
    return this.before.apply(this, args);
  }
  get [$nextElementSibling]() {
    return this.nextElementSibling;
  }
  get [$previousElementSibling]() {
    return this.previousElementSibling;
  }
};
dart.addTypeTests(html$.CharacterData);
const data$0 = Symbol("CharacterData.data");
const length$0 = Symbol("CharacterData.length");
const nextElementSibling$ = Symbol("CharacterData.nextElementSibling");
const previousElementSibling$ = Symbol("CharacterData.previousElementSibling");
html$.CharacterData[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.ChildNode];
dart.setMethodSignature(html$.CharacterData, () => ({
  __proto__: dart.getMethods(html$.CharacterData.__proto__),
  [$appendData]: dart.fnType(dart.void, [core.String]),
  [$deleteData]: dart.fnType(dart.void, [core.int, core.int]),
  [$insertData]: dart.fnType(dart.void, [core.int, core.String]),
  [$replaceData]: dart.fnType(dart.void, [core.int, core.int, core.String]),
  [$substringData]: dart.fnType(core.String, [core.int, core.int]),
  [$after]: dart.fnType(dart.void, [core.Object]),
  [$before]: dart.fnType(dart.void, [core.Object])
}));
dart.setLibraryUri(html$.CharacterData, "dart:html");
dart.setFieldSignature(html$.CharacterData, () => ({
  __proto__: dart.getFields(html$.CharacterData.__proto__),
  [$data]: dart.fieldType(core.String),
  [$length]: dart.finalFieldType(core.int),
  [$nextElementSibling]: dart.finalFieldType(html$.Element),
  [$previousElementSibling]: dart.finalFieldType(html$.Element)
}));
dart.registerExtension("CharacterData", html$.CharacterData);
html$.Text = class Text extends html$.CharacterData {
  static new(data) {
    return html$.document.createTextNode(data);
  }
  get [$assignedSlot]() {
    return this.assignedSlot;
  }
  get [$wholeText]() {
    return this.wholeText;
  }
  [$getDestinationInsertionPoints](...args) {
    return this.getDestinationInsertionPoints.apply(this, args);
  }
  [$splitText](...args) {
    return this.splitText.apply(this, args);
  }
};
dart.addTypeTests(html$.Text);
const assignedSlot$ = Symbol("Text.assignedSlot");
const wholeText = Symbol("Text.wholeText");
dart.setMethodSignature(html$.Text, () => ({
  __proto__: dart.getMethods(html$.Text.__proto__),
  [$getDestinationInsertionPoints]: dart.fnType(core.List$(html$.Node), []),
  [$splitText]: dart.fnType(html$.Text, [core.int])
}));
dart.setLibraryUri(html$.Text, "dart:html");
dart.setFieldSignature(html$.Text, () => ({
  __proto__: dart.getFields(html$.Text.__proto__),
  [$assignedSlot]: dart.finalFieldType(html$.SlotElement),
  [$wholeText]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Text", html$.Text);
html$.CDataSection = class CDataSection extends html$.Text {};
dart.addTypeTests(html$.CDataSection);
dart.setLibraryUri(html$.CDataSection, "dart:html");
dart.registerExtension("CDATASection", html$.CDataSection);
html$.CacheStorage = class CacheStorage extends _interceptors.Interceptor {
  [$delete](cacheName) {
    return html$.promiseToFuture(dart.dynamic, this.delete(cacheName));
  }
  [$has](cacheName) {
    return html$.promiseToFuture(dart.dynamic, this.has(cacheName));
  }
  [$keys]() {
    return html$.promiseToFuture(dart.dynamic, this.keys());
  }
  [$match](request, options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.match(request, options_dict));
  }
  [$open](cacheName) {
    return html$.promiseToFuture(dart.dynamic, this.open(cacheName));
  }
};
dart.addTypeTests(html$.CacheStorage);
dart.setMethodSignature(html$.CacheStorage, () => ({
  __proto__: dart.getMethods(html$.CacheStorage.__proto__),
  [$delete]: dart.fnType(async.Future, [core.String]),
  [$has]: dart.fnType(async.Future, [core.String]),
  [$keys]: dart.fnType(async.Future, []),
  [$match]: dart.fnType(async.Future, [dart.dynamic], [core.Map]),
  [$open]: dart.fnType(async.Future, [core.String])
}));
dart.setLibraryUri(html$.CacheStorage, "dart:html");
dart.registerExtension("CacheStorage", html$.CacheStorage);
html$.CanMakePaymentEvent = class CanMakePaymentEvent$ extends html$.ExtendableEvent {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.CanMakePaymentEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new CanMakePaymentEvent(type, eventInitDict);
  }
  get [$methodData]() {
    return this.methodData;
  }
  get [$modifiers]() {
    return this.modifiers;
  }
  get [$paymentRequestOrigin]() {
    return this.paymentRequestOrigin;
  }
  get [$topLevelOrigin]() {
    return this.topLevelOrigin;
  }
  [$respondWith](...args) {
    return this.respondWith.apply(this, args);
  }
};
dart.addTypeTests(html$.CanMakePaymentEvent);
const methodData = Symbol("CanMakePaymentEvent.methodData");
const modifiers = Symbol("CanMakePaymentEvent.modifiers");
const paymentRequestOrigin = Symbol("CanMakePaymentEvent.paymentRequestOrigin");
const topLevelOrigin = Symbol("CanMakePaymentEvent.topLevelOrigin");
dart.setMethodSignature(html$.CanMakePaymentEvent, () => ({
  __proto__: dart.getMethods(html$.CanMakePaymentEvent.__proto__),
  [$respondWith]: dart.fnType(dart.void, [async.Future])
}));
dart.setLibraryUri(html$.CanMakePaymentEvent, "dart:html");
dart.setFieldSignature(html$.CanMakePaymentEvent, () => ({
  __proto__: dart.getFields(html$.CanMakePaymentEvent.__proto__),
  [$methodData]: dart.finalFieldType(core.List),
  [$modifiers]: dart.finalFieldType(core.List),
  [$paymentRequestOrigin]: dart.finalFieldType(core.String),
  [$topLevelOrigin]: dart.finalFieldType(core.String)
}));
dart.registerExtension("CanMakePaymentEvent", html$.CanMakePaymentEvent);
const _getCapabilities_1 = dart.privateName(html$, "_getCapabilities_1");
const _getConstraints_1 = dart.privateName(html$, "_getConstraints_1");
const _getSettings_1 = dart.privateName(html$, "_getSettings_1");
html$.MediaStreamTrack = class MediaStreamTrack extends html$.EventTarget {
  get [$contentHint]() {
    return this.contentHint;
  }
  set [$contentHint](value) {
    this.contentHint = value;
  }
  get [$enabled]() {
    return this.enabled;
  }
  set [$enabled](value) {
    this.enabled = value;
  }
  get [$id]() {
    return this.id;
  }
  get [$kind]() {
    return this.kind;
  }
  get [$label]() {
    return this.label;
  }
  get [$muted]() {
    return this.muted;
  }
  get [$readyState]() {
    return this.readyState;
  }
  [$applyConstraints](constraints) {
    if (constraints === void 0) constraints = null;
    let constraints_dict = null;
    if (constraints != null) {
      constraints_dict = html_common.convertDartToNative_Dictionary(constraints);
    }
    return html$.promiseToFuture(dart.dynamic, this.applyConstraints(constraints_dict));
  }
  [$clone](...args) {
    return this.clone.apply(this, args);
  }
  [$getCapabilities]() {
    return html_common.convertNativeToDart_Dictionary(this[_getCapabilities_1]());
  }
  [_getCapabilities_1](...args) {
    return this.getCapabilities.apply(this, args);
  }
  [$getConstraints]() {
    return html_common.convertNativeToDart_Dictionary(this[_getConstraints_1]());
  }
  [_getConstraints_1](...args) {
    return this.getConstraints.apply(this, args);
  }
  [$getSettings]() {
    return html_common.convertNativeToDart_Dictionary(this[_getSettings_1]());
  }
  [_getSettings_1](...args) {
    return this.getSettings.apply(this, args);
  }
  [$stop](...args) {
    return this.stop.apply(this, args);
  }
  get [$onEnded]() {
    return html$.MediaStreamTrack.endedEvent.forTarget(this);
  }
  get [$onMute]() {
    return html$.MediaStreamTrack.muteEvent.forTarget(this);
  }
  get [$onUnmute]() {
    return html$.MediaStreamTrack.unmuteEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.MediaStreamTrack);
const contentHint = Symbol("MediaStreamTrack.contentHint");
const enabled = Symbol("MediaStreamTrack.enabled");
const id$3 = Symbol("MediaStreamTrack.id");
const kind = Symbol("MediaStreamTrack.kind");
const label$ = Symbol("MediaStreamTrack.label");
const muted$ = Symbol("MediaStreamTrack.muted");
const readyState$0 = Symbol("MediaStreamTrack.readyState");
dart.setMethodSignature(html$.MediaStreamTrack, () => ({
  __proto__: dart.getMethods(html$.MediaStreamTrack.__proto__),
  [$applyConstraints]: dart.fnType(async.Future, [], [core.Map]),
  [$clone]: dart.fnType(html$.MediaStreamTrack, []),
  [$getCapabilities]: dart.fnType(core.Map, []),
  [_getCapabilities_1]: dart.fnType(dart.dynamic, []),
  [$getConstraints]: dart.fnType(core.Map, []),
  [_getConstraints_1]: dart.fnType(dart.dynamic, []),
  [$getSettings]: dart.fnType(core.Map, []),
  [_getSettings_1]: dart.fnType(dart.dynamic, []),
  [$stop]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.MediaStreamTrack, () => ({
  __proto__: dart.getGetters(html$.MediaStreamTrack.__proto__),
  [$onEnded]: async.Stream$(html$.Event),
  [$onMute]: async.Stream$(html$.Event),
  [$onUnmute]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.MediaStreamTrack, "dart:html");
dart.setFieldSignature(html$.MediaStreamTrack, () => ({
  __proto__: dart.getFields(html$.MediaStreamTrack.__proto__),
  [$contentHint]: dart.fieldType(core.String),
  [$enabled]: dart.fieldType(core.bool),
  [$id]: dart.finalFieldType(core.String),
  [$kind]: dart.finalFieldType(core.String),
  [$label]: dart.finalFieldType(core.String),
  [$muted]: dart.finalFieldType(core.bool),
  [$readyState]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.MediaStreamTrack, {
  /*html$.MediaStreamTrack.endedEvent*/get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("ended"));
  },
  /*html$.MediaStreamTrack.muteEvent*/get muteEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("mute"));
  },
  /*html$.MediaStreamTrack.unmuteEvent*/get unmuteEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("unmute"));
  }
});
dart.registerExtension("MediaStreamTrack", html$.MediaStreamTrack);
html$.CanvasCaptureMediaStreamTrack = class CanvasCaptureMediaStreamTrack extends html$.MediaStreamTrack {
  get [$canvas]() {
    return this.canvas;
  }
  [$requestFrame](...args) {
    return this.requestFrame.apply(this, args);
  }
};
dart.addTypeTests(html$.CanvasCaptureMediaStreamTrack);
const canvas = Symbol("CanvasCaptureMediaStreamTrack.canvas");
dart.setMethodSignature(html$.CanvasCaptureMediaStreamTrack, () => ({
  __proto__: dart.getMethods(html$.CanvasCaptureMediaStreamTrack.__proto__),
  [$requestFrame]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.CanvasCaptureMediaStreamTrack, "dart:html");
dart.setFieldSignature(html$.CanvasCaptureMediaStreamTrack, () => ({
  __proto__: dart.getFields(html$.CanvasCaptureMediaStreamTrack.__proto__),
  [$canvas]: dart.finalFieldType(html$.CanvasElement)
}));
dart.registerExtension("CanvasCaptureMediaStreamTrack", html$.CanvasCaptureMediaStreamTrack);
const _getContext_1 = dart.privateName(html$, "_getContext_1");
const _getContext_2 = dart.privateName(html$, "_getContext_2");
const _toDataUrl = dart.privateName(html$, "_toDataUrl");
const _toBlob = dart.privateName(html$, "_toBlob");
html$.CanvasElement = class CanvasElement extends html$.HtmlElement {
  static new(opts) {
    let width = opts && 'width' in opts ? opts.width : null;
    let height = opts && 'height' in opts ? opts.height : null;
    let e = html$.document.createElement("canvas");
    if (width != null) e.width = width;
    if (height != null) e.height = height;
    return e;
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  [$captureStream](...args) {
    return this.captureStream.apply(this, args);
  }
  [$getContext](contextId, attributes) {
    if (attributes === void 0) attributes = null;
    if (attributes != null) {
      let attributes_1 = html_common.convertDartToNative_Dictionary(attributes);
      return this[_getContext_1](contextId, attributes_1);
    }
    return this[_getContext_2](contextId);
  }
  [_getContext_1](...args) {
    return this.getContext.apply(this, args);
  }
  [_getContext_2](...args) {
    return this.getContext.apply(this, args);
  }
  [_toDataUrl](...args) {
    return this.toDataURL.apply(this, args);
  }
  [$transferControlToOffscreen](...args) {
    return this.transferControlToOffscreen.apply(this, args);
  }
  get [$onWebGlContextLost]() {
    return html$.CanvasElement.webGlContextLostEvent.forElement(this);
  }
  get [$onWebGlContextRestored]() {
    return html$.CanvasElement.webGlContextRestoredEvent.forElement(this);
  }
  get [$context2D]() {
    return this.getContext("2d");
  }
  [$getContext3d](opts) {
    let alpha = opts && 'alpha' in opts ? opts.alpha : true;
    let depth = opts && 'depth' in opts ? opts.depth : true;
    let stencil = opts && 'stencil' in opts ? opts.stencil : false;
    let antialias = opts && 'antialias' in opts ? opts.antialias : true;
    let premultipliedAlpha = opts && 'premultipliedAlpha' in opts ? opts.premultipliedAlpha : true;
    let preserveDrawingBuffer = opts && 'preserveDrawingBuffer' in opts ? opts.preserveDrawingBuffer : false;
    let options = new (IdentityMapOfString$dynamic()).from(["alpha", alpha, "depth", depth, "stencil", stencil, "antialias", antialias, "premultipliedAlpha", premultipliedAlpha, "preserveDrawingBuffer", preserveDrawingBuffer]);
    let context = this[$getContext]("webgl", options);
    if (context == null) {
      context = this[$getContext]("experimental-webgl", options);
    }
    return web_gl.RenderingContext._check(context);
  }
  [$toDataUrl](type, quality) {
    if (type === void 0) type = "image/png";
    if (quality === void 0) quality = null;
    return this[_toDataUrl](type, quality);
  }
  [_toBlob](...args) {
    return this.toBlob.apply(this, args);
  }
  [$toBlob](type, arguments$0) {
    if (arguments$0 === void 0) arguments$0 = null;
    let completer = CompleterOfBlob().new();
    this[_toBlob](dart.fn(value => {
      completer.complete(value);
    }, BlobToNull()), type, arguments$0);
    return completer.future;
  }
};
(html$.CanvasElement.created = function() {
  this[height] = null;
  this[width] = null;
  html$.CanvasElement.__proto__.created.call(this);
}).prototype = html$.CanvasElement.prototype;
dart.addTypeTests(html$.CanvasElement);
const height = Symbol("CanvasElement.height");
const width = Symbol("CanvasElement.width");
html$.CanvasElement[dart.implements] = () => [html$.CanvasImageSource];
dart.setMethodSignature(html$.CanvasElement, () => ({
  __proto__: dart.getMethods(html$.CanvasElement.__proto__),
  [$captureStream]: dart.fnType(html$.MediaStream, [], [core.num]),
  [$getContext]: dart.fnType(core.Object, [core.String], [core.Map]),
  [_getContext_1]: dart.fnType(core.Object, [dart.dynamic, dart.dynamic]),
  [_getContext_2]: dart.fnType(core.Object, [dart.dynamic]),
  [_toDataUrl]: dart.fnType(core.String, [core.String], [dart.dynamic]),
  [$transferControlToOffscreen]: dart.fnType(html$.OffscreenCanvas, []),
  [$getContext3d]: dart.fnType(web_gl.RenderingContext, [], {alpha: dart.dynamic, depth: dart.dynamic, stencil: dart.dynamic, antialias: dart.dynamic, premultipliedAlpha: dart.dynamic, preserveDrawingBuffer: dart.dynamic}),
  [$toDataUrl]: dart.fnType(core.String, [], [core.String, core.num]),
  [_toBlob]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.Blob]), core.String], [core.Object]),
  [$toBlob]: dart.fnType(async.Future$(html$.Blob), [core.String], [core.Object])
}));
dart.setGetterSignature(html$.CanvasElement, () => ({
  __proto__: dart.getGetters(html$.CanvasElement.__proto__),
  [$onWebGlContextLost]: html$.ElementStream$(web_gl.ContextEvent),
  [$onWebGlContextRestored]: html$.ElementStream$(web_gl.ContextEvent),
  [$context2D]: html$.CanvasRenderingContext2D
}));
dart.setLibraryUri(html$.CanvasElement, "dart:html");
dart.setFieldSignature(html$.CanvasElement, () => ({
  __proto__: dart.getFields(html$.CanvasElement.__proto__),
  [$height]: dart.fieldType(core.int),
  [$width]: dart.fieldType(core.int)
}));
dart.defineLazy(html$.CanvasElement, {
  /*html$.CanvasElement.webGlContextLostEvent*/get webGlContextLostEvent() {
    return dart.const(new (EventStreamProviderOfContextEvent()).new("webglcontextlost"));
  },
  /*html$.CanvasElement.webGlContextRestoredEvent*/get webGlContextRestoredEvent() {
    return dart.const(new (EventStreamProviderOfContextEvent()).new("webglcontextrestored"));
  }
});
dart.registerExtension("HTMLCanvasElement", html$.CanvasElement);
html$.CanvasGradient = class CanvasGradient extends _interceptors.Interceptor {
  [$addColorStop](...args) {
    return this.addColorStop.apply(this, args);
  }
};
dart.addTypeTests(html$.CanvasGradient);
dart.setMethodSignature(html$.CanvasGradient, () => ({
  __proto__: dart.getMethods(html$.CanvasGradient.__proto__),
  [$addColorStop]: dart.fnType(dart.void, [core.num, core.String])
}));
dart.setLibraryUri(html$.CanvasGradient, "dart:html");
dart.registerExtension("CanvasGradient", html$.CanvasGradient);
html$.CanvasPattern = class CanvasPattern extends _interceptors.Interceptor {
  [$setTransform](...args) {
    return this.setTransform.apply(this, args);
  }
};
dart.addTypeTests(html$.CanvasPattern);
dart.setMethodSignature(html$.CanvasPattern, () => ({
  __proto__: dart.getMethods(html$.CanvasPattern.__proto__),
  [$setTransform]: dart.fnType(dart.void, [svg$.Matrix])
}));
dart.setLibraryUri(html$.CanvasPattern, "dart:html");
dart.registerExtension("CanvasPattern", html$.CanvasPattern);
html$.CanvasRenderingContext = class CanvasRenderingContext extends core.Object {};
(html$.CanvasRenderingContext.new = function() {
}).prototype = html$.CanvasRenderingContext.prototype;
dart.addTypeTests(html$.CanvasRenderingContext);
dart.setLibraryUri(html$.CanvasRenderingContext, "dart:html");
const _addHitRegion_1 = dart.privateName(html$, "_addHitRegion_1");
const _addHitRegion_2 = dart.privateName(html$, "_addHitRegion_2");
const _createImageData_1 = dart.privateName(html$, "_createImageData_1");
const _createImageData_2 = dart.privateName(html$, "_createImageData_2");
const _createImageData_3 = dart.privateName(html$, "_createImageData_3");
const _createImageData_4 = dart.privateName(html$, "_createImageData_4");
const _createImageData_5 = dart.privateName(html$, "_createImageData_5");
const _getContextAttributes_1 = dart.privateName(html$, "_getContextAttributes_1");
const _getImageData_1 = dart.privateName(html$, "_getImageData_1");
const _getLineDash = dart.privateName(html$, "_getLineDash");
const _putImageData_1 = dart.privateName(html$, "_putImageData_1");
const _putImageData_2 = dart.privateName(html$, "_putImageData_2");
const _arc = dart.privateName(html$, "_arc");
html$.CanvasRenderingContext2D = class CanvasRenderingContext2D extends _interceptors.Interceptor {
  get [$canvas]() {
    return this.canvas;
  }
  get [$currentTransform]() {
    return this.currentTransform;
  }
  set [$currentTransform](value) {
    this.currentTransform = value;
  }
  get [$direction]() {
    return this.direction;
  }
  set [$direction](value) {
    this.direction = value;
  }
  get [$fillStyle]() {
    return this.fillStyle;
  }
  set [$fillStyle](value) {
    this.fillStyle = value;
  }
  get [$filter]() {
    return this.filter;
  }
  set [$filter](value) {
    this.filter = value;
  }
  get [$font]() {
    return this.font;
  }
  set [$font](value) {
    this.font = value;
  }
  get [$globalAlpha]() {
    return this.globalAlpha;
  }
  set [$globalAlpha](value) {
    this.globalAlpha = value;
  }
  get [$globalCompositeOperation]() {
    return this.globalCompositeOperation;
  }
  set [$globalCompositeOperation](value) {
    this.globalCompositeOperation = value;
  }
  get [$imageSmoothingEnabled]() {
    return this.imageSmoothingEnabled;
  }
  set [$imageSmoothingEnabled](value) {
    this.imageSmoothingEnabled = value;
  }
  get [$imageSmoothingQuality]() {
    return this.imageSmoothingQuality;
  }
  set [$imageSmoothingQuality](value) {
    this.imageSmoothingQuality = value;
  }
  get [$lineCap]() {
    return this.lineCap;
  }
  set [$lineCap](value) {
    this.lineCap = value;
  }
  get [$lineJoin]() {
    return this.lineJoin;
  }
  set [$lineJoin](value) {
    this.lineJoin = value;
  }
  get [$lineWidth]() {
    return this.lineWidth;
  }
  set [$lineWidth](value) {
    this.lineWidth = value;
  }
  get [$miterLimit]() {
    return this.miterLimit;
  }
  set [$miterLimit](value) {
    this.miterLimit = value;
  }
  get [$shadowBlur]() {
    return this.shadowBlur;
  }
  set [$shadowBlur](value) {
    this.shadowBlur = value;
  }
  get [$shadowColor]() {
    return this.shadowColor;
  }
  set [$shadowColor](value) {
    this.shadowColor = value;
  }
  get [$shadowOffsetX]() {
    return this.shadowOffsetX;
  }
  set [$shadowOffsetX](value) {
    this.shadowOffsetX = value;
  }
  get [$shadowOffsetY]() {
    return this.shadowOffsetY;
  }
  set [$shadowOffsetY](value) {
    this.shadowOffsetY = value;
  }
  get [$strokeStyle]() {
    return this.strokeStyle;
  }
  set [$strokeStyle](value) {
    this.strokeStyle = value;
  }
  get [$textAlign]() {
    return this.textAlign;
  }
  set [$textAlign](value) {
    this.textAlign = value;
  }
  get [$textBaseline]() {
    return this.textBaseline;
  }
  set [$textBaseline](value) {
    this.textBaseline = value;
  }
  [$addHitRegion](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[_addHitRegion_1](options_1);
      return;
    }
    this[_addHitRegion_2]();
    return;
  }
  [_addHitRegion_1](...args) {
    return this.addHitRegion.apply(this, args);
  }
  [_addHitRegion_2](...args) {
    return this.addHitRegion.apply(this, args);
  }
  [$beginPath](...args) {
    return this.beginPath.apply(this, args);
  }
  [$clearHitRegions](...args) {
    return this.clearHitRegions.apply(this, args);
  }
  [$clearRect](...args) {
    return this.clearRect.apply(this, args);
  }
  [$clip](...args) {
    return this.clip.apply(this, args);
  }
  [$createImageData](data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_OR_sh, imageDataColorSettings) {
    if (sh_OR_sw === void 0) sh_OR_sw = null;
    if (imageDataColorSettings_OR_sh === void 0) imageDataColorSettings_OR_sh = null;
    if (imageDataColorSettings === void 0) imageDataColorSettings = null;
    if (html$.ImageData.is(data_OR_imagedata_OR_sw) && sh_OR_sw == null && imageDataColorSettings_OR_sh == null && imageDataColorSettings == null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(data_OR_imagedata_OR_sw);
      return html_common.convertNativeToDart_ImageData(this[_createImageData_1](imagedata_1));
    }
    if (sh_OR_sw != null && core.int.is(data_OR_imagedata_OR_sw) && imageDataColorSettings_OR_sh == null && imageDataColorSettings == null) {
      return html_common.convertNativeToDart_ImageData(this[_createImageData_2](data_OR_imagedata_OR_sw, sh_OR_sw));
    }
    if (core.Map.is(imageDataColorSettings_OR_sh) && sh_OR_sw != null && core.int.is(data_OR_imagedata_OR_sw) && imageDataColorSettings == null) {
      let imageDataColorSettings_1 = html_common.convertDartToNative_Dictionary(imageDataColorSettings_OR_sh);
      return html_common.convertNativeToDart_ImageData(this[_createImageData_3](data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_1));
    }
    if (core.int.is(imageDataColorSettings_OR_sh) && sh_OR_sw != null && data_OR_imagedata_OR_sw != null && imageDataColorSettings == null) {
      return html_common.convertNativeToDart_ImageData(this[_createImageData_4](data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_OR_sh));
    }
    if (imageDataColorSettings != null && core.int.is(imageDataColorSettings_OR_sh) && sh_OR_sw != null && data_OR_imagedata_OR_sw != null) {
      let imageDataColorSettings_1 = html_common.convertDartToNative_Dictionary(imageDataColorSettings);
      return html_common.convertNativeToDart_ImageData(this[_createImageData_5](data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_OR_sh, imageDataColorSettings_1));
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_createImageData_1](...args) {
    return this.createImageData.apply(this, args);
  }
  [_createImageData_2](...args) {
    return this.createImageData.apply(this, args);
  }
  [_createImageData_3](...args) {
    return this.createImageData.apply(this, args);
  }
  [_createImageData_4](...args) {
    return this.createImageData.apply(this, args);
  }
  [_createImageData_5](...args) {
    return this.createImageData.apply(this, args);
  }
  [$createLinearGradient](...args) {
    return this.createLinearGradient.apply(this, args);
  }
  [$createPattern](...args) {
    return this.createPattern.apply(this, args);
  }
  [$createRadialGradient](...args) {
    return this.createRadialGradient.apply(this, args);
  }
  [$drawFocusIfNeeded](...args) {
    return this.drawFocusIfNeeded.apply(this, args);
  }
  [$fill](...args) {
    return this.fill.apply(this, args);
  }
  [$fillRect](...args) {
    return this.fillRect.apply(this, args);
  }
  [$getContextAttributes]() {
    return html_common.convertNativeToDart_Dictionary(this[_getContextAttributes_1]());
  }
  [_getContextAttributes_1](...args) {
    return this.getContextAttributes.apply(this, args);
  }
  [$getImageData](sx, sy, sw, sh) {
    return html_common.convertNativeToDart_ImageData(this[_getImageData_1](sx, sy, sw, sh));
  }
  [_getImageData_1](...args) {
    return this.getImageData.apply(this, args);
  }
  [_getLineDash](...args) {
    return this.getLineDash.apply(this, args);
  }
  [$isContextLost](...args) {
    return this.isContextLost.apply(this, args);
  }
  [$isPointInPath](...args) {
    return this.isPointInPath.apply(this, args);
  }
  [$isPointInStroke](...args) {
    return this.isPointInStroke.apply(this, args);
  }
  [$measureText](...args) {
    return this.measureText.apply(this, args);
  }
  [$putImageData](imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
    if (dirtyX === void 0) dirtyX = null;
    if (dirtyY === void 0) dirtyY = null;
    if (dirtyWidth === void 0) dirtyWidth = null;
    if (dirtyHeight === void 0) dirtyHeight = null;
    if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
      this[_putImageData_1](imagedata_1, dx, dy);
      return;
    }
    if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
      this[_putImageData_2](imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_putImageData_1](...args) {
    return this.putImageData.apply(this, args);
  }
  [_putImageData_2](...args) {
    return this.putImageData.apply(this, args);
  }
  [$removeHitRegion](...args) {
    return this.removeHitRegion.apply(this, args);
  }
  [$resetTransform](...args) {
    return this.resetTransform.apply(this, args);
  }
  [$restore](...args) {
    return this.restore.apply(this, args);
  }
  [$rotate](...args) {
    return this.rotate.apply(this, args);
  }
  [$save](...args) {
    return this.save.apply(this, args);
  }
  [$scale](...args) {
    return this.scale.apply(this, args);
  }
  [$scrollPathIntoView](...args) {
    return this.scrollPathIntoView.apply(this, args);
  }
  [$setTransform](...args) {
    return this.setTransform.apply(this, args);
  }
  [$stroke](...args) {
    return this.stroke.apply(this, args);
  }
  [$strokeRect](...args) {
    return this.strokeRect.apply(this, args);
  }
  [$strokeText](...args) {
    return this.strokeText.apply(this, args);
  }
  [$transform](...args) {
    return this.transform.apply(this, args);
  }
  [$translate](...args) {
    return this.translate.apply(this, args);
  }
  [_arc](...args) {
    return this.arc.apply(this, args);
  }
  [$arcTo](...args) {
    return this.arcTo.apply(this, args);
  }
  [$bezierCurveTo](...args) {
    return this.bezierCurveTo.apply(this, args);
  }
  [$closePath](...args) {
    return this.closePath.apply(this, args);
  }
  [$ellipse](...args) {
    return this.ellipse.apply(this, args);
  }
  [$lineTo](...args) {
    return this.lineTo.apply(this, args);
  }
  [$moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [$quadraticCurveTo](...args) {
    return this.quadraticCurveTo.apply(this, args);
  }
  [$rect](...args) {
    return this.rect.apply(this, args);
  }
  [$createImageDataFromImageData](imagedata) {
    return this.createImageData(imagedata);
  }
  [$setFillColorRgb](r, g, b, a) {
    if (a === void 0) a = 1;
    this.fillStyle = "rgba(" + dart.str(r) + ", " + dart.str(g) + ", " + dart.str(b) + ", " + dart.str(a) + ")";
  }
  [$setFillColorHsl](h, s, l, a) {
    if (a === void 0) a = 1;
    this.fillStyle = "hsla(" + dart.str(h) + ", " + dart.str(s) + "%, " + dart.str(l) + "%, " + dart.str(a) + ")";
  }
  [$setStrokeColorRgb](r, g, b, a) {
    if (a === void 0) a = 1;
    this.strokeStyle = "rgba(" + dart.str(r) + ", " + dart.str(g) + ", " + dart.str(b) + ", " + dart.str(a) + ")";
  }
  [$setStrokeColorHsl](h, s, l, a) {
    if (a === void 0) a = 1;
    this.strokeStyle = "hsla(" + dart.str(h) + ", " + dart.str(s) + "%, " + dart.str(l) + "%, " + dart.str(a) + ")";
  }
  [$arc](x, y, radius, startAngle, endAngle, anticlockwise) {
    if (anticlockwise === void 0) anticlockwise = false;
    this.arc(x, y, radius, startAngle, endAngle, anticlockwise);
  }
  [$createPatternFromImage](image, repetitionType) {
    return this.createPattern(image, repetitionType);
  }
  [$drawImageToRect](source, destRect, opts) {
    let sourceRect = opts && 'sourceRect' in opts ? opts.sourceRect : null;
    if (sourceRect == null) {
      this[$drawImageScaled](source, destRect[$left], destRect[$top], destRect[$width], destRect[$height]);
    } else {
      this[$drawImageScaledFromSource](source, sourceRect[$left], sourceRect[$top], sourceRect[$width], sourceRect[$height], destRect[$left], destRect[$top], destRect[$width], destRect[$height]);
    }
  }
  [$drawImage](...args) {
    return this.drawImage.apply(this, args);
  }
  [$drawImageScaled](...args) {
    return this.drawImage.apply(this, args);
  }
  [$drawImageScaledFromSource](...args) {
    return this.drawImage.apply(this, args);
  }
  get [$lineDashOffset]() {
    return this.lineDashOffset || this.webkitLineDashOffset;
  }
  set [$lineDashOffset](value) {
    typeof this.lineDashOffset != "undefined" ? this.lineDashOffset = value : this.webkitLineDashOffset = value;
  }
  [$getLineDash]() {
    if (!!this.getLineDash) {
      return this.getLineDash();
    } else if (!!this.webkitLineDash) {
      return this.webkitLineDash;
    }
  }
  [$setLineDash](dash) {
    if (!!this.setLineDash) {
      this.setLineDash(dash);
    } else if (!!this.webkitLineDash) {
      this.webkitLineDash = dash;
    }
  }
  [$fillText](text, x, y, maxWidth) {
    if (maxWidth === void 0) maxWidth = null;
    if (maxWidth != null) {
      this.fillText(text, x, y, maxWidth);
    } else {
      this.fillText(text, x, y);
    }
  }
  get [$backingStorePixelRatio]() {
    return 1.0;
  }
};
dart.addTypeTests(html$.CanvasRenderingContext2D);
const canvas$ = Symbol("CanvasRenderingContext2D.canvas");
const currentTransform = Symbol("CanvasRenderingContext2D.currentTransform");
const direction$0 = Symbol("CanvasRenderingContext2D.direction");
const fillStyle = Symbol("CanvasRenderingContext2D.fillStyle");
const filter = Symbol("CanvasRenderingContext2D.filter");
const font = Symbol("CanvasRenderingContext2D.font");
const globalAlpha = Symbol("CanvasRenderingContext2D.globalAlpha");
const globalCompositeOperation = Symbol("CanvasRenderingContext2D.globalCompositeOperation");
const imageSmoothingEnabled = Symbol("CanvasRenderingContext2D.imageSmoothingEnabled");
const imageSmoothingQuality = Symbol("CanvasRenderingContext2D.imageSmoothingQuality");
const lineCap = Symbol("CanvasRenderingContext2D.lineCap");
const lineJoin = Symbol("CanvasRenderingContext2D.lineJoin");
const lineWidth = Symbol("CanvasRenderingContext2D.lineWidth");
const miterLimit = Symbol("CanvasRenderingContext2D.miterLimit");
const shadowBlur = Symbol("CanvasRenderingContext2D.shadowBlur");
const shadowColor = Symbol("CanvasRenderingContext2D.shadowColor");
const shadowOffsetX = Symbol("CanvasRenderingContext2D.shadowOffsetX");
const shadowOffsetY = Symbol("CanvasRenderingContext2D.shadowOffsetY");
const strokeStyle = Symbol("CanvasRenderingContext2D.strokeStyle");
const textAlign = Symbol("CanvasRenderingContext2D.textAlign");
const textBaseline = Symbol("CanvasRenderingContext2D.textBaseline");
html$.CanvasRenderingContext2D[dart.implements] = () => [html$.CanvasRenderingContext];
dart.setMethodSignature(html$.CanvasRenderingContext2D, () => ({
  __proto__: dart.getMethods(html$.CanvasRenderingContext2D.__proto__),
  [$addHitRegion]: dart.fnType(dart.void, [], [core.Map]),
  [_addHitRegion_1]: dart.fnType(dart.void, [dart.dynamic]),
  [_addHitRegion_2]: dart.fnType(dart.void, []),
  [$beginPath]: dart.fnType(dart.void, []),
  [$clearHitRegions]: dart.fnType(dart.void, []),
  [$clearRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$clip]: dart.fnType(dart.void, [], [dart.dynamic, core.String]),
  [$createImageData]: dart.fnType(html$.ImageData, [dart.dynamic], [core.int, dart.dynamic, core.Map]),
  [_createImageData_1]: dart.fnType(dart.dynamic, [dart.dynamic]),
  [_createImageData_2]: dart.fnType(dart.dynamic, [core.int, dart.dynamic]),
  [_createImageData_3]: dart.fnType(dart.dynamic, [core.int, dart.dynamic, dart.dynamic]),
  [_createImageData_4]: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic, core.int]),
  [_createImageData_5]: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic, core.int, dart.dynamic]),
  [$createLinearGradient]: dart.fnType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
  [$createPattern]: dart.fnType(html$.CanvasPattern, [core.Object, core.String]),
  [$createRadialGradient]: dart.fnType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$drawFocusIfNeeded]: dart.fnType(dart.void, [dart.dynamic], [html$.Element]),
  [$fill]: dart.fnType(dart.void, [], [dart.dynamic, core.String]),
  [$fillRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$getContextAttributes]: dart.fnType(core.Map, []),
  [_getContextAttributes_1]: dart.fnType(dart.dynamic, []),
  [$getImageData]: dart.fnType(html$.ImageData, [core.int, core.int, core.int, core.int]),
  [_getImageData_1]: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_getLineDash]: dart.fnType(core.List$(core.num), []),
  [$isContextLost]: dart.fnType(core.bool, []),
  [$isPointInPath]: dart.fnType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
  [$isPointInStroke]: dart.fnType(core.bool, [dart.dynamic, core.num], [core.num]),
  [$measureText]: dart.fnType(html$.TextMetrics, [core.String]),
  [$putImageData]: dart.fnType(dart.void, [html$.ImageData, core.int, core.int], [core.int, core.int, core.int, core.int]),
  [_putImageData_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
  [_putImageData_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [$removeHitRegion]: dart.fnType(dart.void, [core.String]),
  [$resetTransform]: dart.fnType(dart.void, []),
  [$restore]: dart.fnType(dart.void, []),
  [$rotate]: dart.fnType(dart.void, [core.num]),
  [$save]: dart.fnType(dart.void, []),
  [$scale]: dart.fnType(dart.void, [core.num, core.num]),
  [$scrollPathIntoView]: dart.fnType(dart.void, [], [html$.Path2D]),
  [$setTransform]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$stroke]: dart.fnType(dart.void, [], [html$.Path2D]),
  [$strokeRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$strokeText]: dart.fnType(dart.void, [core.String, core.num, core.num], [core.num]),
  [$transform]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$translate]: dart.fnType(dart.void, [core.num, core.num]),
  [_arc]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
  [$arcTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
  [$bezierCurveTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$closePath]: dart.fnType(dart.void, []),
  [$ellipse]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
  [$lineTo]: dart.fnType(dart.void, [core.num, core.num]),
  [$moveTo]: dart.fnType(dart.void, [core.num, core.num]),
  [$quadraticCurveTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$rect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$createImageDataFromImageData]: dart.fnType(html$.ImageData, [html$.ImageData]),
  [$setFillColorRgb]: dart.fnType(dart.void, [core.int, core.int, core.int], [core.num]),
  [$setFillColorHsl]: dart.fnType(dart.void, [core.int, core.num, core.num], [core.num]),
  [$setStrokeColorRgb]: dart.fnType(dart.void, [core.int, core.int, core.int], [core.num]),
  [$setStrokeColorHsl]: dart.fnType(dart.void, [core.int, core.num, core.num], [core.num]),
  [$arc]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num], [core.bool]),
  [$createPatternFromImage]: dart.fnType(html$.CanvasPattern, [html$.ImageElement, core.String]),
  [$drawImageToRect]: dart.fnType(dart.void, [html$.CanvasImageSource, math.Rectangle$(core.num)], {sourceRect: math.Rectangle$(core.num)}),
  [$drawImage]: dart.fnType(dart.void, [html$.CanvasImageSource, core.num, core.num]),
  [$drawImageScaled]: dart.fnType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num]),
  [$drawImageScaledFromSource]: dart.fnType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
  [$getLineDash]: dart.fnType(core.List$(core.num), []),
  [$setLineDash]: dart.fnType(dart.void, [core.List$(core.num)]),
  [$fillText]: dart.fnType(dart.void, [core.String, core.num, core.num], [core.num])
}));
dart.setGetterSignature(html$.CanvasRenderingContext2D, () => ({
  __proto__: dart.getGetters(html$.CanvasRenderingContext2D.__proto__),
  [$lineDashOffset]: core.num,
  [$backingStorePixelRatio]: core.double
}));
dart.setSetterSignature(html$.CanvasRenderingContext2D, () => ({
  __proto__: dart.getSetters(html$.CanvasRenderingContext2D.__proto__),
  [$lineDashOffset]: core.num
}));
dart.setLibraryUri(html$.CanvasRenderingContext2D, "dart:html");
dart.setFieldSignature(html$.CanvasRenderingContext2D, () => ({
  __proto__: dart.getFields(html$.CanvasRenderingContext2D.__proto__),
  [$canvas]: dart.finalFieldType(html$.CanvasElement),
  [$currentTransform]: dart.fieldType(svg$.Matrix),
  [$direction]: dart.fieldType(core.String),
  [$fillStyle]: dart.fieldType(core.Object),
  [$filter]: dart.fieldType(core.String),
  [$font]: dart.fieldType(core.String),
  [$globalAlpha]: dart.fieldType(core.num),
  [$globalCompositeOperation]: dart.fieldType(core.String),
  [$imageSmoothingEnabled]: dart.fieldType(core.bool),
  [$imageSmoothingQuality]: dart.fieldType(core.String),
  [$lineCap]: dart.fieldType(core.String),
  [$lineJoin]: dart.fieldType(core.String),
  [$lineWidth]: dart.fieldType(core.num),
  [$miterLimit]: dart.fieldType(core.num),
  [$shadowBlur]: dart.fieldType(core.num),
  [$shadowColor]: dart.fieldType(core.String),
  [$shadowOffsetX]: dart.fieldType(core.num),
  [$shadowOffsetY]: dart.fieldType(core.num),
  [$strokeStyle]: dart.fieldType(core.Object),
  [$textAlign]: dart.fieldType(core.String),
  [$textBaseline]: dart.fieldType(core.String)
}));
dart.registerExtension("CanvasRenderingContext2D", html$.CanvasRenderingContext2D);
html$.ChildNode = class ChildNode extends _interceptors.Interceptor {};
dart.addTypeTests(html$.ChildNode);
dart.setLibraryUri(html$.ChildNode, "dart:html");
html$.Client = class Client extends _interceptors.Interceptor {
  get [$frameType]() {
    return this.frameType;
  }
  get [$id]() {
    return this.id;
  }
  get [$type]() {
    return this.type;
  }
  get [$url]() {
    return this.url;
  }
  [$postMessage](...args) {
    return this.postMessage.apply(this, args);
  }
};
dart.addTypeTests(html$.Client);
const frameType = Symbol("Client.frameType");
const id$4 = Symbol("Client.id");
const type$6 = Symbol("Client.type");
const url$ = Symbol("Client.url");
dart.setMethodSignature(html$.Client, () => ({
  __proto__: dart.getMethods(html$.Client.__proto__),
  [$postMessage]: dart.fnType(dart.void, [core.Object], [core.List$(core.Object)])
}));
dart.setLibraryUri(html$.Client, "dart:html");
dart.setFieldSignature(html$.Client, () => ({
  __proto__: dart.getFields(html$.Client.__proto__),
  [$frameType]: dart.finalFieldType(core.String),
  [$id]: dart.finalFieldType(core.String),
  [$type]: dart.finalFieldType(core.String),
  [$url]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Client", html$.Client);
html$.Clients = class Clients extends _interceptors.Interceptor {
  [$claim]() {
    return html$.promiseToFuture(dart.dynamic, this.claim());
  }
  [$get](id) {
    return html$.promiseToFuture(dart.dynamic, this.get(id));
  }
  [$matchAll](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(ListOfClient(), this.matchAll(options_dict));
  }
  [$openWindow](url) {
    return html$.promiseToFuture(html$.WindowClient, this.openWindow(url));
  }
};
dart.addTypeTests(html$.Clients);
dart.setMethodSignature(html$.Clients, () => ({
  __proto__: dart.getMethods(html$.Clients.__proto__),
  [$claim]: dart.fnType(async.Future, []),
  [$get]: dart.fnType(async.Future, [core.String]),
  [$matchAll]: dart.fnType(async.Future$(core.List$(html$.Client)), [], [core.Map]),
  [$openWindow]: dart.fnType(async.Future$(html$.WindowClient), [core.String])
}));
dart.setLibraryUri(html$.Clients, "dart:html");
dart.registerExtension("Clients", html$.Clients);
html$.ClipboardEvent = class ClipboardEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ClipboardEvent._create_1(type, eventInitDict_1);
    }
    return html$.ClipboardEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new ClipboardEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new ClipboardEvent(type);
  }
  get [$clipboardData]() {
    return this.clipboardData;
  }
};
dart.addTypeTests(html$.ClipboardEvent);
const clipboardData = Symbol("ClipboardEvent.clipboardData");
dart.setLibraryUri(html$.ClipboardEvent, "dart:html");
dart.setFieldSignature(html$.ClipboardEvent, () => ({
  __proto__: dart.getFields(html$.ClipboardEvent.__proto__),
  [$clipboardData]: dart.finalFieldType(html$.DataTransfer)
}));
dart.registerExtension("ClipboardEvent", html$.ClipboardEvent);
html$.CloseEvent = class CloseEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.CloseEvent._create_1(type, eventInitDict_1);
    }
    return html$.CloseEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new CloseEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new CloseEvent(type);
  }
  get [$code]() {
    return this.code;
  }
  get [$reason]() {
    return this.reason;
  }
  get [$wasClean]() {
    return this.wasClean;
  }
};
dart.addTypeTests(html$.CloseEvent);
const code = Symbol("CloseEvent.code");
const reason$ = Symbol("CloseEvent.reason");
const wasClean = Symbol("CloseEvent.wasClean");
dart.setLibraryUri(html$.CloseEvent, "dart:html");
dart.setFieldSignature(html$.CloseEvent, () => ({
  __proto__: dart.getFields(html$.CloseEvent.__proto__),
  [$code]: dart.finalFieldType(core.int),
  [$reason]: dart.finalFieldType(core.String),
  [$wasClean]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("CloseEvent", html$.CloseEvent);
html$.Comment = class Comment extends html$.CharacterData {
  static new(data) {
    if (data === void 0) data = null;
    return html$.document.createComment(data == null ? "" : data);
  }
};
dart.addTypeTests(html$.Comment);
dart.setLibraryUri(html$.Comment, "dart:html");
dart.registerExtension("Comment", html$.Comment);
const _initCompositionEvent = dart.privateName(html$, "_initCompositionEvent");
const _initUIEvent = dart.privateName(html$, "_initUIEvent");
const _get_view = dart.privateName(html$, "_get_view");
const _which = dart.privateName(html$, "_which");
html$.UIEvent = class UIEvent$ extends html$.Event {
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let detail = opts && 'detail' in opts ? opts.detail : 0;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    if (view == null) {
      view = html$.window;
    }
    let e = html$.UIEvent._check(html$.document[_createEvent]("UIEvent"));
    e[_initUIEvent](type, canBubble, cancelable, view, detail);
    return e;
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.UIEvent._create_1(type, eventInitDict_1);
    }
    return html$.UIEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new UIEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new UIEvent(type);
  }
  get [$detail]() {
    return this.detail;
  }
  get [$sourceCapabilities]() {
    return this.sourceCapabilities;
  }
  get [$view]() {
    return html$._convertNativeToDart_Window(this[_get_view]);
  }
  get [_get_view]() {
    return this.view;
  }
  get [_which]() {
    return this.which;
  }
  [_initUIEvent](...args) {
    return this.initUIEvent.apply(this, args);
  }
};
dart.addTypeTests(html$.UIEvent);
const detail = Symbol("UIEvent.detail");
const sourceCapabilities = Symbol("UIEvent.sourceCapabilities");
dart.setMethodSignature(html$.UIEvent, () => ({
  __proto__: dart.getMethods(html$.UIEvent.__proto__),
  [_initUIEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int])
}));
dart.setGetterSignature(html$.UIEvent, () => ({
  __proto__: dart.getGetters(html$.UIEvent.__proto__),
  [$view]: html$.WindowBase
}));
dart.setLibraryUri(html$.UIEvent, "dart:html");
dart.setFieldSignature(html$.UIEvent, () => ({
  __proto__: dart.getFields(html$.UIEvent.__proto__),
  [$detail]: dart.finalFieldType(core.int),
  [$sourceCapabilities]: dart.finalFieldType(html$.InputDeviceCapabilities),
  [_get_view]: dart.finalFieldType(dart.dynamic),
  [_which]: dart.finalFieldType(core.int)
}));
dart.registerExtension("UIEvent", html$.UIEvent);
html$.CompositionEvent = class CompositionEvent$ extends html$.UIEvent {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
    let view = opts && 'view' in opts ? opts.view : null;
    let data = opts && 'data' in opts ? opts.data : null;
    let locale = opts && 'locale' in opts ? opts.locale : null;
    if (view == null) {
      view = html$.window;
    }
    let e = html$.CompositionEvent._check(html$.document[_createEvent]("CompositionEvent"));
    if (dart.test(html_common.Device.isFirefox)) {
      e.initCompositionEvent(type, canBubble, cancelable, view, data, locale);
    } else {
      e[_initCompositionEvent](type, canBubble, cancelable, view, data);
    }
    return e;
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.CompositionEvent._create_1(type, eventInitDict_1);
    }
    return html$.CompositionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new CompositionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new CompositionEvent(type);
  }
  get [$data]() {
    return this.data;
  }
  [_initCompositionEvent](...args) {
    return this.initCompositionEvent.apply(this, args);
  }
};
dart.addTypeTests(html$.CompositionEvent);
const data$1 = Symbol("CompositionEvent.data");
dart.setMethodSignature(html$.CompositionEvent, () => ({
  __proto__: dart.getMethods(html$.CompositionEvent.__proto__),
  [_initCompositionEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])
}));
dart.setLibraryUri(html$.CompositionEvent, "dart:html");
dart.setFieldSignature(html$.CompositionEvent, () => ({
  __proto__: dart.getFields(html$.CompositionEvent.__proto__),
  [$data]: dart.finalFieldType(core.String)
}));
dart.registerExtension("CompositionEvent", html$.CompositionEvent);
html$.ContentElement = class ContentElement extends html$.HtmlElement {
  static new() {
    return html$.ContentElement._check(html$.document[$createElement]("content"));
  }
  static get supported() {
    return html$.Element.isTagSupported("content");
  }
  get [$select]() {
    return this.select;
  }
  set [$select](value) {
    this.select = value;
  }
  [$getDistributedNodes](...args) {
    return this.getDistributedNodes.apply(this, args);
  }
};
(html$.ContentElement.created = function() {
  this[select] = null;
  html$.ContentElement.__proto__.created.call(this);
}).prototype = html$.ContentElement.prototype;
dart.addTypeTests(html$.ContentElement);
const select = Symbol("ContentElement.select");
dart.setMethodSignature(html$.ContentElement, () => ({
  __proto__: dart.getMethods(html$.ContentElement.__proto__),
  [$getDistributedNodes]: dart.fnType(core.List$(html$.Node), [])
}));
dart.setLibraryUri(html$.ContentElement, "dart:html");
dart.setFieldSignature(html$.ContentElement, () => ({
  __proto__: dart.getFields(html$.ContentElement.__proto__),
  [$select]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLContentElement", html$.ContentElement);
html$.CookieStore = class CookieStore extends _interceptors.Interceptor {
  [$getAll](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.getAll(options_dict));
  }
  [$set](name, value, options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.set(name, value, options_dict));
  }
};
dart.addTypeTests(html$.CookieStore);
dart.setMethodSignature(html$.CookieStore, () => ({
  __proto__: dart.getMethods(html$.CookieStore.__proto__),
  [$getAll]: dart.fnType(async.Future, [], [core.Map]),
  [$set]: dart.fnType(async.Future, [core.String, core.String], [core.Map])
}));
dart.setLibraryUri(html$.CookieStore, "dart:html");
dart.registerExtension("CookieStore", html$.CookieStore);
html$.Coordinates = class Coordinates extends _interceptors.Interceptor {
  get [$accuracy]() {
    return this.accuracy;
  }
  get [$altitude]() {
    return this.altitude;
  }
  get [$altitudeAccuracy]() {
    return this.altitudeAccuracy;
  }
  get [$heading]() {
    return this.heading;
  }
  get [$latitude]() {
    return this.latitude;
  }
  get [$longitude]() {
    return this.longitude;
  }
  get [$speed]() {
    return this.speed;
  }
};
dart.addTypeTests(html$.Coordinates);
const accuracy = Symbol("Coordinates.accuracy");
const altitude = Symbol("Coordinates.altitude");
const altitudeAccuracy = Symbol("Coordinates.altitudeAccuracy");
const heading = Symbol("Coordinates.heading");
const latitude = Symbol("Coordinates.latitude");
const longitude = Symbol("Coordinates.longitude");
const speed = Symbol("Coordinates.speed");
dart.setLibraryUri(html$.Coordinates, "dart:html");
dart.setFieldSignature(html$.Coordinates, () => ({
  __proto__: dart.getFields(html$.Coordinates.__proto__),
  [$accuracy]: dart.finalFieldType(core.num),
  [$altitude]: dart.finalFieldType(core.num),
  [$altitudeAccuracy]: dart.finalFieldType(core.num),
  [$heading]: dart.finalFieldType(core.num),
  [$latitude]: dart.finalFieldType(core.num),
  [$longitude]: dart.finalFieldType(core.num),
  [$speed]: dart.finalFieldType(core.num)
}));
dart.registerExtension("Coordinates", html$.Coordinates);
html$.Credential = class Credential extends _interceptors.Interceptor {
  get [$id]() {
    return this.id;
  }
  get [$type]() {
    return this.type;
  }
};
dart.addTypeTests(html$.Credential);
const id$5 = Symbol("Credential.id");
const type$7 = Symbol("Credential.type");
dart.setLibraryUri(html$.Credential, "dart:html");
dart.setFieldSignature(html$.Credential, () => ({
  __proto__: dart.getFields(html$.Credential.__proto__),
  [$id]: dart.finalFieldType(core.String),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Credential", html$.Credential);
html$.CredentialUserData = class CredentialUserData extends _interceptors.Interceptor {
  get [$iconUrl]() {
    return this.iconURL;
  }
  get [$name]() {
    return this.name;
  }
};
dart.addTypeTests(html$.CredentialUserData);
const iconUrl = Symbol("CredentialUserData.iconUrl");
const name$8 = Symbol("CredentialUserData.name");
dart.setLibraryUri(html$.CredentialUserData, "dart:html");
dart.setFieldSignature(html$.CredentialUserData, () => ({
  __proto__: dart.getFields(html$.CredentialUserData.__proto__),
  [$iconUrl]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("CredentialUserData", html$.CredentialUserData);
html$.CredentialsContainer = class CredentialsContainer extends _interceptors.Interceptor {
  [$create](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.create(options_dict));
  }
  [$get](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.get(options_dict));
  }
  [$preventSilentAccess]() {
    return html$.promiseToFuture(dart.dynamic, this.preventSilentAccess());
  }
  [$requireUserMediation]() {
    return html$.promiseToFuture(dart.dynamic, this.requireUserMediation());
  }
  [$store](credential) {
    return html$.promiseToFuture(dart.dynamic, this.store(credential));
  }
};
dart.addTypeTests(html$.CredentialsContainer);
dart.setMethodSignature(html$.CredentialsContainer, () => ({
  __proto__: dart.getMethods(html$.CredentialsContainer.__proto__),
  [$create]: dart.fnType(async.Future, [], [core.Map]),
  [$get]: dart.fnType(async.Future, [], [core.Map]),
  [$preventSilentAccess]: dart.fnType(async.Future, []),
  [$requireUserMediation]: dart.fnType(async.Future, []),
  [$store]: dart.fnType(async.Future, [html$.Credential])
}));
dart.setLibraryUri(html$.CredentialsContainer, "dart:html");
dart.registerExtension("CredentialsContainer", html$.CredentialsContainer);
const _getRandomValues = dart.privateName(html$, "_getRandomValues");
html$.Crypto = class Crypto extends _interceptors.Interceptor {
  [$getRandomValues](array) {
    return this[_getRandomValues](array);
  }
  static get supported() {
    return !!(window.crypto && window.crypto.getRandomValues);
  }
  get [$subtle]() {
    return this.subtle;
  }
  [_getRandomValues](...args) {
    return this.getRandomValues.apply(this, args);
  }
};
dart.addTypeTests(html$.Crypto);
const subtle = Symbol("Crypto.subtle");
dart.setMethodSignature(html$.Crypto, () => ({
  __proto__: dart.getMethods(html$.Crypto.__proto__),
  [$getRandomValues]: dart.fnType(typed_data.TypedData, [typed_data.TypedData]),
  [_getRandomValues]: dart.fnType(typed_data.TypedData, [typed_data.TypedData])
}));
dart.setLibraryUri(html$.Crypto, "dart:html");
dart.setFieldSignature(html$.Crypto, () => ({
  __proto__: dart.getFields(html$.Crypto.__proto__),
  [$subtle]: dart.finalFieldType(html$._SubtleCrypto)
}));
dart.registerExtension("Crypto", html$.Crypto);
html$.CryptoKey = class CryptoKey extends _interceptors.Interceptor {
  get [$algorithm]() {
    return this.algorithm;
  }
  get [$extractable]() {
    return this.extractable;
  }
  get [$type]() {
    return this.type;
  }
  get [$usages]() {
    return this.usages;
  }
};
dart.addTypeTests(html$.CryptoKey);
const algorithm = Symbol("CryptoKey.algorithm");
const extractable = Symbol("CryptoKey.extractable");
const type$8 = Symbol("CryptoKey.type");
const usages = Symbol("CryptoKey.usages");
dart.setLibraryUri(html$.CryptoKey, "dart:html");
dart.setFieldSignature(html$.CryptoKey, () => ({
  __proto__: dart.getFields(html$.CryptoKey.__proto__),
  [$algorithm]: dart.finalFieldType(core.Object),
  [$extractable]: dart.finalFieldType(core.bool),
  [$type]: dart.finalFieldType(core.String),
  [$usages]: dart.finalFieldType(core.Object)
}));
dart.registerExtension("CryptoKey", html$.CryptoKey);
html$.Css = class Css extends _interceptors.Interceptor {
  static registerProperty(descriptor) {
    let descriptor_1 = html_common.convertDartToNative_Dictionary(descriptor);
    dart.global.CSS.registerProperty(descriptor_1);
    return;
  }
};
dart.addTypeTests(html$.Css);
dart.setLibraryUri(html$.Css, "dart:html");
dart.defineLazy(html$.Css, {
  /*html$.Css.paintWorklet*/get paintWorklet() {
    return null;
  }
});
dart.registerExtension("CSS", html$.Css);
html$.CssRule = class CssRule extends _interceptors.Interceptor {
  get [$cssText]() {
    return this.cssText;
  }
  set [$cssText](value) {
    this.cssText = value;
  }
  get [$parentRule]() {
    return this.parentRule;
  }
  get [$parentStyleSheet]() {
    return this.parentStyleSheet;
  }
  get [$type]() {
    return this.type;
  }
};
dart.addTypeTests(html$.CssRule);
const cssText = Symbol("CssRule.cssText");
const parentRule = Symbol("CssRule.parentRule");
const parentStyleSheet = Symbol("CssRule.parentStyleSheet");
const type$9 = Symbol("CssRule.type");
dart.setLibraryUri(html$.CssRule, "dart:html");
dart.setFieldSignature(html$.CssRule, () => ({
  __proto__: dart.getFields(html$.CssRule.__proto__),
  [$cssText]: dart.fieldType(core.String),
  [$parentRule]: dart.finalFieldType(html$.CssRule),
  [$parentStyleSheet]: dart.finalFieldType(html$.CssStyleSheet),
  [$type]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.CssRule, {
  /*html$.CssRule.CHARSET_RULE*/get CHARSET_RULE() {
    return 2;
  },
  /*html$.CssRule.FONT_FACE_RULE*/get FONT_FACE_RULE() {
    return 5;
  },
  /*html$.CssRule.IMPORT_RULE*/get IMPORT_RULE() {
    return 3;
  },
  /*html$.CssRule.KEYFRAMES_RULE*/get KEYFRAMES_RULE() {
    return 7;
  },
  /*html$.CssRule.KEYFRAME_RULE*/get KEYFRAME_RULE() {
    return 8;
  },
  /*html$.CssRule.MEDIA_RULE*/get MEDIA_RULE() {
    return 4;
  },
  /*html$.CssRule.NAMESPACE_RULE*/get NAMESPACE_RULE() {
    return 10;
  },
  /*html$.CssRule.PAGE_RULE*/get PAGE_RULE() {
    return 6;
  },
  /*html$.CssRule.STYLE_RULE*/get STYLE_RULE() {
    return 1;
  },
  /*html$.CssRule.SUPPORTS_RULE*/get SUPPORTS_RULE() {
    return 12;
  },
  /*html$.CssRule.VIEWPORT_RULE*/get VIEWPORT_RULE() {
    return 15;
  }
});
dart.registerExtension("CSSRule", html$.CssRule);
html$.CssCharsetRule = class CssCharsetRule extends html$.CssRule {
  get [$encoding]() {
    return this.encoding;
  }
  set [$encoding](value) {
    this.encoding = value;
  }
};
dart.addTypeTests(html$.CssCharsetRule);
const encoding$ = Symbol("CssCharsetRule.encoding");
dart.setLibraryUri(html$.CssCharsetRule, "dart:html");
dart.setFieldSignature(html$.CssCharsetRule, () => ({
  __proto__: dart.getFields(html$.CssCharsetRule.__proto__),
  [$encoding]: dart.fieldType(core.String)
}));
dart.registerExtension("CSSCharsetRule", html$.CssCharsetRule);
html$.CssGroupingRule = class CssGroupingRule extends html$.CssRule {
  get [$cssRules]() {
    return this.cssRules;
  }
  [$deleteRule](...args) {
    return this.deleteRule.apply(this, args);
  }
  [$insertRule](...args) {
    return this.insertRule.apply(this, args);
  }
};
dart.addTypeTests(html$.CssGroupingRule);
const cssRules = Symbol("CssGroupingRule.cssRules");
dart.setMethodSignature(html$.CssGroupingRule, () => ({
  __proto__: dart.getMethods(html$.CssGroupingRule.__proto__),
  [$deleteRule]: dart.fnType(dart.void, [core.int]),
  [$insertRule]: dart.fnType(core.int, [core.String, core.int])
}));
dart.setLibraryUri(html$.CssGroupingRule, "dart:html");
dart.setFieldSignature(html$.CssGroupingRule, () => ({
  __proto__: dart.getFields(html$.CssGroupingRule.__proto__),
  [$cssRules]: dart.finalFieldType(ListOfCssRule())
}));
dart.registerExtension("CSSGroupingRule", html$.CssGroupingRule);
html$.CssConditionRule = class CssConditionRule extends html$.CssGroupingRule {
  get [$conditionText]() {
    return this.conditionText;
  }
};
dart.addTypeTests(html$.CssConditionRule);
const conditionText = Symbol("CssConditionRule.conditionText");
dart.setLibraryUri(html$.CssConditionRule, "dart:html");
dart.setFieldSignature(html$.CssConditionRule, () => ({
  __proto__: dart.getFields(html$.CssConditionRule.__proto__),
  [$conditionText]: dart.finalFieldType(core.String)
}));
dart.registerExtension("CSSConditionRule", html$.CssConditionRule);
html$.CssFontFaceRule = class CssFontFaceRule extends html$.CssRule {
  get [$style]() {
    return this.style;
  }
};
dart.addTypeTests(html$.CssFontFaceRule);
const style$ = Symbol("CssFontFaceRule.style");
dart.setLibraryUri(html$.CssFontFaceRule, "dart:html");
dart.setFieldSignature(html$.CssFontFaceRule, () => ({
  __proto__: dart.getFields(html$.CssFontFaceRule.__proto__),
  [$style]: dart.finalFieldType(html$.CssStyleDeclaration)
}));
dart.registerExtension("CSSFontFaceRule", html$.CssFontFaceRule);
html$.CssStyleValue = class CssStyleValue extends _interceptors.Interceptor {};
dart.addTypeTests(html$.CssStyleValue);
dart.setLibraryUri(html$.CssStyleValue, "dart:html");
dart.registerExtension("CSSStyleValue", html$.CssStyleValue);
html$.CssResourceValue = class CssResourceValue extends html$.CssStyleValue {
  get [$state]() {
    return this.state;
  }
};
dart.addTypeTests(html$.CssResourceValue);
const state$ = Symbol("CssResourceValue.state");
dart.setLibraryUri(html$.CssResourceValue, "dart:html");
dart.setFieldSignature(html$.CssResourceValue, () => ({
  __proto__: dart.getFields(html$.CssResourceValue.__proto__),
  [$state]: dart.finalFieldType(core.String)
}));
dart.registerExtension("CSSResourceValue", html$.CssResourceValue);
html$.CssImageValue = class CssImageValue extends html$.CssResourceValue {
  get [$intrinsicHeight]() {
    return this.intrinsicHeight;
  }
  get [$intrinsicRatio]() {
    return this.intrinsicRatio;
  }
  get [$intrinsicWidth]() {
    return this.intrinsicWidth;
  }
};
dart.addTypeTests(html$.CssImageValue);
const intrinsicHeight = Symbol("CssImageValue.intrinsicHeight");
const intrinsicRatio = Symbol("CssImageValue.intrinsicRatio");
const intrinsicWidth = Symbol("CssImageValue.intrinsicWidth");
dart.setLibraryUri(html$.CssImageValue, "dart:html");
dart.setFieldSignature(html$.CssImageValue, () => ({
  __proto__: dart.getFields(html$.CssImageValue.__proto__),
  [$intrinsicHeight]: dart.finalFieldType(core.num),
  [$intrinsicRatio]: dart.finalFieldType(core.num),
  [$intrinsicWidth]: dart.finalFieldType(core.num)
}));
dart.registerExtension("CSSImageValue", html$.CssImageValue);
html$.CssImportRule = class CssImportRule extends html$.CssRule {
  get [$href]() {
    return this.href;
  }
  get [$media]() {
    return this.media;
  }
  get [$styleSheet]() {
    return this.styleSheet;
  }
};
dart.addTypeTests(html$.CssImportRule);
const href$1 = Symbol("CssImportRule.href");
const media = Symbol("CssImportRule.media");
const styleSheet = Symbol("CssImportRule.styleSheet");
dart.setLibraryUri(html$.CssImportRule, "dart:html");
dart.setFieldSignature(html$.CssImportRule, () => ({
  __proto__: dart.getFields(html$.CssImportRule.__proto__),
  [$href]: dart.finalFieldType(core.String),
  [$media]: dart.finalFieldType(html$.MediaList),
  [$styleSheet]: dart.finalFieldType(html$.CssStyleSheet)
}));
dart.registerExtension("CSSImportRule", html$.CssImportRule);
html$.CssKeyframeRule = class CssKeyframeRule extends html$.CssRule {
  get [$keyText]() {
    return this.keyText;
  }
  set [$keyText](value) {
    this.keyText = value;
  }
  get [$style]() {
    return this.style;
  }
};
dart.addTypeTests(html$.CssKeyframeRule);
const keyText = Symbol("CssKeyframeRule.keyText");
const style$0 = Symbol("CssKeyframeRule.style");
dart.setLibraryUri(html$.CssKeyframeRule, "dart:html");
dart.setFieldSignature(html$.CssKeyframeRule, () => ({
  __proto__: dart.getFields(html$.CssKeyframeRule.__proto__),
  [$keyText]: dart.fieldType(core.String),
  [$style]: dart.finalFieldType(html$.CssStyleDeclaration)
}));
dart.registerExtension("CSSKeyframeRule", html$.CssKeyframeRule);
dart.registerExtension("MozCSSKeyframeRule", html$.CssKeyframeRule);
dart.registerExtension("WebKitCSSKeyframeRule", html$.CssKeyframeRule);
const __getter__ = dart.privateName(html$, "__getter__");
html$.CssKeyframesRule = class CssKeyframesRule extends html$.CssRule {
  get [$cssRules]() {
    return this.cssRules;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [$appendRule](...args) {
    return this.appendRule.apply(this, args);
  }
  [$deleteRule](...args) {
    return this.deleteRule.apply(this, args);
  }
  [$findRule](...args) {
    return this.findRule.apply(this, args);
  }
};
dart.addTypeTests(html$.CssKeyframesRule);
const cssRules$ = Symbol("CssKeyframesRule.cssRules");
const name$9 = Symbol("CssKeyframesRule.name");
dart.setMethodSignature(html$.CssKeyframesRule, () => ({
  __proto__: dart.getMethods(html$.CssKeyframesRule.__proto__),
  [__getter__]: dart.fnType(html$.CssKeyframeRule, [core.int]),
  [$appendRule]: dart.fnType(dart.void, [core.String]),
  [$deleteRule]: dart.fnType(dart.void, [core.String]),
  [$findRule]: dart.fnType(html$.CssKeyframeRule, [core.String])
}));
dart.setLibraryUri(html$.CssKeyframesRule, "dart:html");
dart.setFieldSignature(html$.CssKeyframesRule, () => ({
  __proto__: dart.getFields(html$.CssKeyframesRule.__proto__),
  [$cssRules]: dart.finalFieldType(ListOfCssRule()),
  [$name]: dart.fieldType(core.String)
}));
dart.registerExtension("CSSKeyframesRule", html$.CssKeyframesRule);
dart.registerExtension("MozCSSKeyframesRule", html$.CssKeyframesRule);
dart.registerExtension("WebKitCSSKeyframesRule", html$.CssKeyframesRule);
html$.CssKeywordValue = class CssKeywordValue extends html$.CssStyleValue {
  static new(keyword) {
    return html$.CssKeywordValue._create_1(keyword);
  }
  static _create_1(keyword) {
    return new CSSKeywordValue(keyword);
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
dart.addTypeTests(html$.CssKeywordValue);
const value$2 = Symbol("CssKeywordValue.value");
dart.setLibraryUri(html$.CssKeywordValue, "dart:html");
dart.setFieldSignature(html$.CssKeywordValue, () => ({
  __proto__: dart.getFields(html$.CssKeywordValue.__proto__),
  [$value]: dart.fieldType(core.String)
}));
dart.registerExtension("CSSKeywordValue", html$.CssKeywordValue);
html$.CssTransformComponent = class CssTransformComponent extends _interceptors.Interceptor {
  get [$is2D]() {
    return this.is2D;
  }
  set [$is2D](value) {
    this.is2D = value;
  }
};
dart.addTypeTests(html$.CssTransformComponent);
const is2D = Symbol("CssTransformComponent.is2D");
dart.setLibraryUri(html$.CssTransformComponent, "dart:html");
dart.setFieldSignature(html$.CssTransformComponent, () => ({
  __proto__: dart.getFields(html$.CssTransformComponent.__proto__),
  [$is2D]: dart.fieldType(core.bool)
}));
dart.registerExtension("CSSTransformComponent", html$.CssTransformComponent);
html$.CssMatrixComponent = class CssMatrixComponent extends html$.CssTransformComponent {
  static new(matrix, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return html$.CssMatrixComponent._create_1(matrix, options_1);
    }
    return html$.CssMatrixComponent._create_2(matrix);
  }
  static _create_1(matrix, options) {
    return new CSSMatrixComponent(matrix, options);
  }
  static _create_2(matrix) {
    return new CSSMatrixComponent(matrix);
  }
  get [$matrix]() {
    return this.matrix;
  }
  set [$matrix](value) {
    this.matrix = value;
  }
};
dart.addTypeTests(html$.CssMatrixComponent);
const matrix = Symbol("CssMatrixComponent.matrix");
dart.setLibraryUri(html$.CssMatrixComponent, "dart:html");
dart.setFieldSignature(html$.CssMatrixComponent, () => ({
  __proto__: dart.getFields(html$.CssMatrixComponent.__proto__),
  [$matrix]: dart.fieldType(html$.DomMatrix)
}));
dart.registerExtension("CSSMatrixComponent", html$.CssMatrixComponent);
html$.CssMediaRule = class CssMediaRule extends html$.CssConditionRule {
  get [$media]() {
    return this.media;
  }
};
dart.addTypeTests(html$.CssMediaRule);
const media$ = Symbol("CssMediaRule.media");
dart.setLibraryUri(html$.CssMediaRule, "dart:html");
dart.setFieldSignature(html$.CssMediaRule, () => ({
  __proto__: dart.getFields(html$.CssMediaRule.__proto__),
  [$media]: dart.finalFieldType(html$.MediaList)
}));
dart.registerExtension("CSSMediaRule", html$.CssMediaRule);
html$.CssNamespaceRule = class CssNamespaceRule extends html$.CssRule {
  get [$namespaceUri]() {
    return this.namespaceURI;
  }
  get [$prefix]() {
    return this.prefix;
  }
};
dart.addTypeTests(html$.CssNamespaceRule);
const namespaceUri = Symbol("CssNamespaceRule.namespaceUri");
const prefix = Symbol("CssNamespaceRule.prefix");
dart.setLibraryUri(html$.CssNamespaceRule, "dart:html");
dart.setFieldSignature(html$.CssNamespaceRule, () => ({
  __proto__: dart.getFields(html$.CssNamespaceRule.__proto__),
  [$namespaceUri]: dart.finalFieldType(core.String),
  [$prefix]: dart.finalFieldType(core.String)
}));
dart.registerExtension("CSSNamespaceRule", html$.CssNamespaceRule);
html$.CssNumericValue = class CssNumericValue extends html$.CssStyleValue {
  [$add](...args) {
    return this.add.apply(this, args);
  }
  [$div](...args) {
    return this.div.apply(this, args);
  }
  [$mul](...args) {
    return this.mul.apply(this, args);
  }
  [$sub](...args) {
    return this.sub.apply(this, args);
  }
  [$to](...args) {
    return this.to.apply(this, args);
  }
};
dart.addTypeTests(html$.CssNumericValue);
dart.setMethodSignature(html$.CssNumericValue, () => ({
  __proto__: dart.getMethods(html$.CssNumericValue.__proto__),
  [$add]: dart.fnType(html$.CssNumericValue, [html$.CssNumericValue]),
  [$div]: dart.fnType(html$.CssNumericValue, [core.num]),
  [$mul]: dart.fnType(html$.CssNumericValue, [core.num]),
  [$sub]: dart.fnType(html$.CssNumericValue, [html$.CssNumericValue]),
  [$to]: dart.fnType(html$.CssNumericValue, [core.String])
}));
dart.setLibraryUri(html$.CssNumericValue, "dart:html");
dart.registerExtension("CSSNumericValue", html$.CssNumericValue);
html$.CssPageRule = class CssPageRule extends html$.CssRule {
  get [$selectorText]() {
    return this.selectorText;
  }
  set [$selectorText](value) {
    this.selectorText = value;
  }
  get [$style]() {
    return this.style;
  }
};
dart.addTypeTests(html$.CssPageRule);
const selectorText = Symbol("CssPageRule.selectorText");
const style$1 = Symbol("CssPageRule.style");
dart.setLibraryUri(html$.CssPageRule, "dart:html");
dart.setFieldSignature(html$.CssPageRule, () => ({
  __proto__: dart.getFields(html$.CssPageRule.__proto__),
  [$selectorText]: dart.fieldType(core.String),
  [$style]: dart.finalFieldType(html$.CssStyleDeclaration)
}));
dart.registerExtension("CSSPageRule", html$.CssPageRule);
html$.CssPerspective = class CssPerspective extends html$.CssTransformComponent {
  static new(length) {
    return html$.CssPerspective._create_1(length);
  }
  static _create_1(length) {
    return new CSSPerspective(length);
  }
  get [$length]() {
    return this.length;
  }
  set [$length](value) {
    this.length = value;
  }
};
dart.addTypeTests(html$.CssPerspective);
const length$1 = Symbol("CssPerspective.length");
dart.setLibraryUri(html$.CssPerspective, "dart:html");
dart.setFieldSignature(html$.CssPerspective, () => ({
  __proto__: dart.getFields(html$.CssPerspective.__proto__),
  [$length]: dart.fieldType(html$.CssNumericValue)
}));
dart.registerExtension("CSSPerspective", html$.CssPerspective);
html$.CssPositionValue = class CssPositionValue extends html$.CssStyleValue {
  static new(x, y) {
    return html$.CssPositionValue._create_1(x, y);
  }
  static _create_1(x, y) {
    return new CSSPositionValue(x, y);
  }
  get [$x]() {
    return this.x;
  }
  set [$x](value) {
    this.x = value;
  }
  get [$y]() {
    return this.y;
  }
  set [$y](value) {
    this.y = value;
  }
};
dart.addTypeTests(html$.CssPositionValue);
const x$ = Symbol("CssPositionValue.x");
const y$ = Symbol("CssPositionValue.y");
dart.setLibraryUri(html$.CssPositionValue, "dart:html");
dart.setFieldSignature(html$.CssPositionValue, () => ({
  __proto__: dart.getFields(html$.CssPositionValue.__proto__),
  [$x]: dart.fieldType(html$.CssNumericValue),
  [$y]: dart.fieldType(html$.CssNumericValue)
}));
dart.registerExtension("CSSPositionValue", html$.CssPositionValue);
html$.CssRotation = class CssRotation extends html$.CssTransformComponent {
  static new(angleValue_OR_x, y, z, angle) {
    if (y === void 0) y = null;
    if (z === void 0) z = null;
    if (angle === void 0) angle = null;
    if (html$.CssNumericValue.is(angleValue_OR_x) && y == null && z == null && angle == null) {
      return html$.CssRotation._create_1(angleValue_OR_x);
    }
    if (html$.CssNumericValue.is(angle) && typeof z == 'number' && typeof y == 'number' && typeof angleValue_OR_x == 'number') {
      return html$.CssRotation._create_2(angleValue_OR_x, y, z, angle);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1(angleValue_OR_x) {
    return new CSSRotation(angleValue_OR_x);
  }
  static _create_2(angleValue_OR_x, y, z, angle) {
    return new CSSRotation(angleValue_OR_x, y, z, angle);
  }
  get [$angle]() {
    return this.angle;
  }
  set [$angle](value) {
    this.angle = value;
  }
  get [$x]() {
    return this.x;
  }
  set [$x](value) {
    this.x = value;
  }
  get [$y]() {
    return this.y;
  }
  set [$y](value) {
    this.y = value;
  }
  get [$z]() {
    return this.z;
  }
  set [$z](value) {
    this.z = value;
  }
};
dart.addTypeTests(html$.CssRotation);
const angle = Symbol("CssRotation.angle");
const x$0 = Symbol("CssRotation.x");
const y$0 = Symbol("CssRotation.y");
const z$ = Symbol("CssRotation.z");
dart.setLibraryUri(html$.CssRotation, "dart:html");
dart.setFieldSignature(html$.CssRotation, () => ({
  __proto__: dart.getFields(html$.CssRotation.__proto__),
  [$angle]: dart.fieldType(html$.CssNumericValue),
  [$x]: dart.fieldType(core.num),
  [$y]: dart.fieldType(core.num),
  [$z]: dart.fieldType(core.num)
}));
dart.registerExtension("CSSRotation", html$.CssRotation);
html$.CssScale = class CssScale extends html$.CssTransformComponent {
  static new(x, y, z) {
    if (z === void 0) z = null;
    if (typeof y == 'number' && typeof x == 'number' && z == null) {
      return html$.CssScale._create_1(x, y);
    }
    if (typeof z == 'number' && typeof y == 'number' && typeof x == 'number') {
      return html$.CssScale._create_2(x, y, z);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1(x, y) {
    return new CSSScale(x, y);
  }
  static _create_2(x, y, z) {
    return new CSSScale(x, y, z);
  }
  get [$x]() {
    return this.x;
  }
  set [$x](value) {
    this.x = value;
  }
  get [$y]() {
    return this.y;
  }
  set [$y](value) {
    this.y = value;
  }
  get [$z]() {
    return this.z;
  }
  set [$z](value) {
    this.z = value;
  }
};
dart.addTypeTests(html$.CssScale);
const x$1 = Symbol("CssScale.x");
const y$1 = Symbol("CssScale.y");
const z$0 = Symbol("CssScale.z");
dart.setLibraryUri(html$.CssScale, "dart:html");
dart.setFieldSignature(html$.CssScale, () => ({
  __proto__: dart.getFields(html$.CssScale.__proto__),
  [$x]: dart.fieldType(core.num),
  [$y]: dart.fieldType(core.num),
  [$z]: dart.fieldType(core.num)
}));
dart.registerExtension("CSSScale", html$.CssScale);
html$.CssSkew = class CssSkew extends html$.CssTransformComponent {
  static new(ax, ay) {
    return html$.CssSkew._create_1(ax, ay);
  }
  static _create_1(ax, ay) {
    return new CSSSkew(ax, ay);
  }
  get [$ax]() {
    return this.ax;
  }
  set [$ax](value) {
    this.ax = value;
  }
  get [$ay]() {
    return this.ay;
  }
  set [$ay](value) {
    this.ay = value;
  }
};
dart.addTypeTests(html$.CssSkew);
const ax = Symbol("CssSkew.ax");
const ay = Symbol("CssSkew.ay");
dart.setLibraryUri(html$.CssSkew, "dart:html");
dart.setFieldSignature(html$.CssSkew, () => ({
  __proto__: dart.getFields(html$.CssSkew.__proto__),
  [$ax]: dart.fieldType(html$.CssNumericValue),
  [$ay]: dart.fieldType(html$.CssNumericValue)
}));
dart.registerExtension("CSSSkew", html$.CssSkew);
const _getPropertyValueHelper = dart.privateName(html$, "_getPropertyValueHelper");
const _browserPropertyName = dart.privateName(html$, "_browserPropertyName");
const _getPropertyValue = dart.privateName(html$, "_getPropertyValue");
const _supportsProperty = dart.privateName(html$, "_supportsProperty");
const _setPropertyHelper = dart.privateName(html$, "_setPropertyHelper");
const _supportedBrowserPropertyName = dart.privateName(html$, "_supportedBrowserPropertyName");
const _background = dart.privateName(html$, "_background");
const _backgroundAttachment = dart.privateName(html$, "_backgroundAttachment");
const _backgroundColor = dart.privateName(html$, "_backgroundColor");
const _backgroundImage = dart.privateName(html$, "_backgroundImage");
const _backgroundPosition = dart.privateName(html$, "_backgroundPosition");
const _backgroundRepeat = dart.privateName(html$, "_backgroundRepeat");
const _border = dart.privateName(html$, "_border");
const _borderBottom = dart.privateName(html$, "_borderBottom");
const _borderBottomColor = dart.privateName(html$, "_borderBottomColor");
const _borderBottomStyle = dart.privateName(html$, "_borderBottomStyle");
const _borderBottomWidth = dart.privateName(html$, "_borderBottomWidth");
const _borderCollapse = dart.privateName(html$, "_borderCollapse");
const _borderColor = dart.privateName(html$, "_borderColor");
const _borderLeft = dart.privateName(html$, "_borderLeft");
const _borderLeftColor = dart.privateName(html$, "_borderLeftColor");
const _borderLeftStyle = dart.privateName(html$, "_borderLeftStyle");
const _borderLeftWidth = dart.privateName(html$, "_borderLeftWidth");
const _borderRight = dart.privateName(html$, "_borderRight");
const _borderRightColor = dart.privateName(html$, "_borderRightColor");
const _borderRightStyle = dart.privateName(html$, "_borderRightStyle");
const _borderRightWidth = dart.privateName(html$, "_borderRightWidth");
const _borderSpacing = dart.privateName(html$, "_borderSpacing");
const _borderStyle = dart.privateName(html$, "_borderStyle");
const _borderTop = dart.privateName(html$, "_borderTop");
const _borderTopColor = dart.privateName(html$, "_borderTopColor");
const _borderTopStyle = dart.privateName(html$, "_borderTopStyle");
const _borderTopWidth = dart.privateName(html$, "_borderTopWidth");
const _borderWidth = dart.privateName(html$, "_borderWidth");
const _bottom = dart.privateName(html$, "_bottom");
const _captionSide = dart.privateName(html$, "_captionSide");
const _clear$0 = dart.privateName(html$, "_clear");
const _clip = dart.privateName(html$, "_clip");
const _color = dart.privateName(html$, "_color");
const _content = dart.privateName(html$, "_content");
const _cursor = dart.privateName(html$, "_cursor");
const _direction = dart.privateName(html$, "_direction");
const _display = dart.privateName(html$, "_display");
const _emptyCells = dart.privateName(html$, "_emptyCells");
const _font = dart.privateName(html$, "_font");
const _fontFamily = dart.privateName(html$, "_fontFamily");
const _fontSize = dart.privateName(html$, "_fontSize");
const _fontStyle = dart.privateName(html$, "_fontStyle");
const _fontVariant = dart.privateName(html$, "_fontVariant");
const _fontWeight = dart.privateName(html$, "_fontWeight");
const _height$ = dart.privateName(html$, "_height");
const _left = dart.privateName(html$, "_left");
const _letterSpacing = dart.privateName(html$, "_letterSpacing");
const _lineHeight = dart.privateName(html$, "_lineHeight");
const _listStyle = dart.privateName(html$, "_listStyle");
const _listStyleImage = dart.privateName(html$, "_listStyleImage");
const _listStylePosition = dart.privateName(html$, "_listStylePosition");
const _listStyleType = dart.privateName(html$, "_listStyleType");
const _margin = dart.privateName(html$, "_margin");
const _marginBottom = dart.privateName(html$, "_marginBottom");
const _marginLeft = dart.privateName(html$, "_marginLeft");
const _marginRight = dart.privateName(html$, "_marginRight");
const _marginTop = dart.privateName(html$, "_marginTop");
const _maxHeight = dart.privateName(html$, "_maxHeight");
const _maxWidth = dart.privateName(html$, "_maxWidth");
const _minHeight = dart.privateName(html$, "_minHeight");
const _minWidth = dart.privateName(html$, "_minWidth");
const _outline = dart.privateName(html$, "_outline");
const _outlineColor = dart.privateName(html$, "_outlineColor");
const _outlineStyle = dart.privateName(html$, "_outlineStyle");
const _outlineWidth = dart.privateName(html$, "_outlineWidth");
const _overflow = dart.privateName(html$, "_overflow");
const _padding = dart.privateName(html$, "_padding");
const _paddingBottom = dart.privateName(html$, "_paddingBottom");
const _paddingLeft = dart.privateName(html$, "_paddingLeft");
const _paddingRight = dart.privateName(html$, "_paddingRight");
const _paddingTop = dart.privateName(html$, "_paddingTop");
const _pageBreakAfter = dart.privateName(html$, "_pageBreakAfter");
const _pageBreakBefore = dart.privateName(html$, "_pageBreakBefore");
const _pageBreakInside = dart.privateName(html$, "_pageBreakInside");
const _position$1 = dart.privateName(html$, "_position");
const _quotes = dart.privateName(html$, "_quotes");
const _right = dart.privateName(html$, "_right");
const _tableLayout = dart.privateName(html$, "_tableLayout");
const _textAlign = dart.privateName(html$, "_textAlign");
const _textDecoration = dart.privateName(html$, "_textDecoration");
const _textIndent = dart.privateName(html$, "_textIndent");
const _textTransform = dart.privateName(html$, "_textTransform");
const _top = dart.privateName(html$, "_top");
const _unicodeBidi = dart.privateName(html$, "_unicodeBidi");
const _verticalAlign = dart.privateName(html$, "_verticalAlign");
const _visibility = dart.privateName(html$, "_visibility");
const _whiteSpace = dart.privateName(html$, "_whiteSpace");
const _width$ = dart.privateName(html$, "_width");
const _wordSpacing = dart.privateName(html$, "_wordSpacing");
const _zIndex = dart.privateName(html$, "_zIndex");
html$.CssStyleDeclarationBase = class CssStyleDeclarationBase extends core.Object {
  get alignContent() {
    return this[$getPropertyValue]("align-content");
  }
  set alignContent(value) {
    this[$setProperty]("align-content", value, "");
  }
  get alignItems() {
    return this[$getPropertyValue]("align-items");
  }
  set alignItems(value) {
    this[$setProperty]("align-items", value, "");
  }
  get alignSelf() {
    return this[$getPropertyValue]("align-self");
  }
  set alignSelf(value) {
    this[$setProperty]("align-self", value, "");
  }
  get animation() {
    return this[$getPropertyValue]("animation");
  }
  set animation(value) {
    this[$setProperty]("animation", value, "");
  }
  get animationDelay() {
    return this[$getPropertyValue]("animation-delay");
  }
  set animationDelay(value) {
    this[$setProperty]("animation-delay", value, "");
  }
  get animationDirection() {
    return this[$getPropertyValue]("animation-direction");
  }
  set animationDirection(value) {
    this[$setProperty]("animation-direction", value, "");
  }
  get animationDuration() {
    return this[$getPropertyValue]("animation-duration");
  }
  set animationDuration(value) {
    this[$setProperty]("animation-duration", value, "");
  }
  get animationFillMode() {
    return this[$getPropertyValue]("animation-fill-mode");
  }
  set animationFillMode(value) {
    this[$setProperty]("animation-fill-mode", value, "");
  }
  get animationIterationCount() {
    return this[$getPropertyValue]("animation-iteration-count");
  }
  set animationIterationCount(value) {
    this[$setProperty]("animation-iteration-count", value, "");
  }
  get animationName() {
    return this[$getPropertyValue]("animation-name");
  }
  set animationName(value) {
    this[$setProperty]("animation-name", value, "");
  }
  get animationPlayState() {
    return this[$getPropertyValue]("animation-play-state");
  }
  set animationPlayState(value) {
    this[$setProperty]("animation-play-state", value, "");
  }
  get animationTimingFunction() {
    return this[$getPropertyValue]("animation-timing-function");
  }
  set animationTimingFunction(value) {
    this[$setProperty]("animation-timing-function", value, "");
  }
  get appRegion() {
    return this[$getPropertyValue]("app-region");
  }
  set appRegion(value) {
    this[$setProperty]("app-region", value, "");
  }
  get appearance() {
    return this[$getPropertyValue]("appearance");
  }
  set appearance(value) {
    this[$setProperty]("appearance", value, "");
  }
  get aspectRatio() {
    return this[$getPropertyValue]("aspect-ratio");
  }
  set aspectRatio(value) {
    this[$setProperty]("aspect-ratio", value, "");
  }
  get backfaceVisibility() {
    return this[$getPropertyValue]("backface-visibility");
  }
  set backfaceVisibility(value) {
    this[$setProperty]("backface-visibility", value, "");
  }
  get background() {
    return this[$getPropertyValue]("background");
  }
  set background(value) {
    this[$setProperty]("background", value, "");
  }
  get backgroundAttachment() {
    return this[$getPropertyValue]("background-attachment");
  }
  set backgroundAttachment(value) {
    this[$setProperty]("background-attachment", value, "");
  }
  get backgroundBlendMode() {
    return this[$getPropertyValue]("background-blend-mode");
  }
  set backgroundBlendMode(value) {
    this[$setProperty]("background-blend-mode", value, "");
  }
  get backgroundClip() {
    return this[$getPropertyValue]("background-clip");
  }
  set backgroundClip(value) {
    this[$setProperty]("background-clip", value, "");
  }
  get backgroundColor() {
    return this[$getPropertyValue]("background-color");
  }
  set backgroundColor(value) {
    this[$setProperty]("background-color", value, "");
  }
  get backgroundComposite() {
    return this[$getPropertyValue]("background-composite");
  }
  set backgroundComposite(value) {
    this[$setProperty]("background-composite", value, "");
  }
  get backgroundImage() {
    return this[$getPropertyValue]("background-image");
  }
  set backgroundImage(value) {
    this[$setProperty]("background-image", value, "");
  }
  get backgroundOrigin() {
    return this[$getPropertyValue]("background-origin");
  }
  set backgroundOrigin(value) {
    this[$setProperty]("background-origin", value, "");
  }
  get backgroundPosition() {
    return this[$getPropertyValue]("background-position");
  }
  set backgroundPosition(value) {
    this[$setProperty]("background-position", value, "");
  }
  get backgroundPositionX() {
    return this[$getPropertyValue]("background-position-x");
  }
  set backgroundPositionX(value) {
    this[$setProperty]("background-position-x", value, "");
  }
  get backgroundPositionY() {
    return this[$getPropertyValue]("background-position-y");
  }
  set backgroundPositionY(value) {
    this[$setProperty]("background-position-y", value, "");
  }
  get backgroundRepeat() {
    return this[$getPropertyValue]("background-repeat");
  }
  set backgroundRepeat(value) {
    this[$setProperty]("background-repeat", value, "");
  }
  get backgroundRepeatX() {
    return this[$getPropertyValue]("background-repeat-x");
  }
  set backgroundRepeatX(value) {
    this[$setProperty]("background-repeat-x", value, "");
  }
  get backgroundRepeatY() {
    return this[$getPropertyValue]("background-repeat-y");
  }
  set backgroundRepeatY(value) {
    this[$setProperty]("background-repeat-y", value, "");
  }
  get backgroundSize() {
    return this[$getPropertyValue]("background-size");
  }
  set backgroundSize(value) {
    this[$setProperty]("background-size", value, "");
  }
  get border() {
    return this[$getPropertyValue]("border");
  }
  set border(value) {
    this[$setProperty]("border", value, "");
  }
  get borderAfter() {
    return this[$getPropertyValue]("border-after");
  }
  set borderAfter(value) {
    this[$setProperty]("border-after", value, "");
  }
  get borderAfterColor() {
    return this[$getPropertyValue]("border-after-color");
  }
  set borderAfterColor(value) {
    this[$setProperty]("border-after-color", value, "");
  }
  get borderAfterStyle() {
    return this[$getPropertyValue]("border-after-style");
  }
  set borderAfterStyle(value) {
    this[$setProperty]("border-after-style", value, "");
  }
  get borderAfterWidth() {
    return this[$getPropertyValue]("border-after-width");
  }
  set borderAfterWidth(value) {
    this[$setProperty]("border-after-width", value, "");
  }
  get borderBefore() {
    return this[$getPropertyValue]("border-before");
  }
  set borderBefore(value) {
    this[$setProperty]("border-before", value, "");
  }
  get borderBeforeColor() {
    return this[$getPropertyValue]("border-before-color");
  }
  set borderBeforeColor(value) {
    this[$setProperty]("border-before-color", value, "");
  }
  get borderBeforeStyle() {
    return this[$getPropertyValue]("border-before-style");
  }
  set borderBeforeStyle(value) {
    this[$setProperty]("border-before-style", value, "");
  }
  get borderBeforeWidth() {
    return this[$getPropertyValue]("border-before-width");
  }
  set borderBeforeWidth(value) {
    this[$setProperty]("border-before-width", value, "");
  }
  get borderBottom() {
    return this[$getPropertyValue]("border-bottom");
  }
  set borderBottom(value) {
    this[$setProperty]("border-bottom", value, "");
  }
  get borderBottomColor() {
    return this[$getPropertyValue]("border-bottom-color");
  }
  set borderBottomColor(value) {
    this[$setProperty]("border-bottom-color", value, "");
  }
  get borderBottomLeftRadius() {
    return this[$getPropertyValue]("border-bottom-left-radius");
  }
  set borderBottomLeftRadius(value) {
    this[$setProperty]("border-bottom-left-radius", value, "");
  }
  get borderBottomRightRadius() {
    return this[$getPropertyValue]("border-bottom-right-radius");
  }
  set borderBottomRightRadius(value) {
    this[$setProperty]("border-bottom-right-radius", value, "");
  }
  get borderBottomStyle() {
    return this[$getPropertyValue]("border-bottom-style");
  }
  set borderBottomStyle(value) {
    this[$setProperty]("border-bottom-style", value, "");
  }
  get borderBottomWidth() {
    return this[$getPropertyValue]("border-bottom-width");
  }
  set borderBottomWidth(value) {
    this[$setProperty]("border-bottom-width", value, "");
  }
  get borderCollapse() {
    return this[$getPropertyValue]("border-collapse");
  }
  set borderCollapse(value) {
    this[$setProperty]("border-collapse", value, "");
  }
  get borderColor() {
    return this[$getPropertyValue]("border-color");
  }
  set borderColor(value) {
    this[$setProperty]("border-color", value, "");
  }
  get borderEnd() {
    return this[$getPropertyValue]("border-end");
  }
  set borderEnd(value) {
    this[$setProperty]("border-end", value, "");
  }
  get borderEndColor() {
    return this[$getPropertyValue]("border-end-color");
  }
  set borderEndColor(value) {
    this[$setProperty]("border-end-color", value, "");
  }
  get borderEndStyle() {
    return this[$getPropertyValue]("border-end-style");
  }
  set borderEndStyle(value) {
    this[$setProperty]("border-end-style", value, "");
  }
  get borderEndWidth() {
    return this[$getPropertyValue]("border-end-width");
  }
  set borderEndWidth(value) {
    this[$setProperty]("border-end-width", value, "");
  }
  get borderFit() {
    return this[$getPropertyValue]("border-fit");
  }
  set borderFit(value) {
    this[$setProperty]("border-fit", value, "");
  }
  get borderHorizontalSpacing() {
    return this[$getPropertyValue]("border-horizontal-spacing");
  }
  set borderHorizontalSpacing(value) {
    this[$setProperty]("border-horizontal-spacing", value, "");
  }
  get borderImage() {
    return this[$getPropertyValue]("border-image");
  }
  set borderImage(value) {
    this[$setProperty]("border-image", value, "");
  }
  get borderImageOutset() {
    return this[$getPropertyValue]("border-image-outset");
  }
  set borderImageOutset(value) {
    this[$setProperty]("border-image-outset", value, "");
  }
  get borderImageRepeat() {
    return this[$getPropertyValue]("border-image-repeat");
  }
  set borderImageRepeat(value) {
    this[$setProperty]("border-image-repeat", value, "");
  }
  get borderImageSlice() {
    return this[$getPropertyValue]("border-image-slice");
  }
  set borderImageSlice(value) {
    this[$setProperty]("border-image-slice", value, "");
  }
  get borderImageSource() {
    return this[$getPropertyValue]("border-image-source");
  }
  set borderImageSource(value) {
    this[$setProperty]("border-image-source", value, "");
  }
  get borderImageWidth() {
    return this[$getPropertyValue]("border-image-width");
  }
  set borderImageWidth(value) {
    this[$setProperty]("border-image-width", value, "");
  }
  get borderLeft() {
    return this[$getPropertyValue]("border-left");
  }
  set borderLeft(value) {
    this[$setProperty]("border-left", value, "");
  }
  get borderLeftColor() {
    return this[$getPropertyValue]("border-left-color");
  }
  set borderLeftColor(value) {
    this[$setProperty]("border-left-color", value, "");
  }
  get borderLeftStyle() {
    return this[$getPropertyValue]("border-left-style");
  }
  set borderLeftStyle(value) {
    this[$setProperty]("border-left-style", value, "");
  }
  get borderLeftWidth() {
    return this[$getPropertyValue]("border-left-width");
  }
  set borderLeftWidth(value) {
    this[$setProperty]("border-left-width", value, "");
  }
  get borderRadius() {
    return this[$getPropertyValue]("border-radius");
  }
  set borderRadius(value) {
    this[$setProperty]("border-radius", value, "");
  }
  get borderRight() {
    return this[$getPropertyValue]("border-right");
  }
  set borderRight(value) {
    this[$setProperty]("border-right", value, "");
  }
  get borderRightColor() {
    return this[$getPropertyValue]("border-right-color");
  }
  set borderRightColor(value) {
    this[$setProperty]("border-right-color", value, "");
  }
  get borderRightStyle() {
    return this[$getPropertyValue]("border-right-style");
  }
  set borderRightStyle(value) {
    this[$setProperty]("border-right-style", value, "");
  }
  get borderRightWidth() {
    return this[$getPropertyValue]("border-right-width");
  }
  set borderRightWidth(value) {
    this[$setProperty]("border-right-width", value, "");
  }
  get borderSpacing() {
    return this[$getPropertyValue]("border-spacing");
  }
  set borderSpacing(value) {
    this[$setProperty]("border-spacing", value, "");
  }
  get borderStart() {
    return this[$getPropertyValue]("border-start");
  }
  set borderStart(value) {
    this[$setProperty]("border-start", value, "");
  }
  get borderStartColor() {
    return this[$getPropertyValue]("border-start-color");
  }
  set borderStartColor(value) {
    this[$setProperty]("border-start-color", value, "");
  }
  get borderStartStyle() {
    return this[$getPropertyValue]("border-start-style");
  }
  set borderStartStyle(value) {
    this[$setProperty]("border-start-style", value, "");
  }
  get borderStartWidth() {
    return this[$getPropertyValue]("border-start-width");
  }
  set borderStartWidth(value) {
    this[$setProperty]("border-start-width", value, "");
  }
  get borderStyle() {
    return this[$getPropertyValue]("border-style");
  }
  set borderStyle(value) {
    this[$setProperty]("border-style", value, "");
  }
  get borderTop() {
    return this[$getPropertyValue]("border-top");
  }
  set borderTop(value) {
    this[$setProperty]("border-top", value, "");
  }
  get borderTopColor() {
    return this[$getPropertyValue]("border-top-color");
  }
  set borderTopColor(value) {
    this[$setProperty]("border-top-color", value, "");
  }
  get borderTopLeftRadius() {
    return this[$getPropertyValue]("border-top-left-radius");
  }
  set borderTopLeftRadius(value) {
    this[$setProperty]("border-top-left-radius", value, "");
  }
  get borderTopRightRadius() {
    return this[$getPropertyValue]("border-top-right-radius");
  }
  set borderTopRightRadius(value) {
    this[$setProperty]("border-top-right-radius", value, "");
  }
  get borderTopStyle() {
    return this[$getPropertyValue]("border-top-style");
  }
  set borderTopStyle(value) {
    this[$setProperty]("border-top-style", value, "");
  }
  get borderTopWidth() {
    return this[$getPropertyValue]("border-top-width");
  }
  set borderTopWidth(value) {
    this[$setProperty]("border-top-width", value, "");
  }
  get borderVerticalSpacing() {
    return this[$getPropertyValue]("border-vertical-spacing");
  }
  set borderVerticalSpacing(value) {
    this[$setProperty]("border-vertical-spacing", value, "");
  }
  get borderWidth() {
    return this[$getPropertyValue]("border-width");
  }
  set borderWidth(value) {
    this[$setProperty]("border-width", value, "");
  }
  get bottom() {
    return this[$getPropertyValue]("bottom");
  }
  set bottom(value) {
    this[$setProperty]("bottom", value, "");
  }
  get boxAlign() {
    return this[$getPropertyValue]("box-align");
  }
  set boxAlign(value) {
    this[$setProperty]("box-align", value, "");
  }
  get boxDecorationBreak() {
    return this[$getPropertyValue]("box-decoration-break");
  }
  set boxDecorationBreak(value) {
    this[$setProperty]("box-decoration-break", value, "");
  }
  get boxDirection() {
    return this[$getPropertyValue]("box-direction");
  }
  set boxDirection(value) {
    this[$setProperty]("box-direction", value, "");
  }
  get boxFlex() {
    return this[$getPropertyValue]("box-flex");
  }
  set boxFlex(value) {
    this[$setProperty]("box-flex", value, "");
  }
  get boxFlexGroup() {
    return this[$getPropertyValue]("box-flex-group");
  }
  set boxFlexGroup(value) {
    this[$setProperty]("box-flex-group", value, "");
  }
  get boxLines() {
    return this[$getPropertyValue]("box-lines");
  }
  set boxLines(value) {
    this[$setProperty]("box-lines", value, "");
  }
  get boxOrdinalGroup() {
    return this[$getPropertyValue]("box-ordinal-group");
  }
  set boxOrdinalGroup(value) {
    this[$setProperty]("box-ordinal-group", value, "");
  }
  get boxOrient() {
    return this[$getPropertyValue]("box-orient");
  }
  set boxOrient(value) {
    this[$setProperty]("box-orient", value, "");
  }
  get boxPack() {
    return this[$getPropertyValue]("box-pack");
  }
  set boxPack(value) {
    this[$setProperty]("box-pack", value, "");
  }
  get boxReflect() {
    return this[$getPropertyValue]("box-reflect");
  }
  set boxReflect(value) {
    this[$setProperty]("box-reflect", value, "");
  }
  get boxShadow() {
    return this[$getPropertyValue]("box-shadow");
  }
  set boxShadow(value) {
    this[$setProperty]("box-shadow", value, "");
  }
  get boxSizing() {
    return this[$getPropertyValue]("box-sizing");
  }
  set boxSizing(value) {
    this[$setProperty]("box-sizing", value, "");
  }
  get captionSide() {
    return this[$getPropertyValue]("caption-side");
  }
  set captionSide(value) {
    this[$setProperty]("caption-side", value, "");
  }
  get clear() {
    return this[$getPropertyValue]("clear");
  }
  set clear(value) {
    this[$setProperty]("clear", value, "");
  }
  get clip() {
    return this[$getPropertyValue]("clip");
  }
  set clip(value) {
    this[$setProperty]("clip", value, "");
  }
  get clipPath() {
    return this[$getPropertyValue]("clip-path");
  }
  set clipPath(value) {
    this[$setProperty]("clip-path", value, "");
  }
  get color() {
    return this[$getPropertyValue]("color");
  }
  set color(value) {
    this[$setProperty]("color", value, "");
  }
  get columnBreakAfter() {
    return this[$getPropertyValue]("column-break-after");
  }
  set columnBreakAfter(value) {
    this[$setProperty]("column-break-after", value, "");
  }
  get columnBreakBefore() {
    return this[$getPropertyValue]("column-break-before");
  }
  set columnBreakBefore(value) {
    this[$setProperty]("column-break-before", value, "");
  }
  get columnBreakInside() {
    return this[$getPropertyValue]("column-break-inside");
  }
  set columnBreakInside(value) {
    this[$setProperty]("column-break-inside", value, "");
  }
  get columnCount() {
    return this[$getPropertyValue]("column-count");
  }
  set columnCount(value) {
    this[$setProperty]("column-count", value, "");
  }
  get columnFill() {
    return this[$getPropertyValue]("column-fill");
  }
  set columnFill(value) {
    this[$setProperty]("column-fill", value, "");
  }
  get columnGap() {
    return this[$getPropertyValue]("column-gap");
  }
  set columnGap(value) {
    this[$setProperty]("column-gap", value, "");
  }
  get columnRule() {
    return this[$getPropertyValue]("column-rule");
  }
  set columnRule(value) {
    this[$setProperty]("column-rule", value, "");
  }
  get columnRuleColor() {
    return this[$getPropertyValue]("column-rule-color");
  }
  set columnRuleColor(value) {
    this[$setProperty]("column-rule-color", value, "");
  }
  get columnRuleStyle() {
    return this[$getPropertyValue]("column-rule-style");
  }
  set columnRuleStyle(value) {
    this[$setProperty]("column-rule-style", value, "");
  }
  get columnRuleWidth() {
    return this[$getPropertyValue]("column-rule-width");
  }
  set columnRuleWidth(value) {
    this[$setProperty]("column-rule-width", value, "");
  }
  get columnSpan() {
    return this[$getPropertyValue]("column-span");
  }
  set columnSpan(value) {
    this[$setProperty]("column-span", value, "");
  }
  get columnWidth() {
    return this[$getPropertyValue]("column-width");
  }
  set columnWidth(value) {
    this[$setProperty]("column-width", value, "");
  }
  get columns() {
    return this[$getPropertyValue]("columns");
  }
  set columns(value) {
    this[$setProperty]("columns", value, "");
  }
  get content() {
    return this[$getPropertyValue]("content");
  }
  set content(value) {
    this[$setProperty]("content", value, "");
  }
  get counterIncrement() {
    return this[$getPropertyValue]("counter-increment");
  }
  set counterIncrement(value) {
    this[$setProperty]("counter-increment", value, "");
  }
  get counterReset() {
    return this[$getPropertyValue]("counter-reset");
  }
  set counterReset(value) {
    this[$setProperty]("counter-reset", value, "");
  }
  get cursor() {
    return this[$getPropertyValue]("cursor");
  }
  set cursor(value) {
    this[$setProperty]("cursor", value, "");
  }
  get direction() {
    return this[$getPropertyValue]("direction");
  }
  set direction(value) {
    this[$setProperty]("direction", value, "");
  }
  get display() {
    return this[$getPropertyValue]("display");
  }
  set display(value) {
    this[$setProperty]("display", value, "");
  }
  get emptyCells() {
    return this[$getPropertyValue]("empty-cells");
  }
  set emptyCells(value) {
    this[$setProperty]("empty-cells", value, "");
  }
  get filter() {
    return this[$getPropertyValue]("filter");
  }
  set filter(value) {
    this[$setProperty]("filter", value, "");
  }
  get flex() {
    return this[$getPropertyValue]("flex");
  }
  set flex(value) {
    this[$setProperty]("flex", value, "");
  }
  get flexBasis() {
    return this[$getPropertyValue]("flex-basis");
  }
  set flexBasis(value) {
    this[$setProperty]("flex-basis", value, "");
  }
  get flexDirection() {
    return this[$getPropertyValue]("flex-direction");
  }
  set flexDirection(value) {
    this[$setProperty]("flex-direction", value, "");
  }
  get flexFlow() {
    return this[$getPropertyValue]("flex-flow");
  }
  set flexFlow(value) {
    this[$setProperty]("flex-flow", value, "");
  }
  get flexGrow() {
    return this[$getPropertyValue]("flex-grow");
  }
  set flexGrow(value) {
    this[$setProperty]("flex-grow", value, "");
  }
  get flexShrink() {
    return this[$getPropertyValue]("flex-shrink");
  }
  set flexShrink(value) {
    this[$setProperty]("flex-shrink", value, "");
  }
  get flexWrap() {
    return this[$getPropertyValue]("flex-wrap");
  }
  set flexWrap(value) {
    this[$setProperty]("flex-wrap", value, "");
  }
  get float() {
    return this[$getPropertyValue]("float");
  }
  set float(value) {
    this[$setProperty]("float", value, "");
  }
  get font() {
    return this[$getPropertyValue]("font");
  }
  set font(value) {
    this[$setProperty]("font", value, "");
  }
  get fontFamily() {
    return this[$getPropertyValue]("font-family");
  }
  set fontFamily(value) {
    this[$setProperty]("font-family", value, "");
  }
  get fontFeatureSettings() {
    return this[$getPropertyValue]("font-feature-settings");
  }
  set fontFeatureSettings(value) {
    this[$setProperty]("font-feature-settings", value, "");
  }
  get fontKerning() {
    return this[$getPropertyValue]("font-kerning");
  }
  set fontKerning(value) {
    this[$setProperty]("font-kerning", value, "");
  }
  get fontSize() {
    return this[$getPropertyValue]("font-size");
  }
  set fontSize(value) {
    this[$setProperty]("font-size", value, "");
  }
  get fontSizeDelta() {
    return this[$getPropertyValue]("font-size-delta");
  }
  set fontSizeDelta(value) {
    this[$setProperty]("font-size-delta", value, "");
  }
  get fontSmoothing() {
    return this[$getPropertyValue]("font-smoothing");
  }
  set fontSmoothing(value) {
    this[$setProperty]("font-smoothing", value, "");
  }
  get fontStretch() {
    return this[$getPropertyValue]("font-stretch");
  }
  set fontStretch(value) {
    this[$setProperty]("font-stretch", value, "");
  }
  get fontStyle() {
    return this[$getPropertyValue]("font-style");
  }
  set fontStyle(value) {
    this[$setProperty]("font-style", value, "");
  }
  get fontVariant() {
    return this[$getPropertyValue]("font-variant");
  }
  set fontVariant(value) {
    this[$setProperty]("font-variant", value, "");
  }
  get fontVariantLigatures() {
    return this[$getPropertyValue]("font-variant-ligatures");
  }
  set fontVariantLigatures(value) {
    this[$setProperty]("font-variant-ligatures", value, "");
  }
  get fontWeight() {
    return this[$getPropertyValue]("font-weight");
  }
  set fontWeight(value) {
    this[$setProperty]("font-weight", value, "");
  }
  get grid() {
    return this[$getPropertyValue]("grid");
  }
  set grid(value) {
    this[$setProperty]("grid", value, "");
  }
  get gridArea() {
    return this[$getPropertyValue]("grid-area");
  }
  set gridArea(value) {
    this[$setProperty]("grid-area", value, "");
  }
  get gridAutoColumns() {
    return this[$getPropertyValue]("grid-auto-columns");
  }
  set gridAutoColumns(value) {
    this[$setProperty]("grid-auto-columns", value, "");
  }
  get gridAutoFlow() {
    return this[$getPropertyValue]("grid-auto-flow");
  }
  set gridAutoFlow(value) {
    this[$setProperty]("grid-auto-flow", value, "");
  }
  get gridAutoRows() {
    return this[$getPropertyValue]("grid-auto-rows");
  }
  set gridAutoRows(value) {
    this[$setProperty]("grid-auto-rows", value, "");
  }
  get gridColumn() {
    return this[$getPropertyValue]("grid-column");
  }
  set gridColumn(value) {
    this[$setProperty]("grid-column", value, "");
  }
  get gridColumnEnd() {
    return this[$getPropertyValue]("grid-column-end");
  }
  set gridColumnEnd(value) {
    this[$setProperty]("grid-column-end", value, "");
  }
  get gridColumnStart() {
    return this[$getPropertyValue]("grid-column-start");
  }
  set gridColumnStart(value) {
    this[$setProperty]("grid-column-start", value, "");
  }
  get gridRow() {
    return this[$getPropertyValue]("grid-row");
  }
  set gridRow(value) {
    this[$setProperty]("grid-row", value, "");
  }
  get gridRowEnd() {
    return this[$getPropertyValue]("grid-row-end");
  }
  set gridRowEnd(value) {
    this[$setProperty]("grid-row-end", value, "");
  }
  get gridRowStart() {
    return this[$getPropertyValue]("grid-row-start");
  }
  set gridRowStart(value) {
    this[$setProperty]("grid-row-start", value, "");
  }
  get gridTemplate() {
    return this[$getPropertyValue]("grid-template");
  }
  set gridTemplate(value) {
    this[$setProperty]("grid-template", value, "");
  }
  get gridTemplateAreas() {
    return this[$getPropertyValue]("grid-template-areas");
  }
  set gridTemplateAreas(value) {
    this[$setProperty]("grid-template-areas", value, "");
  }
  get gridTemplateColumns() {
    return this[$getPropertyValue]("grid-template-columns");
  }
  set gridTemplateColumns(value) {
    this[$setProperty]("grid-template-columns", value, "");
  }
  get gridTemplateRows() {
    return this[$getPropertyValue]("grid-template-rows");
  }
  set gridTemplateRows(value) {
    this[$setProperty]("grid-template-rows", value, "");
  }
  get height() {
    return this[$getPropertyValue]("height");
  }
  set height(value) {
    this[$setProperty]("height", value, "");
  }
  get highlight() {
    return this[$getPropertyValue]("highlight");
  }
  set highlight(value) {
    this[$setProperty]("highlight", value, "");
  }
  get hyphenateCharacter() {
    return this[$getPropertyValue]("hyphenate-character");
  }
  set hyphenateCharacter(value) {
    this[$setProperty]("hyphenate-character", value, "");
  }
  get imageRendering() {
    return this[$getPropertyValue]("image-rendering");
  }
  set imageRendering(value) {
    this[$setProperty]("image-rendering", value, "");
  }
  get isolation() {
    return this[$getPropertyValue]("isolation");
  }
  set isolation(value) {
    this[$setProperty]("isolation", value, "");
  }
  get justifyContent() {
    return this[$getPropertyValue]("justify-content");
  }
  set justifyContent(value) {
    this[$setProperty]("justify-content", value, "");
  }
  get justifySelf() {
    return this[$getPropertyValue]("justify-self");
  }
  set justifySelf(value) {
    this[$setProperty]("justify-self", value, "");
  }
  get left() {
    return this[$getPropertyValue]("left");
  }
  set left(value) {
    this[$setProperty]("left", value, "");
  }
  get letterSpacing() {
    return this[$getPropertyValue]("letter-spacing");
  }
  set letterSpacing(value) {
    this[$setProperty]("letter-spacing", value, "");
  }
  get lineBoxContain() {
    return this[$getPropertyValue]("line-box-contain");
  }
  set lineBoxContain(value) {
    this[$setProperty]("line-box-contain", value, "");
  }
  get lineBreak() {
    return this[$getPropertyValue]("line-break");
  }
  set lineBreak(value) {
    this[$setProperty]("line-break", value, "");
  }
  get lineClamp() {
    return this[$getPropertyValue]("line-clamp");
  }
  set lineClamp(value) {
    this[$setProperty]("line-clamp", value, "");
  }
  get lineHeight() {
    return this[$getPropertyValue]("line-height");
  }
  set lineHeight(value) {
    this[$setProperty]("line-height", value, "");
  }
  get listStyle() {
    return this[$getPropertyValue]("list-style");
  }
  set listStyle(value) {
    this[$setProperty]("list-style", value, "");
  }
  get listStyleImage() {
    return this[$getPropertyValue]("list-style-image");
  }
  set listStyleImage(value) {
    this[$setProperty]("list-style-image", value, "");
  }
  get listStylePosition() {
    return this[$getPropertyValue]("list-style-position");
  }
  set listStylePosition(value) {
    this[$setProperty]("list-style-position", value, "");
  }
  get listStyleType() {
    return this[$getPropertyValue]("list-style-type");
  }
  set listStyleType(value) {
    this[$setProperty]("list-style-type", value, "");
  }
  get locale() {
    return this[$getPropertyValue]("locale");
  }
  set locale(value) {
    this[$setProperty]("locale", value, "");
  }
  get logicalHeight() {
    return this[$getPropertyValue]("logical-height");
  }
  set logicalHeight(value) {
    this[$setProperty]("logical-height", value, "");
  }
  get logicalWidth() {
    return this[$getPropertyValue]("logical-width");
  }
  set logicalWidth(value) {
    this[$setProperty]("logical-width", value, "");
  }
  get margin() {
    return this[$getPropertyValue]("margin");
  }
  set margin(value) {
    this[$setProperty]("margin", value, "");
  }
  get marginAfter() {
    return this[$getPropertyValue]("margin-after");
  }
  set marginAfter(value) {
    this[$setProperty]("margin-after", value, "");
  }
  get marginAfterCollapse() {
    return this[$getPropertyValue]("margin-after-collapse");
  }
  set marginAfterCollapse(value) {
    this[$setProperty]("margin-after-collapse", value, "");
  }
  get marginBefore() {
    return this[$getPropertyValue]("margin-before");
  }
  set marginBefore(value) {
    this[$setProperty]("margin-before", value, "");
  }
  get marginBeforeCollapse() {
    return this[$getPropertyValue]("margin-before-collapse");
  }
  set marginBeforeCollapse(value) {
    this[$setProperty]("margin-before-collapse", value, "");
  }
  get marginBottom() {
    return this[$getPropertyValue]("margin-bottom");
  }
  set marginBottom(value) {
    this[$setProperty]("margin-bottom", value, "");
  }
  get marginBottomCollapse() {
    return this[$getPropertyValue]("margin-bottom-collapse");
  }
  set marginBottomCollapse(value) {
    this[$setProperty]("margin-bottom-collapse", value, "");
  }
  get marginCollapse() {
    return this[$getPropertyValue]("margin-collapse");
  }
  set marginCollapse(value) {
    this[$setProperty]("margin-collapse", value, "");
  }
  get marginEnd() {
    return this[$getPropertyValue]("margin-end");
  }
  set marginEnd(value) {
    this[$setProperty]("margin-end", value, "");
  }
  get marginLeft() {
    return this[$getPropertyValue]("margin-left");
  }
  set marginLeft(value) {
    this[$setProperty]("margin-left", value, "");
  }
  get marginRight() {
    return this[$getPropertyValue]("margin-right");
  }
  set marginRight(value) {
    this[$setProperty]("margin-right", value, "");
  }
  get marginStart() {
    return this[$getPropertyValue]("margin-start");
  }
  set marginStart(value) {
    this[$setProperty]("margin-start", value, "");
  }
  get marginTop() {
    return this[$getPropertyValue]("margin-top");
  }
  set marginTop(value) {
    this[$setProperty]("margin-top", value, "");
  }
  get marginTopCollapse() {
    return this[$getPropertyValue]("margin-top-collapse");
  }
  set marginTopCollapse(value) {
    this[$setProperty]("margin-top-collapse", value, "");
  }
  get mask() {
    return this[$getPropertyValue]("mask");
  }
  set mask(value) {
    this[$setProperty]("mask", value, "");
  }
  get maskBoxImage() {
    return this[$getPropertyValue]("mask-box-image");
  }
  set maskBoxImage(value) {
    this[$setProperty]("mask-box-image", value, "");
  }
  get maskBoxImageOutset() {
    return this[$getPropertyValue]("mask-box-image-outset");
  }
  set maskBoxImageOutset(value) {
    this[$setProperty]("mask-box-image-outset", value, "");
  }
  get maskBoxImageRepeat() {
    return this[$getPropertyValue]("mask-box-image-repeat");
  }
  set maskBoxImageRepeat(value) {
    this[$setProperty]("mask-box-image-repeat", value, "");
  }
  get maskBoxImageSlice() {
    return this[$getPropertyValue]("mask-box-image-slice");
  }
  set maskBoxImageSlice(value) {
    this[$setProperty]("mask-box-image-slice", value, "");
  }
  get maskBoxImageSource() {
    return this[$getPropertyValue]("mask-box-image-source");
  }
  set maskBoxImageSource(value) {
    this[$setProperty]("mask-box-image-source", value, "");
  }
  get maskBoxImageWidth() {
    return this[$getPropertyValue]("mask-box-image-width");
  }
  set maskBoxImageWidth(value) {
    this[$setProperty]("mask-box-image-width", value, "");
  }
  get maskClip() {
    return this[$getPropertyValue]("mask-clip");
  }
  set maskClip(value) {
    this[$setProperty]("mask-clip", value, "");
  }
  get maskComposite() {
    return this[$getPropertyValue]("mask-composite");
  }
  set maskComposite(value) {
    this[$setProperty]("mask-composite", value, "");
  }
  get maskImage() {
    return this[$getPropertyValue]("mask-image");
  }
  set maskImage(value) {
    this[$setProperty]("mask-image", value, "");
  }
  get maskOrigin() {
    return this[$getPropertyValue]("mask-origin");
  }
  set maskOrigin(value) {
    this[$setProperty]("mask-origin", value, "");
  }
  get maskPosition() {
    return this[$getPropertyValue]("mask-position");
  }
  set maskPosition(value) {
    this[$setProperty]("mask-position", value, "");
  }
  get maskPositionX() {
    return this[$getPropertyValue]("mask-position-x");
  }
  set maskPositionX(value) {
    this[$setProperty]("mask-position-x", value, "");
  }
  get maskPositionY() {
    return this[$getPropertyValue]("mask-position-y");
  }
  set maskPositionY(value) {
    this[$setProperty]("mask-position-y", value, "");
  }
  get maskRepeat() {
    return this[$getPropertyValue]("mask-repeat");
  }
  set maskRepeat(value) {
    this[$setProperty]("mask-repeat", value, "");
  }
  get maskRepeatX() {
    return this[$getPropertyValue]("mask-repeat-x");
  }
  set maskRepeatX(value) {
    this[$setProperty]("mask-repeat-x", value, "");
  }
  get maskRepeatY() {
    return this[$getPropertyValue]("mask-repeat-y");
  }
  set maskRepeatY(value) {
    this[$setProperty]("mask-repeat-y", value, "");
  }
  get maskSize() {
    return this[$getPropertyValue]("mask-size");
  }
  set maskSize(value) {
    this[$setProperty]("mask-size", value, "");
  }
  get maskSourceType() {
    return this[$getPropertyValue]("mask-source-type");
  }
  set maskSourceType(value) {
    this[$setProperty]("mask-source-type", value, "");
  }
  get maxHeight() {
    return this[$getPropertyValue]("max-height");
  }
  set maxHeight(value) {
    this[$setProperty]("max-height", value, "");
  }
  get maxLogicalHeight() {
    return this[$getPropertyValue]("max-logical-height");
  }
  set maxLogicalHeight(value) {
    this[$setProperty]("max-logical-height", value, "");
  }
  get maxLogicalWidth() {
    return this[$getPropertyValue]("max-logical-width");
  }
  set maxLogicalWidth(value) {
    this[$setProperty]("max-logical-width", value, "");
  }
  get maxWidth() {
    return this[$getPropertyValue]("max-width");
  }
  set maxWidth(value) {
    this[$setProperty]("max-width", value, "");
  }
  get maxZoom() {
    return this[$getPropertyValue]("max-zoom");
  }
  set maxZoom(value) {
    this[$setProperty]("max-zoom", value, "");
  }
  get minHeight() {
    return this[$getPropertyValue]("min-height");
  }
  set minHeight(value) {
    this[$setProperty]("min-height", value, "");
  }
  get minLogicalHeight() {
    return this[$getPropertyValue]("min-logical-height");
  }
  set minLogicalHeight(value) {
    this[$setProperty]("min-logical-height", value, "");
  }
  get minLogicalWidth() {
    return this[$getPropertyValue]("min-logical-width");
  }
  set minLogicalWidth(value) {
    this[$setProperty]("min-logical-width", value, "");
  }
  get minWidth() {
    return this[$getPropertyValue]("min-width");
  }
  set minWidth(value) {
    this[$setProperty]("min-width", value, "");
  }
  get minZoom() {
    return this[$getPropertyValue]("min-zoom");
  }
  set minZoom(value) {
    this[$setProperty]("min-zoom", value, "");
  }
  get mixBlendMode() {
    return this[$getPropertyValue]("mix-blend-mode");
  }
  set mixBlendMode(value) {
    this[$setProperty]("mix-blend-mode", value, "");
  }
  get objectFit() {
    return this[$getPropertyValue]("object-fit");
  }
  set objectFit(value) {
    this[$setProperty]("object-fit", value, "");
  }
  get objectPosition() {
    return this[$getPropertyValue]("object-position");
  }
  set objectPosition(value) {
    this[$setProperty]("object-position", value, "");
  }
  get opacity() {
    return this[$getPropertyValue]("opacity");
  }
  set opacity(value) {
    this[$setProperty]("opacity", value, "");
  }
  get order() {
    return this[$getPropertyValue]("order");
  }
  set order(value) {
    this[$setProperty]("order", value, "");
  }
  get orientation() {
    return this[$getPropertyValue]("orientation");
  }
  set orientation(value) {
    this[$setProperty]("orientation", value, "");
  }
  get orphans() {
    return this[$getPropertyValue]("orphans");
  }
  set orphans(value) {
    this[$setProperty]("orphans", value, "");
  }
  get outline() {
    return this[$getPropertyValue]("outline");
  }
  set outline(value) {
    this[$setProperty]("outline", value, "");
  }
  get outlineColor() {
    return this[$getPropertyValue]("outline-color");
  }
  set outlineColor(value) {
    this[$setProperty]("outline-color", value, "");
  }
  get outlineOffset() {
    return this[$getPropertyValue]("outline-offset");
  }
  set outlineOffset(value) {
    this[$setProperty]("outline-offset", value, "");
  }
  get outlineStyle() {
    return this[$getPropertyValue]("outline-style");
  }
  set outlineStyle(value) {
    this[$setProperty]("outline-style", value, "");
  }
  get outlineWidth() {
    return this[$getPropertyValue]("outline-width");
  }
  set outlineWidth(value) {
    this[$setProperty]("outline-width", value, "");
  }
  get overflow() {
    return this[$getPropertyValue]("overflow");
  }
  set overflow(value) {
    this[$setProperty]("overflow", value, "");
  }
  get overflowWrap() {
    return this[$getPropertyValue]("overflow-wrap");
  }
  set overflowWrap(value) {
    this[$setProperty]("overflow-wrap", value, "");
  }
  get overflowX() {
    return this[$getPropertyValue]("overflow-x");
  }
  set overflowX(value) {
    this[$setProperty]("overflow-x", value, "");
  }
  get overflowY() {
    return this[$getPropertyValue]("overflow-y");
  }
  set overflowY(value) {
    this[$setProperty]("overflow-y", value, "");
  }
  get padding() {
    return this[$getPropertyValue]("padding");
  }
  set padding(value) {
    this[$setProperty]("padding", value, "");
  }
  get paddingAfter() {
    return this[$getPropertyValue]("padding-after");
  }
  set paddingAfter(value) {
    this[$setProperty]("padding-after", value, "");
  }
  get paddingBefore() {
    return this[$getPropertyValue]("padding-before");
  }
  set paddingBefore(value) {
    this[$setProperty]("padding-before", value, "");
  }
  get paddingBottom() {
    return this[$getPropertyValue]("padding-bottom");
  }
  set paddingBottom(value) {
    this[$setProperty]("padding-bottom", value, "");
  }
  get paddingEnd() {
    return this[$getPropertyValue]("padding-end");
  }
  set paddingEnd(value) {
    this[$setProperty]("padding-end", value, "");
  }
  get paddingLeft() {
    return this[$getPropertyValue]("padding-left");
  }
  set paddingLeft(value) {
    this[$setProperty]("padding-left", value, "");
  }
  get paddingRight() {
    return this[$getPropertyValue]("padding-right");
  }
  set paddingRight(value) {
    this[$setProperty]("padding-right", value, "");
  }
  get paddingStart() {
    return this[$getPropertyValue]("padding-start");
  }
  set paddingStart(value) {
    this[$setProperty]("padding-start", value, "");
  }
  get paddingTop() {
    return this[$getPropertyValue]("padding-top");
  }
  set paddingTop(value) {
    this[$setProperty]("padding-top", value, "");
  }
  get page() {
    return this[$getPropertyValue]("page");
  }
  set page(value) {
    this[$setProperty]("page", value, "");
  }
  get pageBreakAfter() {
    return this[$getPropertyValue]("page-break-after");
  }
  set pageBreakAfter(value) {
    this[$setProperty]("page-break-after", value, "");
  }
  get pageBreakBefore() {
    return this[$getPropertyValue]("page-break-before");
  }
  set pageBreakBefore(value) {
    this[$setProperty]("page-break-before", value, "");
  }
  get pageBreakInside() {
    return this[$getPropertyValue]("page-break-inside");
  }
  set pageBreakInside(value) {
    this[$setProperty]("page-break-inside", value, "");
  }
  get perspective() {
    return this[$getPropertyValue]("perspective");
  }
  set perspective(value) {
    this[$setProperty]("perspective", value, "");
  }
  get perspectiveOrigin() {
    return this[$getPropertyValue]("perspective-origin");
  }
  set perspectiveOrigin(value) {
    this[$setProperty]("perspective-origin", value, "");
  }
  get perspectiveOriginX() {
    return this[$getPropertyValue]("perspective-origin-x");
  }
  set perspectiveOriginX(value) {
    this[$setProperty]("perspective-origin-x", value, "");
  }
  get perspectiveOriginY() {
    return this[$getPropertyValue]("perspective-origin-y");
  }
  set perspectiveOriginY(value) {
    this[$setProperty]("perspective-origin-y", value, "");
  }
  get pointerEvents() {
    return this[$getPropertyValue]("pointer-events");
  }
  set pointerEvents(value) {
    this[$setProperty]("pointer-events", value, "");
  }
  get position() {
    return this[$getPropertyValue]("position");
  }
  set position(value) {
    this[$setProperty]("position", value, "");
  }
  get printColorAdjust() {
    return this[$getPropertyValue]("print-color-adjust");
  }
  set printColorAdjust(value) {
    this[$setProperty]("print-color-adjust", value, "");
  }
  get quotes() {
    return this[$getPropertyValue]("quotes");
  }
  set quotes(value) {
    this[$setProperty]("quotes", value, "");
  }
  get resize() {
    return this[$getPropertyValue]("resize");
  }
  set resize(value) {
    this[$setProperty]("resize", value, "");
  }
  get right() {
    return this[$getPropertyValue]("right");
  }
  set right(value) {
    this[$setProperty]("right", value, "");
  }
  get rtlOrdering() {
    return this[$getPropertyValue]("rtl-ordering");
  }
  set rtlOrdering(value) {
    this[$setProperty]("rtl-ordering", value, "");
  }
  get rubyPosition() {
    return this[$getPropertyValue]("ruby-position");
  }
  set rubyPosition(value) {
    this[$setProperty]("ruby-position", value, "");
  }
  get scrollBehavior() {
    return this[$getPropertyValue]("scroll-behavior");
  }
  set scrollBehavior(value) {
    this[$setProperty]("scroll-behavior", value, "");
  }
  get shapeImageThreshold() {
    return this[$getPropertyValue]("shape-image-threshold");
  }
  set shapeImageThreshold(value) {
    this[$setProperty]("shape-image-threshold", value, "");
  }
  get shapeMargin() {
    return this[$getPropertyValue]("shape-margin");
  }
  set shapeMargin(value) {
    this[$setProperty]("shape-margin", value, "");
  }
  get shapeOutside() {
    return this[$getPropertyValue]("shape-outside");
  }
  set shapeOutside(value) {
    this[$setProperty]("shape-outside", value, "");
  }
  get size() {
    return this[$getPropertyValue]("size");
  }
  set size(value) {
    this[$setProperty]("size", value, "");
  }
  get speak() {
    return this[$getPropertyValue]("speak");
  }
  set speak(value) {
    this[$setProperty]("speak", value, "");
  }
  get src() {
    return this[$getPropertyValue]("src");
  }
  set src(value) {
    this[$setProperty]("src", value, "");
  }
  get tabSize() {
    return this[$getPropertyValue]("tab-size");
  }
  set tabSize(value) {
    this[$setProperty]("tab-size", value, "");
  }
  get tableLayout() {
    return this[$getPropertyValue]("table-layout");
  }
  set tableLayout(value) {
    this[$setProperty]("table-layout", value, "");
  }
  get tapHighlightColor() {
    return this[$getPropertyValue]("tap-highlight-color");
  }
  set tapHighlightColor(value) {
    this[$setProperty]("tap-highlight-color", value, "");
  }
  get textAlign() {
    return this[$getPropertyValue]("text-align");
  }
  set textAlign(value) {
    this[$setProperty]("text-align", value, "");
  }
  get textAlignLast() {
    return this[$getPropertyValue]("text-align-last");
  }
  set textAlignLast(value) {
    this[$setProperty]("text-align-last", value, "");
  }
  get textCombine() {
    return this[$getPropertyValue]("text-combine");
  }
  set textCombine(value) {
    this[$setProperty]("text-combine", value, "");
  }
  get textDecoration() {
    return this[$getPropertyValue]("text-decoration");
  }
  set textDecoration(value) {
    this[$setProperty]("text-decoration", value, "");
  }
  get textDecorationColor() {
    return this[$getPropertyValue]("text-decoration-color");
  }
  set textDecorationColor(value) {
    this[$setProperty]("text-decoration-color", value, "");
  }
  get textDecorationLine() {
    return this[$getPropertyValue]("text-decoration-line");
  }
  set textDecorationLine(value) {
    this[$setProperty]("text-decoration-line", value, "");
  }
  get textDecorationStyle() {
    return this[$getPropertyValue]("text-decoration-style");
  }
  set textDecorationStyle(value) {
    this[$setProperty]("text-decoration-style", value, "");
  }
  get textDecorationsInEffect() {
    return this[$getPropertyValue]("text-decorations-in-effect");
  }
  set textDecorationsInEffect(value) {
    this[$setProperty]("text-decorations-in-effect", value, "");
  }
  get textEmphasis() {
    return this[$getPropertyValue]("text-emphasis");
  }
  set textEmphasis(value) {
    this[$setProperty]("text-emphasis", value, "");
  }
  get textEmphasisColor() {
    return this[$getPropertyValue]("text-emphasis-color");
  }
  set textEmphasisColor(value) {
    this[$setProperty]("text-emphasis-color", value, "");
  }
  get textEmphasisPosition() {
    return this[$getPropertyValue]("text-emphasis-position");
  }
  set textEmphasisPosition(value) {
    this[$setProperty]("text-emphasis-position", value, "");
  }
  get textEmphasisStyle() {
    return this[$getPropertyValue]("text-emphasis-style");
  }
  set textEmphasisStyle(value) {
    this[$setProperty]("text-emphasis-style", value, "");
  }
  get textFillColor() {
    return this[$getPropertyValue]("text-fill-color");
  }
  set textFillColor(value) {
    this[$setProperty]("text-fill-color", value, "");
  }
  get textIndent() {
    return this[$getPropertyValue]("text-indent");
  }
  set textIndent(value) {
    this[$setProperty]("text-indent", value, "");
  }
  get textJustify() {
    return this[$getPropertyValue]("text-justify");
  }
  set textJustify(value) {
    this[$setProperty]("text-justify", value, "");
  }
  get textLineThroughColor() {
    return this[$getPropertyValue]("text-line-through-color");
  }
  set textLineThroughColor(value) {
    this[$setProperty]("text-line-through-color", value, "");
  }
  get textLineThroughMode() {
    return this[$getPropertyValue]("text-line-through-mode");
  }
  set textLineThroughMode(value) {
    this[$setProperty]("text-line-through-mode", value, "");
  }
  get textLineThroughStyle() {
    return this[$getPropertyValue]("text-line-through-style");
  }
  set textLineThroughStyle(value) {
    this[$setProperty]("text-line-through-style", value, "");
  }
  get textLineThroughWidth() {
    return this[$getPropertyValue]("text-line-through-width");
  }
  set textLineThroughWidth(value) {
    this[$setProperty]("text-line-through-width", value, "");
  }
  get textOrientation() {
    return this[$getPropertyValue]("text-orientation");
  }
  set textOrientation(value) {
    this[$setProperty]("text-orientation", value, "");
  }
  get textOverflow() {
    return this[$getPropertyValue]("text-overflow");
  }
  set textOverflow(value) {
    this[$setProperty]("text-overflow", value, "");
  }
  get textOverlineColor() {
    return this[$getPropertyValue]("text-overline-color");
  }
  set textOverlineColor(value) {
    this[$setProperty]("text-overline-color", value, "");
  }
  get textOverlineMode() {
    return this[$getPropertyValue]("text-overline-mode");
  }
  set textOverlineMode(value) {
    this[$setProperty]("text-overline-mode", value, "");
  }
  get textOverlineStyle() {
    return this[$getPropertyValue]("text-overline-style");
  }
  set textOverlineStyle(value) {
    this[$setProperty]("text-overline-style", value, "");
  }
  get textOverlineWidth() {
    return this[$getPropertyValue]("text-overline-width");
  }
  set textOverlineWidth(value) {
    this[$setProperty]("text-overline-width", value, "");
  }
  get textRendering() {
    return this[$getPropertyValue]("text-rendering");
  }
  set textRendering(value) {
    this[$setProperty]("text-rendering", value, "");
  }
  get textSecurity() {
    return this[$getPropertyValue]("text-security");
  }
  set textSecurity(value) {
    this[$setProperty]("text-security", value, "");
  }
  get textShadow() {
    return this[$getPropertyValue]("text-shadow");
  }
  set textShadow(value) {
    this[$setProperty]("text-shadow", value, "");
  }
  get textStroke() {
    return this[$getPropertyValue]("text-stroke");
  }
  set textStroke(value) {
    this[$setProperty]("text-stroke", value, "");
  }
  get textStrokeColor() {
    return this[$getPropertyValue]("text-stroke-color");
  }
  set textStrokeColor(value) {
    this[$setProperty]("text-stroke-color", value, "");
  }
  get textStrokeWidth() {
    return this[$getPropertyValue]("text-stroke-width");
  }
  set textStrokeWidth(value) {
    this[$setProperty]("text-stroke-width", value, "");
  }
  get textTransform() {
    return this[$getPropertyValue]("text-transform");
  }
  set textTransform(value) {
    this[$setProperty]("text-transform", value, "");
  }
  get textUnderlineColor() {
    return this[$getPropertyValue]("text-underline-color");
  }
  set textUnderlineColor(value) {
    this[$setProperty]("text-underline-color", value, "");
  }
  get textUnderlineMode() {
    return this[$getPropertyValue]("text-underline-mode");
  }
  set textUnderlineMode(value) {
    this[$setProperty]("text-underline-mode", value, "");
  }
  get textUnderlinePosition() {
    return this[$getPropertyValue]("text-underline-position");
  }
  set textUnderlinePosition(value) {
    this[$setProperty]("text-underline-position", value, "");
  }
  get textUnderlineStyle() {
    return this[$getPropertyValue]("text-underline-style");
  }
  set textUnderlineStyle(value) {
    this[$setProperty]("text-underline-style", value, "");
  }
  get textUnderlineWidth() {
    return this[$getPropertyValue]("text-underline-width");
  }
  set textUnderlineWidth(value) {
    this[$setProperty]("text-underline-width", value, "");
  }
  get top() {
    return this[$getPropertyValue]("top");
  }
  set top(value) {
    this[$setProperty]("top", value, "");
  }
  get touchAction() {
    return this[$getPropertyValue]("touch-action");
  }
  set touchAction(value) {
    this[$setProperty]("touch-action", value, "");
  }
  get touchActionDelay() {
    return this[$getPropertyValue]("touch-action-delay");
  }
  set touchActionDelay(value) {
    this[$setProperty]("touch-action-delay", value, "");
  }
  get transform() {
    return this[$getPropertyValue]("transform");
  }
  set transform(value) {
    this[$setProperty]("transform", value, "");
  }
  get transformOrigin() {
    return this[$getPropertyValue]("transform-origin");
  }
  set transformOrigin(value) {
    this[$setProperty]("transform-origin", value, "");
  }
  get transformOriginX() {
    return this[$getPropertyValue]("transform-origin-x");
  }
  set transformOriginX(value) {
    this[$setProperty]("transform-origin-x", value, "");
  }
  get transformOriginY() {
    return this[$getPropertyValue]("transform-origin-y");
  }
  set transformOriginY(value) {
    this[$setProperty]("transform-origin-y", value, "");
  }
  get transformOriginZ() {
    return this[$getPropertyValue]("transform-origin-z");
  }
  set transformOriginZ(value) {
    this[$setProperty]("transform-origin-z", value, "");
  }
  get transformStyle() {
    return this[$getPropertyValue]("transform-style");
  }
  set transformStyle(value) {
    this[$setProperty]("transform-style", value, "");
  }
  get transition() {
    return this[$getPropertyValue]("transition");
  }
  set transition(value) {
    this[$setProperty]("transition", value, "");
  }
  get transitionDelay() {
    return this[$getPropertyValue]("transition-delay");
  }
  set transitionDelay(value) {
    this[$setProperty]("transition-delay", value, "");
  }
  get transitionDuration() {
    return this[$getPropertyValue]("transition-duration");
  }
  set transitionDuration(value) {
    this[$setProperty]("transition-duration", value, "");
  }
  get transitionProperty() {
    return this[$getPropertyValue]("transition-property");
  }
  set transitionProperty(value) {
    this[$setProperty]("transition-property", value, "");
  }
  get transitionTimingFunction() {
    return this[$getPropertyValue]("transition-timing-function");
  }
  set transitionTimingFunction(value) {
    this[$setProperty]("transition-timing-function", value, "");
  }
  get unicodeBidi() {
    return this[$getPropertyValue]("unicode-bidi");
  }
  set unicodeBidi(value) {
    this[$setProperty]("unicode-bidi", value, "");
  }
  get unicodeRange() {
    return this[$getPropertyValue]("unicode-range");
  }
  set unicodeRange(value) {
    this[$setProperty]("unicode-range", value, "");
  }
  get userDrag() {
    return this[$getPropertyValue]("user-drag");
  }
  set userDrag(value) {
    this[$setProperty]("user-drag", value, "");
  }
  get userModify() {
    return this[$getPropertyValue]("user-modify");
  }
  set userModify(value) {
    this[$setProperty]("user-modify", value, "");
  }
  get userSelect() {
    return this[$getPropertyValue]("user-select");
  }
  set userSelect(value) {
    this[$setProperty]("user-select", value, "");
  }
  get userZoom() {
    return this[$getPropertyValue]("user-zoom");
  }
  set userZoom(value) {
    this[$setProperty]("user-zoom", value, "");
  }
  get verticalAlign() {
    return this[$getPropertyValue]("vertical-align");
  }
  set verticalAlign(value) {
    this[$setProperty]("vertical-align", value, "");
  }
  get visibility() {
    return this[$getPropertyValue]("visibility");
  }
  set visibility(value) {
    this[$setProperty]("visibility", value, "");
  }
  get whiteSpace() {
    return this[$getPropertyValue]("white-space");
  }
  set whiteSpace(value) {
    this[$setProperty]("white-space", value, "");
  }
  get widows() {
    return this[$getPropertyValue]("widows");
  }
  set widows(value) {
    this[$setProperty]("widows", value, "");
  }
  get width() {
    return this[$getPropertyValue]("width");
  }
  set width(value) {
    this[$setProperty]("width", value, "");
  }
  get willChange() {
    return this[$getPropertyValue]("will-change");
  }
  set willChange(value) {
    this[$setProperty]("will-change", value, "");
  }
  get wordBreak() {
    return this[$getPropertyValue]("word-break");
  }
  set wordBreak(value) {
    this[$setProperty]("word-break", value, "");
  }
  get wordSpacing() {
    return this[$getPropertyValue]("word-spacing");
  }
  set wordSpacing(value) {
    this[$setProperty]("word-spacing", value, "");
  }
  get wordWrap() {
    return this[$getPropertyValue]("word-wrap");
  }
  set wordWrap(value) {
    this[$setProperty]("word-wrap", value, "");
  }
  get wrapFlow() {
    return this[$getPropertyValue]("wrap-flow");
  }
  set wrapFlow(value) {
    this[$setProperty]("wrap-flow", value, "");
  }
  get wrapThrough() {
    return this[$getPropertyValue]("wrap-through");
  }
  set wrapThrough(value) {
    this[$setProperty]("wrap-through", value, "");
  }
  get writingMode() {
    return this[$getPropertyValue]("writing-mode");
  }
  set writingMode(value) {
    this[$setProperty]("writing-mode", value, "");
  }
  get zIndex() {
    return this[$getPropertyValue]("z-index");
  }
  set zIndex(value) {
    this[$setProperty]("z-index", value, "");
  }
  get zoom() {
    return this[$getPropertyValue]("zoom");
  }
  set zoom(value) {
    this[$setProperty]("zoom", value, "");
  }
};
(html$.CssStyleDeclarationBase.new = function() {
}).prototype = html$.CssStyleDeclarationBase.prototype;
dart.addTypeTests(html$.CssStyleDeclarationBase);
dart.setGetterSignature(html$.CssStyleDeclarationBase, () => ({
  __proto__: dart.getGetters(html$.CssStyleDeclarationBase.__proto__),
  alignContent: core.String,
  [$alignContent]: core.String,
  alignItems: core.String,
  [$alignItems]: core.String,
  alignSelf: core.String,
  [$alignSelf]: core.String,
  animation: core.String,
  [$animation]: core.String,
  animationDelay: core.String,
  [$animationDelay]: core.String,
  animationDirection: core.String,
  [$animationDirection]: core.String,
  animationDuration: core.String,
  [$animationDuration]: core.String,
  animationFillMode: core.String,
  [$animationFillMode]: core.String,
  animationIterationCount: core.String,
  [$animationIterationCount]: core.String,
  animationName: core.String,
  [$animationName]: core.String,
  animationPlayState: core.String,
  [$animationPlayState]: core.String,
  animationTimingFunction: core.String,
  [$animationTimingFunction]: core.String,
  appRegion: core.String,
  [$appRegion]: core.String,
  appearance: core.String,
  [$appearance]: core.String,
  aspectRatio: core.String,
  [$aspectRatio]: core.String,
  backfaceVisibility: core.String,
  [$backfaceVisibility]: core.String,
  background: core.String,
  [$background]: core.String,
  backgroundAttachment: core.String,
  [$backgroundAttachment]: core.String,
  backgroundBlendMode: core.String,
  [$backgroundBlendMode]: core.String,
  backgroundClip: core.String,
  [$backgroundClip]: core.String,
  backgroundColor: core.String,
  [$backgroundColor]: core.String,
  backgroundComposite: core.String,
  [$backgroundComposite]: core.String,
  backgroundImage: core.String,
  [$backgroundImage]: core.String,
  backgroundOrigin: core.String,
  [$backgroundOrigin]: core.String,
  backgroundPosition: core.String,
  [$backgroundPosition]: core.String,
  backgroundPositionX: core.String,
  [$backgroundPositionX]: core.String,
  backgroundPositionY: core.String,
  [$backgroundPositionY]: core.String,
  backgroundRepeat: core.String,
  [$backgroundRepeat]: core.String,
  backgroundRepeatX: core.String,
  [$backgroundRepeatX]: core.String,
  backgroundRepeatY: core.String,
  [$backgroundRepeatY]: core.String,
  backgroundSize: core.String,
  [$backgroundSize]: core.String,
  border: core.String,
  [$border]: core.String,
  borderAfter: core.String,
  [$borderAfter]: core.String,
  borderAfterColor: core.String,
  [$borderAfterColor]: core.String,
  borderAfterStyle: core.String,
  [$borderAfterStyle]: core.String,
  borderAfterWidth: core.String,
  [$borderAfterWidth]: core.String,
  borderBefore: core.String,
  [$borderBefore]: core.String,
  borderBeforeColor: core.String,
  [$borderBeforeColor]: core.String,
  borderBeforeStyle: core.String,
  [$borderBeforeStyle]: core.String,
  borderBeforeWidth: core.String,
  [$borderBeforeWidth]: core.String,
  borderBottom: core.String,
  [$borderBottom]: core.String,
  borderBottomColor: core.String,
  [$borderBottomColor]: core.String,
  borderBottomLeftRadius: core.String,
  [$borderBottomLeftRadius]: core.String,
  borderBottomRightRadius: core.String,
  [$borderBottomRightRadius]: core.String,
  borderBottomStyle: core.String,
  [$borderBottomStyle]: core.String,
  borderBottomWidth: core.String,
  [$borderBottomWidth]: core.String,
  borderCollapse: core.String,
  [$borderCollapse]: core.String,
  borderColor: core.String,
  [$borderColor]: core.String,
  borderEnd: core.String,
  [$borderEnd]: core.String,
  borderEndColor: core.String,
  [$borderEndColor]: core.String,
  borderEndStyle: core.String,
  [$borderEndStyle]: core.String,
  borderEndWidth: core.String,
  [$borderEndWidth]: core.String,
  borderFit: core.String,
  [$borderFit]: core.String,
  borderHorizontalSpacing: core.String,
  [$borderHorizontalSpacing]: core.String,
  borderImage: core.String,
  [$borderImage]: core.String,
  borderImageOutset: core.String,
  [$borderImageOutset]: core.String,
  borderImageRepeat: core.String,
  [$borderImageRepeat]: core.String,
  borderImageSlice: core.String,
  [$borderImageSlice]: core.String,
  borderImageSource: core.String,
  [$borderImageSource]: core.String,
  borderImageWidth: core.String,
  [$borderImageWidth]: core.String,
  borderLeft: core.String,
  [$borderLeft]: core.String,
  borderLeftColor: core.String,
  [$borderLeftColor]: core.String,
  borderLeftStyle: core.String,
  [$borderLeftStyle]: core.String,
  borderLeftWidth: core.String,
  [$borderLeftWidth]: core.String,
  borderRadius: core.String,
  [$borderRadius]: core.String,
  borderRight: core.String,
  [$borderRight]: core.String,
  borderRightColor: core.String,
  [$borderRightColor]: core.String,
  borderRightStyle: core.String,
  [$borderRightStyle]: core.String,
  borderRightWidth: core.String,
  [$borderRightWidth]: core.String,
  borderSpacing: core.String,
  [$borderSpacing]: core.String,
  borderStart: core.String,
  [$borderStart]: core.String,
  borderStartColor: core.String,
  [$borderStartColor]: core.String,
  borderStartStyle: core.String,
  [$borderStartStyle]: core.String,
  borderStartWidth: core.String,
  [$borderStartWidth]: core.String,
  borderStyle: core.String,
  [$borderStyle]: core.String,
  borderTop: core.String,
  [$borderTop]: core.String,
  borderTopColor: core.String,
  [$borderTopColor]: core.String,
  borderTopLeftRadius: core.String,
  [$borderTopLeftRadius]: core.String,
  borderTopRightRadius: core.String,
  [$borderTopRightRadius]: core.String,
  borderTopStyle: core.String,
  [$borderTopStyle]: core.String,
  borderTopWidth: core.String,
  [$borderTopWidth]: core.String,
  borderVerticalSpacing: core.String,
  [$borderVerticalSpacing]: core.String,
  borderWidth: core.String,
  [$borderWidth]: core.String,
  bottom: core.String,
  [$bottom]: core.String,
  boxAlign: core.String,
  [$boxAlign]: core.String,
  boxDecorationBreak: core.String,
  [$boxDecorationBreak]: core.String,
  boxDirection: core.String,
  [$boxDirection]: core.String,
  boxFlex: core.String,
  [$boxFlex]: core.String,
  boxFlexGroup: core.String,
  [$boxFlexGroup]: core.String,
  boxLines: core.String,
  [$boxLines]: core.String,
  boxOrdinalGroup: core.String,
  [$boxOrdinalGroup]: core.String,
  boxOrient: core.String,
  [$boxOrient]: core.String,
  boxPack: core.String,
  [$boxPack]: core.String,
  boxReflect: core.String,
  [$boxReflect]: core.String,
  boxShadow: core.String,
  [$boxShadow]: core.String,
  boxSizing: core.String,
  [$boxSizing]: core.String,
  captionSide: core.String,
  [$captionSide]: core.String,
  clear: core.String,
  [$clear]: core.String,
  clip: core.String,
  [$clip]: core.String,
  clipPath: core.String,
  [$clipPath]: core.String,
  color: core.String,
  [$color]: core.String,
  columnBreakAfter: core.String,
  [$columnBreakAfter]: core.String,
  columnBreakBefore: core.String,
  [$columnBreakBefore]: core.String,
  columnBreakInside: core.String,
  [$columnBreakInside]: core.String,
  columnCount: core.String,
  [$columnCount]: core.String,
  columnFill: core.String,
  [$columnFill]: core.String,
  columnGap: core.String,
  [$columnGap]: core.String,
  columnRule: core.String,
  [$columnRule]: core.String,
  columnRuleColor: core.String,
  [$columnRuleColor]: core.String,
  columnRuleStyle: core.String,
  [$columnRuleStyle]: core.String,
  columnRuleWidth: core.String,
  [$columnRuleWidth]: core.String,
  columnSpan: core.String,
  [$columnSpan]: core.String,
  columnWidth: core.String,
  [$columnWidth]: core.String,
  columns: core.String,
  [$columns]: core.String,
  content: core.String,
  [$content]: core.String,
  counterIncrement: core.String,
  [$counterIncrement]: core.String,
  counterReset: core.String,
  [$counterReset]: core.String,
  cursor: core.String,
  [$cursor]: core.String,
  direction: core.String,
  [$direction]: core.String,
  display: core.String,
  [$display]: core.String,
  emptyCells: core.String,
  [$emptyCells]: core.String,
  filter: core.String,
  [$filter]: core.String,
  flex: core.String,
  [$flex]: core.String,
  flexBasis: core.String,
  [$flexBasis]: core.String,
  flexDirection: core.String,
  [$flexDirection]: core.String,
  flexFlow: core.String,
  [$flexFlow]: core.String,
  flexGrow: core.String,
  [$flexGrow]: core.String,
  flexShrink: core.String,
  [$flexShrink]: core.String,
  flexWrap: core.String,
  [$flexWrap]: core.String,
  float: core.String,
  [$float]: core.String,
  font: core.String,
  [$font]: core.String,
  fontFamily: core.String,
  [$fontFamily]: core.String,
  fontFeatureSettings: core.String,
  [$fontFeatureSettings]: core.String,
  fontKerning: core.String,
  [$fontKerning]: core.String,
  fontSize: core.String,
  [$fontSize]: core.String,
  fontSizeDelta: core.String,
  [$fontSizeDelta]: core.String,
  fontSmoothing: core.String,
  [$fontSmoothing]: core.String,
  fontStretch: core.String,
  [$fontStretch]: core.String,
  fontStyle: core.String,
  [$fontStyle]: core.String,
  fontVariant: core.String,
  [$fontVariant]: core.String,
  fontVariantLigatures: core.String,
  [$fontVariantLigatures]: core.String,
  fontWeight: core.String,
  [$fontWeight]: core.String,
  grid: core.String,
  [$grid]: core.String,
  gridArea: core.String,
  [$gridArea]: core.String,
  gridAutoColumns: core.String,
  [$gridAutoColumns]: core.String,
  gridAutoFlow: core.String,
  [$gridAutoFlow]: core.String,
  gridAutoRows: core.String,
  [$gridAutoRows]: core.String,
  gridColumn: core.String,
  [$gridColumn]: core.String,
  gridColumnEnd: core.String,
  [$gridColumnEnd]: core.String,
  gridColumnStart: core.String,
  [$gridColumnStart]: core.String,
  gridRow: core.String,
  [$gridRow]: core.String,
  gridRowEnd: core.String,
  [$gridRowEnd]: core.String,
  gridRowStart: core.String,
  [$gridRowStart]: core.String,
  gridTemplate: core.String,
  [$gridTemplate]: core.String,
  gridTemplateAreas: core.String,
  [$gridTemplateAreas]: core.String,
  gridTemplateColumns: core.String,
  [$gridTemplateColumns]: core.String,
  gridTemplateRows: core.String,
  [$gridTemplateRows]: core.String,
  height: core.String,
  [$height]: core.String,
  highlight: core.String,
  [$highlight]: core.String,
  hyphenateCharacter: core.String,
  [$hyphenateCharacter]: core.String,
  imageRendering: core.String,
  [$imageRendering]: core.String,
  isolation: core.String,
  [$isolation]: core.String,
  justifyContent: core.String,
  [$justifyContent]: core.String,
  justifySelf: core.String,
  [$justifySelf]: core.String,
  left: core.String,
  [$left]: core.String,
  letterSpacing: core.String,
  [$letterSpacing]: core.String,
  lineBoxContain: core.String,
  [$lineBoxContain]: core.String,
  lineBreak: core.String,
  [$lineBreak]: core.String,
  lineClamp: core.String,
  [$lineClamp]: core.String,
  lineHeight: core.String,
  [$lineHeight]: core.String,
  listStyle: core.String,
  [$listStyle]: core.String,
  listStyleImage: core.String,
  [$listStyleImage]: core.String,
  listStylePosition: core.String,
  [$listStylePosition]: core.String,
  listStyleType: core.String,
  [$listStyleType]: core.String,
  locale: core.String,
  [$locale]: core.String,
  logicalHeight: core.String,
  [$logicalHeight]: core.String,
  logicalWidth: core.String,
  [$logicalWidth]: core.String,
  margin: core.String,
  [$margin]: core.String,
  marginAfter: core.String,
  [$marginAfter]: core.String,
  marginAfterCollapse: core.String,
  [$marginAfterCollapse]: core.String,
  marginBefore: core.String,
  [$marginBefore]: core.String,
  marginBeforeCollapse: core.String,
  [$marginBeforeCollapse]: core.String,
  marginBottom: core.String,
  [$marginBottom]: core.String,
  marginBottomCollapse: core.String,
  [$marginBottomCollapse]: core.String,
  marginCollapse: core.String,
  [$marginCollapse]: core.String,
  marginEnd: core.String,
  [$marginEnd]: core.String,
  marginLeft: core.String,
  [$marginLeft]: core.String,
  marginRight: core.String,
  [$marginRight]: core.String,
  marginStart: core.String,
  [$marginStart]: core.String,
  marginTop: core.String,
  [$marginTop]: core.String,
  marginTopCollapse: core.String,
  [$marginTopCollapse]: core.String,
  mask: core.String,
  [$mask]: core.String,
  maskBoxImage: core.String,
  [$maskBoxImage]: core.String,
  maskBoxImageOutset: core.String,
  [$maskBoxImageOutset]: core.String,
  maskBoxImageRepeat: core.String,
  [$maskBoxImageRepeat]: core.String,
  maskBoxImageSlice: core.String,
  [$maskBoxImageSlice]: core.String,
  maskBoxImageSource: core.String,
  [$maskBoxImageSource]: core.String,
  maskBoxImageWidth: core.String,
  [$maskBoxImageWidth]: core.String,
  maskClip: core.String,
  [$maskClip]: core.String,
  maskComposite: core.String,
  [$maskComposite]: core.String,
  maskImage: core.String,
  [$maskImage]: core.String,
  maskOrigin: core.String,
  [$maskOrigin]: core.String,
  maskPosition: core.String,
  [$maskPosition]: core.String,
  maskPositionX: core.String,
  [$maskPositionX]: core.String,
  maskPositionY: core.String,
  [$maskPositionY]: core.String,
  maskRepeat: core.String,
  [$maskRepeat]: core.String,
  maskRepeatX: core.String,
  [$maskRepeatX]: core.String,
  maskRepeatY: core.String,
  [$maskRepeatY]: core.String,
  maskSize: core.String,
  [$maskSize]: core.String,
  maskSourceType: core.String,
  [$maskSourceType]: core.String,
  maxHeight: core.String,
  [$maxHeight]: core.String,
  maxLogicalHeight: core.String,
  [$maxLogicalHeight]: core.String,
  maxLogicalWidth: core.String,
  [$maxLogicalWidth]: core.String,
  maxWidth: core.String,
  [$maxWidth]: core.String,
  maxZoom: core.String,
  [$maxZoom]: core.String,
  minHeight: core.String,
  [$minHeight]: core.String,
  minLogicalHeight: core.String,
  [$minLogicalHeight]: core.String,
  minLogicalWidth: core.String,
  [$minLogicalWidth]: core.String,
  minWidth: core.String,
  [$minWidth]: core.String,
  minZoom: core.String,
  [$minZoom]: core.String,
  mixBlendMode: core.String,
  [$mixBlendMode]: core.String,
  objectFit: core.String,
  [$objectFit]: core.String,
  objectPosition: core.String,
  [$objectPosition]: core.String,
  opacity: core.String,
  [$opacity]: core.String,
  order: core.String,
  [$order]: core.String,
  orientation: core.String,
  [$orientation]: core.String,
  orphans: core.String,
  [$orphans]: core.String,
  outline: core.String,
  [$outline]: core.String,
  outlineColor: core.String,
  [$outlineColor]: core.String,
  outlineOffset: core.String,
  [$outlineOffset]: core.String,
  outlineStyle: core.String,
  [$outlineStyle]: core.String,
  outlineWidth: core.String,
  [$outlineWidth]: core.String,
  overflow: core.String,
  [$overflow]: core.String,
  overflowWrap: core.String,
  [$overflowWrap]: core.String,
  overflowX: core.String,
  [$overflowX]: core.String,
  overflowY: core.String,
  [$overflowY]: core.String,
  padding: core.String,
  [$padding]: core.String,
  paddingAfter: core.String,
  [$paddingAfter]: core.String,
  paddingBefore: core.String,
  [$paddingBefore]: core.String,
  paddingBottom: core.String,
  [$paddingBottom]: core.String,
  paddingEnd: core.String,
  [$paddingEnd]: core.String,
  paddingLeft: core.String,
  [$paddingLeft]: core.String,
  paddingRight: core.String,
  [$paddingRight]: core.String,
  paddingStart: core.String,
  [$paddingStart]: core.String,
  paddingTop: core.String,
  [$paddingTop]: core.String,
  page: core.String,
  [$page]: core.String,
  pageBreakAfter: core.String,
  [$pageBreakAfter]: core.String,
  pageBreakBefore: core.String,
  [$pageBreakBefore]: core.String,
  pageBreakInside: core.String,
  [$pageBreakInside]: core.String,
  perspective: core.String,
  [$perspective]: core.String,
  perspectiveOrigin: core.String,
  [$perspectiveOrigin]: core.String,
  perspectiveOriginX: core.String,
  [$perspectiveOriginX]: core.String,
  perspectiveOriginY: core.String,
  [$perspectiveOriginY]: core.String,
  pointerEvents: core.String,
  [$pointerEvents]: core.String,
  position: core.String,
  [$position]: core.String,
  printColorAdjust: core.String,
  [$printColorAdjust]: core.String,
  quotes: core.String,
  [$quotes]: core.String,
  resize: core.String,
  [$resize]: core.String,
  right: core.String,
  [$right]: core.String,
  rtlOrdering: core.String,
  [$rtlOrdering]: core.String,
  rubyPosition: core.String,
  [$rubyPosition]: core.String,
  scrollBehavior: core.String,
  [$scrollBehavior]: core.String,
  shapeImageThreshold: core.String,
  [$shapeImageThreshold]: core.String,
  shapeMargin: core.String,
  [$shapeMargin]: core.String,
  shapeOutside: core.String,
  [$shapeOutside]: core.String,
  size: core.String,
  [$size]: core.String,
  speak: core.String,
  [$speak]: core.String,
  src: core.String,
  [$src]: core.String,
  tabSize: core.String,
  [$tabSize]: core.String,
  tableLayout: core.String,
  [$tableLayout]: core.String,
  tapHighlightColor: core.String,
  [$tapHighlightColor]: core.String,
  textAlign: core.String,
  [$textAlign]: core.String,
  textAlignLast: core.String,
  [$textAlignLast]: core.String,
  textCombine: core.String,
  [$textCombine]: core.String,
  textDecoration: core.String,
  [$textDecoration]: core.String,
  textDecorationColor: core.String,
  [$textDecorationColor]: core.String,
  textDecorationLine: core.String,
  [$textDecorationLine]: core.String,
  textDecorationStyle: core.String,
  [$textDecorationStyle]: core.String,
  textDecorationsInEffect: core.String,
  [$textDecorationsInEffect]: core.String,
  textEmphasis: core.String,
  [$textEmphasis]: core.String,
  textEmphasisColor: core.String,
  [$textEmphasisColor]: core.String,
  textEmphasisPosition: core.String,
  [$textEmphasisPosition]: core.String,
  textEmphasisStyle: core.String,
  [$textEmphasisStyle]: core.String,
  textFillColor: core.String,
  [$textFillColor]: core.String,
  textIndent: core.String,
  [$textIndent]: core.String,
  textJustify: core.String,
  [$textJustify]: core.String,
  textLineThroughColor: core.String,
  [$textLineThroughColor]: core.String,
  textLineThroughMode: core.String,
  [$textLineThroughMode]: core.String,
  textLineThroughStyle: core.String,
  [$textLineThroughStyle]: core.String,
  textLineThroughWidth: core.String,
  [$textLineThroughWidth]: core.String,
  textOrientation: core.String,
  [$textOrientation]: core.String,
  textOverflow: core.String,
  [$textOverflow]: core.String,
  textOverlineColor: core.String,
  [$textOverlineColor]: core.String,
  textOverlineMode: core.String,
  [$textOverlineMode]: core.String,
  textOverlineStyle: core.String,
  [$textOverlineStyle]: core.String,
  textOverlineWidth: core.String,
  [$textOverlineWidth]: core.String,
  textRendering: core.String,
  [$textRendering]: core.String,
  textSecurity: core.String,
  [$textSecurity]: core.String,
  textShadow: core.String,
  [$textShadow]: core.String,
  textStroke: core.String,
  [$textStroke]: core.String,
  textStrokeColor: core.String,
  [$textStrokeColor]: core.String,
  textStrokeWidth: core.String,
  [$textStrokeWidth]: core.String,
  textTransform: core.String,
  [$textTransform]: core.String,
  textUnderlineColor: core.String,
  [$textUnderlineColor]: core.String,
  textUnderlineMode: core.String,
  [$textUnderlineMode]: core.String,
  textUnderlinePosition: core.String,
  [$textUnderlinePosition]: core.String,
  textUnderlineStyle: core.String,
  [$textUnderlineStyle]: core.String,
  textUnderlineWidth: core.String,
  [$textUnderlineWidth]: core.String,
  top: core.String,
  [$top]: core.String,
  touchAction: core.String,
  [$touchAction]: core.String,
  touchActionDelay: core.String,
  [$touchActionDelay]: core.String,
  transform: core.String,
  [$transform]: core.String,
  transformOrigin: core.String,
  [$transformOrigin]: core.String,
  transformOriginX: core.String,
  [$transformOriginX]: core.String,
  transformOriginY: core.String,
  [$transformOriginY]: core.String,
  transformOriginZ: core.String,
  [$transformOriginZ]: core.String,
  transformStyle: core.String,
  [$transformStyle]: core.String,
  transition: core.String,
  [$transition]: core.String,
  transitionDelay: core.String,
  [$transitionDelay]: core.String,
  transitionDuration: core.String,
  [$transitionDuration]: core.String,
  transitionProperty: core.String,
  [$transitionProperty]: core.String,
  transitionTimingFunction: core.String,
  [$transitionTimingFunction]: core.String,
  unicodeBidi: core.String,
  [$unicodeBidi]: core.String,
  unicodeRange: core.String,
  [$unicodeRange]: core.String,
  userDrag: core.String,
  [$userDrag]: core.String,
  userModify: core.String,
  [$userModify]: core.String,
  userSelect: core.String,
  [$userSelect]: core.String,
  userZoom: core.String,
  [$userZoom]: core.String,
  verticalAlign: core.String,
  [$verticalAlign]: core.String,
  visibility: core.String,
  [$visibility]: core.String,
  whiteSpace: core.String,
  [$whiteSpace]: core.String,
  widows: core.String,
  [$widows]: core.String,
  width: core.String,
  [$width]: core.String,
  willChange: core.String,
  [$willChange]: core.String,
  wordBreak: core.String,
  [$wordBreak]: core.String,
  wordSpacing: core.String,
  [$wordSpacing]: core.String,
  wordWrap: core.String,
  [$wordWrap]: core.String,
  wrapFlow: core.String,
  [$wrapFlow]: core.String,
  wrapThrough: core.String,
  [$wrapThrough]: core.String,
  writingMode: core.String,
  [$writingMode]: core.String,
  zIndex: core.String,
  [$zIndex]: core.String,
  zoom: core.String,
  [$zoom]: core.String
}));
dart.setSetterSignature(html$.CssStyleDeclarationBase, () => ({
  __proto__: dart.getSetters(html$.CssStyleDeclarationBase.__proto__),
  alignContent: core.String,
  [$alignContent]: core.String,
  alignItems: core.String,
  [$alignItems]: core.String,
  alignSelf: core.String,
  [$alignSelf]: core.String,
  animation: core.String,
  [$animation]: core.String,
  animationDelay: core.String,
  [$animationDelay]: core.String,
  animationDirection: core.String,
  [$animationDirection]: core.String,
  animationDuration: core.String,
  [$animationDuration]: core.String,
  animationFillMode: core.String,
  [$animationFillMode]: core.String,
  animationIterationCount: core.String,
  [$animationIterationCount]: core.String,
  animationName: core.String,
  [$animationName]: core.String,
  animationPlayState: core.String,
  [$animationPlayState]: core.String,
  animationTimingFunction: core.String,
  [$animationTimingFunction]: core.String,
  appRegion: core.String,
  [$appRegion]: core.String,
  appearance: core.String,
  [$appearance]: core.String,
  aspectRatio: core.String,
  [$aspectRatio]: core.String,
  backfaceVisibility: core.String,
  [$backfaceVisibility]: core.String,
  background: core.String,
  [$background]: core.String,
  backgroundAttachment: core.String,
  [$backgroundAttachment]: core.String,
  backgroundBlendMode: core.String,
  [$backgroundBlendMode]: core.String,
  backgroundClip: core.String,
  [$backgroundClip]: core.String,
  backgroundColor: core.String,
  [$backgroundColor]: core.String,
  backgroundComposite: core.String,
  [$backgroundComposite]: core.String,
  backgroundImage: core.String,
  [$backgroundImage]: core.String,
  backgroundOrigin: core.String,
  [$backgroundOrigin]: core.String,
  backgroundPosition: core.String,
  [$backgroundPosition]: core.String,
  backgroundPositionX: core.String,
  [$backgroundPositionX]: core.String,
  backgroundPositionY: core.String,
  [$backgroundPositionY]: core.String,
  backgroundRepeat: core.String,
  [$backgroundRepeat]: core.String,
  backgroundRepeatX: core.String,
  [$backgroundRepeatX]: core.String,
  backgroundRepeatY: core.String,
  [$backgroundRepeatY]: core.String,
  backgroundSize: core.String,
  [$backgroundSize]: core.String,
  border: core.String,
  [$border]: core.String,
  borderAfter: core.String,
  [$borderAfter]: core.String,
  borderAfterColor: core.String,
  [$borderAfterColor]: core.String,
  borderAfterStyle: core.String,
  [$borderAfterStyle]: core.String,
  borderAfterWidth: core.String,
  [$borderAfterWidth]: core.String,
  borderBefore: core.String,
  [$borderBefore]: core.String,
  borderBeforeColor: core.String,
  [$borderBeforeColor]: core.String,
  borderBeforeStyle: core.String,
  [$borderBeforeStyle]: core.String,
  borderBeforeWidth: core.String,
  [$borderBeforeWidth]: core.String,
  borderBottom: core.String,
  [$borderBottom]: core.String,
  borderBottomColor: core.String,
  [$borderBottomColor]: core.String,
  borderBottomLeftRadius: core.String,
  [$borderBottomLeftRadius]: core.String,
  borderBottomRightRadius: core.String,
  [$borderBottomRightRadius]: core.String,
  borderBottomStyle: core.String,
  [$borderBottomStyle]: core.String,
  borderBottomWidth: core.String,
  [$borderBottomWidth]: core.String,
  borderCollapse: core.String,
  [$borderCollapse]: core.String,
  borderColor: core.String,
  [$borderColor]: core.String,
  borderEnd: core.String,
  [$borderEnd]: core.String,
  borderEndColor: core.String,
  [$borderEndColor]: core.String,
  borderEndStyle: core.String,
  [$borderEndStyle]: core.String,
  borderEndWidth: core.String,
  [$borderEndWidth]: core.String,
  borderFit: core.String,
  [$borderFit]: core.String,
  borderHorizontalSpacing: core.String,
  [$borderHorizontalSpacing]: core.String,
  borderImage: core.String,
  [$borderImage]: core.String,
  borderImageOutset: core.String,
  [$borderImageOutset]: core.String,
  borderImageRepeat: core.String,
  [$borderImageRepeat]: core.String,
  borderImageSlice: core.String,
  [$borderImageSlice]: core.String,
  borderImageSource: core.String,
  [$borderImageSource]: core.String,
  borderImageWidth: core.String,
  [$borderImageWidth]: core.String,
  borderLeft: core.String,
  [$borderLeft]: core.String,
  borderLeftColor: core.String,
  [$borderLeftColor]: core.String,
  borderLeftStyle: core.String,
  [$borderLeftStyle]: core.String,
  borderLeftWidth: core.String,
  [$borderLeftWidth]: core.String,
  borderRadius: core.String,
  [$borderRadius]: core.String,
  borderRight: core.String,
  [$borderRight]: core.String,
  borderRightColor: core.String,
  [$borderRightColor]: core.String,
  borderRightStyle: core.String,
  [$borderRightStyle]: core.String,
  borderRightWidth: core.String,
  [$borderRightWidth]: core.String,
  borderSpacing: core.String,
  [$borderSpacing]: core.String,
  borderStart: core.String,
  [$borderStart]: core.String,
  borderStartColor: core.String,
  [$borderStartColor]: core.String,
  borderStartStyle: core.String,
  [$borderStartStyle]: core.String,
  borderStartWidth: core.String,
  [$borderStartWidth]: core.String,
  borderStyle: core.String,
  [$borderStyle]: core.String,
  borderTop: core.String,
  [$borderTop]: core.String,
  borderTopColor: core.String,
  [$borderTopColor]: core.String,
  borderTopLeftRadius: core.String,
  [$borderTopLeftRadius]: core.String,
  borderTopRightRadius: core.String,
  [$borderTopRightRadius]: core.String,
  borderTopStyle: core.String,
  [$borderTopStyle]: core.String,
  borderTopWidth: core.String,
  [$borderTopWidth]: core.String,
  borderVerticalSpacing: core.String,
  [$borderVerticalSpacing]: core.String,
  borderWidth: core.String,
  [$borderWidth]: core.String,
  bottom: core.String,
  [$bottom]: core.String,
  boxAlign: core.String,
  [$boxAlign]: core.String,
  boxDecorationBreak: core.String,
  [$boxDecorationBreak]: core.String,
  boxDirection: core.String,
  [$boxDirection]: core.String,
  boxFlex: core.String,
  [$boxFlex]: core.String,
  boxFlexGroup: core.String,
  [$boxFlexGroup]: core.String,
  boxLines: core.String,
  [$boxLines]: core.String,
  boxOrdinalGroup: core.String,
  [$boxOrdinalGroup]: core.String,
  boxOrient: core.String,
  [$boxOrient]: core.String,
  boxPack: core.String,
  [$boxPack]: core.String,
  boxReflect: core.String,
  [$boxReflect]: core.String,
  boxShadow: core.String,
  [$boxShadow]: core.String,
  boxSizing: core.String,
  [$boxSizing]: core.String,
  captionSide: core.String,
  [$captionSide]: core.String,
  clear: core.String,
  [$clear]: core.String,
  clip: core.String,
  [$clip]: core.String,
  clipPath: core.String,
  [$clipPath]: core.String,
  color: core.String,
  [$color]: core.String,
  columnBreakAfter: core.String,
  [$columnBreakAfter]: core.String,
  columnBreakBefore: core.String,
  [$columnBreakBefore]: core.String,
  columnBreakInside: core.String,
  [$columnBreakInside]: core.String,
  columnCount: core.String,
  [$columnCount]: core.String,
  columnFill: core.String,
  [$columnFill]: core.String,
  columnGap: core.String,
  [$columnGap]: core.String,
  columnRule: core.String,
  [$columnRule]: core.String,
  columnRuleColor: core.String,
  [$columnRuleColor]: core.String,
  columnRuleStyle: core.String,
  [$columnRuleStyle]: core.String,
  columnRuleWidth: core.String,
  [$columnRuleWidth]: core.String,
  columnSpan: core.String,
  [$columnSpan]: core.String,
  columnWidth: core.String,
  [$columnWidth]: core.String,
  columns: core.String,
  [$columns]: core.String,
  content: core.String,
  [$content]: core.String,
  counterIncrement: core.String,
  [$counterIncrement]: core.String,
  counterReset: core.String,
  [$counterReset]: core.String,
  cursor: core.String,
  [$cursor]: core.String,
  direction: core.String,
  [$direction]: core.String,
  display: core.String,
  [$display]: core.String,
  emptyCells: core.String,
  [$emptyCells]: core.String,
  filter: core.String,
  [$filter]: core.String,
  flex: core.String,
  [$flex]: core.String,
  flexBasis: core.String,
  [$flexBasis]: core.String,
  flexDirection: core.String,
  [$flexDirection]: core.String,
  flexFlow: core.String,
  [$flexFlow]: core.String,
  flexGrow: core.String,
  [$flexGrow]: core.String,
  flexShrink: core.String,
  [$flexShrink]: core.String,
  flexWrap: core.String,
  [$flexWrap]: core.String,
  float: core.String,
  [$float]: core.String,
  font: core.String,
  [$font]: core.String,
  fontFamily: core.String,
  [$fontFamily]: core.String,
  fontFeatureSettings: core.String,
  [$fontFeatureSettings]: core.String,
  fontKerning: core.String,
  [$fontKerning]: core.String,
  fontSize: core.String,
  [$fontSize]: core.String,
  fontSizeDelta: core.String,
  [$fontSizeDelta]: core.String,
  fontSmoothing: core.String,
  [$fontSmoothing]: core.String,
  fontStretch: core.String,
  [$fontStretch]: core.String,
  fontStyle: core.String,
  [$fontStyle]: core.String,
  fontVariant: core.String,
  [$fontVariant]: core.String,
  fontVariantLigatures: core.String,
  [$fontVariantLigatures]: core.String,
  fontWeight: core.String,
  [$fontWeight]: core.String,
  grid: core.String,
  [$grid]: core.String,
  gridArea: core.String,
  [$gridArea]: core.String,
  gridAutoColumns: core.String,
  [$gridAutoColumns]: core.String,
  gridAutoFlow: core.String,
  [$gridAutoFlow]: core.String,
  gridAutoRows: core.String,
  [$gridAutoRows]: core.String,
  gridColumn: core.String,
  [$gridColumn]: core.String,
  gridColumnEnd: core.String,
  [$gridColumnEnd]: core.String,
  gridColumnStart: core.String,
  [$gridColumnStart]: core.String,
  gridRow: core.String,
  [$gridRow]: core.String,
  gridRowEnd: core.String,
  [$gridRowEnd]: core.String,
  gridRowStart: core.String,
  [$gridRowStart]: core.String,
  gridTemplate: core.String,
  [$gridTemplate]: core.String,
  gridTemplateAreas: core.String,
  [$gridTemplateAreas]: core.String,
  gridTemplateColumns: core.String,
  [$gridTemplateColumns]: core.String,
  gridTemplateRows: core.String,
  [$gridTemplateRows]: core.String,
  height: core.String,
  [$height]: core.String,
  highlight: core.String,
  [$highlight]: core.String,
  hyphenateCharacter: core.String,
  [$hyphenateCharacter]: core.String,
  imageRendering: core.String,
  [$imageRendering]: core.String,
  isolation: core.String,
  [$isolation]: core.String,
  justifyContent: core.String,
  [$justifyContent]: core.String,
  justifySelf: core.String,
  [$justifySelf]: core.String,
  left: core.String,
  [$left]: core.String,
  letterSpacing: core.String,
  [$letterSpacing]: core.String,
  lineBoxContain: core.String,
  [$lineBoxContain]: core.String,
  lineBreak: core.String,
  [$lineBreak]: core.String,
  lineClamp: core.String,
  [$lineClamp]: core.String,
  lineHeight: core.String,
  [$lineHeight]: core.String,
  listStyle: core.String,
  [$listStyle]: core.String,
  listStyleImage: core.String,
  [$listStyleImage]: core.String,
  listStylePosition: core.String,
  [$listStylePosition]: core.String,
  listStyleType: core.String,
  [$listStyleType]: core.String,
  locale: core.String,
  [$locale]: core.String,
  logicalHeight: core.String,
  [$logicalHeight]: core.String,
  logicalWidth: core.String,
  [$logicalWidth]: core.String,
  margin: core.String,
  [$margin]: core.String,
  marginAfter: core.String,
  [$marginAfter]: core.String,
  marginAfterCollapse: core.String,
  [$marginAfterCollapse]: core.String,
  marginBefore: core.String,
  [$marginBefore]: core.String,
  marginBeforeCollapse: core.String,
  [$marginBeforeCollapse]: core.String,
  marginBottom: core.String,
  [$marginBottom]: core.String,
  marginBottomCollapse: core.String,
  [$marginBottomCollapse]: core.String,
  marginCollapse: core.String,
  [$marginCollapse]: core.String,
  marginEnd: core.String,
  [$marginEnd]: core.String,
  marginLeft: core.String,
  [$marginLeft]: core.String,
  marginRight: core.String,
  [$marginRight]: core.String,
  marginStart: core.String,
  [$marginStart]: core.String,
  marginTop: core.String,
  [$marginTop]: core.String,
  marginTopCollapse: core.String,
  [$marginTopCollapse]: core.String,
  mask: core.String,
  [$mask]: core.String,
  maskBoxImage: core.String,
  [$maskBoxImage]: core.String,
  maskBoxImageOutset: core.String,
  [$maskBoxImageOutset]: core.String,
  maskBoxImageRepeat: core.String,
  [$maskBoxImageRepeat]: core.String,
  maskBoxImageSlice: core.String,
  [$maskBoxImageSlice]: core.String,
  maskBoxImageSource: core.String,
  [$maskBoxImageSource]: core.String,
  maskBoxImageWidth: core.String,
  [$maskBoxImageWidth]: core.String,
  maskClip: core.String,
  [$maskClip]: core.String,
  maskComposite: core.String,
  [$maskComposite]: core.String,
  maskImage: core.String,
  [$maskImage]: core.String,
  maskOrigin: core.String,
  [$maskOrigin]: core.String,
  maskPosition: core.String,
  [$maskPosition]: core.String,
  maskPositionX: core.String,
  [$maskPositionX]: core.String,
  maskPositionY: core.String,
  [$maskPositionY]: core.String,
  maskRepeat: core.String,
  [$maskRepeat]: core.String,
  maskRepeatX: core.String,
  [$maskRepeatX]: core.String,
  maskRepeatY: core.String,
  [$maskRepeatY]: core.String,
  maskSize: core.String,
  [$maskSize]: core.String,
  maskSourceType: core.String,
  [$maskSourceType]: core.String,
  maxHeight: core.String,
  [$maxHeight]: core.String,
  maxLogicalHeight: core.String,
  [$maxLogicalHeight]: core.String,
  maxLogicalWidth: core.String,
  [$maxLogicalWidth]: core.String,
  maxWidth: core.String,
  [$maxWidth]: core.String,
  maxZoom: core.String,
  [$maxZoom]: core.String,
  minHeight: core.String,
  [$minHeight]: core.String,
  minLogicalHeight: core.String,
  [$minLogicalHeight]: core.String,
  minLogicalWidth: core.String,
  [$minLogicalWidth]: core.String,
  minWidth: core.String,
  [$minWidth]: core.String,
  minZoom: core.String,
  [$minZoom]: core.String,
  mixBlendMode: core.String,
  [$mixBlendMode]: core.String,
  objectFit: core.String,
  [$objectFit]: core.String,
  objectPosition: core.String,
  [$objectPosition]: core.String,
  opacity: core.String,
  [$opacity]: core.String,
  order: core.String,
  [$order]: core.String,
  orientation: core.String,
  [$orientation]: core.String,
  orphans: core.String,
  [$orphans]: core.String,
  outline: core.String,
  [$outline]: core.String,
  outlineColor: core.String,
  [$outlineColor]: core.String,
  outlineOffset: core.String,
  [$outlineOffset]: core.String,
  outlineStyle: core.String,
  [$outlineStyle]: core.String,
  outlineWidth: core.String,
  [$outlineWidth]: core.String,
  overflow: core.String,
  [$overflow]: core.String,
  overflowWrap: core.String,
  [$overflowWrap]: core.String,
  overflowX: core.String,
  [$overflowX]: core.String,
  overflowY: core.String,
  [$overflowY]: core.String,
  padding: core.String,
  [$padding]: core.String,
  paddingAfter: core.String,
  [$paddingAfter]: core.String,
  paddingBefore: core.String,
  [$paddingBefore]: core.String,
  paddingBottom: core.String,
  [$paddingBottom]: core.String,
  paddingEnd: core.String,
  [$paddingEnd]: core.String,
  paddingLeft: core.String,
  [$paddingLeft]: core.String,
  paddingRight: core.String,
  [$paddingRight]: core.String,
  paddingStart: core.String,
  [$paddingStart]: core.String,
  paddingTop: core.String,
  [$paddingTop]: core.String,
  page: core.String,
  [$page]: core.String,
  pageBreakAfter: core.String,
  [$pageBreakAfter]: core.String,
  pageBreakBefore: core.String,
  [$pageBreakBefore]: core.String,
  pageBreakInside: core.String,
  [$pageBreakInside]: core.String,
  perspective: core.String,
  [$perspective]: core.String,
  perspectiveOrigin: core.String,
  [$perspectiveOrigin]: core.String,
  perspectiveOriginX: core.String,
  [$perspectiveOriginX]: core.String,
  perspectiveOriginY: core.String,
  [$perspectiveOriginY]: core.String,
  pointerEvents: core.String,
  [$pointerEvents]: core.String,
  position: core.String,
  [$position]: core.String,
  printColorAdjust: core.String,
  [$printColorAdjust]: core.String,
  quotes: core.String,
  [$quotes]: core.String,
  resize: core.String,
  [$resize]: core.String,
  right: core.String,
  [$right]: core.String,
  rtlOrdering: core.String,
  [$rtlOrdering]: core.String,
  rubyPosition: core.String,
  [$rubyPosition]: core.String,
  scrollBehavior: core.String,
  [$scrollBehavior]: core.String,
  shapeImageThreshold: core.String,
  [$shapeImageThreshold]: core.String,
  shapeMargin: core.String,
  [$shapeMargin]: core.String,
  shapeOutside: core.String,
  [$shapeOutside]: core.String,
  size: core.String,
  [$size]: core.String,
  speak: core.String,
  [$speak]: core.String,
  src: core.String,
  [$src]: core.String,
  tabSize: core.String,
  [$tabSize]: core.String,
  tableLayout: core.String,
  [$tableLayout]: core.String,
  tapHighlightColor: core.String,
  [$tapHighlightColor]: core.String,
  textAlign: core.String,
  [$textAlign]: core.String,
  textAlignLast: core.String,
  [$textAlignLast]: core.String,
  textCombine: core.String,
  [$textCombine]: core.String,
  textDecoration: core.String,
  [$textDecoration]: core.String,
  textDecorationColor: core.String,
  [$textDecorationColor]: core.String,
  textDecorationLine: core.String,
  [$textDecorationLine]: core.String,
  textDecorationStyle: core.String,
  [$textDecorationStyle]: core.String,
  textDecorationsInEffect: core.String,
  [$textDecorationsInEffect]: core.String,
  textEmphasis: core.String,
  [$textEmphasis]: core.String,
  textEmphasisColor: core.String,
  [$textEmphasisColor]: core.String,
  textEmphasisPosition: core.String,
  [$textEmphasisPosition]: core.String,
  textEmphasisStyle: core.String,
  [$textEmphasisStyle]: core.String,
  textFillColor: core.String,
  [$textFillColor]: core.String,
  textIndent: core.String,
  [$textIndent]: core.String,
  textJustify: core.String,
  [$textJustify]: core.String,
  textLineThroughColor: core.String,
  [$textLineThroughColor]: core.String,
  textLineThroughMode: core.String,
  [$textLineThroughMode]: core.String,
  textLineThroughStyle: core.String,
  [$textLineThroughStyle]: core.String,
  textLineThroughWidth: core.String,
  [$textLineThroughWidth]: core.String,
  textOrientation: core.String,
  [$textOrientation]: core.String,
  textOverflow: core.String,
  [$textOverflow]: core.String,
  textOverlineColor: core.String,
  [$textOverlineColor]: core.String,
  textOverlineMode: core.String,
  [$textOverlineMode]: core.String,
  textOverlineStyle: core.String,
  [$textOverlineStyle]: core.String,
  textOverlineWidth: core.String,
  [$textOverlineWidth]: core.String,
  textRendering: core.String,
  [$textRendering]: core.String,
  textSecurity: core.String,
  [$textSecurity]: core.String,
  textShadow: core.String,
  [$textShadow]: core.String,
  textStroke: core.String,
  [$textStroke]: core.String,
  textStrokeColor: core.String,
  [$textStrokeColor]: core.String,
  textStrokeWidth: core.String,
  [$textStrokeWidth]: core.String,
  textTransform: core.String,
  [$textTransform]: core.String,
  textUnderlineColor: core.String,
  [$textUnderlineColor]: core.String,
  textUnderlineMode: core.String,
  [$textUnderlineMode]: core.String,
  textUnderlinePosition: core.String,
  [$textUnderlinePosition]: core.String,
  textUnderlineStyle: core.String,
  [$textUnderlineStyle]: core.String,
  textUnderlineWidth: core.String,
  [$textUnderlineWidth]: core.String,
  top: core.String,
  [$top]: core.String,
  touchAction: core.String,
  [$touchAction]: core.String,
  touchActionDelay: core.String,
  [$touchActionDelay]: core.String,
  transform: core.String,
  [$transform]: core.String,
  transformOrigin: core.String,
  [$transformOrigin]: core.String,
  transformOriginX: core.String,
  [$transformOriginX]: core.String,
  transformOriginY: core.String,
  [$transformOriginY]: core.String,
  transformOriginZ: core.String,
  [$transformOriginZ]: core.String,
  transformStyle: core.String,
  [$transformStyle]: core.String,
  transition: core.String,
  [$transition]: core.String,
  transitionDelay: core.String,
  [$transitionDelay]: core.String,
  transitionDuration: core.String,
  [$transitionDuration]: core.String,
  transitionProperty: core.String,
  [$transitionProperty]: core.String,
  transitionTimingFunction: core.String,
  [$transitionTimingFunction]: core.String,
  unicodeBidi: core.String,
  [$unicodeBidi]: core.String,
  unicodeRange: core.String,
  [$unicodeRange]: core.String,
  userDrag: core.String,
  [$userDrag]: core.String,
  userModify: core.String,
  [$userModify]: core.String,
  userSelect: core.String,
  [$userSelect]: core.String,
  userZoom: core.String,
  [$userZoom]: core.String,
  verticalAlign: core.String,
  [$verticalAlign]: core.String,
  visibility: core.String,
  [$visibility]: core.String,
  whiteSpace: core.String,
  [$whiteSpace]: core.String,
  widows: core.String,
  [$widows]: core.String,
  width: core.String,
  [$width]: core.String,
  willChange: core.String,
  [$willChange]: core.String,
  wordBreak: core.String,
  [$wordBreak]: core.String,
  wordSpacing: core.String,
  [$wordSpacing]: core.String,
  wordWrap: core.String,
  [$wordWrap]: core.String,
  wrapFlow: core.String,
  [$wrapFlow]: core.String,
  wrapThrough: core.String,
  [$wrapThrough]: core.String,
  writingMode: core.String,
  [$writingMode]: core.String,
  zIndex: core.String,
  [$zIndex]: core.String,
  zoom: core.String,
  [$zoom]: core.String
}));
dart.setLibraryUri(html$.CssStyleDeclarationBase, "dart:html");
dart.defineExtensionAccessors(html$.CssStyleDeclarationBase, [
  'alignContent',
  'alignItems',
  'alignSelf',
  'animation',
  'animationDelay',
  'animationDirection',
  'animationDuration',
  'animationFillMode',
  'animationIterationCount',
  'animationName',
  'animationPlayState',
  'animationTimingFunction',
  'appRegion',
  'appearance',
  'aspectRatio',
  'backfaceVisibility',
  'background',
  'backgroundAttachment',
  'backgroundBlendMode',
  'backgroundClip',
  'backgroundColor',
  'backgroundComposite',
  'backgroundImage',
  'backgroundOrigin',
  'backgroundPosition',
  'backgroundPositionX',
  'backgroundPositionY',
  'backgroundRepeat',
  'backgroundRepeatX',
  'backgroundRepeatY',
  'backgroundSize',
  'border',
  'borderAfter',
  'borderAfterColor',
  'borderAfterStyle',
  'borderAfterWidth',
  'borderBefore',
  'borderBeforeColor',
  'borderBeforeStyle',
  'borderBeforeWidth',
  'borderBottom',
  'borderBottomColor',
  'borderBottomLeftRadius',
  'borderBottomRightRadius',
  'borderBottomStyle',
  'borderBottomWidth',
  'borderCollapse',
  'borderColor',
  'borderEnd',
  'borderEndColor',
  'borderEndStyle',
  'borderEndWidth',
  'borderFit',
  'borderHorizontalSpacing',
  'borderImage',
  'borderImageOutset',
  'borderImageRepeat',
  'borderImageSlice',
  'borderImageSource',
  'borderImageWidth',
  'borderLeft',
  'borderLeftColor',
  'borderLeftStyle',
  'borderLeftWidth',
  'borderRadius',
  'borderRight',
  'borderRightColor',
  'borderRightStyle',
  'borderRightWidth',
  'borderSpacing',
  'borderStart',
  'borderStartColor',
  'borderStartStyle',
  'borderStartWidth',
  'borderStyle',
  'borderTop',
  'borderTopColor',
  'borderTopLeftRadius',
  'borderTopRightRadius',
  'borderTopStyle',
  'borderTopWidth',
  'borderVerticalSpacing',
  'borderWidth',
  'bottom',
  'boxAlign',
  'boxDecorationBreak',
  'boxDirection',
  'boxFlex',
  'boxFlexGroup',
  'boxLines',
  'boxOrdinalGroup',
  'boxOrient',
  'boxPack',
  'boxReflect',
  'boxShadow',
  'boxSizing',
  'captionSide',
  'clear',
  'clip',
  'clipPath',
  'color',
  'columnBreakAfter',
  'columnBreakBefore',
  'columnBreakInside',
  'columnCount',
  'columnFill',
  'columnGap',
  'columnRule',
  'columnRuleColor',
  'columnRuleStyle',
  'columnRuleWidth',
  'columnSpan',
  'columnWidth',
  'columns',
  'content',
  'counterIncrement',
  'counterReset',
  'cursor',
  'direction',
  'display',
  'emptyCells',
  'filter',
  'flex',
  'flexBasis',
  'flexDirection',
  'flexFlow',
  'flexGrow',
  'flexShrink',
  'flexWrap',
  'float',
  'font',
  'fontFamily',
  'fontFeatureSettings',
  'fontKerning',
  'fontSize',
  'fontSizeDelta',
  'fontSmoothing',
  'fontStretch',
  'fontStyle',
  'fontVariant',
  'fontVariantLigatures',
  'fontWeight',
  'grid',
  'gridArea',
  'gridAutoColumns',
  'gridAutoFlow',
  'gridAutoRows',
  'gridColumn',
  'gridColumnEnd',
  'gridColumnStart',
  'gridRow',
  'gridRowEnd',
  'gridRowStart',
  'gridTemplate',
  'gridTemplateAreas',
  'gridTemplateColumns',
  'gridTemplateRows',
  'height',
  'highlight',
  'hyphenateCharacter',
  'imageRendering',
  'isolation',
  'justifyContent',
  'justifySelf',
  'left',
  'letterSpacing',
  'lineBoxContain',
  'lineBreak',
  'lineClamp',
  'lineHeight',
  'listStyle',
  'listStyleImage',
  'listStylePosition',
  'listStyleType',
  'locale',
  'logicalHeight',
  'logicalWidth',
  'margin',
  'marginAfter',
  'marginAfterCollapse',
  'marginBefore',
  'marginBeforeCollapse',
  'marginBottom',
  'marginBottomCollapse',
  'marginCollapse',
  'marginEnd',
  'marginLeft',
  'marginRight',
  'marginStart',
  'marginTop',
  'marginTopCollapse',
  'mask',
  'maskBoxImage',
  'maskBoxImageOutset',
  'maskBoxImageRepeat',
  'maskBoxImageSlice',
  'maskBoxImageSource',
  'maskBoxImageWidth',
  'maskClip',
  'maskComposite',
  'maskImage',
  'maskOrigin',
  'maskPosition',
  'maskPositionX',
  'maskPositionY',
  'maskRepeat',
  'maskRepeatX',
  'maskRepeatY',
  'maskSize',
  'maskSourceType',
  'maxHeight',
  'maxLogicalHeight',
  'maxLogicalWidth',
  'maxWidth',
  'maxZoom',
  'minHeight',
  'minLogicalHeight',
  'minLogicalWidth',
  'minWidth',
  'minZoom',
  'mixBlendMode',
  'objectFit',
  'objectPosition',
  'opacity',
  'order',
  'orientation',
  'orphans',
  'outline',
  'outlineColor',
  'outlineOffset',
  'outlineStyle',
  'outlineWidth',
  'overflow',
  'overflowWrap',
  'overflowX',
  'overflowY',
  'padding',
  'paddingAfter',
  'paddingBefore',
  'paddingBottom',
  'paddingEnd',
  'paddingLeft',
  'paddingRight',
  'paddingStart',
  'paddingTop',
  'page',
  'pageBreakAfter',
  'pageBreakBefore',
  'pageBreakInside',
  'perspective',
  'perspectiveOrigin',
  'perspectiveOriginX',
  'perspectiveOriginY',
  'pointerEvents',
  'position',
  'printColorAdjust',
  'quotes',
  'resize',
  'right',
  'rtlOrdering',
  'rubyPosition',
  'scrollBehavior',
  'shapeImageThreshold',
  'shapeMargin',
  'shapeOutside',
  'size',
  'speak',
  'src',
  'tabSize',
  'tableLayout',
  'tapHighlightColor',
  'textAlign',
  'textAlignLast',
  'textCombine',
  'textDecoration',
  'textDecorationColor',
  'textDecorationLine',
  'textDecorationStyle',
  'textDecorationsInEffect',
  'textEmphasis',
  'textEmphasisColor',
  'textEmphasisPosition',
  'textEmphasisStyle',
  'textFillColor',
  'textIndent',
  'textJustify',
  'textLineThroughColor',
  'textLineThroughMode',
  'textLineThroughStyle',
  'textLineThroughWidth',
  'textOrientation',
  'textOverflow',
  'textOverlineColor',
  'textOverlineMode',
  'textOverlineStyle',
  'textOverlineWidth',
  'textRendering',
  'textSecurity',
  'textShadow',
  'textStroke',
  'textStrokeColor',
  'textStrokeWidth',
  'textTransform',
  'textUnderlineColor',
  'textUnderlineMode',
  'textUnderlinePosition',
  'textUnderlineStyle',
  'textUnderlineWidth',
  'top',
  'touchAction',
  'touchActionDelay',
  'transform',
  'transformOrigin',
  'transformOriginX',
  'transformOriginY',
  'transformOriginZ',
  'transformStyle',
  'transition',
  'transitionDelay',
  'transitionDuration',
  'transitionProperty',
  'transitionTimingFunction',
  'unicodeBidi',
  'unicodeRange',
  'userDrag',
  'userModify',
  'userSelect',
  'userZoom',
  'verticalAlign',
  'visibility',
  'whiteSpace',
  'widows',
  'width',
  'willChange',
  'wordBreak',
  'wordSpacing',
  'wordWrap',
  'wrapFlow',
  'wrapThrough',
  'writingMode',
  'zIndex',
  'zoom'
]);
const Interceptor_CssStyleDeclarationBase$ = class Interceptor_CssStyleDeclarationBase extends _interceptors.Interceptor {};
(Interceptor_CssStyleDeclarationBase$.new = function() {
  Interceptor_CssStyleDeclarationBase$.__proto__.new.call(this);
}).prototype = Interceptor_CssStyleDeclarationBase$.prototype;
dart.applyMixin(Interceptor_CssStyleDeclarationBase$, html$.CssStyleDeclarationBase);
html$.CssStyleDeclaration = class CssStyleDeclaration extends Interceptor_CssStyleDeclarationBase$ {
  static new() {
    return html$.CssStyleDeclaration.css("");
  }
  static css(css) {
    let style = html$.DivElement.new().style;
    style.cssText = css;
    return style;
  }
  [$getPropertyValue](propertyName) {
    let propValue = this[_getPropertyValueHelper](propertyName);
    return propValue != null ? propValue : "";
  }
  [_getPropertyValueHelper](propertyName) {
    return this[_getPropertyValue](this[_browserPropertyName](propertyName));
  }
  [$supportsProperty](propertyName) {
    return dart.test(this[_supportsProperty](propertyName)) || dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(dart.str(html_common.Device.cssPrefix) + dart.str(propertyName))));
  }
  [_supportsProperty](propertyName) {
    return propertyName in this;
  }
  [$setProperty](propertyName, value, priority) {
    if (priority === void 0) priority = null;
    return this[_setPropertyHelper](this[_browserPropertyName](propertyName), value, priority);
  }
  [_browserPropertyName](propertyName) {
    let name = html$.CssStyleDeclaration._readCache(propertyName);
    if (typeof name == 'string') return name;
    name = this[_supportedBrowserPropertyName](propertyName);
    html$.CssStyleDeclaration._writeCache(propertyName, name);
    return name;
  }
  [_supportedBrowserPropertyName](propertyName) {
    if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
      return propertyName;
    }
    let prefixed = dart.str(html_common.Device.cssPrefix) + dart.str(propertyName);
    if (dart.test(this[_supportsProperty](prefixed))) {
      return prefixed;
    }
    return propertyName;
  }
  static _readCache(key) {
    return html$.CssStyleDeclaration._propertyCache[key];
  }
  static _writeCache(key, value) {
    html$.CssStyleDeclaration._propertyCache[key] = value;
  }
  static _camelCase(hyphenated) {
    let replacedMs = hyphenated.replace(/^-ms-/, "ms-");
    return replacedMs.replace(/-([\da-z])/ig, function(_, letter) {
      return letter.toUpperCase();
    });
  }
  [_setPropertyHelper](propertyName, value, priority) {
    if (priority === void 0) priority = null;
    if (value == null) value = "";
    if (priority == null) priority = "";
    this.setProperty(propertyName, value, priority);
  }
  static get supportsTransitions() {
    return html$.document.body.style[$supportsProperty]("transition");
  }
  get [$cssFloat]() {
    return this.cssFloat;
  }
  set [$cssFloat](value) {
    this.cssFloat = value;
  }
  get [$cssText]() {
    return this.cssText;
  }
  set [$cssText](value) {
    this.cssText = value;
  }
  get [$length]() {
    return this.length;
  }
  get [$parentRule]() {
    return this.parentRule;
  }
  [$getPropertyPriority](...args) {
    return this.getPropertyPriority.apply(this, args);
  }
  [_getPropertyValue](...args) {
    return this.getPropertyValue.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$removeProperty](...args) {
    return this.removeProperty.apply(this, args);
  }
  get [$background]() {
    return this[_background];
  }
  set [$background](value) {
    this[_background] = value == null ? "" : value;
  }
  get [_background]() {
    return this.background;
  }
  set [_background](value) {
    this.background = value;
  }
  get [$backgroundAttachment]() {
    return this[_backgroundAttachment];
  }
  set [$backgroundAttachment](value) {
    this[_backgroundAttachment] = value == null ? "" : value;
  }
  get [_backgroundAttachment]() {
    return this.backgroundAttachment;
  }
  set [_backgroundAttachment](value) {
    this.backgroundAttachment = value;
  }
  get [$backgroundColor]() {
    return this[_backgroundColor];
  }
  set [$backgroundColor](value) {
    this[_backgroundColor] = value == null ? "" : value;
  }
  get [_backgroundColor]() {
    return this.backgroundColor;
  }
  set [_backgroundColor](value) {
    this.backgroundColor = value;
  }
  get [$backgroundImage]() {
    return this[_backgroundImage];
  }
  set [$backgroundImage](value) {
    this[_backgroundImage] = value == null ? "" : value;
  }
  get [_backgroundImage]() {
    return this.backgroundImage;
  }
  set [_backgroundImage](value) {
    this.backgroundImage = value;
  }
  get [$backgroundPosition]() {
    return this[_backgroundPosition];
  }
  set [$backgroundPosition](value) {
    this[_backgroundPosition] = value == null ? "" : value;
  }
  get [_backgroundPosition]() {
    return this.backgroundPosition;
  }
  set [_backgroundPosition](value) {
    this.backgroundPosition = value;
  }
  get [$backgroundRepeat]() {
    return this[_backgroundRepeat];
  }
  set [$backgroundRepeat](value) {
    this[_backgroundRepeat] = value == null ? "" : value;
  }
  get [_backgroundRepeat]() {
    return this.backgroundRepeat;
  }
  set [_backgroundRepeat](value) {
    this.backgroundRepeat = value;
  }
  get [$border]() {
    return this[_border];
  }
  set [$border](value) {
    this[_border] = value == null ? "" : value;
  }
  get [_border]() {
    return this.border;
  }
  set [_border](value) {
    this.border = value;
  }
  get [$borderBottom]() {
    return this[_borderBottom];
  }
  set [$borderBottom](value) {
    this[_borderBottom] = value == null ? "" : value;
  }
  get [_borderBottom]() {
    return this.borderBottom;
  }
  set [_borderBottom](value) {
    this.borderBottom = value;
  }
  get [$borderBottomColor]() {
    return this[_borderBottomColor];
  }
  set [$borderBottomColor](value) {
    this[_borderBottomColor] = value == null ? "" : value;
  }
  get [_borderBottomColor]() {
    return this.borderBottomColor;
  }
  set [_borderBottomColor](value) {
    this.borderBottomColor = value;
  }
  get [$borderBottomStyle]() {
    return this[_borderBottomStyle];
  }
  set [$borderBottomStyle](value) {
    this[_borderBottomStyle] = value == null ? "" : value;
  }
  get [_borderBottomStyle]() {
    return this.borderBottomStyle;
  }
  set [_borderBottomStyle](value) {
    this.borderBottomStyle = value;
  }
  get [$borderBottomWidth]() {
    return this[_borderBottomWidth];
  }
  set [$borderBottomWidth](value) {
    this[_borderBottomWidth] = value == null ? "" : value;
  }
  get [_borderBottomWidth]() {
    return this.borderBottomWidth;
  }
  set [_borderBottomWidth](value) {
    this.borderBottomWidth = value;
  }
  get [$borderCollapse]() {
    return this[_borderCollapse];
  }
  set [$borderCollapse](value) {
    this[_borderCollapse] = value == null ? "" : value;
  }
  get [_borderCollapse]() {
    return this.borderCollapse;
  }
  set [_borderCollapse](value) {
    this.borderCollapse = value;
  }
  get [$borderColor]() {
    return this[_borderColor];
  }
  set [$borderColor](value) {
    this[_borderColor] = value == null ? "" : value;
  }
  get [_borderColor]() {
    return this.borderColor;
  }
  set [_borderColor](value) {
    this.borderColor = value;
  }
  get [$borderLeft]() {
    return this[_borderLeft];
  }
  set [$borderLeft](value) {
    this[_borderLeft] = value == null ? "" : value;
  }
  get [_borderLeft]() {
    return this.borderLeft;
  }
  set [_borderLeft](value) {
    this.borderLeft = value;
  }
  get [$borderLeftColor]() {
    return this[_borderLeftColor];
  }
  set [$borderLeftColor](value) {
    this[_borderLeftColor] = value == null ? "" : value;
  }
  get [_borderLeftColor]() {
    return this.borderLeftColor;
  }
  set [_borderLeftColor](value) {
    this.borderLeftColor = value;
  }
  get [$borderLeftStyle]() {
    return this[_borderLeftStyle];
  }
  set [$borderLeftStyle](value) {
    this[_borderLeftStyle] = value == null ? "" : value;
  }
  get [_borderLeftStyle]() {
    return this.borderLeftStyle;
  }
  set [_borderLeftStyle](value) {
    this.borderLeftStyle = value;
  }
  get [$borderLeftWidth]() {
    return this[_borderLeftWidth];
  }
  set [$borderLeftWidth](value) {
    this[_borderLeftWidth] = value == null ? "" : value;
  }
  get [_borderLeftWidth]() {
    return this.borderLeftWidth;
  }
  set [_borderLeftWidth](value) {
    this.borderLeftWidth = value;
  }
  get [$borderRight]() {
    return this[_borderRight];
  }
  set [$borderRight](value) {
    this[_borderRight] = value == null ? "" : value;
  }
  get [_borderRight]() {
    return this.borderRight;
  }
  set [_borderRight](value) {
    this.borderRight = value;
  }
  get [$borderRightColor]() {
    return this[_borderRightColor];
  }
  set [$borderRightColor](value) {
    this[_borderRightColor] = value == null ? "" : value;
  }
  get [_borderRightColor]() {
    return this.borderRightColor;
  }
  set [_borderRightColor](value) {
    this.borderRightColor = value;
  }
  get [$borderRightStyle]() {
    return this[_borderRightStyle];
  }
  set [$borderRightStyle](value) {
    this[_borderRightStyle] = value == null ? "" : value;
  }
  get [_borderRightStyle]() {
    return this.borderRightStyle;
  }
  set [_borderRightStyle](value) {
    this.borderRightStyle = value;
  }
  get [$borderRightWidth]() {
    return this[_borderRightWidth];
  }
  set [$borderRightWidth](value) {
    this[_borderRightWidth] = value == null ? "" : value;
  }
  get [_borderRightWidth]() {
    return this.borderRightWidth;
  }
  set [_borderRightWidth](value) {
    this.borderRightWidth = value;
  }
  get [$borderSpacing]() {
    return this[_borderSpacing];
  }
  set [$borderSpacing](value) {
    this[_borderSpacing] = value == null ? "" : value;
  }
  get [_borderSpacing]() {
    return this.borderSpacing;
  }
  set [_borderSpacing](value) {
    this.borderSpacing = value;
  }
  get [$borderStyle]() {
    return this[_borderStyle];
  }
  set [$borderStyle](value) {
    this[_borderStyle] = value == null ? "" : value;
  }
  get [_borderStyle]() {
    return this.borderStyle;
  }
  set [_borderStyle](value) {
    this.borderStyle = value;
  }
  get [$borderTop]() {
    return this[_borderTop];
  }
  set [$borderTop](value) {
    this[_borderTop] = value == null ? "" : value;
  }
  get [_borderTop]() {
    return this.borderTop;
  }
  set [_borderTop](value) {
    this.borderTop = value;
  }
  get [$borderTopColor]() {
    return this[_borderTopColor];
  }
  set [$borderTopColor](value) {
    this[_borderTopColor] = value == null ? "" : value;
  }
  get [_borderTopColor]() {
    return this.borderTopColor;
  }
  set [_borderTopColor](value) {
    this.borderTopColor = value;
  }
  get [$borderTopStyle]() {
    return this[_borderTopStyle];
  }
  set [$borderTopStyle](value) {
    this[_borderTopStyle] = value == null ? "" : value;
  }
  get [_borderTopStyle]() {
    return this.borderTopStyle;
  }
  set [_borderTopStyle](value) {
    this.borderTopStyle = value;
  }
  get [$borderTopWidth]() {
    return this[_borderTopWidth];
  }
  set [$borderTopWidth](value) {
    this[_borderTopWidth] = value == null ? "" : value;
  }
  get [_borderTopWidth]() {
    return this.borderTopWidth;
  }
  set [_borderTopWidth](value) {
    this.borderTopWidth = value;
  }
  get [$borderWidth]() {
    return this[_borderWidth];
  }
  set [$borderWidth](value) {
    this[_borderWidth] = value == null ? "" : value;
  }
  get [_borderWidth]() {
    return this.borderWidth;
  }
  set [_borderWidth](value) {
    this.borderWidth = value;
  }
  get [$bottom]() {
    return this[_bottom];
  }
  set [$bottom](value) {
    this[_bottom] = value == null ? "" : value;
  }
  get [_bottom]() {
    return this.bottom;
  }
  set [_bottom](value) {
    this.bottom = value;
  }
  get [$captionSide]() {
    return this[_captionSide];
  }
  set [$captionSide](value) {
    this[_captionSide] = value == null ? "" : value;
  }
  get [_captionSide]() {
    return this.captionSide;
  }
  set [_captionSide](value) {
    this.captionSide = value;
  }
  get [$clear]() {
    return this[_clear$0];
  }
  set [$clear](value) {
    this[_clear$0] = value == null ? "" : value;
  }
  get [_clear$0]() {
    return this.clear;
  }
  set [_clear$0](value) {
    this.clear = value;
  }
  get [$clip]() {
    return this[_clip];
  }
  set [$clip](value) {
    this[_clip] = value == null ? "" : value;
  }
  get [_clip]() {
    return this.clip;
  }
  set [_clip](value) {
    this.clip = value;
  }
  get [$color]() {
    return this[_color];
  }
  set [$color](value) {
    this[_color] = value == null ? "" : value;
  }
  get [_color]() {
    return this.color;
  }
  set [_color](value) {
    this.color = value;
  }
  get [$content]() {
    return this[_content];
  }
  set [$content](value) {
    this[_content] = value == null ? "" : value;
  }
  get [_content]() {
    return this.content;
  }
  set [_content](value) {
    this.content = value;
  }
  get [$cursor]() {
    return this[_cursor];
  }
  set [$cursor](value) {
    this[_cursor] = value == null ? "" : value;
  }
  get [_cursor]() {
    return this.cursor;
  }
  set [_cursor](value) {
    this.cursor = value;
  }
  get [$direction]() {
    return this[_direction];
  }
  set [$direction](value) {
    this[_direction] = value == null ? "" : value;
  }
  get [_direction]() {
    return this.direction;
  }
  set [_direction](value) {
    this.direction = value;
  }
  get [$display]() {
    return this[_display];
  }
  set [$display](value) {
    this[_display] = value == null ? "" : value;
  }
  get [_display]() {
    return this.display;
  }
  set [_display](value) {
    this.display = value;
  }
  get [$emptyCells]() {
    return this[_emptyCells];
  }
  set [$emptyCells](value) {
    this[_emptyCells] = value == null ? "" : value;
  }
  get [_emptyCells]() {
    return this.emptyCells;
  }
  set [_emptyCells](value) {
    this.emptyCells = value;
  }
  get [$font]() {
    return this[_font];
  }
  set [$font](value) {
    this[_font] = value == null ? "" : value;
  }
  get [_font]() {
    return this.font;
  }
  set [_font](value) {
    this.font = value;
  }
  get [$fontFamily]() {
    return this[_fontFamily];
  }
  set [$fontFamily](value) {
    this[_fontFamily] = value == null ? "" : value;
  }
  get [_fontFamily]() {
    return this.fontFamily;
  }
  set [_fontFamily](value) {
    this.fontFamily = value;
  }
  get [$fontSize]() {
    return this[_fontSize];
  }
  set [$fontSize](value) {
    this[_fontSize] = value == null ? "" : value;
  }
  get [_fontSize]() {
    return this.fontSize;
  }
  set [_fontSize](value) {
    this.fontSize = value;
  }
  get [$fontStyle]() {
    return this[_fontStyle];
  }
  set [$fontStyle](value) {
    this[_fontStyle] = value == null ? "" : value;
  }
  get [_fontStyle]() {
    return this.fontStyle;
  }
  set [_fontStyle](value) {
    this.fontStyle = value;
  }
  get [$fontVariant]() {
    return this[_fontVariant];
  }
  set [$fontVariant](value) {
    this[_fontVariant] = value == null ? "" : value;
  }
  get [_fontVariant]() {
    return this.fontVariant;
  }
  set [_fontVariant](value) {
    this.fontVariant = value;
  }
  get [$fontWeight]() {
    return this[_fontWeight];
  }
  set [$fontWeight](value) {
    this[_fontWeight] = value == null ? "" : value;
  }
  get [_fontWeight]() {
    return this.fontWeight;
  }
  set [_fontWeight](value) {
    this.fontWeight = value;
  }
  get [$height]() {
    return this[_height$];
  }
  set [$height](value) {
    this[_height$] = value == null ? "" : value;
  }
  get [_height$]() {
    return this.height;
  }
  set [_height$](value) {
    this.height = value;
  }
  get [$left]() {
    return this[_left];
  }
  set [$left](value) {
    this[_left] = value == null ? "" : value;
  }
  get [_left]() {
    return this.left;
  }
  set [_left](value) {
    this.left = value;
  }
  get [$letterSpacing]() {
    return this[_letterSpacing];
  }
  set [$letterSpacing](value) {
    this[_letterSpacing] = value == null ? "" : value;
  }
  get [_letterSpacing]() {
    return this.letterSpacing;
  }
  set [_letterSpacing](value) {
    this.letterSpacing = value;
  }
  get [$lineHeight]() {
    return this[_lineHeight];
  }
  set [$lineHeight](value) {
    this[_lineHeight] = value == null ? "" : value;
  }
  get [_lineHeight]() {
    return this.lineHeight;
  }
  set [_lineHeight](value) {
    this.lineHeight = value;
  }
  get [$listStyle]() {
    return this[_listStyle];
  }
  set [$listStyle](value) {
    this[_listStyle] = value == null ? "" : value;
  }
  get [_listStyle]() {
    return this.listStyle;
  }
  set [_listStyle](value) {
    this.listStyle = value;
  }
  get [$listStyleImage]() {
    return this[_listStyleImage];
  }
  set [$listStyleImage](value) {
    this[_listStyleImage] = value == null ? "" : value;
  }
  get [_listStyleImage]() {
    return this.listStyleImage;
  }
  set [_listStyleImage](value) {
    this.listStyleImage = value;
  }
  get [$listStylePosition]() {
    return this[_listStylePosition];
  }
  set [$listStylePosition](value) {
    this[_listStylePosition] = value == null ? "" : value;
  }
  get [_listStylePosition]() {
    return this.listStylePosition;
  }
  set [_listStylePosition](value) {
    this.listStylePosition = value;
  }
  get [$listStyleType]() {
    return this[_listStyleType];
  }
  set [$listStyleType](value) {
    this[_listStyleType] = value == null ? "" : value;
  }
  get [_listStyleType]() {
    return this.listStyleType;
  }
  set [_listStyleType](value) {
    this.listStyleType = value;
  }
  get [$margin]() {
    return this[_margin];
  }
  set [$margin](value) {
    this[_margin] = value == null ? "" : value;
  }
  get [_margin]() {
    return this.margin;
  }
  set [_margin](value) {
    this.margin = value;
  }
  get [$marginBottom]() {
    return this[_marginBottom];
  }
  set [$marginBottom](value) {
    this[_marginBottom] = value == null ? "" : value;
  }
  get [_marginBottom]() {
    return this.marginBottom;
  }
  set [_marginBottom](value) {
    this.marginBottom = value;
  }
  get [$marginLeft]() {
    return this[_marginLeft];
  }
  set [$marginLeft](value) {
    this[_marginLeft] = value == null ? "" : value;
  }
  get [_marginLeft]() {
    return this.marginLeft;
  }
  set [_marginLeft](value) {
    this.marginLeft = value;
  }
  get [$marginRight]() {
    return this[_marginRight];
  }
  set [$marginRight](value) {
    this[_marginRight] = value == null ? "" : value;
  }
  get [_marginRight]() {
    return this.marginRight;
  }
  set [_marginRight](value) {
    this.marginRight = value;
  }
  get [$marginTop]() {
    return this[_marginTop];
  }
  set [$marginTop](value) {
    this[_marginTop] = value == null ? "" : value;
  }
  get [_marginTop]() {
    return this.marginTop;
  }
  set [_marginTop](value) {
    this.marginTop = value;
  }
  get [$maxHeight]() {
    return this[_maxHeight];
  }
  set [$maxHeight](value) {
    this[_maxHeight] = value == null ? "" : value;
  }
  get [_maxHeight]() {
    return this.maxHeight;
  }
  set [_maxHeight](value) {
    this.maxHeight = value;
  }
  get [$maxWidth]() {
    return this[_maxWidth];
  }
  set [$maxWidth](value) {
    this[_maxWidth] = value == null ? "" : value;
  }
  get [_maxWidth]() {
    return this.maxWidth;
  }
  set [_maxWidth](value) {
    this.maxWidth = value;
  }
  get [$minHeight]() {
    return this[_minHeight];
  }
  set [$minHeight](value) {
    this[_minHeight] = value == null ? "" : value;
  }
  get [_minHeight]() {
    return this.minHeight;
  }
  set [_minHeight](value) {
    this.minHeight = value;
  }
  get [$minWidth]() {
    return this[_minWidth];
  }
  set [$minWidth](value) {
    this[_minWidth] = value == null ? "" : value;
  }
  get [_minWidth]() {
    return this.minWidth;
  }
  set [_minWidth](value) {
    this.minWidth = value;
  }
  get [$outline]() {
    return this[_outline];
  }
  set [$outline](value) {
    this[_outline] = value == null ? "" : value;
  }
  get [_outline]() {
    return this.outline;
  }
  set [_outline](value) {
    this.outline = value;
  }
  get [$outlineColor]() {
    return this[_outlineColor];
  }
  set [$outlineColor](value) {
    this[_outlineColor] = value == null ? "" : value;
  }
  get [_outlineColor]() {
    return this.outlineColor;
  }
  set [_outlineColor](value) {
    this.outlineColor = value;
  }
  get [$outlineStyle]() {
    return this[_outlineStyle];
  }
  set [$outlineStyle](value) {
    this[_outlineStyle] = value == null ? "" : value;
  }
  get [_outlineStyle]() {
    return this.outlineStyle;
  }
  set [_outlineStyle](value) {
    this.outlineStyle = value;
  }
  get [$outlineWidth]() {
    return this[_outlineWidth];
  }
  set [$outlineWidth](value) {
    this[_outlineWidth] = value == null ? "" : value;
  }
  get [_outlineWidth]() {
    return this.outlineWidth;
  }
  set [_outlineWidth](value) {
    this.outlineWidth = value;
  }
  get [$overflow]() {
    return this[_overflow];
  }
  set [$overflow](value) {
    this[_overflow] = value == null ? "" : value;
  }
  get [_overflow]() {
    return this.overflow;
  }
  set [_overflow](value) {
    this.overflow = value;
  }
  get [$padding]() {
    return this[_padding];
  }
  set [$padding](value) {
    this[_padding] = value == null ? "" : value;
  }
  get [_padding]() {
    return this.padding;
  }
  set [_padding](value) {
    this.padding = value;
  }
  get [$paddingBottom]() {
    return this[_paddingBottom];
  }
  set [$paddingBottom](value) {
    this[_paddingBottom] = value == null ? "" : value;
  }
  get [_paddingBottom]() {
    return this.paddingBottom;
  }
  set [_paddingBottom](value) {
    this.paddingBottom = value;
  }
  get [$paddingLeft]() {
    return this[_paddingLeft];
  }
  set [$paddingLeft](value) {
    this[_paddingLeft] = value == null ? "" : value;
  }
  get [_paddingLeft]() {
    return this.paddingLeft;
  }
  set [_paddingLeft](value) {
    this.paddingLeft = value;
  }
  get [$paddingRight]() {
    return this[_paddingRight];
  }
  set [$paddingRight](value) {
    this[_paddingRight] = value == null ? "" : value;
  }
  get [_paddingRight]() {
    return this.paddingRight;
  }
  set [_paddingRight](value) {
    this.paddingRight = value;
  }
  get [$paddingTop]() {
    return this[_paddingTop];
  }
  set [$paddingTop](value) {
    this[_paddingTop] = value == null ? "" : value;
  }
  get [_paddingTop]() {
    return this.paddingTop;
  }
  set [_paddingTop](value) {
    this.paddingTop = value;
  }
  get [$pageBreakAfter]() {
    return this[_pageBreakAfter];
  }
  set [$pageBreakAfter](value) {
    this[_pageBreakAfter] = value == null ? "" : value;
  }
  get [_pageBreakAfter]() {
    return this.pageBreakAfter;
  }
  set [_pageBreakAfter](value) {
    this.pageBreakAfter = value;
  }
  get [$pageBreakBefore]() {
    return this[_pageBreakBefore];
  }
  set [$pageBreakBefore](value) {
    this[_pageBreakBefore] = value == null ? "" : value;
  }
  get [_pageBreakBefore]() {
    return this.pageBreakBefore;
  }
  set [_pageBreakBefore](value) {
    this.pageBreakBefore = value;
  }
  get [$pageBreakInside]() {
    return this[_pageBreakInside];
  }
  set [$pageBreakInside](value) {
    this[_pageBreakInside] = value == null ? "" : value;
  }
  get [_pageBreakInside]() {
    return this.pageBreakInside;
  }
  set [_pageBreakInside](value) {
    this.pageBreakInside = value;
  }
  get [$position]() {
    return this[_position$1];
  }
  set [$position](value) {
    this[_position$1] = value == null ? "" : value;
  }
  get [_position$1]() {
    return this.position;
  }
  set [_position$1](value) {
    this.position = value;
  }
  get [$quotes]() {
    return this[_quotes];
  }
  set [$quotes](value) {
    this[_quotes] = value == null ? "" : value;
  }
  get [_quotes]() {
    return this.quotes;
  }
  set [_quotes](value) {
    this.quotes = value;
  }
  get [$right]() {
    return this[_right];
  }
  set [$right](value) {
    this[_right] = value == null ? "" : value;
  }
  get [_right]() {
    return this.right;
  }
  set [_right](value) {
    this.right = value;
  }
  get [$tableLayout]() {
    return this[_tableLayout];
  }
  set [$tableLayout](value) {
    this[_tableLayout] = value == null ? "" : value;
  }
  get [_tableLayout]() {
    return this.tableLayout;
  }
  set [_tableLayout](value) {
    this.tableLayout = value;
  }
  get [$textAlign]() {
    return this[_textAlign];
  }
  set [$textAlign](value) {
    this[_textAlign] = value == null ? "" : value;
  }
  get [_textAlign]() {
    return this.textAlign;
  }
  set [_textAlign](value) {
    this.textAlign = value;
  }
  get [$textDecoration]() {
    return this[_textDecoration];
  }
  set [$textDecoration](value) {
    this[_textDecoration] = value == null ? "" : value;
  }
  get [_textDecoration]() {
    return this.textDecoration;
  }
  set [_textDecoration](value) {
    this.textDecoration = value;
  }
  get [$textIndent]() {
    return this[_textIndent];
  }
  set [$textIndent](value) {
    this[_textIndent] = value == null ? "" : value;
  }
  get [_textIndent]() {
    return this.textIndent;
  }
  set [_textIndent](value) {
    this.textIndent = value;
  }
  get [$textTransform]() {
    return this[_textTransform];
  }
  set [$textTransform](value) {
    this[_textTransform] = value == null ? "" : value;
  }
  get [_textTransform]() {
    return this.textTransform;
  }
  set [_textTransform](value) {
    this.textTransform = value;
  }
  get [$top]() {
    return this[_top];
  }
  set [$top](value) {
    this[_top] = value == null ? "" : value;
  }
  get [_top]() {
    return this.top;
  }
  set [_top](value) {
    this.top = value;
  }
  get [$unicodeBidi]() {
    return this[_unicodeBidi];
  }
  set [$unicodeBidi](value) {
    this[_unicodeBidi] = value == null ? "" : value;
  }
  get [_unicodeBidi]() {
    return this.unicodeBidi;
  }
  set [_unicodeBidi](value) {
    this.unicodeBidi = value;
  }
  get [$verticalAlign]() {
    return this[_verticalAlign];
  }
  set [$verticalAlign](value) {
    this[_verticalAlign] = value == null ? "" : value;
  }
  get [_verticalAlign]() {
    return this.verticalAlign;
  }
  set [_verticalAlign](value) {
    this.verticalAlign = value;
  }
  get [$visibility]() {
    return this[_visibility];
  }
  set [$visibility](value) {
    this[_visibility] = value == null ? "" : value;
  }
  get [_visibility]() {
    return this.visibility;
  }
  set [_visibility](value) {
    this.visibility = value;
  }
  get [$whiteSpace]() {
    return this[_whiteSpace];
  }
  set [$whiteSpace](value) {
    this[_whiteSpace] = value == null ? "" : value;
  }
  get [_whiteSpace]() {
    return this.whiteSpace;
  }
  set [_whiteSpace](value) {
    this.whiteSpace = value;
  }
  get [$width]() {
    return this[_width$];
  }
  set [$width](value) {
    this[_width$] = value == null ? "" : value;
  }
  get [_width$]() {
    return this.width;
  }
  set [_width$](value) {
    this.width = value;
  }
  get [$wordSpacing]() {
    return this[_wordSpacing];
  }
  set [$wordSpacing](value) {
    this[_wordSpacing] = value == null ? "" : value;
  }
  get [_wordSpacing]() {
    return this.wordSpacing;
  }
  set [_wordSpacing](value) {
    this.wordSpacing = value;
  }
  get [$zIndex]() {
    return this[_zIndex];
  }
  set [$zIndex](value) {
    this[_zIndex] = value == null ? "" : value;
  }
  get [_zIndex]() {
    return this.zIndex;
  }
  set [_zIndex](value) {
    this.zIndex = value;
  }
};
dart.addTypeTests(html$.CssStyleDeclaration);
const cssFloat = Symbol("CssStyleDeclaration.cssFloat");
const cssText$ = Symbol("CssStyleDeclaration.cssText");
const length$2 = Symbol("CssStyleDeclaration.length");
const parentRule$ = Symbol("CssStyleDeclaration.parentRule");
dart.setMethodSignature(html$.CssStyleDeclaration, () => ({
  __proto__: dart.getMethods(html$.CssStyleDeclaration.__proto__),
  [$getPropertyValue]: dart.fnType(core.String, [core.String]),
  [_getPropertyValueHelper]: dart.fnType(core.String, [core.String]),
  [$supportsProperty]: dart.fnType(core.bool, [core.String]),
  [_supportsProperty]: dart.fnType(core.bool, [core.String]),
  [$setProperty]: dart.fnType(dart.void, [core.String, core.String], [core.String]),
  [_browserPropertyName]: dart.fnType(core.String, [core.String]),
  [_supportedBrowserPropertyName]: dart.fnType(core.String, [core.String]),
  [_setPropertyHelper]: dart.fnType(dart.void, [core.String, core.String], [core.String]),
  [$getPropertyPriority]: dart.fnType(core.String, [core.String]),
  [_getPropertyValue]: dart.fnType(core.String, [core.String]),
  [$item]: dart.fnType(core.String, [core.int]),
  [$removeProperty]: dart.fnType(core.String, [core.String])
}));
dart.setLibraryUri(html$.CssStyleDeclaration, "dart:html");
dart.setFieldSignature(html$.CssStyleDeclaration, () => ({
  __proto__: dart.getFields(html$.CssStyleDeclaration.__proto__),
  [$cssFloat]: dart.fieldType(core.String),
  [$cssText]: dart.fieldType(core.String),
  [$length]: dart.finalFieldType(core.int),
  [$parentRule]: dart.finalFieldType(html$.CssRule),
  [_background]: dart.fieldType(core.String),
  [_backgroundAttachment]: dart.fieldType(core.String),
  [_backgroundColor]: dart.fieldType(core.String),
  [_backgroundImage]: dart.fieldType(core.String),
  [_backgroundPosition]: dart.fieldType(core.String),
  [_backgroundRepeat]: dart.fieldType(core.String),
  [_border]: dart.fieldType(core.String),
  [_borderBottom]: dart.fieldType(core.String),
  [_borderBottomColor]: dart.fieldType(core.String),
  [_borderBottomStyle]: dart.fieldType(core.String),
  [_borderBottomWidth]: dart.fieldType(core.String),
  [_borderCollapse]: dart.fieldType(core.String),
  [_borderColor]: dart.fieldType(core.String),
  [_borderLeft]: dart.fieldType(core.String),
  [_borderLeftColor]: dart.fieldType(core.String),
  [_borderLeftStyle]: dart.fieldType(core.String),
  [_borderLeftWidth]: dart.fieldType(core.String),
  [_borderRight]: dart.fieldType(core.String),
  [_borderRightColor]: dart.fieldType(core.String),
  [_borderRightStyle]: dart.fieldType(core.String),
  [_borderRightWidth]: dart.fieldType(core.String),
  [_borderSpacing]: dart.fieldType(core.String),
  [_borderStyle]: dart.fieldType(core.String),
  [_borderTop]: dart.fieldType(core.String),
  [_borderTopColor]: dart.fieldType(core.String),
  [_borderTopStyle]: dart.fieldType(core.String),
  [_borderTopWidth]: dart.fieldType(core.String),
  [_borderWidth]: dart.fieldType(core.String),
  [_bottom]: dart.fieldType(core.String),
  [_captionSide]: dart.fieldType(core.String),
  [_clear$0]: dart.fieldType(core.String),
  [_clip]: dart.fieldType(core.String),
  [_color]: dart.fieldType(core.String),
  [_content]: dart.fieldType(core.String),
  [_cursor]: dart.fieldType(core.String),
  [_direction]: dart.fieldType(core.String),
  [_display]: dart.fieldType(core.String),
  [_emptyCells]: dart.fieldType(core.String),
  [_font]: dart.fieldType(core.String),
  [_fontFamily]: dart.fieldType(core.String),
  [_fontSize]: dart.fieldType(core.String),
  [_fontStyle]: dart.fieldType(core.String),
  [_fontVariant]: dart.fieldType(core.String),
  [_fontWeight]: dart.fieldType(core.String),
  [_height$]: dart.fieldType(core.String),
  [_left]: dart.fieldType(core.String),
  [_letterSpacing]: dart.fieldType(core.String),
  [_lineHeight]: dart.fieldType(core.String),
  [_listStyle]: dart.fieldType(core.String),
  [_listStyleImage]: dart.fieldType(core.String),
  [_listStylePosition]: dart.fieldType(core.String),
  [_listStyleType]: dart.fieldType(core.String),
  [_margin]: dart.fieldType(core.String),
  [_marginBottom]: dart.fieldType(core.String),
  [_marginLeft]: dart.fieldType(core.String),
  [_marginRight]: dart.fieldType(core.String),
  [_marginTop]: dart.fieldType(core.String),
  [_maxHeight]: dart.fieldType(core.String),
  [_maxWidth]: dart.fieldType(core.String),
  [_minHeight]: dart.fieldType(core.String),
  [_minWidth]: dart.fieldType(core.String),
  [_outline]: dart.fieldType(core.String),
  [_outlineColor]: dart.fieldType(core.String),
  [_outlineStyle]: dart.fieldType(core.String),
  [_outlineWidth]: dart.fieldType(core.String),
  [_overflow]: dart.fieldType(core.String),
  [_padding]: dart.fieldType(core.String),
  [_paddingBottom]: dart.fieldType(core.String),
  [_paddingLeft]: dart.fieldType(core.String),
  [_paddingRight]: dart.fieldType(core.String),
  [_paddingTop]: dart.fieldType(core.String),
  [_pageBreakAfter]: dart.fieldType(core.String),
  [_pageBreakBefore]: dart.fieldType(core.String),
  [_pageBreakInside]: dart.fieldType(core.String),
  [_position$1]: dart.fieldType(core.String),
  [_quotes]: dart.fieldType(core.String),
  [_right]: dart.fieldType(core.String),
  [_tableLayout]: dart.fieldType(core.String),
  [_textAlign]: dart.fieldType(core.String),
  [_textDecoration]: dart.fieldType(core.String),
  [_textIndent]: dart.fieldType(core.String),
  [_textTransform]: dart.fieldType(core.String),
  [_top]: dart.fieldType(core.String),
  [_unicodeBidi]: dart.fieldType(core.String),
  [_verticalAlign]: dart.fieldType(core.String),
  [_visibility]: dart.fieldType(core.String),
  [_whiteSpace]: dart.fieldType(core.String),
  [_width$]: dart.fieldType(core.String),
  [_wordSpacing]: dart.fieldType(core.String),
  [_zIndex]: dart.fieldType(core.String)
}));
dart.defineLazy(html$.CssStyleDeclaration, {
  /*html$.CssStyleDeclaration._propertyCache*/get _propertyCache() {
    return {};
  }
});
dart.registerExtension("CSSStyleDeclaration", html$.CssStyleDeclaration);
dart.registerExtension("MSStyleCSSProperties", html$.CssStyleDeclaration);
dart.registerExtension("CSS2Properties", html$.CssStyleDeclaration);
const _elementIterable = dart.privateName(html$, "_elementIterable");
const _elementCssStyleDeclarationSetIterable = dart.privateName(html$, "_elementCssStyleDeclarationSetIterable");
const _setAll = dart.privateName(html$, "_setAll");
const Object_CssStyleDeclarationBase$ = class Object_CssStyleDeclarationBase extends core.Object {};
(Object_CssStyleDeclarationBase$.new = function() {
}).prototype = Object_CssStyleDeclarationBase$.prototype;
dart.applyMixin(Object_CssStyleDeclarationBase$, html$.CssStyleDeclarationBase);
html$._CssStyleDeclarationSet = class _CssStyleDeclarationSet extends Object_CssStyleDeclarationBase$ {
  getPropertyValue(propertyName) {
    return this[_elementCssStyleDeclarationSetIterable][$first][$getPropertyValue](propertyName);
  }
  setProperty(propertyName, value, priority) {
    if (priority === void 0) priority = null;
    this[_elementCssStyleDeclarationSetIterable][$forEach](dart.fn(e => e[$setProperty](propertyName, value, priority), CssStyleDeclarationTovoid()));
  }
  [_setAll](propertyName, value) {
    value = value == null ? "" : value;
    for (let element of this[_elementIterable]) {
      element.style[propertyName] = value;
    }
  }
  set background(value) {
    this[_setAll]("background", value);
  }
  get background() {
    return super.background;
  }
  set backgroundAttachment(value) {
    this[_setAll]("backgroundAttachment", value);
  }
  get backgroundAttachment() {
    return super.backgroundAttachment;
  }
  set backgroundColor(value) {
    this[_setAll]("backgroundColor", value);
  }
  get backgroundColor() {
    return super.backgroundColor;
  }
  set backgroundImage(value) {
    this[_setAll]("backgroundImage", value);
  }
  get backgroundImage() {
    return super.backgroundImage;
  }
  set backgroundPosition(value) {
    this[_setAll]("backgroundPosition", value);
  }
  get backgroundPosition() {
    return super.backgroundPosition;
  }
  set backgroundRepeat(value) {
    this[_setAll]("backgroundRepeat", value);
  }
  get backgroundRepeat() {
    return super.backgroundRepeat;
  }
  set border(value) {
    this[_setAll]("border", value);
  }
  get border() {
    return super.border;
  }
  set borderBottom(value) {
    this[_setAll]("borderBottom", value);
  }
  get borderBottom() {
    return super.borderBottom;
  }
  set borderBottomColor(value) {
    this[_setAll]("borderBottomColor", value);
  }
  get borderBottomColor() {
    return super.borderBottomColor;
  }
  set borderBottomStyle(value) {
    this[_setAll]("borderBottomStyle", value);
  }
  get borderBottomStyle() {
    return super.borderBottomStyle;
  }
  set borderBottomWidth(value) {
    this[_setAll]("borderBottomWidth", value);
  }
  get borderBottomWidth() {
    return super.borderBottomWidth;
  }
  set borderCollapse(value) {
    this[_setAll]("borderCollapse", value);
  }
  get borderCollapse() {
    return super.borderCollapse;
  }
  set borderColor(value) {
    this[_setAll]("borderColor", value);
  }
  get borderColor() {
    return super.borderColor;
  }
  set borderLeft(value) {
    this[_setAll]("borderLeft", value);
  }
  get borderLeft() {
    return super.borderLeft;
  }
  set borderLeftColor(value) {
    this[_setAll]("borderLeftColor", value);
  }
  get borderLeftColor() {
    return super.borderLeftColor;
  }
  set borderLeftStyle(value) {
    this[_setAll]("borderLeftStyle", value);
  }
  get borderLeftStyle() {
    return super.borderLeftStyle;
  }
  set borderLeftWidth(value) {
    this[_setAll]("borderLeftWidth", value);
  }
  get borderLeftWidth() {
    return super.borderLeftWidth;
  }
  set borderRight(value) {
    this[_setAll]("borderRight", value);
  }
  get borderRight() {
    return super.borderRight;
  }
  set borderRightColor(value) {
    this[_setAll]("borderRightColor", value);
  }
  get borderRightColor() {
    return super.borderRightColor;
  }
  set borderRightStyle(value) {
    this[_setAll]("borderRightStyle", value);
  }
  get borderRightStyle() {
    return super.borderRightStyle;
  }
  set borderRightWidth(value) {
    this[_setAll]("borderRightWidth", value);
  }
  get borderRightWidth() {
    return super.borderRightWidth;
  }
  set borderSpacing(value) {
    this[_setAll]("borderSpacing", value);
  }
  get borderSpacing() {
    return super.borderSpacing;
  }
  set borderStyle(value) {
    this[_setAll]("borderStyle", value);
  }
  get borderStyle() {
    return super.borderStyle;
  }
  set borderTop(value) {
    this[_setAll]("borderTop", value);
  }
  get borderTop() {
    return super.borderTop;
  }
  set borderTopColor(value) {
    this[_setAll]("borderTopColor", value);
  }
  get borderTopColor() {
    return super.borderTopColor;
  }
  set borderTopStyle(value) {
    this[_setAll]("borderTopStyle", value);
  }
  get borderTopStyle() {
    return super.borderTopStyle;
  }
  set borderTopWidth(value) {
    this[_setAll]("borderTopWidth", value);
  }
  get borderTopWidth() {
    return super.borderTopWidth;
  }
  set borderWidth(value) {
    this[_setAll]("borderWidth", value);
  }
  get borderWidth() {
    return super.borderWidth;
  }
  set bottom(value) {
    this[_setAll]("bottom", value);
  }
  get bottom() {
    return super.bottom;
  }
  set captionSide(value) {
    this[_setAll]("captionSide", value);
  }
  get captionSide() {
    return super.captionSide;
  }
  set clear(value) {
    this[_setAll]("clear", value);
  }
  get clear() {
    return super.clear;
  }
  set clip(value) {
    this[_setAll]("clip", value);
  }
  get clip() {
    return super.clip;
  }
  set color(value) {
    this[_setAll]("color", value);
  }
  get color() {
    return super.color;
  }
  set content(value) {
    this[_setAll]("content", value);
  }
  get content() {
    return super.content;
  }
  set cursor(value) {
    this[_setAll]("cursor", value);
  }
  get cursor() {
    return super.cursor;
  }
  set direction(value) {
    this[_setAll]("direction", value);
  }
  get direction() {
    return super.direction;
  }
  set display(value) {
    this[_setAll]("display", value);
  }
  get display() {
    return super.display;
  }
  set emptyCells(value) {
    this[_setAll]("emptyCells", value);
  }
  get emptyCells() {
    return super.emptyCells;
  }
  set font(value) {
    this[_setAll]("font", value);
  }
  get font() {
    return super.font;
  }
  set fontFamily(value) {
    this[_setAll]("fontFamily", value);
  }
  get fontFamily() {
    return super.fontFamily;
  }
  set fontSize(value) {
    this[_setAll]("fontSize", value);
  }
  get fontSize() {
    return super.fontSize;
  }
  set fontStyle(value) {
    this[_setAll]("fontStyle", value);
  }
  get fontStyle() {
    return super.fontStyle;
  }
  set fontVariant(value) {
    this[_setAll]("fontVariant", value);
  }
  get fontVariant() {
    return super.fontVariant;
  }
  set fontWeight(value) {
    this[_setAll]("fontWeight", value);
  }
  get fontWeight() {
    return super.fontWeight;
  }
  set height(value) {
    this[_setAll]("height", value);
  }
  get height() {
    return super.height;
  }
  set left(value) {
    this[_setAll]("left", value);
  }
  get left() {
    return super.left;
  }
  set letterSpacing(value) {
    this[_setAll]("letterSpacing", value);
  }
  get letterSpacing() {
    return super.letterSpacing;
  }
  set lineHeight(value) {
    this[_setAll]("lineHeight", value);
  }
  get lineHeight() {
    return super.lineHeight;
  }
  set listStyle(value) {
    this[_setAll]("listStyle", value);
  }
  get listStyle() {
    return super.listStyle;
  }
  set listStyleImage(value) {
    this[_setAll]("listStyleImage", value);
  }
  get listStyleImage() {
    return super.listStyleImage;
  }
  set listStylePosition(value) {
    this[_setAll]("listStylePosition", value);
  }
  get listStylePosition() {
    return super.listStylePosition;
  }
  set listStyleType(value) {
    this[_setAll]("listStyleType", value);
  }
  get listStyleType() {
    return super.listStyleType;
  }
  set margin(value) {
    this[_setAll]("margin", value);
  }
  get margin() {
    return super.margin;
  }
  set marginBottom(value) {
    this[_setAll]("marginBottom", value);
  }
  get marginBottom() {
    return super.marginBottom;
  }
  set marginLeft(value) {
    this[_setAll]("marginLeft", value);
  }
  get marginLeft() {
    return super.marginLeft;
  }
  set marginRight(value) {
    this[_setAll]("marginRight", value);
  }
  get marginRight() {
    return super.marginRight;
  }
  set marginTop(value) {
    this[_setAll]("marginTop", value);
  }
  get marginTop() {
    return super.marginTop;
  }
  set maxHeight(value) {
    this[_setAll]("maxHeight", value);
  }
  get maxHeight() {
    return super.maxHeight;
  }
  set maxWidth(value) {
    this[_setAll]("maxWidth", value);
  }
  get maxWidth() {
    return super.maxWidth;
  }
  set minHeight(value) {
    this[_setAll]("minHeight", value);
  }
  get minHeight() {
    return super.minHeight;
  }
  set minWidth(value) {
    this[_setAll]("minWidth", value);
  }
  get minWidth() {
    return super.minWidth;
  }
  set outline(value) {
    this[_setAll]("outline", value);
  }
  get outline() {
    return super.outline;
  }
  set outlineColor(value) {
    this[_setAll]("outlineColor", value);
  }
  get outlineColor() {
    return super.outlineColor;
  }
  set outlineStyle(value) {
    this[_setAll]("outlineStyle", value);
  }
  get outlineStyle() {
    return super.outlineStyle;
  }
  set outlineWidth(value) {
    this[_setAll]("outlineWidth", value);
  }
  get outlineWidth() {
    return super.outlineWidth;
  }
  set overflow(value) {
    this[_setAll]("overflow", value);
  }
  get overflow() {
    return super.overflow;
  }
  set padding(value) {
    this[_setAll]("padding", value);
  }
  get padding() {
    return super.padding;
  }
  set paddingBottom(value) {
    this[_setAll]("paddingBottom", value);
  }
  get paddingBottom() {
    return super.paddingBottom;
  }
  set paddingLeft(value) {
    this[_setAll]("paddingLeft", value);
  }
  get paddingLeft() {
    return super.paddingLeft;
  }
  set paddingRight(value) {
    this[_setAll]("paddingRight", value);
  }
  get paddingRight() {
    return super.paddingRight;
  }
  set paddingTop(value) {
    this[_setAll]("paddingTop", value);
  }
  get paddingTop() {
    return super.paddingTop;
  }
  set pageBreakAfter(value) {
    this[_setAll]("pageBreakAfter", value);
  }
  get pageBreakAfter() {
    return super.pageBreakAfter;
  }
  set pageBreakBefore(value) {
    this[_setAll]("pageBreakBefore", value);
  }
  get pageBreakBefore() {
    return super.pageBreakBefore;
  }
  set pageBreakInside(value) {
    this[_setAll]("pageBreakInside", value);
  }
  get pageBreakInside() {
    return super.pageBreakInside;
  }
  set position(value) {
    this[_setAll]("position", value);
  }
  get position() {
    return super.position;
  }
  set quotes(value) {
    this[_setAll]("quotes", value);
  }
  get quotes() {
    return super.quotes;
  }
  set right(value) {
    this[_setAll]("right", value);
  }
  get right() {
    return super.right;
  }
  set tableLayout(value) {
    this[_setAll]("tableLayout", value);
  }
  get tableLayout() {
    return super.tableLayout;
  }
  set textAlign(value) {
    this[_setAll]("textAlign", value);
  }
  get textAlign() {
    return super.textAlign;
  }
  set textDecoration(value) {
    this[_setAll]("textDecoration", value);
  }
  get textDecoration() {
    return super.textDecoration;
  }
  set textIndent(value) {
    this[_setAll]("textIndent", value);
  }
  get textIndent() {
    return super.textIndent;
  }
  set textTransform(value) {
    this[_setAll]("textTransform", value);
  }
  get textTransform() {
    return super.textTransform;
  }
  set top(value) {
    this[_setAll]("top", value);
  }
  get top() {
    return super.top;
  }
  set unicodeBidi(value) {
    this[_setAll]("unicodeBidi", value);
  }
  get unicodeBidi() {
    return super.unicodeBidi;
  }
  set verticalAlign(value) {
    this[_setAll]("verticalAlign", value);
  }
  get verticalAlign() {
    return super.verticalAlign;
  }
  set visibility(value) {
    this[_setAll]("visibility", value);
  }
  get visibility() {
    return super.visibility;
  }
  set whiteSpace(value) {
    this[_setAll]("whiteSpace", value);
  }
  get whiteSpace() {
    return super.whiteSpace;
  }
  set width(value) {
    this[_setAll]("width", value);
  }
  get width() {
    return super.width;
  }
  set wordSpacing(value) {
    this[_setAll]("wordSpacing", value);
  }
  get wordSpacing() {
    return super.wordSpacing;
  }
  set zIndex(value) {
    this[_setAll]("zIndex", value);
  }
  get zIndex() {
    return super.zIndex;
  }
};
(html$._CssStyleDeclarationSet.new = function(elementIterable) {
  this[_elementCssStyleDeclarationSetIterable] = null;
  this[_elementIterable] = elementIterable;
  this[_elementCssStyleDeclarationSetIterable] = IterableOfCssStyleDeclaration()._check(core.List.from(this[_elementIterable])[$map](html$.CssStyleDeclaration, dart.fn(e => html$.CssStyleDeclaration._check(dart.dload(e, 'style')), dynamicToCssStyleDeclaration())));
}).prototype = html$._CssStyleDeclarationSet.prototype;
dart.addTypeTests(html$._CssStyleDeclarationSet);
dart.setMethodSignature(html$._CssStyleDeclarationSet, () => ({
  __proto__: dart.getMethods(html$._CssStyleDeclarationSet.__proto__),
  getPropertyValue: dart.fnType(core.String, [core.String]),
  [$getPropertyValue]: dart.fnType(core.String, [core.String]),
  setProperty: dart.fnType(dart.void, [core.String, core.String], [core.String]),
  [$setProperty]: dart.fnType(dart.void, [core.String, core.String], [core.String]),
  [_setAll]: dart.fnType(dart.void, [core.String, core.String])
}));
dart.setLibraryUri(html$._CssStyleDeclarationSet, "dart:html");
dart.setFieldSignature(html$._CssStyleDeclarationSet, () => ({
  __proto__: dart.getFields(html$._CssStyleDeclarationSet.__proto__),
  [_elementIterable]: dart.finalFieldType(IterableOfElement()),
  [_elementCssStyleDeclarationSetIterable]: dart.fieldType(IterableOfCssStyleDeclaration())
}));
dart.defineExtensionMethods(html$._CssStyleDeclarationSet, ['getPropertyValue', 'setProperty']);
dart.defineExtensionAccessors(html$._CssStyleDeclarationSet, [
  'background',
  'backgroundAttachment',
  'backgroundColor',
  'backgroundImage',
  'backgroundPosition',
  'backgroundRepeat',
  'border',
  'borderBottom',
  'borderBottomColor',
  'borderBottomStyle',
  'borderBottomWidth',
  'borderCollapse',
  'borderColor',
  'borderLeft',
  'borderLeftColor',
  'borderLeftStyle',
  'borderLeftWidth',
  'borderRight',
  'borderRightColor',
  'borderRightStyle',
  'borderRightWidth',
  'borderSpacing',
  'borderStyle',
  'borderTop',
  'borderTopColor',
  'borderTopStyle',
  'borderTopWidth',
  'borderWidth',
  'bottom',
  'captionSide',
  'clear',
  'clip',
  'color',
  'content',
  'cursor',
  'direction',
  'display',
  'emptyCells',
  'font',
  'fontFamily',
  'fontSize',
  'fontStyle',
  'fontVariant',
  'fontWeight',
  'height',
  'left',
  'letterSpacing',
  'lineHeight',
  'listStyle',
  'listStyleImage',
  'listStylePosition',
  'listStyleType',
  'margin',
  'marginBottom',
  'marginLeft',
  'marginRight',
  'marginTop',
  'maxHeight',
  'maxWidth',
  'minHeight',
  'minWidth',
  'outline',
  'outlineColor',
  'outlineStyle',
  'outlineWidth',
  'overflow',
  'padding',
  'paddingBottom',
  'paddingLeft',
  'paddingRight',
  'paddingTop',
  'pageBreakAfter',
  'pageBreakBefore',
  'pageBreakInside',
  'position',
  'quotes',
  'right',
  'tableLayout',
  'textAlign',
  'textDecoration',
  'textIndent',
  'textTransform',
  'top',
  'unicodeBidi',
  'verticalAlign',
  'visibility',
  'whiteSpace',
  'width',
  'wordSpacing',
  'zIndex'
]);
html$.CssStyleRule = class CssStyleRule extends html$.CssRule {
  get [$selectorText]() {
    return this.selectorText;
  }
  set [$selectorText](value) {
    this.selectorText = value;
  }
  get [$style]() {
    return this.style;
  }
};
dart.addTypeTests(html$.CssStyleRule);
const selectorText$ = Symbol("CssStyleRule.selectorText");
const style$2 = Symbol("CssStyleRule.style");
dart.setLibraryUri(html$.CssStyleRule, "dart:html");
dart.setFieldSignature(html$.CssStyleRule, () => ({
  __proto__: dart.getFields(html$.CssStyleRule.__proto__),
  [$selectorText]: dart.fieldType(core.String),
  [$style]: dart.finalFieldType(html$.CssStyleDeclaration)
}));
dart.registerExtension("CSSStyleRule", html$.CssStyleRule);
html$.StyleSheet = class StyleSheet extends _interceptors.Interceptor {
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$href]() {
    return this.href;
  }
  get [$media]() {
    return this.media;
  }
  get [$ownerNode]() {
    return this.ownerNode;
  }
  get [$parentStyleSheet]() {
    return this.parentStyleSheet;
  }
  get [$title]() {
    return this.title;
  }
  get [$type]() {
    return this.type;
  }
};
dart.addTypeTests(html$.StyleSheet);
const disabled$0 = Symbol("StyleSheet.disabled");
const href$2 = Symbol("StyleSheet.href");
const media$0 = Symbol("StyleSheet.media");
const ownerNode = Symbol("StyleSheet.ownerNode");
const parentStyleSheet$ = Symbol("StyleSheet.parentStyleSheet");
const title$0 = Symbol("StyleSheet.title");
const type$10 = Symbol("StyleSheet.type");
dart.setLibraryUri(html$.StyleSheet, "dart:html");
dart.setFieldSignature(html$.StyleSheet, () => ({
  __proto__: dart.getFields(html$.StyleSheet.__proto__),
  [$disabled]: dart.fieldType(core.bool),
  [$href]: dart.finalFieldType(core.String),
  [$media]: dart.finalFieldType(html$.MediaList),
  [$ownerNode]: dart.finalFieldType(html$.Node),
  [$parentStyleSheet]: dart.finalFieldType(html$.StyleSheet),
  [$title]: dart.finalFieldType(core.String),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("StyleSheet", html$.StyleSheet);
html$.CssStyleSheet = class CssStyleSheet extends html$.StyleSheet {
  get [$cssRules]() {
    return this.cssRules;
  }
  get [$ownerRule]() {
    return this.ownerRule;
  }
  get [$rules]() {
    return this.rules;
  }
  [$addRule](...args) {
    return this.addRule.apply(this, args);
  }
  [$deleteRule](...args) {
    return this.deleteRule.apply(this, args);
  }
  [$insertRule](...args) {
    return this.insertRule.apply(this, args);
  }
  [$removeRule](...args) {
    return this.removeRule.apply(this, args);
  }
};
dart.addTypeTests(html$.CssStyleSheet);
const cssRules$0 = Symbol("CssStyleSheet.cssRules");
const ownerRule = Symbol("CssStyleSheet.ownerRule");
const rules = Symbol("CssStyleSheet.rules");
dart.setMethodSignature(html$.CssStyleSheet, () => ({
  __proto__: dart.getMethods(html$.CssStyleSheet.__proto__),
  [$addRule]: dart.fnType(core.int, [core.String, core.String], [core.int]),
  [$deleteRule]: dart.fnType(dart.void, [core.int]),
  [$insertRule]: dart.fnType(core.int, [core.String], [core.int]),
  [$removeRule]: dart.fnType(dart.void, [core.int])
}));
dart.setLibraryUri(html$.CssStyleSheet, "dart:html");
dart.setFieldSignature(html$.CssStyleSheet, () => ({
  __proto__: dart.getFields(html$.CssStyleSheet.__proto__),
  [$cssRules]: dart.finalFieldType(ListOfCssRule()),
  [$ownerRule]: dart.finalFieldType(html$.CssRule),
  [$rules]: dart.finalFieldType(ListOfCssRule())
}));
dart.registerExtension("CSSStyleSheet", html$.CssStyleSheet);
html$.CssSupportsRule = class CssSupportsRule extends html$.CssConditionRule {};
dart.addTypeTests(html$.CssSupportsRule);
dart.setLibraryUri(html$.CssSupportsRule, "dart:html");
dart.registerExtension("CSSSupportsRule", html$.CssSupportsRule);
html$.CssTransformValue = class CssTransformValue extends html$.CssStyleValue {
  static new(transformComponents) {
    if (transformComponents === void 0) transformComponents = null;
    if (transformComponents == null) {
      return html$.CssTransformValue._create_1();
    }
    if (ListOfCssTransformComponent().is(transformComponents)) {
      return html$.CssTransformValue._create_2(transformComponents);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1() {
    return new CSSTransformValue();
  }
  static _create_2(transformComponents) {
    return new CSSTransformValue(transformComponents);
  }
  get [$is2D]() {
    return this.is2D;
  }
  get [$length]() {
    return this.length;
  }
  [$componentAtIndex](...args) {
    return this.componentAtIndex.apply(this, args);
  }
  [$toMatrix](...args) {
    return this.toMatrix.apply(this, args);
  }
};
dart.addTypeTests(html$.CssTransformValue);
const is2D$ = Symbol("CssTransformValue.is2D");
const length$3 = Symbol("CssTransformValue.length");
dart.setMethodSignature(html$.CssTransformValue, () => ({
  __proto__: dart.getMethods(html$.CssTransformValue.__proto__),
  [$componentAtIndex]: dart.fnType(html$.CssTransformComponent, [core.int]),
  [$toMatrix]: dart.fnType(html$.DomMatrix, [])
}));
dart.setLibraryUri(html$.CssTransformValue, "dart:html");
dart.setFieldSignature(html$.CssTransformValue, () => ({
  __proto__: dart.getFields(html$.CssTransformValue.__proto__),
  [$is2D]: dart.finalFieldType(core.bool),
  [$length]: dart.finalFieldType(core.int)
}));
dart.registerExtension("CSSTransformValue", html$.CssTransformValue);
html$.CssTranslation = class CssTranslation extends html$.CssTransformComponent {
  static new(x, y, z) {
    if (z === void 0) z = null;
    if (html$.CssNumericValue.is(y) && html$.CssNumericValue.is(x) && z == null) {
      return html$.CssTranslation._create_1(x, y);
    }
    if (html$.CssNumericValue.is(z) && html$.CssNumericValue.is(y) && html$.CssNumericValue.is(x)) {
      return html$.CssTranslation._create_2(x, y, z);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1(x, y) {
    return new CSSTranslation(x, y);
  }
  static _create_2(x, y, z) {
    return new CSSTranslation(x, y, z);
  }
  get [$x]() {
    return this.x;
  }
  set [$x](value) {
    this.x = value;
  }
  get [$y]() {
    return this.y;
  }
  set [$y](value) {
    this.y = value;
  }
  get [$z]() {
    return this.z;
  }
  set [$z](value) {
    this.z = value;
  }
};
dart.addTypeTests(html$.CssTranslation);
const x$2 = Symbol("CssTranslation.x");
const y$2 = Symbol("CssTranslation.y");
const z$1 = Symbol("CssTranslation.z");
dart.setLibraryUri(html$.CssTranslation, "dart:html");
dart.setFieldSignature(html$.CssTranslation, () => ({
  __proto__: dart.getFields(html$.CssTranslation.__proto__),
  [$x]: dart.fieldType(html$.CssNumericValue),
  [$y]: dart.fieldType(html$.CssNumericValue),
  [$z]: dart.fieldType(html$.CssNumericValue)
}));
dart.registerExtension("CSSTranslation", html$.CssTranslation);
html$.CssUnitValue = class CssUnitValue extends html$.CssNumericValue {
  static new(value, unit) {
    return html$.CssUnitValue._create_1(value, unit);
  }
  static _create_1(value, unit) {
    return new CSSUnitValue(value, unit);
  }
  get [$type]() {
    return this.type;
  }
  get [$unit]() {
    return this.unit;
  }
  set [$unit](value) {
    this.unit = value;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
dart.addTypeTests(html$.CssUnitValue);
const type$11 = Symbol("CssUnitValue.type");
const unit = Symbol("CssUnitValue.unit");
const value$3 = Symbol("CssUnitValue.value");
dart.setLibraryUri(html$.CssUnitValue, "dart:html");
dart.setFieldSignature(html$.CssUnitValue, () => ({
  __proto__: dart.getFields(html$.CssUnitValue.__proto__),
  [$type]: dart.finalFieldType(core.String),
  [$unit]: dart.fieldType(core.String),
  [$value]: dart.fieldType(core.num)
}));
dart.registerExtension("CSSUnitValue", html$.CssUnitValue);
html$.CssUnparsedValue = class CssUnparsedValue extends html$.CssStyleValue {
  get [$length]() {
    return this.length;
  }
  [$fragmentAtIndex](...args) {
    return this.fragmentAtIndex.apply(this, args);
  }
};
dart.addTypeTests(html$.CssUnparsedValue);
const length$4 = Symbol("CssUnparsedValue.length");
dart.setMethodSignature(html$.CssUnparsedValue, () => ({
  __proto__: dart.getMethods(html$.CssUnparsedValue.__proto__),
  [$fragmentAtIndex]: dart.fnType(core.Object, [core.int])
}));
dart.setLibraryUri(html$.CssUnparsedValue, "dart:html");
dart.setFieldSignature(html$.CssUnparsedValue, () => ({
  __proto__: dart.getFields(html$.CssUnparsedValue.__proto__),
  [$length]: dart.finalFieldType(core.int)
}));
dart.registerExtension("CSSUnparsedValue", html$.CssUnparsedValue);
html$.CssVariableReferenceValue = class CssVariableReferenceValue extends _interceptors.Interceptor {
  get [$fallback]() {
    return this.fallback;
  }
  get [$variable]() {
    return this.variable;
  }
};
dart.addTypeTests(html$.CssVariableReferenceValue);
const fallback = Symbol("CssVariableReferenceValue.fallback");
const variable = Symbol("CssVariableReferenceValue.variable");
dart.setLibraryUri(html$.CssVariableReferenceValue, "dart:html");
dart.setFieldSignature(html$.CssVariableReferenceValue, () => ({
  __proto__: dart.getFields(html$.CssVariableReferenceValue.__proto__),
  [$fallback]: dart.finalFieldType(html$.CssUnparsedValue),
  [$variable]: dart.finalFieldType(core.String)
}));
dart.registerExtension("CSSVariableReferenceValue", html$.CssVariableReferenceValue);
html$.CssViewportRule = class CssViewportRule extends html$.CssRule {
  get [$style]() {
    return this.style;
  }
};
dart.addTypeTests(html$.CssViewportRule);
const style$3 = Symbol("CssViewportRule.style");
dart.setLibraryUri(html$.CssViewportRule, "dart:html");
dart.setFieldSignature(html$.CssViewportRule, () => ({
  __proto__: dart.getFields(html$.CssViewportRule.__proto__),
  [$style]: dart.finalFieldType(html$.CssStyleDeclaration)
}));
dart.registerExtension("CSSViewportRule", html$.CssViewportRule);
html$.CssurlImageValue = class CssurlImageValue extends html$.CssImageValue {
  static new(url) {
    return html$.CssurlImageValue._create_1(url);
  }
  static _create_1(url) {
    return new CSSURLImageValue(url);
  }
  get [$url]() {
    return this.url;
  }
};
dart.addTypeTests(html$.CssurlImageValue);
const url$0 = Symbol("CssurlImageValue.url");
dart.setLibraryUri(html$.CssurlImageValue, "dart:html");
dart.setFieldSignature(html$.CssurlImageValue, () => ({
  __proto__: dart.getFields(html$.CssurlImageValue.__proto__),
  [$url]: dart.finalFieldType(core.String)
}));
dart.registerExtension("CSSURLImageValue", html$.CssurlImageValue);
const _define_1 = dart.privateName(html$, "_define_1");
const _define_2 = dart.privateName(html$, "_define_2");
html$.CustomElementRegistry = class CustomElementRegistry extends _interceptors.Interceptor {
  [$define](name, constructor, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[_define_1](name, constructor, options_1);
      return;
    }
    this[_define_2](name, constructor);
    return;
  }
  [_define_1](...args) {
    return this.define.apply(this, args);
  }
  [_define_2](...args) {
    return this.define.apply(this, args);
  }
  [$get](...args) {
    return this.get.apply(this, args);
  }
  [$whenDefined](name) {
    return html$.promiseToFuture(dart.dynamic, this.whenDefined(name));
  }
};
dart.addTypeTests(html$.CustomElementRegistry);
dart.setMethodSignature(html$.CustomElementRegistry, () => ({
  __proto__: dart.getMethods(html$.CustomElementRegistry.__proto__),
  [$define]: dart.fnType(dart.void, [core.String, core.Object], [core.Map]),
  [_define_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
  [_define_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic]),
  [$get]: dart.fnType(core.Object, [core.String]),
  [$whenDefined]: dart.fnType(async.Future, [core.String])
}));
dart.setLibraryUri(html$.CustomElementRegistry, "dart:html");
dart.registerExtension("CustomElementRegistry", html$.CustomElementRegistry);
const _dartDetail = dart.privateName(html$, "_dartDetail");
const _initCustomEvent = dart.privateName(html$, "_initCustomEvent");
const _detail = dart.privateName(html$, "_detail");
const _get__detail = dart.privateName(html$, "_get__detail");
html$.CustomEvent = class CustomEvent$ extends html$.Event {
  get [_dartDetail]() {
    return this._dartDetail;
  }
  set [_dartDetail](value) {
    this._dartDetail = value;
  }
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let detail = opts && 'detail' in opts ? opts.detail : null;
    let e = html$.CustomEvent._check(html$.document[_createEvent]("CustomEvent"));
    e[_dartDetail] = detail;
    if (core.List.is(detail) || core.Map.is(detail) || typeof detail == 'string' || typeof detail == 'number') {
      try {
        detail = html_common.convertDartToNative_SerializedScriptValue(detail);
        e[_initCustomEvent](type, canBubble, cancelable, detail);
      } catch (e$) {
        let _ = dart.getThrown(e$);
        e[_initCustomEvent](type, canBubble, cancelable, null);
      }
    } else {
      e[_initCustomEvent](type, canBubble, cancelable, null);
    }
    return e;
  }
  get [$detail]() {
    if (this[_dartDetail] != null) {
      return this[_dartDetail];
    }
    return this[_detail];
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.CustomEvent._create_1(type, eventInitDict_1);
    }
    return html$.CustomEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new CustomEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new CustomEvent(type);
  }
  get [_detail]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get__detail]);
  }
  get [_get__detail]() {
    return this.detail;
  }
  [_initCustomEvent](...args) {
    return this.initCustomEvent.apply(this, args);
  }
};
dart.addTypeTests(html$.CustomEvent);
dart.setMethodSignature(html$.CustomEvent, () => ({
  __proto__: dart.getMethods(html$.CustomEvent.__proto__),
  [_initCustomEvent]: dart.fnType(dart.void, [core.String], [core.bool, core.bool, core.Object])
}));
dart.setGetterSignature(html$.CustomEvent, () => ({
  __proto__: dart.getGetters(html$.CustomEvent.__proto__),
  [$detail]: dart.dynamic,
  [_detail]: dart.dynamic
}));
dart.setLibraryUri(html$.CustomEvent, "dart:html");
dart.setFieldSignature(html$.CustomEvent, () => ({
  __proto__: dart.getFields(html$.CustomEvent.__proto__),
  [_dartDetail]: dart.fieldType(dart.dynamic),
  [_get__detail]: dart.finalFieldType(dart.dynamic)
}));
dart.registerExtension("CustomEvent", html$.CustomEvent);
html$.DListElement = class DListElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("dl");
  }
};
(html$.DListElement.created = function() {
  html$.DListElement.__proto__.created.call(this);
}).prototype = html$.DListElement.prototype;
dart.addTypeTests(html$.DListElement);
dart.setLibraryUri(html$.DListElement, "dart:html");
dart.registerExtension("HTMLDListElement", html$.DListElement);
html$.DataElement = class DataElement extends html$.HtmlElement {
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
(html$.DataElement.created = function() {
  this[value$4] = null;
  html$.DataElement.__proto__.created.call(this);
}).prototype = html$.DataElement.prototype;
dart.addTypeTests(html$.DataElement);
const value$4 = Symbol("DataElement.value");
dart.setLibraryUri(html$.DataElement, "dart:html");
dart.setFieldSignature(html$.DataElement, () => ({
  __proto__: dart.getFields(html$.DataElement.__proto__),
  [$value]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLDataElement", html$.DataElement);
html$.DataListElement = class DataListElement extends html$.HtmlElement {
  static new() {
    return html$.DataListElement._check(html$.document[$createElement]("datalist"));
  }
  static get supported() {
    return html$.Element.isTagSupported("datalist");
  }
  get [$options]() {
    return this.options;
  }
};
(html$.DataListElement.created = function() {
  this[options] = null;
  html$.DataListElement.__proto__.created.call(this);
}).prototype = html$.DataListElement.prototype;
dart.addTypeTests(html$.DataListElement);
const options = Symbol("DataListElement.options");
dart.setLibraryUri(html$.DataListElement, "dart:html");
dart.setFieldSignature(html$.DataListElement, () => ({
  __proto__: dart.getFields(html$.DataListElement.__proto__),
  [$options]: dart.finalFieldType(ListOfNode())
}));
dart.registerExtension("HTMLDataListElement", html$.DataListElement);
html$.DataTransfer = class DataTransfer$ extends _interceptors.Interceptor {
  static new() {
    return html$.DataTransfer._create_1();
  }
  static _create_1() {
    return new DataTransfer();
  }
  get [$dropEffect]() {
    return this.dropEffect;
  }
  set [$dropEffect](value) {
    this.dropEffect = value;
  }
  get [$effectAllowed]() {
    return this.effectAllowed;
  }
  set [$effectAllowed](value) {
    this.effectAllowed = value;
  }
  get [$files]() {
    return this.files;
  }
  get [$items]() {
    return this.items;
  }
  get [$types]() {
    return this.types;
  }
  [$clearData](...args) {
    return this.clearData.apply(this, args);
  }
  [$getData](...args) {
    return this.getData.apply(this, args);
  }
  [$setData](...args) {
    return this.setData.apply(this, args);
  }
  [$setDragImage](...args) {
    return this.setDragImage.apply(this, args);
  }
};
dart.addTypeTests(html$.DataTransfer);
const dropEffect = Symbol("DataTransfer.dropEffect");
const effectAllowed = Symbol("DataTransfer.effectAllowed");
const files = Symbol("DataTransfer.files");
const items = Symbol("DataTransfer.items");
const types = Symbol("DataTransfer.types");
dart.setMethodSignature(html$.DataTransfer, () => ({
  __proto__: dart.getMethods(html$.DataTransfer.__proto__),
  [$clearData]: dart.fnType(dart.void, [], [core.String]),
  [$getData]: dart.fnType(core.String, [core.String]),
  [$setData]: dart.fnType(dart.void, [core.String, core.String]),
  [$setDragImage]: dart.fnType(dart.void, [html$.Element, core.int, core.int])
}));
dart.setLibraryUri(html$.DataTransfer, "dart:html");
dart.setFieldSignature(html$.DataTransfer, () => ({
  __proto__: dart.getFields(html$.DataTransfer.__proto__),
  [$dropEffect]: dart.fieldType(core.String),
  [$effectAllowed]: dart.fieldType(core.String),
  [$files]: dart.finalFieldType(ListOfFile()),
  [$items]: dart.finalFieldType(html$.DataTransferItemList),
  [$types]: dart.finalFieldType(ListOfString())
}));
dart.registerExtension("DataTransfer", html$.DataTransfer);
const _webkitGetAsEntry = dart.privateName(html$, "_webkitGetAsEntry");
html$.DataTransferItem = class DataTransferItem extends _interceptors.Interceptor {
  [$getAsEntry]() {
    let entry = this[_webkitGetAsEntry]();
    if (dart.test(entry.isFile))
      _js_helper.applyExtension("FileEntry", entry);
    else if (dart.test(entry.isDirectory))
      _js_helper.applyExtension("DirectoryEntry", entry);
    else
      _js_helper.applyExtension("Entry", entry);
    return entry;
  }
  get [$kind]() {
    return this.kind;
  }
  get [$type]() {
    return this.type;
  }
  [$getAsFile](...args) {
    return this.getAsFile.apply(this, args);
  }
  [_webkitGetAsEntry](...args) {
    return this.webkitGetAsEntry.apply(this, args);
  }
};
dart.addTypeTests(html$.DataTransferItem);
const kind$ = Symbol("DataTransferItem.kind");
const type$12 = Symbol("DataTransferItem.type");
dart.setMethodSignature(html$.DataTransferItem, () => ({
  __proto__: dart.getMethods(html$.DataTransferItem.__proto__),
  [$getAsEntry]: dart.fnType(html$.Entry, []),
  [$getAsFile]: dart.fnType(html$.File, []),
  [_webkitGetAsEntry]: dart.fnType(html$.Entry, [])
}));
dart.setLibraryUri(html$.DataTransferItem, "dart:html");
dart.setFieldSignature(html$.DataTransferItem, () => ({
  __proto__: dart.getFields(html$.DataTransferItem.__proto__),
  [$kind]: dart.finalFieldType(core.String),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("DataTransferItem", html$.DataTransferItem);
html$.DataTransferItemList = class DataTransferItemList extends _interceptors.Interceptor {
  get [$length]() {
    return this.length;
  }
  [$add](...args) {
    return this.add.apply(this, args);
  }
  [$addData](...args) {
    return this.add.apply(this, args);
  }
  [$addFile](...args) {
    return this.add.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$remove](...args) {
    return this.remove.apply(this, args);
  }
  [$_get](index) {
    return this[index];
  }
};
dart.addTypeTests(html$.DataTransferItemList);
const length$5 = Symbol("DataTransferItemList.length");
dart.setMethodSignature(html$.DataTransferItemList, () => ({
  __proto__: dart.getMethods(html$.DataTransferItemList.__proto__),
  [$add]: dart.fnType(html$.DataTransferItem, [dart.dynamic], [core.String]),
  [$addData]: dart.fnType(html$.DataTransferItem, [core.String, core.String]),
  [$addFile]: dart.fnType(html$.DataTransferItem, [html$.File]),
  [$clear]: dart.fnType(dart.void, []),
  [$item]: dart.fnType(html$.DataTransferItem, [core.int]),
  [$remove]: dart.fnType(dart.void, [core.int]),
  [$_get]: dart.fnType(html$.DataTransferItem, [core.int])
}));
dart.setLibraryUri(html$.DataTransferItemList, "dart:html");
dart.setFieldSignature(html$.DataTransferItemList, () => ({
  __proto__: dart.getFields(html$.DataTransferItemList.__proto__),
  [$length]: dart.finalFieldType(core.int)
}));
dart.registerExtension("DataTransferItemList", html$.DataTransferItemList);
const _postMessage_1 = dart.privateName(html$, "_postMessage_1");
const _postMessage_2 = dart.privateName(html$, "_postMessage_2");
const _webkitRequestFileSystem = dart.privateName(html$, "_webkitRequestFileSystem");
const _webkitResolveLocalFileSystemUrl = dart.privateName(html$, "_webkitResolveLocalFileSystemUrl");
const _setInterval_String = dart.privateName(html$, "_setInterval_String");
const _setTimeout_String = dart.privateName(html$, "_setTimeout_String");
const _clearInterval = dart.privateName(html$, "_clearInterval");
const _clearTimeout = dart.privateName(html$, "_clearTimeout");
const _setInterval = dart.privateName(html$, "_setInterval");
const _setTimeout = dart.privateName(html$, "_setTimeout");
html$.WorkerGlobalScope = class WorkerGlobalScope extends html$.EventTarget {
  get [$addressSpace]() {
    return this.addressSpace;
  }
  get [$caches]() {
    return this.caches;
  }
  get [$crypto]() {
    return this.crypto;
  }
  get [$indexedDB]() {
    return this.indexedDB;
  }
  get [$isSecureContext]() {
    return this.isSecureContext;
  }
  get [$location]() {
    return this.location;
  }
  get [$navigator]() {
    return this.navigator;
  }
  get [$origin]() {
    return this.origin;
  }
  get [$performance]() {
    return this.performance;
  }
  get [$self]() {
    return this.self;
  }
  [$fetch](input, init) {
    if (init === void 0) init = null;
    let init_dict = null;
    if (init != null) {
      init_dict = html_common.convertDartToNative_Dictionary(init);
    }
    return html$.promiseToFuture(dart.dynamic, this.fetch(input, init_dict));
  }
  [$importScripts](...args) {
    return this.importScripts.apply(this, args);
  }
  [$atob](...args) {
    return this.atob.apply(this, args);
  }
  [$btoa](...args) {
    return this.btoa.apply(this, args);
  }
  [_setInterval_String](...args) {
    return this.setInterval.apply(this, args);
  }
  [_setTimeout_String](...args) {
    return this.setTimeout.apply(this, args);
  }
  [_clearInterval](...args) {
    return this.clearInterval.apply(this, args);
  }
  [_clearTimeout](...args) {
    return this.clearTimeout.apply(this, args);
  }
  [_setInterval](...args) {
    return this.setInterval.apply(this, args);
  }
  [_setTimeout](...args) {
    return this.setTimeout.apply(this, args);
  }
  get [$onError]() {
    return html$.WorkerGlobalScope.errorEvent.forTarget(this);
  }
  static get instance() {
    return html$._workerSelf;
  }
};
dart.addTypeTests(html$.WorkerGlobalScope);
const addressSpace = Symbol("WorkerGlobalScope.addressSpace");
const caches = Symbol("WorkerGlobalScope.caches");
const crypto$ = Symbol("WorkerGlobalScope.crypto");
const indexedDB = Symbol("WorkerGlobalScope.indexedDB");
const isSecureContext = Symbol("WorkerGlobalScope.isSecureContext");
const navigator = Symbol("WorkerGlobalScope.navigator");
const origin$0 = Symbol("WorkerGlobalScope.origin");
const performance = Symbol("WorkerGlobalScope.performance");
const self$ = Symbol("WorkerGlobalScope.self");
html$.WorkerGlobalScope[dart.implements] = () => [html$._WindowTimers, html$.WindowBase64];
dart.setMethodSignature(html$.WorkerGlobalScope, () => ({
  __proto__: dart.getMethods(html$.WorkerGlobalScope.__proto__),
  [$fetch]: dart.fnType(async.Future, [dart.dynamic], [core.Map]),
  [$importScripts]: dart.fnType(dart.void, [core.String]),
  [$atob]: dart.fnType(core.String, [core.String]),
  [$btoa]: dart.fnType(core.String, [core.String]),
  [_setInterval_String]: dart.fnType(core.int, [core.String], [core.int, core.Object]),
  [_setTimeout_String]: dart.fnType(core.int, [core.String], [core.int, core.Object]),
  [_clearInterval]: dart.fnType(dart.void, [], [core.int]),
  [_clearTimeout]: dart.fnType(dart.void, [], [core.int]),
  [_setInterval]: dart.fnType(core.int, [core.Object], [core.int]),
  [_setTimeout]: dart.fnType(core.int, [core.Object], [core.int])
}));
dart.setGetterSignature(html$.WorkerGlobalScope, () => ({
  __proto__: dart.getGetters(html$.WorkerGlobalScope.__proto__),
  [$onError]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.WorkerGlobalScope, "dart:html");
dart.setFieldSignature(html$.WorkerGlobalScope, () => ({
  __proto__: dart.getFields(html$.WorkerGlobalScope.__proto__),
  [$addressSpace]: dart.finalFieldType(core.String),
  [$caches]: dart.finalFieldType(html$.CacheStorage),
  [$crypto]: dart.finalFieldType(html$.Crypto),
  [$indexedDB]: dart.finalFieldType(indexed_db.IdbFactory),
  [$isSecureContext]: dart.finalFieldType(core.bool),
  [$location]: dart.finalFieldType(html$._WorkerLocation),
  [$navigator]: dart.finalFieldType(html$._WorkerNavigator),
  [$origin]: dart.finalFieldType(core.String),
  [$performance]: dart.finalFieldType(html$.WorkerPerformance),
  [$self]: dart.finalFieldType(html$.WorkerGlobalScope)
}));
dart.defineLazy(html$.WorkerGlobalScope, {
  /*html$.WorkerGlobalScope.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  }
});
dart.registerExtension("WorkerGlobalScope", html$.WorkerGlobalScope);
html$.DedicatedWorkerGlobalScope = class DedicatedWorkerGlobalScope extends html$.WorkerGlobalScope {
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [_webkitRequestFileSystem](...args) {
    return this.webkitRequestFileSystem.apply(this, args);
  }
  [$requestFileSystemSync](...args) {
    return this.webkitRequestFileSystemSync.apply(this, args);
  }
  [$resolveLocalFileSystemSyncUrl](...args) {
    return this.webkitResolveLocalFileSystemSyncURL.apply(this, args);
  }
  [_webkitResolveLocalFileSystemUrl](...args) {
    return this.webkitResolveLocalFileSystemURL.apply(this, args);
  }
  get [$onMessage]() {
    return html$.DedicatedWorkerGlobalScope.messageEvent.forTarget(this);
  }
  static get instance() {
    return html$.DedicatedWorkerGlobalScope.as(html$._workerSelf);
  }
};
dart.addTypeTests(html$.DedicatedWorkerGlobalScope);
dart.setMethodSignature(html$.DedicatedWorkerGlobalScope, () => ({
  __proto__: dart.getMethods(html$.DedicatedWorkerGlobalScope.__proto__),
  [$close]: dart.fnType(dart.void, []),
  [$postMessage]: dart.fnType(dart.void, [dart.dynamic], [core.List$(core.Object)]),
  [_postMessage_1]: dart.fnType(dart.void, [dart.dynamic, core.List$(core.Object)]),
  [_postMessage_2]: dart.fnType(dart.void, [dart.dynamic]),
  [_webkitRequestFileSystem]: dart.fnType(dart.void, [core.int, core.int], [dart.fnType(dart.void, [html$.FileSystem]), dart.fnType(dart.void, [html$.DomException])]),
  [$requestFileSystemSync]: dart.fnType(html$._DOMFileSystemSync, [core.int, core.int]),
  [$resolveLocalFileSystemSyncUrl]: dart.fnType(html$._EntrySync, [core.String]),
  [_webkitResolveLocalFileSystemUrl]: dart.fnType(dart.void, [core.String, dart.fnType(dart.void, [html$.Entry])], [dart.fnType(dart.void, [html$.DomException])])
}));
dart.setGetterSignature(html$.DedicatedWorkerGlobalScope, () => ({
  __proto__: dart.getGetters(html$.DedicatedWorkerGlobalScope.__proto__),
  [$onMessage]: async.Stream$(html$.MessageEvent)
}));
dart.setLibraryUri(html$.DedicatedWorkerGlobalScope, "dart:html");
dart.defineLazy(html$.DedicatedWorkerGlobalScope, {
  /*html$.DedicatedWorkerGlobalScope.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  },
  /*html$.DedicatedWorkerGlobalScope.PERSISTENT*/get PERSISTENT() {
    return 1;
  },
  /*html$.DedicatedWorkerGlobalScope.TEMPORARY*/get TEMPORARY() {
    return 0;
  }
});
dart.registerExtension("DedicatedWorkerGlobalScope", html$.DedicatedWorkerGlobalScope);
html$.DeprecatedStorageInfo = class DeprecatedStorageInfo extends _interceptors.Interceptor {
  [$queryUsageAndQuota](...args) {
    return this.queryUsageAndQuota.apply(this, args);
  }
  [$requestQuota](...args) {
    return this.requestQuota.apply(this, args);
  }
};
dart.addTypeTests(html$.DeprecatedStorageInfo);
dart.setMethodSignature(html$.DeprecatedStorageInfo, () => ({
  __proto__: dart.getMethods(html$.DeprecatedStorageInfo.__proto__),
  [$queryUsageAndQuota]: dart.fnType(dart.void, [core.int], [dart.fnType(dart.void, [core.int, core.int]), dart.fnType(dart.void, [html$.DomError])]),
  [$requestQuota]: dart.fnType(dart.void, [core.int, core.int], [dart.fnType(dart.void, [core.int]), dart.fnType(dart.void, [html$.DomError])])
}));
dart.setLibraryUri(html$.DeprecatedStorageInfo, "dart:html");
dart.defineLazy(html$.DeprecatedStorageInfo, {
  /*html$.DeprecatedStorageInfo.PERSISTENT*/get PERSISTENT() {
    return 1;
  },
  /*html$.DeprecatedStorageInfo.TEMPORARY*/get TEMPORARY() {
    return 0;
  }
});
dart.registerExtension("DeprecatedStorageInfo", html$.DeprecatedStorageInfo);
html$.DeprecatedStorageQuota = class DeprecatedStorageQuota extends _interceptors.Interceptor {
  [$queryUsageAndQuota](...args) {
    return this.queryUsageAndQuota.apply(this, args);
  }
  [$requestQuota](...args) {
    return this.requestQuota.apply(this, args);
  }
};
dart.addTypeTests(html$.DeprecatedStorageQuota);
dart.setMethodSignature(html$.DeprecatedStorageQuota, () => ({
  __proto__: dart.getMethods(html$.DeprecatedStorageQuota.__proto__),
  [$queryUsageAndQuota]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.int, core.int])], [dart.fnType(dart.void, [html$.DomError])]),
  [$requestQuota]: dart.fnType(dart.void, [core.int], [dart.fnType(dart.void, [core.int]), dart.fnType(dart.void, [html$.DomError])])
}));
dart.setLibraryUri(html$.DeprecatedStorageQuota, "dart:html");
dart.registerExtension("DeprecatedStorageQuota", html$.DeprecatedStorageQuota);
html$.ReportBody = class ReportBody extends _interceptors.Interceptor {};
dart.addTypeTests(html$.ReportBody);
dart.setLibraryUri(html$.ReportBody, "dart:html");
dart.registerExtension("ReportBody", html$.ReportBody);
html$.DeprecationReport = class DeprecationReport extends html$.ReportBody {
  get [$lineNumber]() {
    return this.lineNumber;
  }
  get [$message]() {
    return this.message;
  }
  get [$sourceFile]() {
    return this.sourceFile;
  }
};
dart.addTypeTests(html$.DeprecationReport);
const lineNumber = Symbol("DeprecationReport.lineNumber");
const message$16 = Symbol("DeprecationReport.message");
const sourceFile = Symbol("DeprecationReport.sourceFile");
dart.setLibraryUri(html$.DeprecationReport, "dart:html");
dart.setFieldSignature(html$.DeprecationReport, () => ({
  __proto__: dart.getFields(html$.DeprecationReport.__proto__),
  [$lineNumber]: dart.finalFieldType(core.int),
  [$message]: dart.finalFieldType(core.String),
  [$sourceFile]: dart.finalFieldType(core.String)
}));
dart.registerExtension("DeprecationReport", html$.DeprecationReport);
html$.DetailsElement = class DetailsElement extends html$.HtmlElement {
  static new() {
    return html$.DetailsElement._check(html$.document[$createElement]("details"));
  }
  static get supported() {
    return html$.Element.isTagSupported("details");
  }
  get [$open]() {
    return this.open;
  }
  set [$open](value) {
    this.open = value;
  }
};
(html$.DetailsElement.created = function() {
  this[open] = null;
  html$.DetailsElement.__proto__.created.call(this);
}).prototype = html$.DetailsElement.prototype;
dart.addTypeTests(html$.DetailsElement);
const open = Symbol("DetailsElement.open");
dart.setLibraryUri(html$.DetailsElement, "dart:html");
dart.setFieldSignature(html$.DetailsElement, () => ({
  __proto__: dart.getFields(html$.DetailsElement.__proto__),
  [$open]: dart.fieldType(core.bool)
}));
dart.registerExtension("HTMLDetailsElement", html$.DetailsElement);
html$.DetectedBarcode = class DetectedBarcode$ extends _interceptors.Interceptor {
  static new() {
    return html$.DetectedBarcode._create_1();
  }
  static _create_1() {
    return new DetectedBarcode();
  }
  get [$boundingBox]() {
    return this.boundingBox;
  }
  get [$cornerPoints]() {
    return this.cornerPoints;
  }
  get [$rawValue]() {
    return this.rawValue;
  }
};
dart.addTypeTests(html$.DetectedBarcode);
const boundingBox = Symbol("DetectedBarcode.boundingBox");
const cornerPoints = Symbol("DetectedBarcode.cornerPoints");
const rawValue = Symbol("DetectedBarcode.rawValue");
dart.setLibraryUri(html$.DetectedBarcode, "dart:html");
dart.setFieldSignature(html$.DetectedBarcode, () => ({
  __proto__: dart.getFields(html$.DetectedBarcode.__proto__),
  [$boundingBox]: dart.finalFieldType(RectangleOfnum()),
  [$cornerPoints]: dart.finalFieldType(core.List),
  [$rawValue]: dart.finalFieldType(core.String)
}));
dart.registerExtension("DetectedBarcode", html$.DetectedBarcode);
html$.DetectedFace = class DetectedFace$ extends _interceptors.Interceptor {
  static new() {
    return html$.DetectedFace._create_1();
  }
  static _create_1() {
    return new DetectedFace();
  }
  get [$boundingBox]() {
    return this.boundingBox;
  }
  get [$landmarks]() {
    return this.landmarks;
  }
};
dart.addTypeTests(html$.DetectedFace);
const boundingBox$ = Symbol("DetectedFace.boundingBox");
const landmarks = Symbol("DetectedFace.landmarks");
dart.setLibraryUri(html$.DetectedFace, "dart:html");
dart.setFieldSignature(html$.DetectedFace, () => ({
  __proto__: dart.getFields(html$.DetectedFace.__proto__),
  [$boundingBox]: dart.finalFieldType(RectangleOfnum()),
  [$landmarks]: dart.finalFieldType(core.List)
}));
dart.registerExtension("DetectedFace", html$.DetectedFace);
html$.DetectedText = class DetectedText$ extends _interceptors.Interceptor {
  static new() {
    return html$.DetectedText._create_1();
  }
  static _create_1() {
    return new DetectedText();
  }
  get [$boundingBox]() {
    return this.boundingBox;
  }
  get [$cornerPoints]() {
    return this.cornerPoints;
  }
  get [$rawValue]() {
    return this.rawValue;
  }
};
dart.addTypeTests(html$.DetectedText);
const boundingBox$0 = Symbol("DetectedText.boundingBox");
const cornerPoints$ = Symbol("DetectedText.cornerPoints");
const rawValue$ = Symbol("DetectedText.rawValue");
dart.setLibraryUri(html$.DetectedText, "dart:html");
dart.setFieldSignature(html$.DetectedText, () => ({
  __proto__: dart.getFields(html$.DetectedText.__proto__),
  [$boundingBox]: dart.finalFieldType(RectangleOfnum()),
  [$cornerPoints]: dart.finalFieldType(core.List),
  [$rawValue]: dart.finalFieldType(core.String)
}));
dart.registerExtension("DetectedText", html$.DetectedText);
html$.DeviceAcceleration = class DeviceAcceleration extends _interceptors.Interceptor {
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$z]() {
    return this.z;
  }
};
dart.addTypeTests(html$.DeviceAcceleration);
const x$3 = Symbol("DeviceAcceleration.x");
const y$3 = Symbol("DeviceAcceleration.y");
const z$2 = Symbol("DeviceAcceleration.z");
dart.setLibraryUri(html$.DeviceAcceleration, "dart:html");
dart.setFieldSignature(html$.DeviceAcceleration, () => ({
  __proto__: dart.getFields(html$.DeviceAcceleration.__proto__),
  [$x]: dart.finalFieldType(core.num),
  [$y]: dart.finalFieldType(core.num),
  [$z]: dart.finalFieldType(core.num)
}));
dart.registerExtension("DeviceAcceleration", html$.DeviceAcceleration);
html$.DeviceMotionEvent = class DeviceMotionEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.DeviceMotionEvent._create_1(type, eventInitDict_1);
    }
    return html$.DeviceMotionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new DeviceMotionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new DeviceMotionEvent(type);
  }
  get [$acceleration]() {
    return this.acceleration;
  }
  get [$accelerationIncludingGravity]() {
    return this.accelerationIncludingGravity;
  }
  get [$interval]() {
    return this.interval;
  }
  get [$rotationRate]() {
    return this.rotationRate;
  }
};
dart.addTypeTests(html$.DeviceMotionEvent);
const acceleration = Symbol("DeviceMotionEvent.acceleration");
const accelerationIncludingGravity = Symbol("DeviceMotionEvent.accelerationIncludingGravity");
const interval = Symbol("DeviceMotionEvent.interval");
const rotationRate = Symbol("DeviceMotionEvent.rotationRate");
dart.setLibraryUri(html$.DeviceMotionEvent, "dart:html");
dart.setFieldSignature(html$.DeviceMotionEvent, () => ({
  __proto__: dart.getFields(html$.DeviceMotionEvent.__proto__),
  [$acceleration]: dart.finalFieldType(html$.DeviceAcceleration),
  [$accelerationIncludingGravity]: dart.finalFieldType(html$.DeviceAcceleration),
  [$interval]: dart.finalFieldType(core.num),
  [$rotationRate]: dart.finalFieldType(html$.DeviceRotationRate)
}));
dart.registerExtension("DeviceMotionEvent", html$.DeviceMotionEvent);
html$.DeviceOrientationEvent = class DeviceOrientationEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.DeviceOrientationEvent._create_1(type, eventInitDict_1);
    }
    return html$.DeviceOrientationEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new DeviceOrientationEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new DeviceOrientationEvent(type);
  }
  get [$absolute]() {
    return this.absolute;
  }
  get [$alpha]() {
    return this.alpha;
  }
  get [$beta]() {
    return this.beta;
  }
  get [$gamma]() {
    return this.gamma;
  }
};
dart.addTypeTests(html$.DeviceOrientationEvent);
const absolute = Symbol("DeviceOrientationEvent.absolute");
const alpha = Symbol("DeviceOrientationEvent.alpha");
const beta = Symbol("DeviceOrientationEvent.beta");
const gamma = Symbol("DeviceOrientationEvent.gamma");
dart.setLibraryUri(html$.DeviceOrientationEvent, "dart:html");
dart.setFieldSignature(html$.DeviceOrientationEvent, () => ({
  __proto__: dart.getFields(html$.DeviceOrientationEvent.__proto__),
  [$absolute]: dart.finalFieldType(core.bool),
  [$alpha]: dart.finalFieldType(core.num),
  [$beta]: dart.finalFieldType(core.num),
  [$gamma]: dart.finalFieldType(core.num)
}));
dart.registerExtension("DeviceOrientationEvent", html$.DeviceOrientationEvent);
html$.DeviceRotationRate = class DeviceRotationRate extends _interceptors.Interceptor {
  get [$alpha]() {
    return this.alpha;
  }
  get [$beta]() {
    return this.beta;
  }
  get [$gamma]() {
    return this.gamma;
  }
};
dart.addTypeTests(html$.DeviceRotationRate);
const alpha$ = Symbol("DeviceRotationRate.alpha");
const beta$ = Symbol("DeviceRotationRate.beta");
const gamma$ = Symbol("DeviceRotationRate.gamma");
dart.setLibraryUri(html$.DeviceRotationRate, "dart:html");
dart.setFieldSignature(html$.DeviceRotationRate, () => ({
  __proto__: dart.getFields(html$.DeviceRotationRate.__proto__),
  [$alpha]: dart.finalFieldType(core.num),
  [$beta]: dart.finalFieldType(core.num),
  [$gamma]: dart.finalFieldType(core.num)
}));
dart.registerExtension("DeviceRotationRate", html$.DeviceRotationRate);
html$.DialogElement = class DialogElement extends html$.HtmlElement {
  get [$open]() {
    return this.open;
  }
  set [$open](value) {
    this.open = value;
  }
  get [$returnValue]() {
    return this.returnValue;
  }
  set [$returnValue](value) {
    this.returnValue = value;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$show](...args) {
    return this.show.apply(this, args);
  }
  [$showModal](...args) {
    return this.showModal.apply(this, args);
  }
};
(html$.DialogElement.created = function() {
  this[open$] = null;
  this[returnValue] = null;
  html$.DialogElement.__proto__.created.call(this);
}).prototype = html$.DialogElement.prototype;
dart.addTypeTests(html$.DialogElement);
const open$ = Symbol("DialogElement.open");
const returnValue = Symbol("DialogElement.returnValue");
dart.setMethodSignature(html$.DialogElement, () => ({
  __proto__: dart.getMethods(html$.DialogElement.__proto__),
  [$close]: dart.fnType(dart.void, [], [core.String]),
  [$show]: dart.fnType(dart.void, []),
  [$showModal]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.DialogElement, "dart:html");
dart.setFieldSignature(html$.DialogElement, () => ({
  __proto__: dart.getFields(html$.DialogElement.__proto__),
  [$open]: dart.fieldType(core.bool),
  [$returnValue]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLDialogElement", html$.DialogElement);
const _getDirectory = dart.privateName(html$, "_getDirectory");
const _createReader = dart.privateName(html$, "_createReader");
const _getFile = dart.privateName(html$, "_getFile");
const __getDirectory_1 = dart.privateName(html$, "__getDirectory_1");
const __getDirectory_2 = dart.privateName(html$, "__getDirectory_2");
const __getDirectory_3 = dart.privateName(html$, "__getDirectory_3");
const __getDirectory_4 = dart.privateName(html$, "__getDirectory_4");
const __getDirectory = dart.privateName(html$, "__getDirectory");
const __getFile_1 = dart.privateName(html$, "__getFile_1");
const __getFile_2 = dart.privateName(html$, "__getFile_2");
const __getFile_3 = dart.privateName(html$, "__getFile_3");
const __getFile_4 = dart.privateName(html$, "__getFile_4");
const __getFile = dart.privateName(html$, "__getFile");
const _removeRecursively = dart.privateName(html$, "_removeRecursively");
const _copyTo = dart.privateName(html$, "_copyTo");
const _getMetadata = dart.privateName(html$, "_getMetadata");
const _getParent = dart.privateName(html$, "_getParent");
const _moveTo = dart.privateName(html$, "_moveTo");
const _remove$ = dart.privateName(html$, "_remove");
html$.Entry = class Entry extends _interceptors.Interceptor {
  get [$filesystem]() {
    return this.filesystem;
  }
  get [$fullPath]() {
    return this.fullPath;
  }
  get [$isDirectory]() {
    return this.isDirectory;
  }
  get [$isFile]() {
    return this.isFile;
  }
  get [$name]() {
    return this.name;
  }
  [_copyTo](...args) {
    return this.copyTo.apply(this, args);
  }
  [$copyTo](parent, opts) {
    let name = opts && 'name' in opts ? opts.name : null;
    let completer = CompleterOfEntry().new();
    this[_copyTo](parent, name, dart.fn(value => {
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [_getMetadata](...args) {
    return this.getMetadata.apply(this, args);
  }
  [$getMetadata]() {
    let completer = CompleterOfMetadata().new();
    this[_getMetadata](dart.fn(value => {
      _js_helper.applyExtension("Metadata", value);
      completer.complete(value);
    }, MetadataToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [_getParent](...args) {
    return this.getParent.apply(this, args);
  }
  [$getParent]() {
    let completer = CompleterOfEntry().new();
    this[_getParent](dart.fn(value => {
      _js_helper.applyExtension("Entry", value);
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [_moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [$moveTo](parent, opts) {
    let name = opts && 'name' in opts ? opts.name : null;
    let completer = CompleterOfEntry().new();
    this[_moveTo](parent, name, dart.fn(value => {
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [_remove$](...args) {
    return this.remove.apply(this, args);
  }
  [$remove]() {
    let completer = async.Completer.new();
    this[_remove$](dart.fn(() => {
      completer.complete();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [$toUrl](...args) {
    return this.toURL.apply(this, args);
  }
};
dart.addTypeTests(html$.Entry);
const filesystem = Symbol("Entry.filesystem");
const fullPath = Symbol("Entry.fullPath");
const isDirectory = Symbol("Entry.isDirectory");
const isFile = Symbol("Entry.isFile");
const name$10 = Symbol("Entry.name");
dart.setMethodSignature(html$.Entry, () => ({
  __proto__: dart.getMethods(html$.Entry.__proto__),
  [_copyTo]: dart.fnType(dart.void, [html$.DirectoryEntry], [core.String, dart.fnType(dart.void, [html$.Entry]), dart.fnType(dart.void, [html$.DomException])]),
  [$copyTo]: dart.fnType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
  [_getMetadata]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.Metadata])], [dart.fnType(dart.void, [html$.DomException])]),
  [$getMetadata]: dart.fnType(async.Future$(html$.Metadata), []),
  [_getParent]: dart.fnType(dart.void, [], [dart.fnType(dart.void, [html$.Entry]), dart.fnType(dart.void, [html$.DomException])]),
  [$getParent]: dart.fnType(async.Future$(html$.Entry), []),
  [_moveTo]: dart.fnType(dart.void, [html$.DirectoryEntry], [core.String, dart.fnType(dart.void, [html$.Entry]), dart.fnType(dart.void, [html$.DomException])]),
  [$moveTo]: dart.fnType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
  [_remove$]: dart.fnType(dart.void, [dart.fnType(dart.void, [])], [dart.fnType(dart.void, [html$.DomException])]),
  [$remove]: dart.fnType(async.Future, []),
  [$toUrl]: dart.fnType(core.String, [])
}));
dart.setLibraryUri(html$.Entry, "dart:html");
dart.setFieldSignature(html$.Entry, () => ({
  __proto__: dart.getFields(html$.Entry.__proto__),
  [$filesystem]: dart.finalFieldType(html$.FileSystem),
  [$fullPath]: dart.finalFieldType(core.String),
  [$isDirectory]: dart.finalFieldType(core.bool),
  [$isFile]: dart.finalFieldType(core.bool),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Entry", html$.Entry);
html$.DirectoryEntry = class DirectoryEntry extends html$.Entry {
  [$createDirectory](path, opts) {
    let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
    return this[_getDirectory](path, {options: new _js_helper.LinkedMap.from(["create", true, "exclusive", exclusive])});
  }
  [$createReader]() {
    let reader = this[_createReader]();
    _js_helper.applyExtension("DirectoryReader", reader);
    return reader;
  }
  [$getDirectory](path) {
    return this[_getDirectory](path);
  }
  [$createFile](path, opts) {
    let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
    return this[_getFile](path, {options: new _js_helper.LinkedMap.from(["create", true, "exclusive", exclusive])});
  }
  [$getFile](path) {
    return this[_getFile](path);
  }
  [_createReader](...args) {
    return this.createReader.apply(this, args);
  }
  [__getDirectory](path, options, successCallback, errorCallback) {
    if (options === void 0) options = null;
    if (successCallback === void 0) successCallback = null;
    if (errorCallback === void 0) errorCallback = null;
    if (errorCallback != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getDirectory_1](path, options_1, successCallback, errorCallback);
      return;
    }
    if (successCallback != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getDirectory_2](path, options_1, successCallback);
      return;
    }
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getDirectory_3](path, options_1);
      return;
    }
    this[__getDirectory_4](path);
    return;
  }
  [__getDirectory_1](...args) {
    return this.getDirectory.apply(this, args);
  }
  [__getDirectory_2](...args) {
    return this.getDirectory.apply(this, args);
  }
  [__getDirectory_3](...args) {
    return this.getDirectory.apply(this, args);
  }
  [__getDirectory_4](...args) {
    return this.getDirectory.apply(this, args);
  }
  [_getDirectory](path, opts) {
    let options = opts && 'options' in opts ? opts.options : null;
    let completer = CompleterOfEntry().new();
    this[__getDirectory](path, options, dart.fn(value => {
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [__getFile](path, options, successCallback, errorCallback) {
    if (options === void 0) options = null;
    if (successCallback === void 0) successCallback = null;
    if (errorCallback === void 0) errorCallback = null;
    if (errorCallback != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getFile_1](path, options_1, successCallback, errorCallback);
      return;
    }
    if (successCallback != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getFile_2](path, options_1, successCallback);
      return;
    }
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[__getFile_3](path, options_1);
      return;
    }
    this[__getFile_4](path);
    return;
  }
  [__getFile_1](...args) {
    return this.getFile.apply(this, args);
  }
  [__getFile_2](...args) {
    return this.getFile.apply(this, args);
  }
  [__getFile_3](...args) {
    return this.getFile.apply(this, args);
  }
  [__getFile_4](...args) {
    return this.getFile.apply(this, args);
  }
  [_getFile](path, opts) {
    let options = opts && 'options' in opts ? opts.options : null;
    let completer = CompleterOfEntry().new();
    this[__getFile](path, options, dart.fn(value => {
      _js_helper.applyExtension("FileEntry", value);
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [_removeRecursively](...args) {
    return this.removeRecursively.apply(this, args);
  }
  [$removeRecursively]() {
    let completer = async.Completer.new();
    this[_removeRecursively](dart.fn(() => {
      completer.complete();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
};
dart.addTypeTests(html$.DirectoryEntry);
dart.setMethodSignature(html$.DirectoryEntry, () => ({
  __proto__: dart.getMethods(html$.DirectoryEntry.__proto__),
  [$createDirectory]: dart.fnType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
  [$createReader]: dart.fnType(html$.DirectoryReader, []),
  [$getDirectory]: dart.fnType(async.Future$(html$.Entry), [core.String]),
  [$createFile]: dart.fnType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
  [$getFile]: dart.fnType(async.Future$(html$.Entry), [core.String]),
  [_createReader]: dart.fnType(html$.DirectoryReader, []),
  [__getDirectory]: dart.fnType(dart.void, [core.String], [core.Map, dart.fnType(dart.void, [html$.Entry]), dart.fnType(dart.void, [html$.DomException])]),
  [__getDirectory_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.fnType(dart.void, [html$.Entry]), dart.fnType(dart.void, [html$.DomException])]),
  [__getDirectory_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.fnType(dart.void, [html$.Entry])]),
  [__getDirectory_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic]),
  [__getDirectory_4]: dart.fnType(dart.void, [dart.dynamic]),
  [_getDirectory]: dart.fnType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
  [__getFile]: dart.fnType(dart.void, [core.String], [core.Map, dart.fnType(dart.void, [html$.Entry]), dart.fnType(dart.void, [html$.DomException])]),
  [__getFile_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.fnType(dart.void, [html$.Entry]), dart.fnType(dart.void, [html$.DomException])]),
  [__getFile_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.fnType(dart.void, [html$.Entry])]),
  [__getFile_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic]),
  [__getFile_4]: dart.fnType(dart.void, [dart.dynamic]),
  [_getFile]: dart.fnType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
  [_removeRecursively]: dart.fnType(dart.void, [dart.fnType(dart.void, [])], [dart.fnType(dart.void, [html$.DomException])]),
  [$removeRecursively]: dart.fnType(async.Future, [])
}));
dart.setLibraryUri(html$.DirectoryEntry, "dart:html");
dart.registerExtension("DirectoryEntry", html$.DirectoryEntry);
const _readEntries = dart.privateName(html$, "_readEntries");
html$.DirectoryReader = class DirectoryReader extends _interceptors.Interceptor {
  [_readEntries](...args) {
    return this.readEntries.apply(this, args);
  }
  [$readEntries]() {
    let completer = CompleterOfListOfEntry().new();
    this[_readEntries](dart.fn(values => {
      values[$forEach](dart.fn(value => {
        _js_helper.applyExtension("Entry", value);
        let entry = html$.Entry.as(value);
        if (dart.test(entry.isFile))
          _js_helper.applyExtension("FileEntry", entry);
        else if (dart.test(entry.isDirectory)) _js_helper.applyExtension("DirectoryEntry", entry);
      }, dynamicToNull()));
      completer.complete(ListOfEntry().from(values));
    }, ListToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
};
dart.addTypeTests(html$.DirectoryReader);
dart.setMethodSignature(html$.DirectoryReader, () => ({
  __proto__: dart.getMethods(html$.DirectoryReader.__proto__),
  [_readEntries]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.List])], [dart.fnType(dart.void, [html$.DomException])]),
  [$readEntries]: dart.fnType(async.Future$(core.List$(html$.Entry)), [])
}));
dart.setLibraryUri(html$.DirectoryReader, "dart:html");
dart.registerExtension("DirectoryReader", html$.DirectoryReader);
html$.DivElement = class DivElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("div");
  }
};
(html$.DivElement.created = function() {
  html$.DivElement.__proto__.created.call(this);
}).prototype = html$.DivElement.prototype;
dart.addTypeTests(html$.DivElement);
dart.setLibraryUri(html$.DivElement, "dart:html");
dart.registerExtension("HTMLDivElement", html$.DivElement);
const _body = dart.privateName(html$, "_body");
const _get_window = dart.privateName(html$, "_get_window");
const _head$ = dart.privateName(html$, "_head");
const _lastModified = dart.privateName(html$, "_lastModified");
const _preferredStylesheetSet = dart.privateName(html$, "_preferredStylesheetSet");
const _referrer = dart.privateName(html$, "_referrer");
const _selectedStylesheetSet = dart.privateName(html$, "_selectedStylesheetSet");
const _title = dart.privateName(html$, "_title");
const _visibilityState = dart.privateName(html$, "_visibilityState");
const _webkitFullscreenElement = dart.privateName(html$, "_webkitFullscreenElement");
const _webkitFullscreenEnabled = dart.privateName(html$, "_webkitFullscreenEnabled");
const _webkitHidden = dart.privateName(html$, "_webkitHidden");
const _webkitVisibilityState = dart.privateName(html$, "_webkitVisibilityState");
const _caretRangeFromPoint = dart.privateName(html$, "_caretRangeFromPoint");
const _createElement = dart.privateName(html$, "_createElement");
const _createElementNS = dart.privateName(html$, "_createElementNS");
const _createTextNode = dart.privateName(html$, "_createTextNode");
const _createTouch_1 = dart.privateName(html$, "_createTouch_1");
const _createTouch_2 = dart.privateName(html$, "_createTouch_2");
const _createTouch_3 = dart.privateName(html$, "_createTouch_3");
const _createTouch_4 = dart.privateName(html$, "_createTouch_4");
const _createTouch_5 = dart.privateName(html$, "_createTouch_5");
const _createTouch = dart.privateName(html$, "_createTouch");
const _createTouchList = dart.privateName(html$, "_createTouchList");
const _registerElement2_1 = dart.privateName(html$, "_registerElement2_1");
const _registerElement2_2 = dart.privateName(html$, "_registerElement2_2");
const _webkitExitFullscreen = dart.privateName(html$, "_webkitExitFullscreen");
const _styleSheets = dart.privateName(html$, "_styleSheets");
const _elementFromPoint = dart.privateName(html$, "_elementFromPoint");
const _createElement_2 = dart.privateName(html$, "_createElement_2");
const _createElementNS_2 = dart.privateName(html$, "_createElementNS_2");
const _createNodeIterator = dart.privateName(html$, "_createNodeIterator");
const _createTreeWalker = dart.privateName(html$, "_createTreeWalker");
html$.Document = class Document$ extends html$.Node {
  static new() {
    return html$.Document._create_1();
  }
  static _create_1() {
    return new Document();
  }
  get [$addressSpace]() {
    return this.addressSpace;
  }
  get [_body]() {
    return this.body;
  }
  set [_body](value) {
    this.body = value;
  }
  get [$contentType]() {
    return this.contentType;
  }
  get [$cookie]() {
    return this.cookie;
  }
  set [$cookie](value) {
    this.cookie = value;
  }
  get [$currentScript]() {
    return this.currentScript;
  }
  get [$window]() {
    return html$._convertNativeToDart_Window(this[_get_window]);
  }
  get [_get_window]() {
    return this.defaultView;
  }
  get [$documentElement]() {
    return this.documentElement;
  }
  get [$domain]() {
    return this.domain;
  }
  get [$fullscreenEnabled]() {
    return this.fullscreenEnabled;
  }
  get [_head$]() {
    return this.head;
  }
  get [$hidden]() {
    return this.hidden;
  }
  get [$implementation]() {
    return this.implementation;
  }
  get [_lastModified]() {
    return this.lastModified;
  }
  get [$origin]() {
    return this.origin;
  }
  get [_preferredStylesheetSet]() {
    return this.preferredStylesheetSet;
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [_referrer]() {
    return this.referrer;
  }
  get [$rootElement]() {
    return this.rootElement;
  }
  get [$rootScroller]() {
    return this.rootScroller;
  }
  set [$rootScroller](value) {
    this.rootScroller = value;
  }
  get [$scrollingElement]() {
    return this.scrollingElement;
  }
  get [_selectedStylesheetSet]() {
    return this.selectedStylesheetSet;
  }
  set [_selectedStylesheetSet](value) {
    this.selectedStylesheetSet = value;
  }
  get [$suborigin]() {
    return this.suborigin;
  }
  get [$timeline]() {
    return this.timeline;
  }
  get [_title]() {
    return this.title;
  }
  set [_title](value) {
    this.title = value;
  }
  get [_visibilityState]() {
    return this.visibilityState;
  }
  get [_webkitFullscreenElement]() {
    return this.webkitFullscreenElement;
  }
  get [_webkitFullscreenEnabled]() {
    return this.webkitFullscreenEnabled;
  }
  get [_webkitHidden]() {
    return this.webkitHidden;
  }
  get [_webkitVisibilityState]() {
    return this.webkitVisibilityState;
  }
  [$adoptNode](...args) {
    return this.adoptNode.apply(this, args);
  }
  [_caretRangeFromPoint](...args) {
    return this.caretRangeFromPoint.apply(this, args);
  }
  [$createDocumentFragment](...args) {
    return this.createDocumentFragment.apply(this, args);
  }
  [_createElement](...args) {
    return this.createElement.apply(this, args);
  }
  [_createElementNS](...args) {
    return this.createElementNS.apply(this, args);
  }
  [_createEvent](...args) {
    return this.createEvent.apply(this, args);
  }
  [$createRange](...args) {
    return this.createRange.apply(this, args);
  }
  [_createTextNode](...args) {
    return this.createTextNode.apply(this, args);
  }
  [_createTouch](view, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) {
    if (radiusX === void 0) radiusX = null;
    if (radiusY === void 0) radiusY = null;
    if (rotationAngle === void 0) rotationAngle = null;
    if (force === void 0) force = null;
    if (force != null) {
      let target_1 = html$._convertDartToNative_EventTarget(target);
      return this[_createTouch_1](view, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
    }
    if (rotationAngle != null) {
      let target_1 = html$._convertDartToNative_EventTarget(target);
      return this[_createTouch_2](view, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle);
    }
    if (radiusY != null) {
      let target_1 = html$._convertDartToNative_EventTarget(target);
      return this[_createTouch_3](view, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY);
    }
    if (radiusX != null) {
      let target_1 = html$._convertDartToNative_EventTarget(target);
      return this[_createTouch_4](view, target_1, identifier, pageX, pageY, screenX, screenY, radiusX);
    }
    let target_1 = html$._convertDartToNative_EventTarget(target);
    return this[_createTouch_5](view, target_1, identifier, pageX, pageY, screenX, screenY);
  }
  [_createTouch_1](...args) {
    return this.createTouch.apply(this, args);
  }
  [_createTouch_2](...args) {
    return this.createTouch.apply(this, args);
  }
  [_createTouch_3](...args) {
    return this.createTouch.apply(this, args);
  }
  [_createTouch_4](...args) {
    return this.createTouch.apply(this, args);
  }
  [_createTouch_5](...args) {
    return this.createTouch.apply(this, args);
  }
  [_createTouchList](...args) {
    return this.createTouchList.apply(this, args);
  }
  [$execCommand](...args) {
    return this.execCommand.apply(this, args);
  }
  [$exitFullscreen](...args) {
    return this.exitFullscreen.apply(this, args);
  }
  [$exitPointerLock](...args) {
    return this.exitPointerLock.apply(this, args);
  }
  [$getAnimations](...args) {
    return this.getAnimations.apply(this, args);
  }
  [$getElementsByClassName](...args) {
    return this.getElementsByClassName.apply(this, args);
  }
  [$getElementsByName](...args) {
    return this.getElementsByName.apply(this, args);
  }
  [$getElementsByTagName](...args) {
    return this.getElementsByTagName.apply(this, args);
  }
  [$importNode](...args) {
    return this.importNode.apply(this, args);
  }
  [$queryCommandEnabled](...args) {
    return this.queryCommandEnabled.apply(this, args);
  }
  [$queryCommandIndeterm](...args) {
    return this.queryCommandIndeterm.apply(this, args);
  }
  [$queryCommandState](...args) {
    return this.queryCommandState.apply(this, args);
  }
  [$queryCommandSupported](...args) {
    return this.queryCommandSupported.apply(this, args);
  }
  [$queryCommandValue](...args) {
    return this.queryCommandValue.apply(this, args);
  }
  [$registerElement2](type, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_registerElement2_1](type, options_1);
    }
    return this[_registerElement2_2](type);
  }
  [_registerElement2_1](...args) {
    return this.registerElement.apply(this, args);
  }
  [_registerElement2_2](...args) {
    return this.registerElement.apply(this, args);
  }
  [_webkitExitFullscreen](...args) {
    return this.webkitExitFullscreen.apply(this, args);
  }
  [$getElementById](...args) {
    return this.getElementById.apply(this, args);
  }
  get [$activeElement]() {
    return this.activeElement;
  }
  get [$fullscreenElement]() {
    return this.fullscreenElement;
  }
  get [$pointerLockElement]() {
    return this.pointerLockElement;
  }
  get [_styleSheets]() {
    return this.styleSheets;
  }
  [_elementFromPoint](...args) {
    return this.elementFromPoint.apply(this, args);
  }
  [$elementsFromPoint](...args) {
    return this.elementsFromPoint.apply(this, args);
  }
  get [$fonts]() {
    return this.fonts;
  }
  get [_childElementCount]() {
    return this.childElementCount;
  }
  get [_children]() {
    return this.children;
  }
  get [_firstElementChild]() {
    return this.firstElementChild;
  }
  get [_lastElementChild]() {
    return this.lastElementChild;
  }
  [$querySelector](...args) {
    return this.querySelector.apply(this, args);
  }
  [_querySelectorAll](...args) {
    return this.querySelectorAll.apply(this, args);
  }
  get [$onAbort]() {
    return html$.Element.abortEvent.forTarget(this);
  }
  get [$onBeforeCopy]() {
    return html$.Element.beforeCopyEvent.forTarget(this);
  }
  get [$onBeforeCut]() {
    return html$.Element.beforeCutEvent.forTarget(this);
  }
  get [$onBeforePaste]() {
    return html$.Element.beforePasteEvent.forTarget(this);
  }
  get [$onBlur]() {
    return html$.Element.blurEvent.forTarget(this);
  }
  get [$onCanPlay]() {
    return html$.Element.canPlayEvent.forTarget(this);
  }
  get [$onCanPlayThrough]() {
    return html$.Element.canPlayThroughEvent.forTarget(this);
  }
  get [$onChange]() {
    return html$.Element.changeEvent.forTarget(this);
  }
  get [$onClick]() {
    return html$.Element.clickEvent.forTarget(this);
  }
  get [$onContextMenu]() {
    return html$.Element.contextMenuEvent.forTarget(this);
  }
  get [$onCopy]() {
    return html$.Element.copyEvent.forTarget(this);
  }
  get [$onCut]() {
    return html$.Element.cutEvent.forTarget(this);
  }
  get [$onDoubleClick]() {
    return html$.Element.doubleClickEvent.forTarget(this);
  }
  get [$onDrag]() {
    return html$.Element.dragEvent.forTarget(this);
  }
  get [$onDragEnd]() {
    return html$.Element.dragEndEvent.forTarget(this);
  }
  get [$onDragEnter]() {
    return html$.Element.dragEnterEvent.forTarget(this);
  }
  get [$onDragLeave]() {
    return html$.Element.dragLeaveEvent.forTarget(this);
  }
  get [$onDragOver]() {
    return html$.Element.dragOverEvent.forTarget(this);
  }
  get [$onDragStart]() {
    return html$.Element.dragStartEvent.forTarget(this);
  }
  get [$onDrop]() {
    return html$.Element.dropEvent.forTarget(this);
  }
  get [$onDurationChange]() {
    return html$.Element.durationChangeEvent.forTarget(this);
  }
  get [$onEmptied]() {
    return html$.Element.emptiedEvent.forTarget(this);
  }
  get [$onEnded]() {
    return html$.Element.endedEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.Element.errorEvent.forTarget(this);
  }
  get [$onFocus]() {
    return html$.Element.focusEvent.forTarget(this);
  }
  get [$onInput]() {
    return html$.Element.inputEvent.forTarget(this);
  }
  get [$onInvalid]() {
    return html$.Element.invalidEvent.forTarget(this);
  }
  get [$onKeyDown]() {
    return html$.Element.keyDownEvent.forTarget(this);
  }
  get [$onKeyPress]() {
    return html$.Element.keyPressEvent.forTarget(this);
  }
  get [$onKeyUp]() {
    return html$.Element.keyUpEvent.forTarget(this);
  }
  get [$onLoad]() {
    return html$.Element.loadEvent.forTarget(this);
  }
  get [$onLoadedData]() {
    return html$.Element.loadedDataEvent.forTarget(this);
  }
  get [$onLoadedMetadata]() {
    return html$.Element.loadedMetadataEvent.forTarget(this);
  }
  get [$onMouseDown]() {
    return html$.Element.mouseDownEvent.forTarget(this);
  }
  get [$onMouseEnter]() {
    return html$.Element.mouseEnterEvent.forTarget(this);
  }
  get [$onMouseLeave]() {
    return html$.Element.mouseLeaveEvent.forTarget(this);
  }
  get [$onMouseMove]() {
    return html$.Element.mouseMoveEvent.forTarget(this);
  }
  get [$onMouseOut]() {
    return html$.Element.mouseOutEvent.forTarget(this);
  }
  get [$onMouseOver]() {
    return html$.Element.mouseOverEvent.forTarget(this);
  }
  get [$onMouseUp]() {
    return html$.Element.mouseUpEvent.forTarget(this);
  }
  get [$onMouseWheel]() {
    return html$.Element.mouseWheelEvent.forTarget(this);
  }
  get [$onPaste]() {
    return html$.Element.pasteEvent.forTarget(this);
  }
  get [$onPause]() {
    return html$.Element.pauseEvent.forTarget(this);
  }
  get [$onPlay]() {
    return html$.Element.playEvent.forTarget(this);
  }
  get [$onPlaying]() {
    return html$.Element.playingEvent.forTarget(this);
  }
  get [$onPointerLockChange]() {
    return html$.Document.pointerLockChangeEvent.forTarget(this);
  }
  get [$onPointerLockError]() {
    return html$.Document.pointerLockErrorEvent.forTarget(this);
  }
  get [$onRateChange]() {
    return html$.Element.rateChangeEvent.forTarget(this);
  }
  get [$onReadyStateChange]() {
    return html$.Document.readyStateChangeEvent.forTarget(this);
  }
  get [$onReset]() {
    return html$.Element.resetEvent.forTarget(this);
  }
  get [$onResize]() {
    return html$.Element.resizeEvent.forTarget(this);
  }
  get [$onScroll]() {
    return html$.Element.scrollEvent.forTarget(this);
  }
  get [$onSearch]() {
    return html$.Element.searchEvent.forTarget(this);
  }
  get [$onSecurityPolicyViolation]() {
    return html$.Document.securityPolicyViolationEvent.forTarget(this);
  }
  get [$onSeeked]() {
    return html$.Element.seekedEvent.forTarget(this);
  }
  get [$onSeeking]() {
    return html$.Element.seekingEvent.forTarget(this);
  }
  get [$onSelect]() {
    return html$.Element.selectEvent.forTarget(this);
  }
  get [$onSelectionChange]() {
    return html$.Document.selectionChangeEvent.forTarget(this);
  }
  get [$onSelectStart]() {
    return html$.Element.selectStartEvent.forTarget(this);
  }
  get [$onStalled]() {
    return html$.Element.stalledEvent.forTarget(this);
  }
  get [$onSubmit]() {
    return html$.Element.submitEvent.forTarget(this);
  }
  get [$onSuspend]() {
    return html$.Element.suspendEvent.forTarget(this);
  }
  get [$onTimeUpdate]() {
    return html$.Element.timeUpdateEvent.forTarget(this);
  }
  get [$onTouchCancel]() {
    return html$.Element.touchCancelEvent.forTarget(this);
  }
  get [$onTouchEnd]() {
    return html$.Element.touchEndEvent.forTarget(this);
  }
  get [$onTouchMove]() {
    return html$.Element.touchMoveEvent.forTarget(this);
  }
  get [$onTouchStart]() {
    return html$.Element.touchStartEvent.forTarget(this);
  }
  get [$onVolumeChange]() {
    return html$.Element.volumeChangeEvent.forTarget(this);
  }
  get [$onWaiting]() {
    return html$.Element.waitingEvent.forTarget(this);
  }
  get [$onFullscreenChange]() {
    return html$.Element.fullscreenChangeEvent.forTarget(this);
  }
  get [$onFullscreenError]() {
    return html$.Element.fullscreenErrorEvent.forTarget(this);
  }
  [$querySelectorAll](T, selectors) {
    return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
  }
  get [$supportsRegisterElement]() {
    return "registerElement" in this;
  }
  get [$supportsRegister]() {
    return this[$supportsRegisterElement];
  }
  [$registerElement](tag, customElementClass, opts) {
    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
    this[$registerElement2](tag, new _js_helper.LinkedMap.from(["prototype", customElementClass, "extends", extendsTag]));
  }
  [$createElement](tagName, typeExtension) {
    if (typeExtension === void 0) typeExtension = null;
    return html$.Element._check(typeExtension == null ? this[_createElement_2](tagName) : this[_createElement](tagName, typeExtension));
  }
  [_createElement_2](tagName) {
    return this.createElement(tagName);
  }
  [_createElementNS_2](namespaceURI, qualifiedName) {
    return this.createElementNS(namespaceURI, qualifiedName);
  }
  [$createElementNS](namespaceURI, qualifiedName, typeExtension) {
    if (typeExtension === void 0) typeExtension = null;
    return html$.Element._check(typeExtension == null ? this[_createElementNS_2](namespaceURI, qualifiedName) : this[_createElementNS](namespaceURI, qualifiedName, typeExtension));
  }
  [_createNodeIterator](root, whatToShow, filter) {
    if (whatToShow === void 0) whatToShow = null;
    if (filter === void 0) filter = null;
    return this.createNodeIterator(root, whatToShow, filter, false);
  }
  [_createTreeWalker](root, whatToShow, filter) {
    if (whatToShow === void 0) whatToShow = null;
    if (filter === void 0) filter = null;
    return this.createTreeWalker(root, whatToShow, filter, false);
  }
  get [$visibilityState]() {
    return this.visibilityState || this.mozVisibilityState || this.msVisibilityState || this.webkitVisibilityState;
  }
};
dart.addTypeTests(html$.Document);
const addressSpace$ = Symbol("Document.addressSpace");
const contentType = Symbol("Document.contentType");
const cookie = Symbol("Document.cookie");
const currentScript = Symbol("Document.currentScript");
const documentElement = Symbol("Document.documentElement");
const domain = Symbol("Document.domain");
const fullscreenEnabled = Symbol("Document.fullscreenEnabled");
const hidden$0 = Symbol("Document.hidden");
const implementation = Symbol("Document.implementation");
const origin$1 = Symbol("Document.origin");
const readyState$1 = Symbol("Document.readyState");
const rootElement = Symbol("Document.rootElement");
const rootScroller = Symbol("Document.rootScroller");
const scrollingElement = Symbol("Document.scrollingElement");
const suborigin = Symbol("Document.suborigin");
const timeline$ = Symbol("Document.timeline");
const activeElement = Symbol("Document.activeElement");
const fullscreenElement = Symbol("Document.fullscreenElement");
const pointerLockElement = Symbol("Document.pointerLockElement");
const fonts = Symbol("Document.fonts");
dart.setMethodSignature(html$.Document, () => ({
  __proto__: dart.getMethods(html$.Document.__proto__),
  [$adoptNode]: dart.fnType(html$.Node, [html$.Node]),
  [_caretRangeFromPoint]: dart.fnType(html$.Range, [core.int, core.int]),
  [$createDocumentFragment]: dart.fnType(html$.DocumentFragment, []),
  [_createElement]: dart.fnType(html$.Element, [core.String], [dart.dynamic]),
  [_createElementNS]: dart.fnType(html$.Element, [core.String, core.String], [dart.dynamic]),
  [_createEvent]: dart.fnType(html$.Event, [core.String]),
  [$createRange]: dart.fnType(html$.Range, []),
  [_createTextNode]: dart.fnType(html$.Text, [core.String]),
  [_createTouch]: dart.fnType(html$.Touch, [html$.Window, html$.EventTarget, core.int, core.num, core.num, core.num, core.num], [core.num, core.num, core.num, core.num]),
  [_createTouch_1]: dart.fnType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_createTouch_2]: dart.fnType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_createTouch_3]: dart.fnType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_createTouch_4]: dart.fnType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_createTouch_5]: dart.fnType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_createTouchList]: dart.fnType(html$.TouchList, [html$.Touch]),
  [$execCommand]: dart.fnType(core.bool, [core.String], [core.bool, core.String]),
  [$exitFullscreen]: dart.fnType(dart.void, []),
  [$exitPointerLock]: dart.fnType(dart.void, []),
  [$getAnimations]: dart.fnType(core.List$(html$.Animation), []),
  [$getElementsByClassName]: dart.fnType(core.List$(html$.Node), [core.String]),
  [$getElementsByName]: dart.fnType(core.List$(html$.Node), [core.String]),
  [$getElementsByTagName]: dart.fnType(core.List$(html$.Node), [core.String]),
  [$importNode]: dart.fnType(html$.Node, [html$.Node], [core.bool]),
  [$queryCommandEnabled]: dart.fnType(core.bool, [core.String]),
  [$queryCommandIndeterm]: dart.fnType(core.bool, [core.String]),
  [$queryCommandState]: dart.fnType(core.bool, [core.String]),
  [$queryCommandSupported]: dart.fnType(core.bool, [core.String]),
  [$queryCommandValue]: dart.fnType(core.String, [core.String]),
  [$registerElement2]: dart.fnType(core.Function, [core.String], [core.Map]),
  [_registerElement2_1]: dart.fnType(core.Function, [dart.dynamic, dart.dynamic]),
  [_registerElement2_2]: dart.fnType(core.Function, [dart.dynamic]),
  [_webkitExitFullscreen]: dart.fnType(dart.void, []),
  [$getElementById]: dart.fnType(html$.Element, [core.String]),
  [_elementFromPoint]: dart.fnType(html$.Element, [core.int, core.int]),
  [$elementsFromPoint]: dart.fnType(core.List$(html$.Element), [core.int, core.int]),
  [$querySelector]: dart.fnType(html$.Element, [core.String]),
  [_querySelectorAll]: dart.fnType(core.List$(html$.Node), [core.String]),
  [$querySelectorAll]: dart.gFnType(T => [html$.ElementList$(T), [core.String]], T => [html$.Element]),
  [$registerElement]: dart.fnType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
  [$createElement]: dart.fnType(html$.Element, [core.String], [core.String]),
  [_createElement_2]: dart.fnType(dart.dynamic, [core.String]),
  [_createElementNS_2]: dart.fnType(dart.dynamic, [core.String, core.String]),
  [$createElementNS]: dart.fnType(html$.Element, [core.String, core.String], [core.String]),
  [_createNodeIterator]: dart.fnType(html$.NodeIterator, [html$.Node], [core.int, html$.NodeFilter]),
  [_createTreeWalker]: dart.fnType(html$.TreeWalker, [html$.Node], [core.int, html$.NodeFilter])
}));
dart.setGetterSignature(html$.Document, () => ({
  __proto__: dart.getGetters(html$.Document.__proto__),
  [$window]: html$.WindowBase,
  [$onAbort]: async.Stream$(html$.Event),
  [$onBeforeCopy]: async.Stream$(html$.Event),
  [$onBeforeCut]: async.Stream$(html$.Event),
  [$onBeforePaste]: async.Stream$(html$.Event),
  [$onBlur]: async.Stream$(html$.Event),
  [$onCanPlay]: async.Stream$(html$.Event),
  [$onCanPlayThrough]: async.Stream$(html$.Event),
  [$onChange]: async.Stream$(html$.Event),
  [$onClick]: async.Stream$(html$.MouseEvent),
  [$onContextMenu]: async.Stream$(html$.MouseEvent),
  [$onCopy]: async.Stream$(html$.ClipboardEvent),
  [$onCut]: async.Stream$(html$.ClipboardEvent),
  [$onDoubleClick]: async.Stream$(html$.Event),
  [$onDrag]: async.Stream$(html$.MouseEvent),
  [$onDragEnd]: async.Stream$(html$.MouseEvent),
  [$onDragEnter]: async.Stream$(html$.MouseEvent),
  [$onDragLeave]: async.Stream$(html$.MouseEvent),
  [$onDragOver]: async.Stream$(html$.MouseEvent),
  [$onDragStart]: async.Stream$(html$.MouseEvent),
  [$onDrop]: async.Stream$(html$.MouseEvent),
  [$onDurationChange]: async.Stream$(html$.Event),
  [$onEmptied]: async.Stream$(html$.Event),
  [$onEnded]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event),
  [$onFocus]: async.Stream$(html$.Event),
  [$onInput]: async.Stream$(html$.Event),
  [$onInvalid]: async.Stream$(html$.Event),
  [$onKeyDown]: async.Stream$(html$.KeyboardEvent),
  [$onKeyPress]: async.Stream$(html$.KeyboardEvent),
  [$onKeyUp]: async.Stream$(html$.KeyboardEvent),
  [$onLoad]: async.Stream$(html$.Event),
  [$onLoadedData]: async.Stream$(html$.Event),
  [$onLoadedMetadata]: async.Stream$(html$.Event),
  [$onMouseDown]: async.Stream$(html$.MouseEvent),
  [$onMouseEnter]: async.Stream$(html$.MouseEvent),
  [$onMouseLeave]: async.Stream$(html$.MouseEvent),
  [$onMouseMove]: async.Stream$(html$.MouseEvent),
  [$onMouseOut]: async.Stream$(html$.MouseEvent),
  [$onMouseOver]: async.Stream$(html$.MouseEvent),
  [$onMouseUp]: async.Stream$(html$.MouseEvent),
  [$onMouseWheel]: async.Stream$(html$.WheelEvent),
  [$onPaste]: async.Stream$(html$.ClipboardEvent),
  [$onPause]: async.Stream$(html$.Event),
  [$onPlay]: async.Stream$(html$.Event),
  [$onPlaying]: async.Stream$(html$.Event),
  [$onPointerLockChange]: async.Stream$(html$.Event),
  [$onPointerLockError]: async.Stream$(html$.Event),
  [$onRateChange]: async.Stream$(html$.Event),
  [$onReadyStateChange]: async.Stream$(html$.Event),
  [$onReset]: async.Stream$(html$.Event),
  [$onResize]: async.Stream$(html$.Event),
  [$onScroll]: async.Stream$(html$.Event),
  [$onSearch]: async.Stream$(html$.Event),
  [$onSecurityPolicyViolation]: async.Stream$(html$.SecurityPolicyViolationEvent),
  [$onSeeked]: async.Stream$(html$.Event),
  [$onSeeking]: async.Stream$(html$.Event),
  [$onSelect]: async.Stream$(html$.Event),
  [$onSelectionChange]: async.Stream$(html$.Event),
  [$onSelectStart]: async.Stream$(html$.Event),
  [$onStalled]: async.Stream$(html$.Event),
  [$onSubmit]: async.Stream$(html$.Event),
  [$onSuspend]: async.Stream$(html$.Event),
  [$onTimeUpdate]: async.Stream$(html$.Event),
  [$onTouchCancel]: async.Stream$(html$.TouchEvent),
  [$onTouchEnd]: async.Stream$(html$.TouchEvent),
  [$onTouchMove]: async.Stream$(html$.TouchEvent),
  [$onTouchStart]: async.Stream$(html$.TouchEvent),
  [$onVolumeChange]: async.Stream$(html$.Event),
  [$onWaiting]: async.Stream$(html$.Event),
  [$onFullscreenChange]: async.Stream$(html$.Event),
  [$onFullscreenError]: async.Stream$(html$.Event),
  [$supportsRegisterElement]: core.bool,
  [$supportsRegister]: core.bool,
  [$visibilityState]: core.String
}));
dart.setLibraryUri(html$.Document, "dart:html");
dart.setFieldSignature(html$.Document, () => ({
  __proto__: dart.getFields(html$.Document.__proto__),
  [$addressSpace]: dart.finalFieldType(core.String),
  [_body]: dart.fieldType(html$.HtmlElement),
  [$contentType]: dart.finalFieldType(core.String),
  [$cookie]: dart.fieldType(core.String),
  [$currentScript]: dart.finalFieldType(html$.ScriptElement),
  [_get_window]: dart.finalFieldType(dart.dynamic),
  [$documentElement]: dart.finalFieldType(html$.Element),
  [$domain]: dart.finalFieldType(core.String),
  [$fullscreenEnabled]: dart.finalFieldType(core.bool),
  [_head$]: dart.finalFieldType(html$.HeadElement),
  [$hidden]: dart.finalFieldType(core.bool),
  [$implementation]: dart.finalFieldType(html$.DomImplementation),
  [_lastModified]: dart.finalFieldType(core.String),
  [$origin]: dart.finalFieldType(core.String),
  [_preferredStylesheetSet]: dart.finalFieldType(core.String),
  [$readyState]: dart.finalFieldType(core.String),
  [_referrer]: dart.finalFieldType(core.String),
  [$rootElement]: dart.finalFieldType(svg$.SvgSvgElement),
  [$rootScroller]: dart.fieldType(html$.Element),
  [$scrollingElement]: dart.finalFieldType(html$.Element),
  [_selectedStylesheetSet]: dart.fieldType(core.String),
  [$suborigin]: dart.finalFieldType(core.String),
  [$timeline]: dart.finalFieldType(html$.DocumentTimeline),
  [_title]: dart.fieldType(core.String),
  [_visibilityState]: dart.finalFieldType(core.String),
  [_webkitFullscreenElement]: dart.finalFieldType(html$.Element),
  [_webkitFullscreenEnabled]: dart.finalFieldType(core.bool),
  [_webkitHidden]: dart.finalFieldType(core.bool),
  [_webkitVisibilityState]: dart.finalFieldType(core.String),
  [$activeElement]: dart.finalFieldType(html$.Element),
  [$fullscreenElement]: dart.finalFieldType(html$.Element),
  [$pointerLockElement]: dart.finalFieldType(html$.Element),
  [_styleSheets]: dart.finalFieldType(ListOfStyleSheet()),
  [$fonts]: dart.finalFieldType(html$.FontFaceSet),
  [_childElementCount]: dart.finalFieldType(core.int),
  [_children]: dart.finalFieldType(ListOfNode()),
  [_firstElementChild]: dart.finalFieldType(html$.Element),
  [_lastElementChild]: dart.finalFieldType(html$.Element)
}));
dart.defineLazy(html$.Document, {
  /*html$.Document.pointerLockChangeEvent*/get pointerLockChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pointerlockchange"));
  },
  /*html$.Document.pointerLockErrorEvent*/get pointerLockErrorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pointerlockerror"));
  },
  /*html$.Document.readyStateChangeEvent*/get readyStateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("readystatechange"));
  },
  /*html$.Document.securityPolicyViolationEvent*/get securityPolicyViolationEvent() {
    return dart.const(new (EventStreamProviderOfSecurityPolicyViolationEvent()).new("securitypolicyviolation"));
  },
  /*html$.Document.selectionChangeEvent*/get selectionChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("selectionchange"));
  }
});
dart.registerExtension("Document", html$.Document);
const _docChildren = dart.privateName(html$, "_docChildren");
html$.DocumentFragment = class DocumentFragment extends html$.Node {
  static new() {
    return html$.document.createDocumentFragment();
  }
  static html(html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    return html$.document.body[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
  }
  static svg(svgContent, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    return svg$.SvgSvgElement.new()[$createFragment](svgContent, {validator: validator, treeSanitizer: treeSanitizer});
  }
  get [_children]() {
    return dart.throw(new core.UnimplementedError.new("Use _docChildren instead"));
  }
  get [_docChildren]() {
    return this._docChildren;
  }
  set [_docChildren](value) {
    this._docChildren = value;
  }
  get [$children]() {
    if (this[_docChildren] == null) {
      this[_docChildren] = new html_common.FilteredElementList.new(this);
    }
    return this[_docChildren];
  }
  set [$children](value) {
    let copy = value[$toList]();
    let children = this[$children];
    children[$clear]();
    children[$addAll](copy);
  }
  [$querySelectorAll](T, selectors) {
    return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
  }
  get [$innerHtml]() {
    let e = html$.DivElement.new();
    e[$append](this[$clone](true));
    return e[$innerHtml];
  }
  set [$innerHtml](value) {
    this[$setInnerHtml](value);
  }
  [$setInnerHtml](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[$nodes][$clear]();
    this[$append](html$.document.body[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
  }
  [$appendText](text) {
    this[$append](html$.Text.new(text));
  }
  [$appendHtml](text, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[$append](html$.DocumentFragment.html(text, {validator: validator, treeSanitizer: treeSanitizer}));
  }
  [$getElementById](...args) {
    return this.getElementById.apply(this, args);
  }
  get [_childElementCount]() {
    return this.childElementCount;
  }
  get [_firstElementChild]() {
    return this.firstElementChild;
  }
  get [_lastElementChild]() {
    return this.lastElementChild;
  }
  [$querySelector](...args) {
    return this.querySelector.apply(this, args);
  }
  [_querySelectorAll](...args) {
    return this.querySelectorAll.apply(this, args);
  }
};
dart.addTypeTests(html$.DocumentFragment);
html$.DocumentFragment[dart.implements] = () => [html$.NonElementParentNode, html$.ParentNode];
dart.setMethodSignature(html$.DocumentFragment, () => ({
  __proto__: dart.getMethods(html$.DocumentFragment.__proto__),
  [$querySelectorAll]: dart.gFnType(T => [html$.ElementList$(T), [core.String]], T => [html$.Element]),
  [$setInnerHtml]: dart.fnType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
  [$appendText]: dart.fnType(dart.void, [core.String]),
  [$appendHtml]: dart.fnType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
  [$getElementById]: dart.fnType(html$.Element, [core.String]),
  [$querySelector]: dart.fnType(html$.Element, [core.String]),
  [_querySelectorAll]: dart.fnType(core.List$(html$.Node), [core.String])
}));
dart.setGetterSignature(html$.DocumentFragment, () => ({
  __proto__: dart.getGetters(html$.DocumentFragment.__proto__),
  [_children]: html$.HtmlCollection,
  [$children]: core.List$(html$.Element),
  [$innerHtml]: core.String
}));
dart.setSetterSignature(html$.DocumentFragment, () => ({
  __proto__: dart.getSetters(html$.DocumentFragment.__proto__),
  [$children]: core.List$(html$.Element),
  [$innerHtml]: core.String
}));
dart.setLibraryUri(html$.DocumentFragment, "dart:html");
dart.setFieldSignature(html$.DocumentFragment, () => ({
  __proto__: dart.getFields(html$.DocumentFragment.__proto__),
  [_docChildren]: dart.fieldType(ListOfElement()),
  [_childElementCount]: dart.finalFieldType(core.int),
  [_firstElementChild]: dart.finalFieldType(html$.Element),
  [_lastElementChild]: dart.finalFieldType(html$.Element)
}));
dart.registerExtension("DocumentFragment", html$.DocumentFragment);
html$.DocumentOrShadowRoot = class DocumentOrShadowRoot extends _interceptors.Interceptor {
  get [$activeElement]() {
    return this.activeElement;
  }
  get [$fullscreenElement]() {
    return this.fullscreenElement;
  }
  get [$pointerLockElement]() {
    return this.pointerLockElement;
  }
  get [$styleSheets]() {
    return this.styleSheets;
  }
  [$elementFromPoint](...args) {
    return this.elementFromPoint.apply(this, args);
  }
  [$elementsFromPoint](...args) {
    return this.elementsFromPoint.apply(this, args);
  }
  [$getSelection](...args) {
    return this.getSelection.apply(this, args);
  }
};
dart.addTypeTests(html$.DocumentOrShadowRoot);
const activeElement$ = Symbol("DocumentOrShadowRoot.activeElement");
const fullscreenElement$ = Symbol("DocumentOrShadowRoot.fullscreenElement");
const pointerLockElement$ = Symbol("DocumentOrShadowRoot.pointerLockElement");
const styleSheets = Symbol("DocumentOrShadowRoot.styleSheets");
dart.setMethodSignature(html$.DocumentOrShadowRoot, () => ({
  __proto__: dart.getMethods(html$.DocumentOrShadowRoot.__proto__),
  [$elementFromPoint]: dart.fnType(html$.Element, [core.int, core.int]),
  [$elementsFromPoint]: dart.fnType(core.List$(html$.Element), [core.int, core.int]),
  [$getSelection]: dart.fnType(html$.Selection, [])
}));
dart.setLibraryUri(html$.DocumentOrShadowRoot, "dart:html");
dart.setFieldSignature(html$.DocumentOrShadowRoot, () => ({
  __proto__: dart.getFields(html$.DocumentOrShadowRoot.__proto__),
  [$activeElement]: dart.finalFieldType(html$.Element),
  [$fullscreenElement]: dart.finalFieldType(html$.Element),
  [$pointerLockElement]: dart.finalFieldType(html$.Element),
  [$styleSheets]: dart.finalFieldType(ListOfStyleSheet())
}));
dart.registerExtension("DocumentOrShadowRoot", html$.DocumentOrShadowRoot);
html$.DocumentTimeline = class DocumentTimeline$ extends html$.AnimationTimeline {
  static new(options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return html$.DocumentTimeline._create_1(options_1);
    }
    return html$.DocumentTimeline._create_2();
  }
  static _create_1(options) {
    return new DocumentTimeline(options);
  }
  static _create_2() {
    return new DocumentTimeline();
  }
};
dart.addTypeTests(html$.DocumentTimeline);
dart.setLibraryUri(html$.DocumentTimeline, "dart:html");
dart.registerExtension("DocumentTimeline", html$.DocumentTimeline);
html$.DomError = class DomError extends _interceptors.Interceptor {
  static new(name, message) {
    if (message === void 0) message = null;
    if (message != null) {
      return html$.DomError._create_1(name, message);
    }
    return html$.DomError._create_2(name);
  }
  static _create_1(name, message) {
    return new DOMError(name, message);
  }
  static _create_2(name) {
    return new DOMError(name);
  }
  get [$message]() {
    return this.message;
  }
  get [$name]() {
    return this.name;
  }
};
dart.addTypeTests(html$.DomError);
const message$17 = Symbol("DomError.message");
const name$11 = Symbol("DomError.name");
dart.setLibraryUri(html$.DomError, "dart:html");
dart.setFieldSignature(html$.DomError, () => ({
  __proto__: dart.getFields(html$.DomError.__proto__),
  [$message]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("DOMError", html$.DomError);
html$.DomException = class DomException extends _interceptors.Interceptor {
  get [$name]() {
    let errorName = this.name;
    if (dart.test(html_common.Device.isWebKit) && errorName === "SECURITY_ERR") return "SecurityError";
    if (dart.test(html_common.Device.isWebKit) && errorName === "SYNTAX_ERR") return "SyntaxError";
    return errorName;
  }
  get [$message]() {
    return this.message;
  }
  [$toString]() {
    return String(this);
  }
};
dart.addTypeTests(html$.DomException);
const message$18 = Symbol("DomException.message");
dart.setGetterSignature(html$.DomException, () => ({
  __proto__: dart.getGetters(html$.DomException.__proto__),
  [$name]: core.String
}));
dart.setLibraryUri(html$.DomException, "dart:html");
dart.setFieldSignature(html$.DomException, () => ({
  __proto__: dart.getFields(html$.DomException.__proto__),
  [$message]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.DomException, {
  /*html$.DomException.INDEX_SIZE*/get INDEX_SIZE() {
    return "IndexSizeError";
  },
  /*html$.DomException.HIERARCHY_REQUEST*/get HIERARCHY_REQUEST() {
    return "HierarchyRequestError";
  },
  /*html$.DomException.WRONG_DOCUMENT*/get WRONG_DOCUMENT() {
    return "WrongDocumentError";
  },
  /*html$.DomException.INVALID_CHARACTER*/get INVALID_CHARACTER() {
    return "InvalidCharacterError";
  },
  /*html$.DomException.NO_MODIFICATION_ALLOWED*/get NO_MODIFICATION_ALLOWED() {
    return "NoModificationAllowedError";
  },
  /*html$.DomException.NOT_FOUND*/get NOT_FOUND() {
    return "NotFoundError";
  },
  /*html$.DomException.NOT_SUPPORTED*/get NOT_SUPPORTED() {
    return "NotSupportedError";
  },
  /*html$.DomException.INVALID_STATE*/get INVALID_STATE() {
    return "InvalidStateError";
  },
  /*html$.DomException.SYNTAX*/get SYNTAX() {
    return "SyntaxError";
  },
  /*html$.DomException.INVALID_MODIFICATION*/get INVALID_MODIFICATION() {
    return "InvalidModificationError";
  },
  /*html$.DomException.NAMESPACE*/get NAMESPACE() {
    return "NamespaceError";
  },
  /*html$.DomException.INVALID_ACCESS*/get INVALID_ACCESS() {
    return "InvalidAccessError";
  },
  /*html$.DomException.TYPE_MISMATCH*/get TYPE_MISMATCH() {
    return "TypeMismatchError";
  },
  /*html$.DomException.SECURITY*/get SECURITY() {
    return "SecurityError";
  },
  /*html$.DomException.NETWORK*/get NETWORK() {
    return "NetworkError";
  },
  /*html$.DomException.ABORT*/get ABORT() {
    return "AbortError";
  },
  /*html$.DomException.URL_MISMATCH*/get URL_MISMATCH() {
    return "URLMismatchError";
  },
  /*html$.DomException.QUOTA_EXCEEDED*/get QUOTA_EXCEEDED() {
    return "QuotaExceededError";
  },
  /*html$.DomException.TIMEOUT*/get TIMEOUT() {
    return "TimeoutError";
  },
  /*html$.DomException.INVALID_NODE_TYPE*/get INVALID_NODE_TYPE() {
    return "InvalidNodeTypeError";
  },
  /*html$.DomException.DATA_CLONE*/get DATA_CLONE() {
    return "DataCloneError";
  },
  /*html$.DomException.ENCODING*/get ENCODING() {
    return "EncodingError";
  },
  /*html$.DomException.NOT_READABLE*/get NOT_READABLE() {
    return "NotReadableError";
  },
  /*html$.DomException.UNKNOWN*/get UNKNOWN() {
    return "UnknownError";
  },
  /*html$.DomException.CONSTRAINT*/get CONSTRAINT() {
    return "ConstraintError";
  },
  /*html$.DomException.TRANSACTION_INACTIVE*/get TRANSACTION_INACTIVE() {
    return "TransactionInactiveError";
  },
  /*html$.DomException.READ_ONLY*/get READ_ONLY() {
    return "ReadOnlyError";
  },
  /*html$.DomException.VERSION*/get VERSION() {
    return "VersionError";
  },
  /*html$.DomException.OPERATION*/get OPERATION() {
    return "OperationError";
  },
  /*html$.DomException.NOT_ALLOWED*/get NOT_ALLOWED() {
    return "NotAllowedError";
  },
  /*html$.DomException.TYPE_ERROR*/get TYPE_ERROR() {
    return "TypeError";
  }
});
dart.registerExtension("DOMException", html$.DomException);
html$.DomImplementation = class DomImplementation extends _interceptors.Interceptor {
  [$createDocument](...args) {
    return this.createDocument.apply(this, args);
  }
  [$createDocumentType](...args) {
    return this.createDocumentType.apply(this, args);
  }
  [$createHtmlDocument](...args) {
    return this.createHTMLDocument.apply(this, args);
  }
  [$hasFeature](...args) {
    return this.hasFeature.apply(this, args);
  }
};
dart.addTypeTests(html$.DomImplementation);
dart.setMethodSignature(html$.DomImplementation, () => ({
  __proto__: dart.getMethods(html$.DomImplementation.__proto__),
  [$createDocument]: dart.fnType(html$.XmlDocument, [core.String, core.String, html$._DocumentType]),
  [$createDocumentType]: dart.fnType(html$._DocumentType, [core.String, core.String, core.String]),
  [$createHtmlDocument]: dart.fnType(html$.HtmlDocument, [], [core.String]),
  [$hasFeature]: dart.fnType(core.bool, [])
}));
dart.setLibraryUri(html$.DomImplementation, "dart:html");
dart.registerExtension("DOMImplementation", html$.DomImplementation);
html$.DomIterator = class DomIterator extends _interceptors.Interceptor {
  [$next](...args) {
    return this.next.apply(this, args);
  }
};
dart.addTypeTests(html$.DomIterator);
dart.setMethodSignature(html$.DomIterator, () => ({
  __proto__: dart.getMethods(html$.DomIterator.__proto__),
  [$next]: dart.fnType(core.Object, [], [core.Object])
}));
dart.setLibraryUri(html$.DomIterator, "dart:html");
dart.registerExtension("Iterator", html$.DomIterator);
const _multiplySelf_1 = dart.privateName(html$, "_multiplySelf_1");
const _multiplySelf_2 = dart.privateName(html$, "_multiplySelf_2");
const _preMultiplySelf_1 = dart.privateName(html$, "_preMultiplySelf_1");
const _preMultiplySelf_2 = dart.privateName(html$, "_preMultiplySelf_2");
const _multiply_1 = dart.privateName(html$, "_multiply_1");
const _multiply_2 = dart.privateName(html$, "_multiply_2");
const _transformPoint_1 = dart.privateName(html$, "_transformPoint_1");
const _transformPoint_2 = dart.privateName(html$, "_transformPoint_2");
html$.DomMatrixReadOnly = class DomMatrixReadOnly extends _interceptors.Interceptor {
  static new(init) {
    if (init === void 0) init = null;
    if (init != null) {
      return html$.DomMatrixReadOnly._create_1(init);
    }
    return html$.DomMatrixReadOnly._create_2();
  }
  static _create_1(init) {
    return new DOMMatrixReadOnly(init);
  }
  static _create_2() {
    return new DOMMatrixReadOnly();
  }
  get [$a]() {
    return this.a;
  }
  get [$b]() {
    return this.b;
  }
  get [$c]() {
    return this.c;
  }
  get [$d]() {
    return this.d;
  }
  get [$e]() {
    return this.e;
  }
  get [$f]() {
    return this.f;
  }
  get [$is2D]() {
    return this.is2D;
  }
  get [$isIdentity]() {
    return this.isIdentity;
  }
  get [$m11]() {
    return this.m11;
  }
  get [$m12]() {
    return this.m12;
  }
  get [$m13]() {
    return this.m13;
  }
  get [$m14]() {
    return this.m14;
  }
  get [$m21]() {
    return this.m21;
  }
  get [$m22]() {
    return this.m22;
  }
  get [$m23]() {
    return this.m23;
  }
  get [$m24]() {
    return this.m24;
  }
  get [$m31]() {
    return this.m31;
  }
  get [$m32]() {
    return this.m32;
  }
  get [$m33]() {
    return this.m33;
  }
  get [$m34]() {
    return this.m34;
  }
  get [$m41]() {
    return this.m41;
  }
  get [$m42]() {
    return this.m42;
  }
  get [$m43]() {
    return this.m43;
  }
  get [$m44]() {
    return this.m44;
  }
  [$flipX](...args) {
    return this.flipX.apply(this, args);
  }
  [$flipY](...args) {
    return this.flipY.apply(this, args);
  }
  static fromMatrix(other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return dart.global.DOMMatrixReadOnly.fromMatrix(other_1);
    }
    return dart.global.DOMMatrixReadOnly.fromMatrix();
  }
  [$inverse](...args) {
    return this.inverse.apply(this, args);
  }
  [$multiply](other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return this[_multiply_1](other_1);
    }
    return this[_multiply_2]();
  }
  [_multiply_1](...args) {
    return this.multiply.apply(this, args);
  }
  [_multiply_2](...args) {
    return this.multiply.apply(this, args);
  }
  [$rotate](...args) {
    return this.rotate.apply(this, args);
  }
  [$rotateAxisAngle](...args) {
    return this.rotateAxisAngle.apply(this, args);
  }
  [$rotateFromVector](...args) {
    return this.rotateFromVector.apply(this, args);
  }
  [$scale](...args) {
    return this.scale.apply(this, args);
  }
  [$scale3d](...args) {
    return this.scale3d.apply(this, args);
  }
  [$skewX](...args) {
    return this.skewX.apply(this, args);
  }
  [$skewY](...args) {
    return this.skewY.apply(this, args);
  }
  [$toFloat32Array](...args) {
    return this.toFloat32Array.apply(this, args);
  }
  [$toFloat64Array](...args) {
    return this.toFloat64Array.apply(this, args);
  }
  [$transformPoint](point) {
    if (point === void 0) point = null;
    if (point != null) {
      let point_1 = html_common.convertDartToNative_Dictionary(point);
      return this[_transformPoint_1](point_1);
    }
    return this[_transformPoint_2]();
  }
  [_transformPoint_1](...args) {
    return this.transformPoint.apply(this, args);
  }
  [_transformPoint_2](...args) {
    return this.transformPoint.apply(this, args);
  }
  [$translate](...args) {
    return this.translate.apply(this, args);
  }
};
dart.addTypeTests(html$.DomMatrixReadOnly);
dart.setMethodSignature(html$.DomMatrixReadOnly, () => ({
  __proto__: dart.getMethods(html$.DomMatrixReadOnly.__proto__),
  [$flipX]: dart.fnType(html$.DomMatrix, []),
  [$flipY]: dart.fnType(html$.DomMatrix, []),
  [$inverse]: dart.fnType(html$.DomMatrix, []),
  [$multiply]: dart.fnType(html$.DomMatrix, [], [core.Map]),
  [_multiply_1]: dart.fnType(html$.DomMatrix, [dart.dynamic]),
  [_multiply_2]: dart.fnType(html$.DomMatrix, []),
  [$rotate]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num]),
  [$rotateAxisAngle]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num, core.num]),
  [$rotateFromVector]: dart.fnType(html$.DomMatrix, [], [core.num, core.num]),
  [$scale]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$scale3d]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num, core.num]),
  [$skewX]: dart.fnType(html$.DomMatrix, [], [core.num]),
  [$skewY]: dart.fnType(html$.DomMatrix, [], [core.num]),
  [$toFloat32Array]: dart.fnType(typed_data.Float32List, []),
  [$toFloat64Array]: dart.fnType(typed_data.Float64List, []),
  [$transformPoint]: dart.fnType(html$.DomPoint, [], [core.Map]),
  [_transformPoint_1]: dart.fnType(html$.DomPoint, [dart.dynamic]),
  [_transformPoint_2]: dart.fnType(html$.DomPoint, []),
  [$translate]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num])
}));
dart.setGetterSignature(html$.DomMatrixReadOnly, () => ({
  __proto__: dart.getGetters(html$.DomMatrixReadOnly.__proto__),
  [$a]: core.num,
  [$b]: core.num,
  [$c]: core.num,
  [$d]: core.num,
  [$e]: core.num,
  [$f]: core.num,
  [$is2D]: core.bool,
  [$isIdentity]: core.bool,
  [$m11]: core.num,
  [$m12]: core.num,
  [$m13]: core.num,
  [$m14]: core.num,
  [$m21]: core.num,
  [$m22]: core.num,
  [$m23]: core.num,
  [$m24]: core.num,
  [$m31]: core.num,
  [$m32]: core.num,
  [$m33]: core.num,
  [$m34]: core.num,
  [$m41]: core.num,
  [$m42]: core.num,
  [$m43]: core.num,
  [$m44]: core.num
}));
dart.setLibraryUri(html$.DomMatrixReadOnly, "dart:html");
dart.registerExtension("DOMMatrixReadOnly", html$.DomMatrixReadOnly);
html$.DomMatrix = class DomMatrix extends html$.DomMatrixReadOnly {
  static new(init) {
    if (init === void 0) init = null;
    if (init != null) {
      return html$.DomMatrix._create_1(init);
    }
    return html$.DomMatrix._create_2();
  }
  static _create_1(init) {
    return new DOMMatrix(init);
  }
  static _create_2() {
    return new DOMMatrix();
  }
  get [$a]() {
    return this.a;
  }
  set [$a](value) {
    this.a = value;
  }
  get [$b]() {
    return this.b;
  }
  set [$b](value) {
    this.b = value;
  }
  get [$c]() {
    return this.c;
  }
  set [$c](value) {
    this.c = value;
  }
  get [$d]() {
    return this.d;
  }
  set [$d](value) {
    this.d = value;
  }
  get [$e]() {
    return this.e;
  }
  set [$e](value) {
    this.e = value;
  }
  get [$f]() {
    return this.f;
  }
  set [$f](value) {
    this.f = value;
  }
  get [$m11]() {
    return this.m11;
  }
  set [$m11](value) {
    this.m11 = value;
  }
  get [$m12]() {
    return this.m12;
  }
  set [$m12](value) {
    this.m12 = value;
  }
  get [$m13]() {
    return this.m13;
  }
  set [$m13](value) {
    this.m13 = value;
  }
  get [$m14]() {
    return this.m14;
  }
  set [$m14](value) {
    this.m14 = value;
  }
  get [$m21]() {
    return this.m21;
  }
  set [$m21](value) {
    this.m21 = value;
  }
  get [$m22]() {
    return this.m22;
  }
  set [$m22](value) {
    this.m22 = value;
  }
  get [$m23]() {
    return this.m23;
  }
  set [$m23](value) {
    this.m23 = value;
  }
  get [$m24]() {
    return this.m24;
  }
  set [$m24](value) {
    this.m24 = value;
  }
  get [$m31]() {
    return this.m31;
  }
  set [$m31](value) {
    this.m31 = value;
  }
  get [$m32]() {
    return this.m32;
  }
  set [$m32](value) {
    this.m32 = value;
  }
  get [$m33]() {
    return this.m33;
  }
  set [$m33](value) {
    this.m33 = value;
  }
  get [$m34]() {
    return this.m34;
  }
  set [$m34](value) {
    this.m34 = value;
  }
  get [$m41]() {
    return this.m41;
  }
  set [$m41](value) {
    this.m41 = value;
  }
  get [$m42]() {
    return this.m42;
  }
  set [$m42](value) {
    this.m42 = value;
  }
  get [$m43]() {
    return this.m43;
  }
  set [$m43](value) {
    this.m43 = value;
  }
  get [$m44]() {
    return this.m44;
  }
  set [$m44](value) {
    this.m44 = value;
  }
  static fromMatrix(other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return dart.global.DOMMatrix.fromMatrix(other_1);
    }
    return dart.global.DOMMatrix.fromMatrix();
  }
  [$invertSelf](...args) {
    return this.invertSelf.apply(this, args);
  }
  [$multiplySelf](other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return this[_multiplySelf_1](other_1);
    }
    return this[_multiplySelf_2]();
  }
  [_multiplySelf_1](...args) {
    return this.multiplySelf.apply(this, args);
  }
  [_multiplySelf_2](...args) {
    return this.multiplySelf.apply(this, args);
  }
  [$preMultiplySelf](other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return this[_preMultiplySelf_1](other_1);
    }
    return this[_preMultiplySelf_2]();
  }
  [_preMultiplySelf_1](...args) {
    return this.preMultiplySelf.apply(this, args);
  }
  [_preMultiplySelf_2](...args) {
    return this.preMultiplySelf.apply(this, args);
  }
  [$rotateAxisAngleSelf](...args) {
    return this.rotateAxisAngleSelf.apply(this, args);
  }
  [$rotateFromVectorSelf](...args) {
    return this.rotateFromVectorSelf.apply(this, args);
  }
  [$rotateSelf](...args) {
    return this.rotateSelf.apply(this, args);
  }
  [$scale3dSelf](...args) {
    return this.scale3dSelf.apply(this, args);
  }
  [$scaleSelf](...args) {
    return this.scaleSelf.apply(this, args);
  }
  [$setMatrixValue](...args) {
    return this.setMatrixValue.apply(this, args);
  }
  [$skewXSelf](...args) {
    return this.skewXSelf.apply(this, args);
  }
  [$skewYSelf](...args) {
    return this.skewYSelf.apply(this, args);
  }
  [$translateSelf](...args) {
    return this.translateSelf.apply(this, args);
  }
};
dart.addTypeTests(html$.DomMatrix);
dart.setMethodSignature(html$.DomMatrix, () => ({
  __proto__: dart.getMethods(html$.DomMatrix.__proto__),
  [$invertSelf]: dart.fnType(html$.DomMatrix, []),
  [$multiplySelf]: dart.fnType(html$.DomMatrix, [], [core.Map]),
  [_multiplySelf_1]: dart.fnType(html$.DomMatrix, [dart.dynamic]),
  [_multiplySelf_2]: dart.fnType(html$.DomMatrix, []),
  [$preMultiplySelf]: dart.fnType(html$.DomMatrix, [], [core.Map]),
  [_preMultiplySelf_1]: dart.fnType(html$.DomMatrix, [dart.dynamic]),
  [_preMultiplySelf_2]: dart.fnType(html$.DomMatrix, []),
  [$rotateAxisAngleSelf]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num, core.num]),
  [$rotateFromVectorSelf]: dart.fnType(html$.DomMatrix, [], [core.num, core.num]),
  [$rotateSelf]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num]),
  [$scale3dSelf]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num, core.num]),
  [$scaleSelf]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$setMatrixValue]: dart.fnType(html$.DomMatrix, [core.String]),
  [$skewXSelf]: dart.fnType(html$.DomMatrix, [], [core.num]),
  [$skewYSelf]: dart.fnType(html$.DomMatrix, [], [core.num]),
  [$translateSelf]: dart.fnType(html$.DomMatrix, [], [core.num, core.num, core.num])
}));
dart.setSetterSignature(html$.DomMatrix, () => ({
  __proto__: dart.getSetters(html$.DomMatrix.__proto__),
  [$a]: core.num,
  [$b]: core.num,
  [$c]: core.num,
  [$d]: core.num,
  [$e]: core.num,
  [$f]: core.num,
  [$m11]: core.num,
  [$m12]: core.num,
  [$m13]: core.num,
  [$m14]: core.num,
  [$m21]: core.num,
  [$m22]: core.num,
  [$m23]: core.num,
  [$m24]: core.num,
  [$m31]: core.num,
  [$m32]: core.num,
  [$m33]: core.num,
  [$m34]: core.num,
  [$m41]: core.num,
  [$m42]: core.num,
  [$m43]: core.num,
  [$m44]: core.num
}));
dart.setLibraryUri(html$.DomMatrix, "dart:html");
dart.registerExtension("DOMMatrix", html$.DomMatrix);
html$.DomParser = class DomParser extends _interceptors.Interceptor {
  static new() {
    return html$.DomParser._create_1();
  }
  static _create_1() {
    return new DOMParser();
  }
  [$parseFromString](...args) {
    return this.parseFromString.apply(this, args);
  }
};
dart.addTypeTests(html$.DomParser);
dart.setMethodSignature(html$.DomParser, () => ({
  __proto__: dart.getMethods(html$.DomParser.__proto__),
  [$parseFromString]: dart.fnType(html$.Document, [core.String, core.String])
}));
dart.setLibraryUri(html$.DomParser, "dart:html");
dart.registerExtension("DOMParser", html$.DomParser);
const _matrixTransform_1 = dart.privateName(html$, "_matrixTransform_1");
const _matrixTransform_2 = dart.privateName(html$, "_matrixTransform_2");
html$.DomPointReadOnly = class DomPointReadOnly extends _interceptors.Interceptor {
  static new(x, y, z, w) {
    if (x === void 0) x = null;
    if (y === void 0) y = null;
    if (z === void 0) z = null;
    if (w === void 0) w = null;
    if (w != null) {
      return html$.DomPointReadOnly._create_1(x, y, z, w);
    }
    if (z != null) {
      return html$.DomPointReadOnly._create_2(x, y, z);
    }
    if (y != null) {
      return html$.DomPointReadOnly._create_3(x, y);
    }
    if (x != null) {
      return html$.DomPointReadOnly._create_4(x);
    }
    return html$.DomPointReadOnly._create_5();
  }
  static _create_1(x, y, z, w) {
    return new DOMPointReadOnly(x, y, z, w);
  }
  static _create_2(x, y, z) {
    return new DOMPointReadOnly(x, y, z);
  }
  static _create_3(x, y) {
    return new DOMPointReadOnly(x, y);
  }
  static _create_4(x) {
    return new DOMPointReadOnly(x);
  }
  static _create_5() {
    return new DOMPointReadOnly();
  }
  get [$w]() {
    return this.w;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$z]() {
    return this.z;
  }
  static fromPoint(other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return dart.global.DOMPointReadOnly.fromPoint(other_1);
    }
    return dart.global.DOMPointReadOnly.fromPoint();
  }
  [$matrixTransform](matrix) {
    if (matrix === void 0) matrix = null;
    if (matrix != null) {
      let matrix_1 = html_common.convertDartToNative_Dictionary(matrix);
      return this[_matrixTransform_1](matrix_1);
    }
    return this[_matrixTransform_2]();
  }
  [_matrixTransform_1](...args) {
    return this.matrixTransform.apply(this, args);
  }
  [_matrixTransform_2](...args) {
    return this.matrixTransform.apply(this, args);
  }
};
dart.addTypeTests(html$.DomPointReadOnly);
dart.setMethodSignature(html$.DomPointReadOnly, () => ({
  __proto__: dart.getMethods(html$.DomPointReadOnly.__proto__),
  [$matrixTransform]: dart.fnType(html$.DomPoint, [], [core.Map]),
  [_matrixTransform_1]: dart.fnType(html$.DomPoint, [dart.dynamic]),
  [_matrixTransform_2]: dart.fnType(html$.DomPoint, [])
}));
dart.setGetterSignature(html$.DomPointReadOnly, () => ({
  __proto__: dart.getGetters(html$.DomPointReadOnly.__proto__),
  [$w]: core.num,
  [$x]: core.num,
  [$y]: core.num,
  [$z]: core.num
}));
dart.setLibraryUri(html$.DomPointReadOnly, "dart:html");
dart.registerExtension("DOMPointReadOnly", html$.DomPointReadOnly);
html$.DomPoint = class DomPoint extends html$.DomPointReadOnly {
  static new(x, y, z, w) {
    if (x === void 0) x = null;
    if (y === void 0) y = null;
    if (z === void 0) z = null;
    if (w === void 0) w = null;
    if (w != null) {
      return html$.DomPoint._create_1(x, y, z, w);
    }
    if (z != null) {
      return html$.DomPoint._create_2(x, y, z);
    }
    if (y != null) {
      return html$.DomPoint._create_3(x, y);
    }
    if (x != null) {
      return html$.DomPoint._create_4(x);
    }
    return html$.DomPoint._create_5();
  }
  static _create_1(x, y, z, w) {
    return new DOMPoint(x, y, z, w);
  }
  static _create_2(x, y, z) {
    return new DOMPoint(x, y, z);
  }
  static _create_3(x, y) {
    return new DOMPoint(x, y);
  }
  static _create_4(x) {
    return new DOMPoint(x);
  }
  static _create_5() {
    return new DOMPoint();
  }
  static get supported() {
    return !!window.DOMPoint || !!window.WebKitPoint;
  }
  get [$w]() {
    return this.w;
  }
  set [$w](value) {
    this.w = value;
  }
  get [$x]() {
    return this.x;
  }
  set [$x](value) {
    this.x = value;
  }
  get [$y]() {
    return this.y;
  }
  set [$y](value) {
    this.y = value;
  }
  get [$z]() {
    return this.z;
  }
  set [$z](value) {
    this.z = value;
  }
  static fromPoint(other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return dart.global.DOMPoint.fromPoint(other_1);
    }
    return dart.global.DOMPoint.fromPoint();
  }
};
dart.addTypeTests(html$.DomPoint);
dart.setSetterSignature(html$.DomPoint, () => ({
  __proto__: dart.getSetters(html$.DomPoint.__proto__),
  [$w]: core.num,
  [$x]: core.num,
  [$y]: core.num,
  [$z]: core.num
}));
dart.setLibraryUri(html$.DomPoint, "dart:html");
dart.registerExtension("DOMPoint", html$.DomPoint);
html$.DomQuad = class DomQuad extends _interceptors.Interceptor {
  static new(p1, p2, p3, p4) {
    if (p1 === void 0) p1 = null;
    if (p2 === void 0) p2 = null;
    if (p3 === void 0) p3 = null;
    if (p4 === void 0) p4 = null;
    if (p4 != null) {
      let p1_1 = html_common.convertDartToNative_Dictionary(p1);
      let p2_2 = html_common.convertDartToNative_Dictionary(p2);
      let p3_3 = html_common.convertDartToNative_Dictionary(p3);
      let p4_4 = html_common.convertDartToNative_Dictionary(p4);
      return html$.DomQuad._create_1(p1_1, p2_2, p3_3, p4_4);
    }
    if (p3 != null) {
      let p1_1 = html_common.convertDartToNative_Dictionary(p1);
      let p2_2 = html_common.convertDartToNative_Dictionary(p2);
      let p3_3 = html_common.convertDartToNative_Dictionary(p3);
      return html$.DomQuad._create_2(p1_1, p2_2, p3_3);
    }
    if (p2 != null) {
      let p1_1 = html_common.convertDartToNative_Dictionary(p1);
      let p2_2 = html_common.convertDartToNative_Dictionary(p2);
      return html$.DomQuad._create_3(p1_1, p2_2);
    }
    if (p1 != null) {
      let p1_1 = html_common.convertDartToNative_Dictionary(p1);
      return html$.DomQuad._create_4(p1_1);
    }
    return html$.DomQuad._create_5();
  }
  static _create_1(p1, p2, p3, p4) {
    return new DOMQuad(p1, p2, p3, p4);
  }
  static _create_2(p1, p2, p3) {
    return new DOMQuad(p1, p2, p3);
  }
  static _create_3(p1, p2) {
    return new DOMQuad(p1, p2);
  }
  static _create_4(p1) {
    return new DOMQuad(p1);
  }
  static _create_5() {
    return new DOMQuad();
  }
  get [$p1]() {
    return this.p1;
  }
  get [$p2]() {
    return this.p2;
  }
  get [$p3]() {
    return this.p3;
  }
  get [$p4]() {
    return this.p4;
  }
  static fromQuad(other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return dart.global.DOMQuad.fromQuad(other_1);
    }
    return dart.global.DOMQuad.fromQuad();
  }
  static fromRect(other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return dart.global.DOMQuad.fromRect(other_1);
    }
    return dart.global.DOMQuad.fromRect();
  }
  [$getBounds](...args) {
    return this.getBounds.apply(this, args);
  }
};
dart.addTypeTests(html$.DomQuad);
const p1 = Symbol("DomQuad.p1");
const p2 = Symbol("DomQuad.p2");
const p3 = Symbol("DomQuad.p3");
const p4 = Symbol("DomQuad.p4");
dart.setMethodSignature(html$.DomQuad, () => ({
  __proto__: dart.getMethods(html$.DomQuad.__proto__),
  [$getBounds]: dart.fnType(math.Rectangle$(core.num), [])
}));
dart.setLibraryUri(html$.DomQuad, "dart:html");
dart.setFieldSignature(html$.DomQuad, () => ({
  __proto__: dart.getFields(html$.DomQuad.__proto__),
  [$p1]: dart.finalFieldType(html$.DomPoint),
  [$p2]: dart.finalFieldType(html$.DomPoint),
  [$p3]: dart.finalFieldType(html$.DomPoint),
  [$p4]: dart.finalFieldType(html$.DomPoint)
}));
dart.registerExtension("DOMQuad", html$.DomQuad);
const _is_ImmutableListMixin_default = Symbol('_is_ImmutableListMixin_default');
html$.ImmutableListMixin$ = dart.generic(E => {
  let FixedSizeListIteratorOfE = () => (FixedSizeListIteratorOfE = dart.constFn(html$.FixedSizeListIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
  class ImmutableListMixin extends core.Object {
    get iterator() {
      return new (FixedSizeListIteratorOfE()).new(this);
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this[$iterator]);
    }
    add(value) {
      E._check(value);
      dart.throw(new core.UnsupportedError.new("Cannot add to immutable List."));
    }
    addAll(iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot add to immutable List."));
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError.new("Cannot sort immutable List."));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError.new("Cannot shuffle immutable List."));
    }
    insert(index, element) {
      E._check(element);
      dart.throw(new core.UnsupportedError.new("Cannot add to immutable List."));
    }
    insertAll(index, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot add to immutable List."));
    }
    setAll(index, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot modify an immutable List."));
    }
    removeAt(pos) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from immutable List."));
    }
    removeLast() {
      dart.throw(new core.UnsupportedError.new("Cannot remove from immutable List."));
    }
    remove(object) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from immutable List."));
    }
    removeWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from immutable List."));
    }
    retainWhere(test) {
      dart.throw(new core.UnsupportedError.new("Cannot remove from immutable List."));
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnsupportedError.new("Cannot setRange on immutable List."));
    }
    removeRange(start, end) {
      dart.throw(new core.UnsupportedError.new("Cannot removeRange on immutable List."));
    }
    replaceRange(start, end, iterable) {
      IterableOfE()._check(iterable);
      dart.throw(new core.UnsupportedError.new("Cannot modify an immutable List."));
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      E._check(fillValue);
      dart.throw(new core.UnsupportedError.new("Cannot modify an immutable List."));
    }
  }
  (ImmutableListMixin.new = function() {
  }).prototype = ImmutableListMixin.prototype;
  ImmutableListMixin.prototype[dart.isList] = true;
  dart.addTypeTests(ImmutableListMixin);
  ImmutableListMixin.prototype[_is_ImmutableListMixin_default] = true;
  ImmutableListMixin[dart.implements] = () => [ListOfE()];
  dart.setMethodSignature(ImmutableListMixin, () => ({
    __proto__: dart.getMethods(ImmutableListMixin.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    [$add]: dart.fnType(dart.void, [core.Object]),
    addAll: dart.fnType(dart.void, [core.Object]),
    [$addAll]: dart.fnType(dart.void, [core.Object]),
    sort: dart.fnType(dart.void, [], [dart.fnType(core.int, [E, E])]),
    [$sort]: dart.fnType(dart.void, [], [dart.fnType(core.int, [E, E])]),
    shuffle: dart.fnType(dart.void, [], [math.Random]),
    [$shuffle]: dart.fnType(dart.void, [], [math.Random]),
    insert: dart.fnType(dart.void, [core.int, core.Object]),
    [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
    insertAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$insertAll]: dart.fnType(dart.void, [core.int, core.Object]),
    setAll: dart.fnType(dart.void, [core.int, core.Object]),
    [$setAll]: dart.fnType(dart.void, [core.int, core.Object]),
    removeAt: dart.fnType(E, [core.int]),
    [$removeAt]: dart.fnType(E, [core.int]),
    removeLast: dart.fnType(E, []),
    [$removeLast]: dart.fnType(E, []),
    remove: dart.fnType(core.bool, [core.Object]),
    [$remove]: dart.fnType(core.bool, [core.Object]),
    removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    [$retainWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [E])]),
    setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    removeRange: dart.fnType(dart.void, [core.int, core.int]),
    [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
    replaceRange: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    fillRange: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
    [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object])
  }));
  dart.setGetterSignature(ImmutableListMixin, () => ({
    __proto__: dart.getGetters(ImmutableListMixin.__proto__),
    iterator: core.Iterator$(E),
    [$iterator]: core.Iterator$(E)
  }));
  dart.setLibraryUri(ImmutableListMixin, "dart:html");
  dart.defineExtensionMethods(ImmutableListMixin, [
    'add',
    'addAll',
    'sort',
    'shuffle',
    'insert',
    'insertAll',
    'setAll',
    'removeAt',
    'removeLast',
    'remove',
    'removeWhere',
    'retainWhere',
    'setRange',
    'removeRange',
    'replaceRange',
    'fillRange'
  ]);
  dart.defineExtensionAccessors(ImmutableListMixin, ['iterator']);
  return ImmutableListMixin;
});
html$.ImmutableListMixin = html$.ImmutableListMixin$();
dart.addTypeTests(html$.ImmutableListMixin, _is_ImmutableListMixin_default);
const Interceptor_ListMixin$ = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$.new = function() {
  Interceptor_ListMixin$.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$.prototype;
dart.applyMixin(Interceptor_ListMixin$, collection.ListMixin$(math.Rectangle$(core.num)));
const Interceptor_ImmutableListMixin$ = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$ {};
(Interceptor_ImmutableListMixin$.new = function() {
  Interceptor_ImmutableListMixin$.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$, html$.ImmutableListMixin$(math.Rectangle$(core.num)));
html$.DomRectList = class DomRectList extends Interceptor_ImmutableListMixin$ {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    RectangleOfnum()._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$.DomRectList.prototype[dart.isList] = true;
dart.addTypeTests(html$.DomRectList);
html$.DomRectList[dart.implements] = () => [ListOfRectangleOfnum(), JavaScriptIndexingBehaviorOfRectangleOfnum()];
dart.setMethodSignature(html$.DomRectList, () => ({
  __proto__: dart.getMethods(html$.DomRectList.__proto__),
  [$_get]: dart.fnType(math.Rectangle$(core.num), [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(math.Rectangle$(core.num), [core.int]),
  [$item]: dart.fnType(math.Rectangle$(core.num), [core.int])
}));
dart.setGetterSignature(html$.DomRectList, () => ({
  __proto__: dart.getGetters(html$.DomRectList.__proto__),
  [$length]: core.int,
  [$first]: math.Rectangle$(core.num),
  [$last]: math.Rectangle$(core.num),
  [$single]: math.Rectangle$(core.num)
}));
dart.setSetterSignature(html$.DomRectList, () => ({
  __proto__: dart.getSetters(html$.DomRectList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.DomRectList, "dart:html");
dart.registerExtension("ClientRectList", html$.DomRectList);
dart.registerExtension("DOMRectList", html$.DomRectList);
html$.DomRectReadOnly = class DomRectReadOnly extends _interceptors.Interceptor {
  [$toString]() {
    return "Rectangle (" + dart.str(this[$left]) + ", " + dart.str(this[$top]) + ") " + dart.str(this[$width]) + " x " + dart.str(this[$height]);
  }
  [$_equals](other) {
    if (!RectangleOfnum().is(other)) return false;
    return core.identical(this[$left], dart.dload(other, 'left')) && core.identical(this[$top], dart.dload(other, 'top')) && core.identical(this[$width], dart.dload(other, 'width')) && core.identical(this[$height], dart.dload(other, 'height'));
  }
  get [$hashCode]() {
    return html$._JenkinsSmiHash.hash4(dart.hashCode(this[$left]), dart.hashCode(this[$top]), dart.hashCode(this[$width]), dart.hashCode(this[$height]));
  }
  [$intersection](other) {
    let x0 = math.max(core.num, this[$left], other[$left]);
    let x1 = math.min(core.num, dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(other[$left]) + dart.notNull(other[$width]));
    if (x0 <= x1) {
      let y0 = math.max(core.num, this[$top], other[$top]);
      let y1 = math.min(core.num, dart.notNull(this[$top]) + dart.notNull(this[$height]), dart.notNull(other[$top]) + dart.notNull(other[$height]));
      if (y0 <= y1) {
        return new (RectangleOfnum()).new(x0, y0, x1 - x0, y1 - y0);
      }
    }
    return null;
  }
  [$intersects](other) {
    return dart.notNull(this[$left]) <= dart.notNull(other[$left]) + dart.notNull(other[$width]) && dart.notNull(other[$left]) <= dart.notNull(this[$left]) + dart.notNull(this[$width]) && dart.notNull(this[$top]) <= dart.notNull(other[$top]) + dart.notNull(other[$height]) && dart.notNull(other[$top]) <= dart.notNull(this[$top]) + dart.notNull(this[$height]);
  }
  [$boundingBox](other) {
    let right = math.max(core.num, dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(other[$left]) + dart.notNull(other[$width]));
    let bottom = math.max(core.num, dart.notNull(this[$top]) + dart.notNull(this[$height]), dart.notNull(other[$top]) + dart.notNull(other[$height]));
    let left = math.min(core.num, this[$left], other[$left]);
    let top = math.min(core.num, this[$top], other[$top]);
    return new (RectangleOfnum()).new(left, top, right - left, bottom - top);
  }
  [$containsRectangle](another) {
    return dart.notNull(this[$left]) <= dart.notNull(another[$left]) && dart.notNull(this[$left]) + dart.notNull(this[$width]) >= dart.notNull(another[$left]) + dart.notNull(another[$width]) && dart.notNull(this[$top]) <= dart.notNull(another[$top]) && dart.notNull(this[$top]) + dart.notNull(this[$height]) >= dart.notNull(another[$top]) + dart.notNull(another[$height]);
  }
  [$containsPoint](another) {
    return dart.notNull(another.x) >= dart.notNull(this[$left]) && dart.notNull(another.x) <= dart.notNull(this[$left]) + dart.notNull(this[$width]) && dart.notNull(another.y) >= dart.notNull(this[$top]) && dart.notNull(another.y) <= dart.notNull(this[$top]) + dart.notNull(this[$height]);
  }
  get [$topLeft]() {
    return new (PointOfnum()).new(this[$left], this[$top]);
  }
  get [$topRight]() {
    return new (PointOfnum()).new(dart.notNull(this[$left]) + dart.notNull(this[$width]), this[$top]);
  }
  get [$bottomRight]() {
    return new (PointOfnum()).new(dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(this[$top]) + dart.notNull(this[$height]));
  }
  get [$bottomLeft]() {
    return new (PointOfnum()).new(this[$left], dart.notNull(this[$top]) + dart.notNull(this[$height]));
  }
  static new(x, y, width, height) {
    if (x === void 0) x = null;
    if (y === void 0) y = null;
    if (width === void 0) width = null;
    if (height === void 0) height = null;
    if (height != null) {
      return html$.DomRectReadOnly._create_1(x, y, width, height);
    }
    if (width != null) {
      return html$.DomRectReadOnly._create_2(x, y, width);
    }
    if (y != null) {
      return html$.DomRectReadOnly._create_3(x, y);
    }
    if (x != null) {
      return html$.DomRectReadOnly._create_4(x);
    }
    return html$.DomRectReadOnly._create_5();
  }
  static _create_1(x, y, width, height) {
    return new DOMRectReadOnly(x, y, width, height);
  }
  static _create_2(x, y, width) {
    return new DOMRectReadOnly(x, y, width);
  }
  static _create_3(x, y) {
    return new DOMRectReadOnly(x, y);
  }
  static _create_4(x) {
    return new DOMRectReadOnly(x);
  }
  static _create_5() {
    return new DOMRectReadOnly();
  }
  get [$bottom]() {
    return this.bottom;
  }
  get [$height]() {
    return this.height;
  }
  get [$left]() {
    return this.left;
  }
  get [$right]() {
    return this.right;
  }
  get [$top]() {
    return this.top;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  static fromRect(other) {
    if (other === void 0) other = null;
    if (other != null) {
      let other_1 = html_common.convertDartToNative_Dictionary(other);
      return dart.global.DOMRectReadOnly.fromRect(other_1);
    }
    return dart.global.DOMRectReadOnly.fromRect();
  }
};
dart.addTypeTests(html$.DomRectReadOnly);
html$.DomRectReadOnly[dart.implements] = () => [RectangleOfnum()];
dart.setMethodSignature(html$.DomRectReadOnly, () => ({
  __proto__: dart.getMethods(html$.DomRectReadOnly.__proto__),
  [$intersection]: dart.fnType(math.Rectangle$(core.num), [math.Rectangle$(core.num)]),
  [$intersects]: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
  [$boundingBox]: dart.fnType(math.Rectangle$(core.num), [math.Rectangle$(core.num)]),
  [$containsRectangle]: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
  [$containsPoint]: dart.fnType(core.bool, [math.Point$(core.num)])
}));
dart.setGetterSignature(html$.DomRectReadOnly, () => ({
  __proto__: dart.getGetters(html$.DomRectReadOnly.__proto__),
  [$topLeft]: math.Point$(core.num),
  [$topRight]: math.Point$(core.num),
  [$bottomRight]: math.Point$(core.num),
  [$bottomLeft]: math.Point$(core.num),
  [$bottom]: core.num,
  [$height]: core.num,
  [$left]: core.num,
  [$right]: core.num,
  [$top]: core.num,
  [$width]: core.num,
  [$x]: core.num,
  [$y]: core.num
}));
dart.setLibraryUri(html$.DomRectReadOnly, "dart:html");
dart.registerExtension("DOMRectReadOnly", html$.DomRectReadOnly);
const Interceptor_ListMixin$$ = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$.new = function() {
  Interceptor_ListMixin$$.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$.prototype;
dart.applyMixin(Interceptor_ListMixin$$, collection.ListMixin$(core.String));
const Interceptor_ImmutableListMixin$$ = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$ {};
(Interceptor_ImmutableListMixin$$.new = function() {
  Interceptor_ImmutableListMixin$$.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$, html$.ImmutableListMixin$(core.String));
html$.DomStringList = class DomStringList extends Interceptor_ImmutableListMixin$$ {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    core.String._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$.DomStringList.prototype[dart.isList] = true;
dart.addTypeTests(html$.DomStringList);
html$.DomStringList[dart.implements] = () => [JavaScriptIndexingBehaviorOfString(), ListOfString()];
dart.setMethodSignature(html$.DomStringList, () => ({
  __proto__: dart.getMethods(html$.DomStringList.__proto__),
  [$_get]: dart.fnType(core.String, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(core.String, [core.int]),
  [$item]: dart.fnType(core.String, [core.int])
}));
dart.setGetterSignature(html$.DomStringList, () => ({
  __proto__: dart.getGetters(html$.DomStringList.__proto__),
  [$length]: core.int,
  [$first]: core.String,
  [$last]: core.String,
  [$single]: core.String
}));
dart.setSetterSignature(html$.DomStringList, () => ({
  __proto__: dart.getSetters(html$.DomStringList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.DomStringList, "dart:html");
dart.registerExtension("DOMStringList", html$.DomStringList);
const __delete__ = dart.privateName(html$, "__delete__");
html$.DomStringMap = class DomStringMap extends _interceptors.Interceptor {
  [__delete__](...args) {
    return this.__delete__.apply(this, args);
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
dart.addTypeTests(html$.DomStringMap);
dart.setMethodSignature(html$.DomStringMap, () => ({
  __proto__: dart.getMethods(html$.DomStringMap.__proto__),
  [__delete__]: dart.fnType(dart.void, [core.String]),
  [__setter__]: dart.fnType(dart.void, [core.String, core.String]),
  [$item]: dart.fnType(core.String, [core.String])
}));
dart.setLibraryUri(html$.DomStringMap, "dart:html");
dart.registerExtension("DOMStringMap", html$.DomStringMap);
html$.DomTokenList = class DomTokenList extends _interceptors.Interceptor {
  get [$length]() {
    return this.length;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  [$add](...args) {
    return this.add.apply(this, args);
  }
  [$contains](...args) {
    return this.contains.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$remove](...args) {
    return this.remove.apply(this, args);
  }
  [$replace](...args) {
    return this.replace.apply(this, args);
  }
  [$supports](...args) {
    return this.supports.apply(this, args);
  }
  [$toggle](...args) {
    return this.toggle.apply(this, args);
  }
};
dart.addTypeTests(html$.DomTokenList);
const length$6 = Symbol("DomTokenList.length");
const value$5 = Symbol("DomTokenList.value");
dart.setMethodSignature(html$.DomTokenList, () => ({
  __proto__: dart.getMethods(html$.DomTokenList.__proto__),
  [$add]: dart.fnType(dart.void, [core.String]),
  [$contains]: dart.fnType(core.bool, [core.String]),
  [$item]: dart.fnType(core.String, [core.int]),
  [$remove]: dart.fnType(dart.void, [core.String]),
  [$replace]: dart.fnType(dart.void, [core.String, core.String]),
  [$supports]: dart.fnType(core.bool, [core.String]),
  [$toggle]: dart.fnType(core.bool, [core.String], [core.bool])
}));
dart.setLibraryUri(html$.DomTokenList, "dart:html");
dart.setFieldSignature(html$.DomTokenList, () => ({
  __proto__: dart.getFields(html$.DomTokenList.__proto__),
  [$length]: dart.finalFieldType(core.int),
  [$value]: dart.fieldType(core.String)
}));
dart.registerExtension("DOMTokenList", html$.DomTokenList);
const _childElements = dart.privateName(html$, "_childElements");
const _element$ = dart.privateName(html$, "_element");
const _filter$0 = dart.privateName(html$, "_filter");
html$._ChildrenElementList = class _ChildrenElementList extends collection.ListBase$(html$.Element) {
  contains(element) {
    return this[_childElements][$contains](element);
  }
  get isEmpty() {
    return this[_element$][_firstElementChild] == null;
  }
  get length() {
    return this[_childElements][$length];
  }
  _get(index) {
    return html$.Element._check(this[_childElements][$_get](index));
  }
  _set(index, value) {
    html$.Element._check(value);
    this[_element$][_replaceChild](value, this[_childElements][$_get](index));
    return value;
  }
  set length(newLength) {
    dart.throw(new core.UnsupportedError.new("Cannot resize element lists"));
  }
  add(value) {
    html$.Element._check(value);
    this[_element$][$append](value);
    return value;
  }
  get iterator() {
    return this[$toList]()[$iterator];
  }
  addAll(iterable) {
    IterableOfElement()._check(iterable);
    if (html$._ChildNodeListLazy.is(iterable)) {
      iterable = ListOfElement().from(iterable);
    }
    for (let element of iterable) {
      this[_element$][$append](element);
    }
  }
  sort(compare) {
    if (compare === void 0) compare = null;
    dart.throw(new core.UnsupportedError.new("Cannot sort element lists"));
  }
  shuffle(random) {
    if (random === void 0) random = null;
    dart.throw(new core.UnsupportedError.new("Cannot shuffle element lists"));
  }
  removeWhere(test) {
    this[_filter$0](test, false);
  }
  retainWhere(test) {
    this[_filter$0](test, true);
  }
  [_filter$0](test, retainMatching) {
    let removed = null;
    if (dart.test(retainMatching)) {
      removed = this[_element$][$children][$where](dart.fn(e => !dart.test(test(e)), ElementTobool()));
    } else {
      removed = this[_element$][$children][$where](test);
    }
    for (let e of core.Iterable._check(removed))
      dart.dsend(e, 'remove', []);
  }
  fillRange(start, end, fillValue) {
    if (fillValue === void 0) fillValue = null;
    html$.Element._check(fillValue);
    dart.throw(new core.UnimplementedError.new());
  }
  replaceRange(start, end, iterable) {
    IterableOfElement()._check(iterable);
    dart.throw(new core.UnimplementedError.new());
  }
  removeRange(start, end) {
    dart.throw(new core.UnimplementedError.new());
  }
  setRange(start, end, iterable, skipCount) {
    IterableOfElement()._check(iterable);
    if (skipCount === void 0) skipCount = 0;
    dart.throw(new core.UnimplementedError.new());
  }
  remove(object) {
    if (html$.Element.is(object)) {
      let element = object;
      if (element.parentNode == this[_element$]) {
        this[_element$][_removeChild](element);
        return true;
      }
    }
    return false;
  }
  insert(index, element) {
    html$.Element._check(element);
    if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
      dart.throw(new core.RangeError.range(index, 0, this.length));
    }
    if (index == this.length) {
      this[_element$][$append](element);
    } else {
      this[_element$].insertBefore(element, this._get(index));
    }
  }
  setAll(index, iterable) {
    IterableOfElement()._check(iterable);
    dart.throw(new core.UnimplementedError.new());
  }
  clear() {
    this[_element$][_clearChildren]();
  }
  removeAt(index) {
    let result = this._get(index);
    if (result != null) {
      this[_element$][_removeChild](result);
    }
    return result;
  }
  removeLast() {
    let result = this.last;
    if (result != null) {
      this[_element$][_removeChild](result);
    }
    return result;
  }
  get first() {
    let result = this[_element$][_firstElementChild];
    if (result == null) dart.throw(new core.StateError.new("No elements"));
    return result;
  }
  set first(value) {
    super.first = value;
  }
  get last() {
    let result = this[_element$][_lastElementChild];
    if (result == null) dart.throw(new core.StateError.new("No elements"));
    return result;
  }
  set last(value) {
    super.last = value;
  }
  get single() {
    if (dart.notNull(this.length) > 1) dart.throw(new core.StateError.new("More than one element"));
    return this.first;
  }
  get rawList() {
    return this[_childElements];
  }
};
(html$._ChildrenElementList._wrap = function(element) {
  this[_childElements] = html$.HtmlCollection._check(element[_children]);
  this[_element$] = element;
}).prototype = html$._ChildrenElementList.prototype;
dart.addTypeTests(html$._ChildrenElementList);
html$._ChildrenElementList[dart.implements] = () => [html_common.NodeListWrapper];
dart.setMethodSignature(html$._ChildrenElementList, () => ({
  __proto__: dart.getMethods(html$._ChildrenElementList.__proto__),
  contains: dart.fnType(core.bool, [core.Object]),
  [$contains]: dart.fnType(core.bool, [core.Object]),
  _get: dart.fnType(html$.Element, [core.int]),
  [$_get]: dart.fnType(html$.Element, [core.int]),
  _set: dart.fnType(dart.void, [core.int, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  add: dart.fnType(html$.Element, [core.Object]),
  [$add]: dart.fnType(html$.Element, [core.Object]),
  addAll: dart.fnType(dart.void, [core.Object]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  sort: dart.fnType(dart.void, [], [dart.fnType(core.int, [html$.Element, html$.Element])]),
  [$sort]: dart.fnType(dart.void, [], [dart.fnType(core.int, [html$.Element, html$.Element])]),
  shuffle: dart.fnType(dart.void, [], [math.Random]),
  [$shuffle]: dart.fnType(dart.void, [], [math.Random]),
  removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Element])]),
  [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Element])]),
  retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Element])]),
  [$retainWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Element])]),
  [_filter$0]: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Element]), core.bool]),
  fillRange: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
  [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
  replaceRange: dart.fnType(dart.void, [core.int, core.int, core.Object]),
  [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object]),
  removeRange: dart.fnType(dart.void, [core.int, core.int]),
  [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
  setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
  [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
  remove: dart.fnType(core.bool, [core.Object]),
  [$remove]: dart.fnType(core.bool, [core.Object]),
  insert: dart.fnType(dart.void, [core.int, core.Object]),
  [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
  setAll: dart.fnType(dart.void, [core.int, core.Object]),
  [$setAll]: dart.fnType(dart.void, [core.int, core.Object]),
  clear: dart.fnType(dart.void, []),
  [$clear]: dart.fnType(dart.void, []),
  removeAt: dart.fnType(html$.Element, [core.int]),
  [$removeAt]: dart.fnType(html$.Element, [core.int]),
  removeLast: dart.fnType(html$.Element, []),
  [$removeLast]: dart.fnType(html$.Element, [])
}));
dart.setGetterSignature(html$._ChildrenElementList, () => ({
  __proto__: dart.getGetters(html$._ChildrenElementList.__proto__),
  isEmpty: core.bool,
  [$isEmpty]: core.bool,
  length: core.int,
  [$length]: core.int,
  iterator: core.Iterator$(html$.Element),
  [$iterator]: core.Iterator$(html$.Element),
  first: html$.Element,
  [$first]: html$.Element,
  last: html$.Element,
  [$last]: html$.Element,
  single: html$.Element,
  [$single]: html$.Element,
  rawList: core.List$(html$.Node)
}));
dart.setSetterSignature(html$._ChildrenElementList, () => ({
  __proto__: dart.getSetters(html$._ChildrenElementList.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(html$._ChildrenElementList, "dart:html");
dart.setFieldSignature(html$._ChildrenElementList, () => ({
  __proto__: dart.getFields(html$._ChildrenElementList.__proto__),
  [_element$]: dart.finalFieldType(html$.Element),
  [_childElements]: dart.finalFieldType(html$.HtmlCollection)
}));
dart.defineExtensionMethods(html$._ChildrenElementList, [
  'contains',
  '_get',
  '_set',
  'add',
  'addAll',
  'sort',
  'shuffle',
  'removeWhere',
  'retainWhere',
  'fillRange',
  'replaceRange',
  'removeRange',
  'setRange',
  'remove',
  'insert',
  'setAll',
  'clear',
  'removeAt',
  'removeLast'
]);
dart.defineExtensionAccessors(html$._ChildrenElementList, [
  'isEmpty',
  'length',
  'iterator',
  'first',
  'last',
  'single'
]);
const _is_ElementList_default = Symbol('_is_ElementList_default');
html$.ElementList$ = dart.generic(T => {
  class ElementList extends collection.ListBase$(T) {}
  (ElementList.new = function() {
  }).prototype = ElementList.prototype;
  dart.addTypeTests(ElementList);
  ElementList.prototype[_is_ElementList_default] = true;
  dart.setLibraryUri(ElementList, "dart:html");
  return ElementList;
});
html$.ElementList = html$.ElementList$();
dart.addTypeTests(html$.ElementList, _is_ElementList_default);
const _nodeList = dart.privateName(html$, "_nodeList");
const _forElementList = dart.privateName(html$, "_forElementList");
const _is__FrozenElementList_default = Symbol('_is__FrozenElementList_default');
html$._FrozenElementList$ = dart.generic(E => {
  let EToIterableOfString = () => (EToIterableOfString = dart.constFn(dart.fnType(IterableOfString(), [E])))();
  let ElementListOfE = () => (ElementListOfE = dart.constFn(html$.ElementList$(E)))();
  class _FrozenElementList extends collection.ListBase$(E) {
    get length() {
      return this[_nodeList][$length];
    }
    _get(index) {
      return E._check(this[_nodeList][$_get](index));
    }
    _set(index, value) {
      E._check(value);
      dart.throw(new core.UnsupportedError.new("Cannot modify list"));
      return value;
    }
    set length(newLength) {
      dart.throw(new core.UnsupportedError.new("Cannot modify list"));
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError.new("Cannot sort list"));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError.new("Cannot shuffle list"));
    }
    get first() {
      return E._check(this[_nodeList][$first]);
    }
    set first(value) {
      super.first = value;
    }
    get last() {
      return E._check(this[_nodeList][$last]);
    }
    set last(value) {
      super.last = value;
    }
    get single() {
      return E._check(this[_nodeList][$single]);
    }
    get classes() {
      return html$._MultiElementCssClassSet.new(this);
    }
    get style() {
      return new html$._CssStyleDeclarationSet.new(this);
    }
    set classes(value) {
      this[$forEach](dart.fn(e => e[$classes] = value, EToIterableOfString()));
    }
    get contentEdge() {
      return new html$._ContentCssListRect.new(this);
    }
    get paddingEdge() {
      return this.first[$paddingEdge];
    }
    get borderEdge() {
      return this.first[$borderEdge];
    }
    get marginEdge() {
      return this.first[$marginEdge];
    }
    get rawList() {
      return this[_nodeList];
    }
    get onAbort() {
      return html$.Element.abortEvent[_forElementList](this);
    }
    get onBeforeCopy() {
      return html$.Element.beforeCopyEvent[_forElementList](this);
    }
    get onBeforeCut() {
      return html$.Element.beforeCutEvent[_forElementList](this);
    }
    get onBeforePaste() {
      return html$.Element.beforePasteEvent[_forElementList](this);
    }
    get onBlur() {
      return html$.Element.blurEvent[_forElementList](this);
    }
    get onCanPlay() {
      return html$.Element.canPlayEvent[_forElementList](this);
    }
    get onCanPlayThrough() {
      return html$.Element.canPlayThroughEvent[_forElementList](this);
    }
    get onChange() {
      return html$.Element.changeEvent[_forElementList](this);
    }
    get onClick() {
      return html$.Element.clickEvent[_forElementList](this);
    }
    get onContextMenu() {
      return html$.Element.contextMenuEvent[_forElementList](this);
    }
    get onCopy() {
      return html$.Element.copyEvent[_forElementList](this);
    }
    get onCut() {
      return html$.Element.cutEvent[_forElementList](this);
    }
    get onDoubleClick() {
      return html$.Element.doubleClickEvent[_forElementList](this);
    }
    get onDrag() {
      return html$.Element.dragEvent[_forElementList](this);
    }
    get onDragEnd() {
      return html$.Element.dragEndEvent[_forElementList](this);
    }
    get onDragEnter() {
      return html$.Element.dragEnterEvent[_forElementList](this);
    }
    get onDragLeave() {
      return html$.Element.dragLeaveEvent[_forElementList](this);
    }
    get onDragOver() {
      return html$.Element.dragOverEvent[_forElementList](this);
    }
    get onDragStart() {
      return html$.Element.dragStartEvent[_forElementList](this);
    }
    get onDrop() {
      return html$.Element.dropEvent[_forElementList](this);
    }
    get onDurationChange() {
      return html$.Element.durationChangeEvent[_forElementList](this);
    }
    get onEmptied() {
      return html$.Element.emptiedEvent[_forElementList](this);
    }
    get onEnded() {
      return html$.Element.endedEvent[_forElementList](this);
    }
    get onError() {
      return html$.Element.errorEvent[_forElementList](this);
    }
    get onFocus() {
      return html$.Element.focusEvent[_forElementList](this);
    }
    get onInput() {
      return html$.Element.inputEvent[_forElementList](this);
    }
    get onInvalid() {
      return html$.Element.invalidEvent[_forElementList](this);
    }
    get onKeyDown() {
      return html$.Element.keyDownEvent[_forElementList](this);
    }
    get onKeyPress() {
      return html$.Element.keyPressEvent[_forElementList](this);
    }
    get onKeyUp() {
      return html$.Element.keyUpEvent[_forElementList](this);
    }
    get onLoad() {
      return html$.Element.loadEvent[_forElementList](this);
    }
    get onLoadedData() {
      return html$.Element.loadedDataEvent[_forElementList](this);
    }
    get onLoadedMetadata() {
      return html$.Element.loadedMetadataEvent[_forElementList](this);
    }
    get onMouseDown() {
      return html$.Element.mouseDownEvent[_forElementList](this);
    }
    get onMouseEnter() {
      return html$.Element.mouseEnterEvent[_forElementList](this);
    }
    get onMouseLeave() {
      return html$.Element.mouseLeaveEvent[_forElementList](this);
    }
    get onMouseMove() {
      return html$.Element.mouseMoveEvent[_forElementList](this);
    }
    get onMouseOut() {
      return html$.Element.mouseOutEvent[_forElementList](this);
    }
    get onMouseOver() {
      return html$.Element.mouseOverEvent[_forElementList](this);
    }
    get onMouseUp() {
      return html$.Element.mouseUpEvent[_forElementList](this);
    }
    get onMouseWheel() {
      return html$.Element.mouseWheelEvent[_forElementList](this);
    }
    get onPaste() {
      return html$.Element.pasteEvent[_forElementList](this);
    }
    get onPause() {
      return html$.Element.pauseEvent[_forElementList](this);
    }
    get onPlay() {
      return html$.Element.playEvent[_forElementList](this);
    }
    get onPlaying() {
      return html$.Element.playingEvent[_forElementList](this);
    }
    get onRateChange() {
      return html$.Element.rateChangeEvent[_forElementList](this);
    }
    get onReset() {
      return html$.Element.resetEvent[_forElementList](this);
    }
    get onResize() {
      return html$.Element.resizeEvent[_forElementList](this);
    }
    get onScroll() {
      return html$.Element.scrollEvent[_forElementList](this);
    }
    get onSearch() {
      return html$.Element.searchEvent[_forElementList](this);
    }
    get onSeeked() {
      return html$.Element.seekedEvent[_forElementList](this);
    }
    get onSeeking() {
      return html$.Element.seekingEvent[_forElementList](this);
    }
    get onSelect() {
      return html$.Element.selectEvent[_forElementList](this);
    }
    get onSelectStart() {
      return html$.Element.selectStartEvent[_forElementList](this);
    }
    get onStalled() {
      return html$.Element.stalledEvent[_forElementList](this);
    }
    get onSubmit() {
      return html$.Element.submitEvent[_forElementList](this);
    }
    get onSuspend() {
      return html$.Element.suspendEvent[_forElementList](this);
    }
    get onTimeUpdate() {
      return html$.Element.timeUpdateEvent[_forElementList](this);
    }
    get onTouchCancel() {
      return html$.Element.touchCancelEvent[_forElementList](this);
    }
    get onTouchEnd() {
      return html$.Element.touchEndEvent[_forElementList](this);
    }
    get onTouchEnter() {
      return html$.Element.touchEnterEvent[_forElementList](this);
    }
    get onTouchLeave() {
      return html$.Element.touchLeaveEvent[_forElementList](this);
    }
    get onTouchMove() {
      return html$.Element.touchMoveEvent[_forElementList](this);
    }
    get onTouchStart() {
      return html$.Element.touchStartEvent[_forElementList](this);
    }
    get onTransitionEnd() {
      return html$.Element.transitionEndEvent[_forElementList](this);
    }
    get onVolumeChange() {
      return html$.Element.volumeChangeEvent[_forElementList](this);
    }
    get onWaiting() {
      return html$.Element.waitingEvent[_forElementList](this);
    }
    get onFullscreenChange() {
      return html$.Element.fullscreenChangeEvent[_forElementList](this);
    }
    get onFullscreenError() {
      return html$.Element.fullscreenErrorEvent[_forElementList](this);
    }
    get onWheel() {
      return html$.Element.wheelEvent[_forElementList](this);
    }
  }
  (_FrozenElementList._wrap = function(nodeList) {
    this[_nodeList] = nodeList;
    if (!dart.test(this[_nodeList][$every](dart.fn(element => E.is(element), NodeTobool())))) dart.assertFailed("Query expects only HTML elements of type " + dart.str(dart.wrapType(E)) + " but found " + dart.str(this[_nodeList][$firstWhere](dart.fn(e => !E.is(e), NodeTobool()))), "dart:html", 11665, 12, "this._nodeList.every((element) => element is E)");
  }).prototype = _FrozenElementList.prototype;
  dart.addTypeTests(_FrozenElementList);
  _FrozenElementList.prototype[_is__FrozenElementList_default] = true;
  _FrozenElementList[dart.implements] = () => [ElementListOfE(), html_common.NodeListWrapper];
  dart.setMethodSignature(_FrozenElementList, () => ({
    __proto__: dart.getMethods(_FrozenElementList.__proto__),
    _get: dart.fnType(E, [core.int]),
    [$_get]: dart.fnType(E, [core.int]),
    _set: dart.fnType(dart.void, [core.int, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.int, core.Object])
  }));
  dart.setGetterSignature(_FrozenElementList, () => ({
    __proto__: dart.getGetters(_FrozenElementList.__proto__),
    length: core.int,
    [$length]: core.int,
    classes: html$.CssClassSet,
    style: html$.CssStyleDeclarationBase,
    contentEdge: html$.CssRect,
    paddingEdge: html$.CssRect,
    borderEdge: html$.CssRect,
    marginEdge: html$.CssRect,
    rawList: core.List$(html$.Node),
    onAbort: html$.ElementStream$(html$.Event),
    onBeforeCopy: html$.ElementStream$(html$.Event),
    onBeforeCut: html$.ElementStream$(html$.Event),
    onBeforePaste: html$.ElementStream$(html$.Event),
    onBlur: html$.ElementStream$(html$.Event),
    onCanPlay: html$.ElementStream$(html$.Event),
    onCanPlayThrough: html$.ElementStream$(html$.Event),
    onChange: html$.ElementStream$(html$.Event),
    onClick: html$.ElementStream$(html$.MouseEvent),
    onContextMenu: html$.ElementStream$(html$.MouseEvent),
    onCopy: html$.ElementStream$(html$.ClipboardEvent),
    onCut: html$.ElementStream$(html$.ClipboardEvent),
    onDoubleClick: html$.ElementStream$(html$.Event),
    onDrag: html$.ElementStream$(html$.MouseEvent),
    onDragEnd: html$.ElementStream$(html$.MouseEvent),
    onDragEnter: html$.ElementStream$(html$.MouseEvent),
    onDragLeave: html$.ElementStream$(html$.MouseEvent),
    onDragOver: html$.ElementStream$(html$.MouseEvent),
    onDragStart: html$.ElementStream$(html$.MouseEvent),
    onDrop: html$.ElementStream$(html$.MouseEvent),
    onDurationChange: html$.ElementStream$(html$.Event),
    onEmptied: html$.ElementStream$(html$.Event),
    onEnded: html$.ElementStream$(html$.Event),
    onError: html$.ElementStream$(html$.Event),
    onFocus: html$.ElementStream$(html$.Event),
    onInput: html$.ElementStream$(html$.Event),
    onInvalid: html$.ElementStream$(html$.Event),
    onKeyDown: html$.ElementStream$(html$.KeyboardEvent),
    onKeyPress: html$.ElementStream$(html$.KeyboardEvent),
    onKeyUp: html$.ElementStream$(html$.KeyboardEvent),
    onLoad: html$.ElementStream$(html$.Event),
    onLoadedData: html$.ElementStream$(html$.Event),
    onLoadedMetadata: html$.ElementStream$(html$.Event),
    onMouseDown: html$.ElementStream$(html$.MouseEvent),
    onMouseEnter: html$.ElementStream$(html$.MouseEvent),
    onMouseLeave: html$.ElementStream$(html$.MouseEvent),
    onMouseMove: html$.ElementStream$(html$.MouseEvent),
    onMouseOut: html$.ElementStream$(html$.MouseEvent),
    onMouseOver: html$.ElementStream$(html$.MouseEvent),
    onMouseUp: html$.ElementStream$(html$.MouseEvent),
    onMouseWheel: html$.ElementStream$(html$.WheelEvent),
    onPaste: html$.ElementStream$(html$.ClipboardEvent),
    onPause: html$.ElementStream$(html$.Event),
    onPlay: html$.ElementStream$(html$.Event),
    onPlaying: html$.ElementStream$(html$.Event),
    onRateChange: html$.ElementStream$(html$.Event),
    onReset: html$.ElementStream$(html$.Event),
    onResize: html$.ElementStream$(html$.Event),
    onScroll: html$.ElementStream$(html$.Event),
    onSearch: html$.ElementStream$(html$.Event),
    onSeeked: html$.ElementStream$(html$.Event),
    onSeeking: html$.ElementStream$(html$.Event),
    onSelect: html$.ElementStream$(html$.Event),
    onSelectStart: html$.ElementStream$(html$.Event),
    onStalled: html$.ElementStream$(html$.Event),
    onSubmit: html$.ElementStream$(html$.Event),
    onSuspend: html$.ElementStream$(html$.Event),
    onTimeUpdate: html$.ElementStream$(html$.Event),
    onTouchCancel: html$.ElementStream$(html$.TouchEvent),
    onTouchEnd: html$.ElementStream$(html$.TouchEvent),
    onTouchEnter: html$.ElementStream$(html$.TouchEvent),
    onTouchLeave: html$.ElementStream$(html$.TouchEvent),
    onTouchMove: html$.ElementStream$(html$.TouchEvent),
    onTouchStart: html$.ElementStream$(html$.TouchEvent),
    onTransitionEnd: html$.ElementStream$(html$.TransitionEvent),
    onVolumeChange: html$.ElementStream$(html$.Event),
    onWaiting: html$.ElementStream$(html$.Event),
    onFullscreenChange: html$.ElementStream$(html$.Event),
    onFullscreenError: html$.ElementStream$(html$.Event),
    onWheel: html$.ElementStream$(html$.WheelEvent)
  }));
  dart.setSetterSignature(_FrozenElementList, () => ({
    __proto__: dart.getSetters(_FrozenElementList.__proto__),
    length: core.int,
    [$length]: core.int,
    classes: core.Iterable$(core.String)
  }));
  dart.setLibraryUri(_FrozenElementList, "dart:html");
  dart.setFieldSignature(_FrozenElementList, () => ({
    __proto__: dart.getFields(_FrozenElementList.__proto__),
    [_nodeList]: dart.finalFieldType(ListOfNode())
  }));
  dart.defineExtensionMethods(_FrozenElementList, ['_get', '_set', 'sort', 'shuffle']);
  dart.defineExtensionAccessors(_FrozenElementList, ['length', 'first', 'last', 'single']);
  return _FrozenElementList;
});
html$._FrozenElementList = html$._FrozenElementList$();
dart.addTypeTests(html$._FrozenElementList, _is__FrozenElementList_default);
html$._ElementFactoryProvider = class _ElementFactoryProvider extends core.Object {
  static createElement_tag(tag, typeExtension) {
    if (typeExtension != null) {
      return document.createElement(tag, typeExtension);
    }
    return document.createElement(tag);
  }
};
(html$._ElementFactoryProvider.new = function() {
}).prototype = html$._ElementFactoryProvider.prototype;
dart.addTypeTests(html$._ElementFactoryProvider);
dart.setLibraryUri(html$._ElementFactoryProvider, "dart:html");
const _value$3 = dart.privateName(html$, "_value");
html$.ScrollAlignment = class ScrollAlignment extends core.Object {
  toString() {
    return "ScrollAlignment." + dart.str(this[_value$3]);
  }
};
(html$.ScrollAlignment._internal = function(value) {
  this[_value$3] = value;
}).prototype = html$.ScrollAlignment.prototype;
dart.addTypeTests(html$.ScrollAlignment);
dart.setLibraryUri(html$.ScrollAlignment, "dart:html");
dart.setFieldSignature(html$.ScrollAlignment, () => ({
  __proto__: dart.getFields(html$.ScrollAlignment.__proto__),
  [_value$3]: dart.finalFieldType(dart.dynamic)
}));
dart.defineExtensionMethods(html$.ScrollAlignment, ['toString']);
dart.defineLazy(html$.ScrollAlignment, {
  /*html$.ScrollAlignment.TOP*/get TOP() {
    return dart.const(new html$.ScrollAlignment._internal("TOP"));
  },
  /*html$.ScrollAlignment.CENTER*/get CENTER() {
    return dart.const(new html$.ScrollAlignment._internal("CENTER"));
  },
  /*html$.ScrollAlignment.BOTTOM*/get BOTTOM() {
    return dart.const(new html$.ScrollAlignment._internal("BOTTOM"));
  }
});
html$.EmbedElement = class EmbedElement extends html$.HtmlElement {
  static new() {
    return html$.EmbedElement._check(html$.document[$createElement]("embed"));
  }
  static get supported() {
    return html$.Element.isTagSupported("embed");
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
};
(html$.EmbedElement.created = function() {
  this[height$] = null;
  this[name$12] = null;
  this[src$] = null;
  this[type$13] = null;
  this[width$] = null;
  html$.EmbedElement.__proto__.created.call(this);
}).prototype = html$.EmbedElement.prototype;
dart.addTypeTests(html$.EmbedElement);
const height$ = Symbol("EmbedElement.height");
const name$12 = Symbol("EmbedElement.name");
const src$ = Symbol("EmbedElement.src");
const type$13 = Symbol("EmbedElement.type");
const width$ = Symbol("EmbedElement.width");
dart.setMethodSignature(html$.EmbedElement, () => ({
  __proto__: dart.getMethods(html$.EmbedElement.__proto__),
  [__getter__]: dart.fnType(html$.Node, [core.String]),
  [__setter__]: dart.fnType(dart.void, [core.String, html$.Node])
}));
dart.setLibraryUri(html$.EmbedElement, "dart:html");
dart.setFieldSignature(html$.EmbedElement, () => ({
  __proto__: dart.getFields(html$.EmbedElement.__proto__),
  [$height]: dart.fieldType(core.String),
  [$name]: dart.fieldType(core.String),
  [$src]: dart.fieldType(core.String),
  [$type]: dart.fieldType(core.String),
  [$width]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLEmbedElement", html$.EmbedElement);
html$.ErrorEvent = class ErrorEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ErrorEvent._create_1(type, eventInitDict_1);
    }
    return html$.ErrorEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new ErrorEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new ErrorEvent(type);
  }
  get [$colno]() {
    return this.colno;
  }
  get [$error]() {
    return this.error;
  }
  get [$filename]() {
    return this.filename;
  }
  get [$lineno]() {
    return this.lineno;
  }
  get [$message]() {
    return this.message;
  }
};
dart.addTypeTests(html$.ErrorEvent);
const colno = Symbol("ErrorEvent.colno");
const error$2 = Symbol("ErrorEvent.error");
const filename = Symbol("ErrorEvent.filename");
const lineno = Symbol("ErrorEvent.lineno");
const message$19 = Symbol("ErrorEvent.message");
dart.setLibraryUri(html$.ErrorEvent, "dart:html");
dart.setFieldSignature(html$.ErrorEvent, () => ({
  __proto__: dart.getFields(html$.ErrorEvent.__proto__),
  [$colno]: dart.finalFieldType(core.int),
  [$error]: dart.finalFieldType(core.Object),
  [$filename]: dart.finalFieldType(core.String),
  [$lineno]: dart.finalFieldType(core.int),
  [$message]: dart.finalFieldType(core.String)
}));
dart.registerExtension("ErrorEvent", html$.ErrorEvent);
html$.EventSource = class EventSource$ extends html$.EventTarget {
  static new(url, opts) {
    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : false;
    let parsedOptions = new (IdentityMapOfString$dynamic()).from(["withCredentials", withCredentials]);
    return html$.EventSource._factoryEventSource(url, parsedOptions);
  }
  static _factoryEventSource(url, eventSourceInitDict) {
    if (eventSourceInitDict === void 0) eventSourceInitDict = null;
    if (eventSourceInitDict != null) {
      let eventSourceInitDict_1 = html_common.convertDartToNative_Dictionary(eventSourceInitDict);
      return html$.EventSource._create_1(url, eventSourceInitDict_1);
    }
    return html$.EventSource._create_2(url);
  }
  static _create_1(url, eventSourceInitDict) {
    return new EventSource(url, eventSourceInitDict);
  }
  static _create_2(url) {
    return new EventSource(url);
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [$url]() {
    return this.url;
  }
  get [$withCredentials]() {
    return this.withCredentials;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  get [$onError]() {
    return html$.EventSource.errorEvent.forTarget(this);
  }
  get [$onMessage]() {
    return html$.EventSource.messageEvent.forTarget(this);
  }
  get [$onOpen]() {
    return html$.EventSource.openEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.EventSource);
const readyState$2 = Symbol("EventSource.readyState");
const url$1 = Symbol("EventSource.url");
const withCredentials = Symbol("EventSource.withCredentials");
dart.setMethodSignature(html$.EventSource, () => ({
  __proto__: dart.getMethods(html$.EventSource.__proto__),
  [$close]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.EventSource, () => ({
  __proto__: dart.getGetters(html$.EventSource.__proto__),
  [$onError]: async.Stream$(html$.Event),
  [$onMessage]: async.Stream$(html$.MessageEvent),
  [$onOpen]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.EventSource, "dart:html");
dart.setFieldSignature(html$.EventSource, () => ({
  __proto__: dart.getFields(html$.EventSource.__proto__),
  [$readyState]: dart.finalFieldType(core.int),
  [$url]: dart.finalFieldType(core.String),
  [$withCredentials]: dart.finalFieldType(core.bool)
}));
dart.defineLazy(html$.EventSource, {
  /*html$.EventSource.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.EventSource.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  },
  /*html$.EventSource.openEvent*/get openEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("open"));
  },
  /*html$.EventSource.CLOSED*/get CLOSED() {
    return 2;
  },
  /*html$.EventSource.CONNECTING*/get CONNECTING() {
    return 0;
  },
  /*html$.EventSource.OPEN*/get OPEN() {
    return 1;
  }
});
dart.registerExtension("EventSource", html$.EventSource);
const _ptr = dart.privateName(html$, "_ptr");
html$.Events = class Events extends core.Object {
  _get(type) {
    return new (_EventStreamOfEvent()).new(this[_ptr], type, false);
  }
};
(html$.Events.new = function(ptr) {
  this[_ptr] = ptr;
}).prototype = html$.Events.prototype;
dart.addTypeTests(html$.Events);
dart.setMethodSignature(html$.Events, () => ({
  __proto__: dart.getMethods(html$.Events.__proto__),
  _get: dart.fnType(async.Stream$(html$.Event), [core.String])
}));
dart.setLibraryUri(html$.Events, "dart:html");
dart.setFieldSignature(html$.Events, () => ({
  __proto__: dart.getFields(html$.Events.__proto__),
  [_ptr]: dart.finalFieldType(html$.EventTarget)
}));
html$.ElementEvents = class ElementEvents extends html$.Events {
  _get(type) {
    if (dart.test(html$.ElementEvents.webkitEvents[$keys][$contains](type[$toLowerCase]()))) {
      if (dart.test(html_common.Device.isWebKit)) {
        return new (_ElementEventStreamImplOfEvent()).new(this[_ptr], html$.ElementEvents.webkitEvents[$_get](type[$toLowerCase]()), false);
      }
    }
    return new (_ElementEventStreamImplOfEvent()).new(this[_ptr], type, false);
  }
};
(html$.ElementEvents.new = function(ptr) {
  html$.ElementEvents.__proto__.new.call(this, ptr);
}).prototype = html$.ElementEvents.prototype;
dart.addTypeTests(html$.ElementEvents);
dart.setLibraryUri(html$.ElementEvents, "dart:html");
dart.defineLazy(html$.ElementEvents, {
  /*html$.ElementEvents.webkitEvents*/get webkitEvents() {
    return new (IdentityMapOfString$String()).from(["animationend", "webkitAnimationEnd", "animationiteration", "webkitAnimationIteration", "animationstart", "webkitAnimationStart", "fullscreenchange", "webkitfullscreenchange", "fullscreenerror", "webkitfullscreenerror", "keyadded", "webkitkeyadded", "keyerror", "webkitkeyerror", "keymessage", "webkitkeymessage", "needkey", "webkitneedkey", "pointerlockchange", "webkitpointerlockchange", "pointerlockerror", "webkitpointerlockerror", "resourcetimingbufferfull", "webkitresourcetimingbufferfull", "transitionend", "webkitTransitionEnd", "speechchange", "webkitSpeechChange"]);
  }
});
html$.ExtendableMessageEvent = class ExtendableMessageEvent extends html$.ExtendableEvent {
  get [$data]() {
    return this.data;
  }
  get [$lastEventId]() {
    return this.lastEventId;
  }
  get [$origin]() {
    return this.origin;
  }
  get [$ports]() {
    return this.ports;
  }
  get [$source]() {
    return this.source;
  }
};
dart.addTypeTests(html$.ExtendableMessageEvent);
const data$2 = Symbol("ExtendableMessageEvent.data");
const lastEventId = Symbol("ExtendableMessageEvent.lastEventId");
const origin$2 = Symbol("ExtendableMessageEvent.origin");
const ports = Symbol("ExtendableMessageEvent.ports");
const source$1 = Symbol("ExtendableMessageEvent.source");
dart.setLibraryUri(html$.ExtendableMessageEvent, "dart:html");
dart.setFieldSignature(html$.ExtendableMessageEvent, () => ({
  __proto__: dart.getFields(html$.ExtendableMessageEvent.__proto__),
  [$data]: dart.finalFieldType(core.Object),
  [$lastEventId]: dart.finalFieldType(core.String),
  [$origin]: dart.finalFieldType(core.String),
  [$ports]: dart.finalFieldType(ListOfMessagePort()),
  [$source]: dart.finalFieldType(core.Object)
}));
dart.registerExtension("ExtendableMessageEvent", html$.ExtendableMessageEvent);
html$.External = class External extends _interceptors.Interceptor {
  [$AddSearchProvider](...args) {
    return this.AddSearchProvider.apply(this, args);
  }
  [$IsSearchProviderInstalled](...args) {
    return this.IsSearchProviderInstalled.apply(this, args);
  }
};
dart.addTypeTests(html$.External);
dart.setMethodSignature(html$.External, () => ({
  __proto__: dart.getMethods(html$.External.__proto__),
  [$AddSearchProvider]: dart.fnType(dart.void, []),
  [$IsSearchProviderInstalled]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.External, "dart:html");
dart.registerExtension("External", html$.External);
html$.FaceDetector = class FaceDetector$ extends _interceptors.Interceptor {
  static new(faceDetectorOptions) {
    if (faceDetectorOptions === void 0) faceDetectorOptions = null;
    if (faceDetectorOptions != null) {
      let faceDetectorOptions_1 = html_common.convertDartToNative_Dictionary(faceDetectorOptions);
      return html$.FaceDetector._create_1(faceDetectorOptions_1);
    }
    return html$.FaceDetector._create_2();
  }
  static _create_1(faceDetectorOptions) {
    return new FaceDetector(faceDetectorOptions);
  }
  static _create_2() {
    return new FaceDetector();
  }
  [$detect](image) {
    return html$.promiseToFuture(ListOfDetectedFace(), this.detect(image));
  }
};
dart.addTypeTests(html$.FaceDetector);
dart.setMethodSignature(html$.FaceDetector, () => ({
  __proto__: dart.getMethods(html$.FaceDetector.__proto__),
  [$detect]: dart.fnType(async.Future$(core.List$(html$.DetectedFace)), [dart.dynamic])
}));
dart.setLibraryUri(html$.FaceDetector, "dart:html");
dart.registerExtension("FaceDetector", html$.FaceDetector);
html$.FederatedCredential = class FederatedCredential$ extends html$.Credential {
  static new(data) {
    let data_1 = html_common.convertDartToNative_Dictionary(data);
    return html$.FederatedCredential._create_1(data_1);
  }
  static _create_1(data) {
    return new FederatedCredential(data);
  }
  get [$protocol]() {
    return this.protocol;
  }
  get [$provider]() {
    return this.provider;
  }
  get [$iconUrl]() {
    return this.iconURL;
  }
  get [$name]() {
    return this.name;
  }
};
dart.addTypeTests(html$.FederatedCredential);
const protocol$0 = Symbol("FederatedCredential.protocol");
const provider = Symbol("FederatedCredential.provider");
const iconUrl$ = Symbol("FederatedCredential.iconUrl");
const name$13 = Symbol("FederatedCredential.name");
html$.FederatedCredential[dart.implements] = () => [html$.CredentialUserData];
dart.setLibraryUri(html$.FederatedCredential, "dart:html");
dart.setFieldSignature(html$.FederatedCredential, () => ({
  __proto__: dart.getFields(html$.FederatedCredential.__proto__),
  [$protocol]: dart.finalFieldType(core.String),
  [$provider]: dart.finalFieldType(core.String),
  [$iconUrl]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("FederatedCredential", html$.FederatedCredential);
html$.FetchEvent = class FetchEvent$ extends html$.ExtendableEvent {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.FetchEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new FetchEvent(type, eventInitDict);
  }
  get [$clientId]() {
    return this.clientId;
  }
  get [$isReload]() {
    return this.isReload;
  }
  get [$preloadResponse]() {
    return html$.promiseToFuture(dart.dynamic, this.preloadResponse);
  }
  get [$request]() {
    return this.request;
  }
  [$respondWith](...args) {
    return this.respondWith.apply(this, args);
  }
};
dart.addTypeTests(html$.FetchEvent);
const clientId = Symbol("FetchEvent.clientId");
const isReload = Symbol("FetchEvent.isReload");
const request$ = Symbol("FetchEvent.request");
dart.setMethodSignature(html$.FetchEvent, () => ({
  __proto__: dart.getMethods(html$.FetchEvent.__proto__),
  [$respondWith]: dart.fnType(dart.void, [async.Future])
}));
dart.setGetterSignature(html$.FetchEvent, () => ({
  __proto__: dart.getGetters(html$.FetchEvent.__proto__),
  [$preloadResponse]: async.Future
}));
dart.setLibraryUri(html$.FetchEvent, "dart:html");
dart.setFieldSignature(html$.FetchEvent, () => ({
  __proto__: dart.getFields(html$.FetchEvent.__proto__),
  [$clientId]: dart.finalFieldType(core.String),
  [$isReload]: dart.finalFieldType(core.bool),
  [$request]: dart.finalFieldType(html$._Request)
}));
dart.registerExtension("FetchEvent", html$.FetchEvent);
html$.FieldSetElement = class FieldSetElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("fieldset");
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$elements]() {
    return this.elements;
  }
  get [$form]() {
    return this.form;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$type]() {
    return this.type;
  }
  get [$validationMessage]() {
    return this.validationMessage;
  }
  get [$validity]() {
    return this.validity;
  }
  get [$willValidate]() {
    return this.willValidate;
  }
  [$checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [$reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [$setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
(html$.FieldSetElement.created = function() {
  this[disabled$1] = null;
  this[elements] = null;
  this[form$] = null;
  this[name$14] = null;
  this[type$14] = null;
  this[validationMessage$] = null;
  this[validity$] = null;
  this[willValidate$] = null;
  html$.FieldSetElement.__proto__.created.call(this);
}).prototype = html$.FieldSetElement.prototype;
dart.addTypeTests(html$.FieldSetElement);
const disabled$1 = Symbol("FieldSetElement.disabled");
const elements = Symbol("FieldSetElement.elements");
const form$ = Symbol("FieldSetElement.form");
const name$14 = Symbol("FieldSetElement.name");
const type$14 = Symbol("FieldSetElement.type");
const validationMessage$ = Symbol("FieldSetElement.validationMessage");
const validity$ = Symbol("FieldSetElement.validity");
const willValidate$ = Symbol("FieldSetElement.willValidate");
dart.setMethodSignature(html$.FieldSetElement, () => ({
  __proto__: dart.getMethods(html$.FieldSetElement.__proto__),
  [$checkValidity]: dart.fnType(core.bool, []),
  [$reportValidity]: dart.fnType(core.bool, []),
  [$setCustomValidity]: dart.fnType(dart.void, [core.String])
}));
dart.setLibraryUri(html$.FieldSetElement, "dart:html");
dart.setFieldSignature(html$.FieldSetElement, () => ({
  __proto__: dart.getFields(html$.FieldSetElement.__proto__),
  [$disabled]: dart.fieldType(core.bool),
  [$elements]: dart.finalFieldType(ListOfNode()),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$name]: dart.fieldType(core.String),
  [$type]: dart.finalFieldType(core.String),
  [$validationMessage]: dart.finalFieldType(core.String),
  [$validity]: dart.finalFieldType(html$.ValidityState),
  [$willValidate]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("HTMLFieldSetElement", html$.FieldSetElement);
const _get_lastModifiedDate = dart.privateName(html$, "_get_lastModifiedDate");
html$.File = class File$ extends html$.Blob {
  static new(fileBits, fileName, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return html$.File._create_1(fileBits, fileName, options_1);
    }
    return html$.File._create_2(fileBits, fileName);
  }
  static _create_1(fileBits, fileName, options) {
    return new File(fileBits, fileName, options);
  }
  static _create_2(fileBits, fileName) {
    return new File(fileBits, fileName);
  }
  get [$lastModified]() {
    return this.lastModified;
  }
  get [$lastModifiedDate]() {
    return html_common.convertNativeToDart_DateTime(this[_get_lastModifiedDate]);
  }
  get [_get_lastModifiedDate]() {
    return this.lastModifiedDate;
  }
  get [$name]() {
    return this.name;
  }
  get [$relativePath]() {
    return this.webkitRelativePath;
  }
};
dart.addTypeTests(html$.File);
const lastModified = Symbol("File.lastModified");
const name$15 = Symbol("File.name");
const relativePath = Symbol("File.relativePath");
dart.setGetterSignature(html$.File, () => ({
  __proto__: dart.getGetters(html$.File.__proto__),
  [$lastModifiedDate]: core.DateTime
}));
dart.setLibraryUri(html$.File, "dart:html");
dart.setFieldSignature(html$.File, () => ({
  __proto__: dart.getFields(html$.File.__proto__),
  [$lastModified]: dart.finalFieldType(core.int),
  [_get_lastModifiedDate]: dart.finalFieldType(dart.dynamic),
  [$name]: dart.finalFieldType(core.String),
  [$relativePath]: dart.finalFieldType(core.String)
}));
dart.registerExtension("File", html$.File);
const _createWriter = dart.privateName(html$, "_createWriter");
const _file$ = dart.privateName(html$, "_file");
html$.FileEntry = class FileEntry extends html$.Entry {
  [_createWriter](...args) {
    return this.createWriter.apply(this, args);
  }
  [$createWriter]() {
    let completer = CompleterOfFileWriter().new();
    this[_createWriter](dart.fn(value => {
      _js_helper.applyExtension("FileWriter", value);
      completer.complete(value);
    }, FileWriterToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [_file$](...args) {
    return this.file.apply(this, args);
  }
  [$file]() {
    let completer = CompleterOfFile$().new();
    this[_file$](dart.fn(value => {
      _js_helper.applyExtension("File", value);
      completer.complete(value);
    }, FileToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
};
dart.addTypeTests(html$.FileEntry);
dart.setMethodSignature(html$.FileEntry, () => ({
  __proto__: dart.getMethods(html$.FileEntry.__proto__),
  [_createWriter]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.FileWriter])], [dart.fnType(dart.void, [html$.DomException])]),
  [$createWriter]: dart.fnType(async.Future$(html$.FileWriter), []),
  [_file$]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.File])], [dart.fnType(dart.void, [html$.DomException])]),
  [$file]: dart.fnType(async.Future$(html$.File), [])
}));
dart.setLibraryUri(html$.FileEntry, "dart:html");
dart.registerExtension("FileEntry", html$.FileEntry);
const Interceptor_ListMixin$$0 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$0.new = function() {
  Interceptor_ListMixin$$0.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$0.prototype;
dart.applyMixin(Interceptor_ListMixin$$0, collection.ListMixin$(html$.File));
const Interceptor_ImmutableListMixin$$0 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$0 {};
(Interceptor_ImmutableListMixin$$0.new = function() {
  Interceptor_ImmutableListMixin$$0.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$0.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$0, html$.ImmutableListMixin$(html$.File));
html$.FileList = class FileList extends Interceptor_ImmutableListMixin$$0 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.File._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$.FileList.prototype[dart.isList] = true;
dart.addTypeTests(html$.FileList);
html$.FileList[dart.implements] = () => [ListOfFile(), JavaScriptIndexingBehaviorOfFile()];
dart.setMethodSignature(html$.FileList, () => ({
  __proto__: dart.getMethods(html$.FileList.__proto__),
  [$_get]: dart.fnType(html$.File, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.File, [core.int]),
  [$item]: dart.fnType(html$.File, [core.int])
}));
dart.setGetterSignature(html$.FileList, () => ({
  __proto__: dart.getGetters(html$.FileList.__proto__),
  [$length]: core.int,
  [$first]: html$.File,
  [$last]: html$.File,
  [$single]: html$.File
}));
dart.setSetterSignature(html$.FileList, () => ({
  __proto__: dart.getSetters(html$.FileList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.FileList, "dart:html");
dart.registerExtension("FileList", html$.FileList);
html$.FileReader = class FileReader$ extends html$.EventTarget {
  get [$result]() {
    let res = this.result;
    if (typed_data.ByteBuffer.is(res)) {
      return typed_data.Uint8List.view(res);
    }
    return res;
  }
  static new() {
    return html$.FileReader._create_1();
  }
  static _create_1() {
    return new FileReader();
  }
  get [$error]() {
    return this.error;
  }
  get [$readyState]() {
    return this.readyState;
  }
  [$abort](...args) {
    return this.abort.apply(this, args);
  }
  [$readAsArrayBuffer](...args) {
    return this.readAsArrayBuffer.apply(this, args);
  }
  [$readAsDataUrl](...args) {
    return this.readAsDataURL.apply(this, args);
  }
  [$readAsText](...args) {
    return this.readAsText.apply(this, args);
  }
  get [$onAbort]() {
    return html$.FileReader.abortEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.FileReader.errorEvent.forTarget(this);
  }
  get [$onLoad]() {
    return html$.FileReader.loadEvent.forTarget(this);
  }
  get [$onLoadEnd]() {
    return html$.FileReader.loadEndEvent.forTarget(this);
  }
  get [$onLoadStart]() {
    return html$.FileReader.loadStartEvent.forTarget(this);
  }
  get [$onProgress]() {
    return html$.FileReader.progressEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.FileReader);
const error$3 = Symbol("FileReader.error");
const readyState$3 = Symbol("FileReader.readyState");
dart.setMethodSignature(html$.FileReader, () => ({
  __proto__: dart.getMethods(html$.FileReader.__proto__),
  [$abort]: dart.fnType(dart.void, []),
  [$readAsArrayBuffer]: dart.fnType(dart.void, [html$.Blob]),
  [$readAsDataUrl]: dart.fnType(dart.void, [html$.Blob]),
  [$readAsText]: dart.fnType(dart.void, [html$.Blob], [core.String])
}));
dart.setGetterSignature(html$.FileReader, () => ({
  __proto__: dart.getGetters(html$.FileReader.__proto__),
  [$result]: core.Object,
  [$onAbort]: async.Stream$(html$.ProgressEvent),
  [$onError]: async.Stream$(html$.ProgressEvent),
  [$onLoad]: async.Stream$(html$.ProgressEvent),
  [$onLoadEnd]: async.Stream$(html$.ProgressEvent),
  [$onLoadStart]: async.Stream$(html$.ProgressEvent),
  [$onProgress]: async.Stream$(html$.ProgressEvent)
}));
dart.setLibraryUri(html$.FileReader, "dart:html");
dart.setFieldSignature(html$.FileReader, () => ({
  __proto__: dart.getFields(html$.FileReader.__proto__),
  [$error]: dart.finalFieldType(html$.DomException),
  [$readyState]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.FileReader, {
  /*html$.FileReader.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("abort"));
  },
  /*html$.FileReader.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("error"));
  },
  /*html$.FileReader.loadEvent*/get loadEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("load"));
  },
  /*html$.FileReader.loadEndEvent*/get loadEndEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("loadend"));
  },
  /*html$.FileReader.loadStartEvent*/get loadStartEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("loadstart"));
  },
  /*html$.FileReader.progressEvent*/get progressEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("progress"));
  },
  /*html$.FileReader.DONE*/get DONE() {
    return 2;
  },
  /*html$.FileReader.EMPTY*/get EMPTY() {
    return 0;
  },
  /*html$.FileReader.LOADING*/get LOADING() {
    return 1;
  }
});
dart.registerExtension("FileReader", html$.FileReader);
html$.FileSystem = class FileSystem extends _interceptors.Interceptor {
  static get supported() {
    return !!window.webkitRequestFileSystem;
  }
  get [$name]() {
    return this.name;
  }
  get [$root]() {
    return this.root;
  }
};
dart.addTypeTests(html$.FileSystem);
const name$16 = Symbol("FileSystem.name");
const root = Symbol("FileSystem.root");
dart.setLibraryUri(html$.FileSystem, "dart:html");
dart.setFieldSignature(html$.FileSystem, () => ({
  __proto__: dart.getFields(html$.FileSystem.__proto__),
  [$name]: dart.finalFieldType(core.String),
  [$root]: dart.finalFieldType(html$.DirectoryEntry)
}));
dart.registerExtension("DOMFileSystem", html$.FileSystem);
html$.FileWriter = class FileWriter extends html$.EventTarget {
  get [$error]() {
    return this.error;
  }
  get [$length]() {
    return this.length;
  }
  get [$position]() {
    return this.position;
  }
  get [$readyState]() {
    return this.readyState;
  }
  [$abort](...args) {
    return this.abort.apply(this, args);
  }
  [$seek](...args) {
    return this.seek.apply(this, args);
  }
  [$truncate](...args) {
    return this.truncate.apply(this, args);
  }
  [$write](...args) {
    return this.write.apply(this, args);
  }
  get [$onAbort]() {
    return html$.FileWriter.abortEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.FileWriter.errorEvent.forTarget(this);
  }
  get [$onProgress]() {
    return html$.FileWriter.progressEvent.forTarget(this);
  }
  get [$onWrite]() {
    return html$.FileWriter.writeEvent.forTarget(this);
  }
  get [$onWriteEnd]() {
    return html$.FileWriter.writeEndEvent.forTarget(this);
  }
  get [$onWriteStart]() {
    return html$.FileWriter.writeStartEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.FileWriter);
const error$4 = Symbol("FileWriter.error");
const length$7 = Symbol("FileWriter.length");
const position = Symbol("FileWriter.position");
const readyState$4 = Symbol("FileWriter.readyState");
dart.setMethodSignature(html$.FileWriter, () => ({
  __proto__: dart.getMethods(html$.FileWriter.__proto__),
  [$abort]: dart.fnType(dart.void, []),
  [$seek]: dart.fnType(dart.void, [core.int]),
  [$truncate]: dart.fnType(dart.void, [core.int]),
  [$write]: dart.fnType(dart.void, [html$.Blob])
}));
dart.setGetterSignature(html$.FileWriter, () => ({
  __proto__: dart.getGetters(html$.FileWriter.__proto__),
  [$onAbort]: async.Stream$(html$.ProgressEvent),
  [$onError]: async.Stream$(html$.Event),
  [$onProgress]: async.Stream$(html$.ProgressEvent),
  [$onWrite]: async.Stream$(html$.ProgressEvent),
  [$onWriteEnd]: async.Stream$(html$.ProgressEvent),
  [$onWriteStart]: async.Stream$(html$.ProgressEvent)
}));
dart.setLibraryUri(html$.FileWriter, "dart:html");
dart.setFieldSignature(html$.FileWriter, () => ({
  __proto__: dart.getFields(html$.FileWriter.__proto__),
  [$error]: dart.finalFieldType(html$.DomException),
  [$length]: dart.finalFieldType(core.int),
  [$position]: dart.finalFieldType(core.int),
  [$readyState]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.FileWriter, {
  /*html$.FileWriter.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("abort"));
  },
  /*html$.FileWriter.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.FileWriter.progressEvent*/get progressEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("progress"));
  },
  /*html$.FileWriter.writeEvent*/get writeEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("write"));
  },
  /*html$.FileWriter.writeEndEvent*/get writeEndEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("writeend"));
  },
  /*html$.FileWriter.writeStartEvent*/get writeStartEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("writestart"));
  },
  /*html$.FileWriter.DONE*/get DONE() {
    return 2;
  },
  /*html$.FileWriter.INIT*/get INIT() {
    return 0;
  },
  /*html$.FileWriter.WRITING*/get WRITING() {
    return 1;
  }
});
dart.registerExtension("FileWriter", html$.FileWriter);
const _get_relatedTarget = dart.privateName(html$, "_get_relatedTarget");
html$.FocusEvent = class FocusEvent$ extends html$.UIEvent {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.FocusEvent._create_1(type, eventInitDict_1);
    }
    return html$.FocusEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new FocusEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new FocusEvent(type);
  }
  get [$relatedTarget]() {
    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
  }
  get [_get_relatedTarget]() {
    return this.relatedTarget;
  }
};
dart.addTypeTests(html$.FocusEvent);
dart.setGetterSignature(html$.FocusEvent, () => ({
  __proto__: dart.getGetters(html$.FocusEvent.__proto__),
  [$relatedTarget]: html$.EventTarget
}));
dart.setLibraryUri(html$.FocusEvent, "dart:html");
dart.setFieldSignature(html$.FocusEvent, () => ({
  __proto__: dart.getFields(html$.FocusEvent.__proto__),
  [_get_relatedTarget]: dart.finalFieldType(dart.dynamic)
}));
dart.registerExtension("FocusEvent", html$.FocusEvent);
html$.FontFace = class FontFace$ extends _interceptors.Interceptor {
  static new(family, source, descriptors) {
    if (descriptors === void 0) descriptors = null;
    if (descriptors != null) {
      let descriptors_1 = html_common.convertDartToNative_Dictionary(descriptors);
      return html$.FontFace._create_1(family, source, descriptors_1);
    }
    return html$.FontFace._create_2(family, source);
  }
  static _create_1(family, source, descriptors) {
    return new FontFace(family, source, descriptors);
  }
  static _create_2(family, source) {
    return new FontFace(family, source);
  }
  get [$display]() {
    return this.display;
  }
  set [$display](value) {
    this.display = value;
  }
  get [$family]() {
    return this.family;
  }
  set [$family](value) {
    this.family = value;
  }
  get [$featureSettings]() {
    return this.featureSettings;
  }
  set [$featureSettings](value) {
    this.featureSettings = value;
  }
  get [$loaded]() {
    return html$.promiseToFuture(html$.FontFace, this.loaded);
  }
  get [$status]() {
    return this.status;
  }
  get [$stretch]() {
    return this.stretch;
  }
  set [$stretch](value) {
    this.stretch = value;
  }
  get [$style]() {
    return this.style;
  }
  set [$style](value) {
    this.style = value;
  }
  get [$unicodeRange]() {
    return this.unicodeRange;
  }
  set [$unicodeRange](value) {
    this.unicodeRange = value;
  }
  get [$variant]() {
    return this.variant;
  }
  set [$variant](value) {
    this.variant = value;
  }
  get [$weight]() {
    return this.weight;
  }
  set [$weight](value) {
    this.weight = value;
  }
  [$load]() {
    return html$.promiseToFuture(html$.FontFace, this.load());
  }
};
dart.addTypeTests(html$.FontFace);
const display = Symbol("FontFace.display");
const family = Symbol("FontFace.family");
const featureSettings = Symbol("FontFace.featureSettings");
const status$0 = Symbol("FontFace.status");
const stretch = Symbol("FontFace.stretch");
const style$4 = Symbol("FontFace.style");
const unicodeRange = Symbol("FontFace.unicodeRange");
const variant = Symbol("FontFace.variant");
const weight = Symbol("FontFace.weight");
dart.setMethodSignature(html$.FontFace, () => ({
  __proto__: dart.getMethods(html$.FontFace.__proto__),
  [$load]: dart.fnType(async.Future$(html$.FontFace), [])
}));
dart.setGetterSignature(html$.FontFace, () => ({
  __proto__: dart.getGetters(html$.FontFace.__proto__),
  [$loaded]: async.Future$(html$.FontFace)
}));
dart.setLibraryUri(html$.FontFace, "dart:html");
dart.setFieldSignature(html$.FontFace, () => ({
  __proto__: dart.getFields(html$.FontFace.__proto__),
  [$display]: dart.fieldType(core.String),
  [$family]: dart.fieldType(core.String),
  [$featureSettings]: dart.fieldType(core.String),
  [$status]: dart.finalFieldType(core.String),
  [$stretch]: dart.fieldType(core.String),
  [$style]: dart.fieldType(core.String),
  [$unicodeRange]: dart.fieldType(core.String),
  [$variant]: dart.fieldType(core.String),
  [$weight]: dart.fieldType(core.String)
}));
dart.registerExtension("FontFace", html$.FontFace);
html$.FontFaceSet = class FontFaceSet extends html$.EventTarget {
  get [$status]() {
    return this.status;
  }
  [$add](...args) {
    return this.add.apply(this, args);
  }
  [$check](...args) {
    return this.check.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$delete](...args) {
    return this.delete.apply(this, args);
  }
  [$forEach](...args) {
    return this.forEach.apply(this, args);
  }
  [$has](...args) {
    return this.has.apply(this, args);
  }
  get [$onLoading]() {
    return html$.FontFaceSet.loadingEvent.forTarget(this);
  }
  get [$onLoadingDone]() {
    return html$.FontFaceSet.loadingDoneEvent.forTarget(this);
  }
  get [$onLoadingError]() {
    return html$.FontFaceSet.loadingErrorEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.FontFaceSet);
const status$1 = Symbol("FontFaceSet.status");
dart.setMethodSignature(html$.FontFaceSet, () => ({
  __proto__: dart.getMethods(html$.FontFaceSet.__proto__),
  [$add]: dart.fnType(html$.FontFaceSet, [html$.FontFace]),
  [$check]: dart.fnType(core.bool, [core.String], [core.String]),
  [$clear]: dart.fnType(dart.void, []),
  [$delete]: dart.fnType(core.bool, [html$.FontFace]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.FontFace, html$.FontFace, html$.FontFaceSet])], [core.Object]),
  [$has]: dart.fnType(core.bool, [html$.FontFace])
}));
dart.setGetterSignature(html$.FontFaceSet, () => ({
  __proto__: dart.getGetters(html$.FontFaceSet.__proto__),
  [$onLoading]: async.Stream$(html$.FontFaceSetLoadEvent),
  [$onLoadingDone]: async.Stream$(html$.FontFaceSetLoadEvent),
  [$onLoadingError]: async.Stream$(html$.FontFaceSetLoadEvent)
}));
dart.setLibraryUri(html$.FontFaceSet, "dart:html");
dart.setFieldSignature(html$.FontFaceSet, () => ({
  __proto__: dart.getFields(html$.FontFaceSet.__proto__),
  [$status]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.FontFaceSet, {
  /*html$.FontFaceSet.loadingEvent*/get loadingEvent() {
    return dart.const(new (EventStreamProviderOfFontFaceSetLoadEvent()).new("loading"));
  },
  /*html$.FontFaceSet.loadingDoneEvent*/get loadingDoneEvent() {
    return dart.const(new (EventStreamProviderOfFontFaceSetLoadEvent()).new("loadingdone"));
  },
  /*html$.FontFaceSet.loadingErrorEvent*/get loadingErrorEvent() {
    return dart.const(new (EventStreamProviderOfFontFaceSetLoadEvent()).new("loadingerror"));
  }
});
dart.registerExtension("FontFaceSet", html$.FontFaceSet);
html$.FontFaceSetLoadEvent = class FontFaceSetLoadEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.FontFaceSetLoadEvent._create_1(type, eventInitDict_1);
    }
    return html$.FontFaceSetLoadEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new FontFaceSetLoadEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new FontFaceSetLoadEvent(type);
  }
  get [$fontfaces]() {
    return this.fontfaces;
  }
};
dart.addTypeTests(html$.FontFaceSetLoadEvent);
const fontfaces = Symbol("FontFaceSetLoadEvent.fontfaces");
dart.setLibraryUri(html$.FontFaceSetLoadEvent, "dart:html");
dart.setFieldSignature(html$.FontFaceSetLoadEvent, () => ({
  __proto__: dart.getFields(html$.FontFaceSetLoadEvent.__proto__),
  [$fontfaces]: dart.finalFieldType(ListOfFontFace())
}));
dart.registerExtension("FontFaceSetLoadEvent", html$.FontFaceSetLoadEvent);
html$.FontFaceSource = class FontFaceSource extends _interceptors.Interceptor {
  get [$fonts]() {
    return this.fonts;
  }
};
dart.addTypeTests(html$.FontFaceSource);
const fonts$ = Symbol("FontFaceSource.fonts");
dart.setLibraryUri(html$.FontFaceSource, "dart:html");
dart.setFieldSignature(html$.FontFaceSource, () => ({
  __proto__: dart.getFields(html$.FontFaceSource.__proto__),
  [$fonts]: dart.finalFieldType(html$.FontFaceSet)
}));
dart.registerExtension("FontFaceSource", html$.FontFaceSource);
html$.ForeignFetchEvent = class ForeignFetchEvent$ extends html$.ExtendableEvent {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.ForeignFetchEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new ForeignFetchEvent(type, eventInitDict);
  }
  get [$origin]() {
    return this.origin;
  }
  get [$request]() {
    return this.request;
  }
  [$respondWith](...args) {
    return this.respondWith.apply(this, args);
  }
};
dart.addTypeTests(html$.ForeignFetchEvent);
const origin$3 = Symbol("ForeignFetchEvent.origin");
const request$0 = Symbol("ForeignFetchEvent.request");
dart.setMethodSignature(html$.ForeignFetchEvent, () => ({
  __proto__: dart.getMethods(html$.ForeignFetchEvent.__proto__),
  [$respondWith]: dart.fnType(dart.void, [async.Future])
}));
dart.setLibraryUri(html$.ForeignFetchEvent, "dart:html");
dart.setFieldSignature(html$.ForeignFetchEvent, () => ({
  __proto__: dart.getFields(html$.ForeignFetchEvent.__proto__),
  [$origin]: dart.finalFieldType(core.String),
  [$request]: dart.finalFieldType(html$._Request)
}));
dart.registerExtension("ForeignFetchEvent", html$.ForeignFetchEvent);
html$.FormData = class FormData$ extends _interceptors.Interceptor {
  static new(form) {
    if (form === void 0) form = null;
    if (form != null) {
      return html$.FormData._create_1(form);
    }
    return html$.FormData._create_2();
  }
  static _create_1(form) {
    return new FormData(form);
  }
  static _create_2() {
    return new FormData();
  }
  static get supported() {
    return !!window.FormData;
  }
  [$append](...args) {
    return this.append.apply(this, args);
  }
  [$appendBlob](...args) {
    return this.append.apply(this, args);
  }
  [$delete](...args) {
    return this.delete.apply(this, args);
  }
  [$get](...args) {
    return this.get.apply(this, args);
  }
  [$getAll](...args) {
    return this.getAll.apply(this, args);
  }
  [$has](...args) {
    return this.has.apply(this, args);
  }
  [$set](...args) {
    return this.set.apply(this, args);
  }
};
dart.addTypeTests(html$.FormData);
dart.setMethodSignature(html$.FormData, () => ({
  __proto__: dart.getMethods(html$.FormData.__proto__),
  [$append]: dart.fnType(dart.void, [core.String, core.String]),
  [$appendBlob]: dart.fnType(dart.void, [core.String, html$.Blob], [core.String]),
  [$delete]: dart.fnType(dart.void, [core.String]),
  [$get]: dart.fnType(core.Object, [core.String]),
  [$getAll]: dart.fnType(core.List$(core.Object), [core.String]),
  [$has]: dart.fnType(core.bool, [core.String]),
  [$set]: dart.fnType(dart.void, [core.String, dart.dynamic], [core.String])
}));
dart.setLibraryUri(html$.FormData, "dart:html");
dart.registerExtension("FormData", html$.FormData);
const _requestAutocomplete_1 = dart.privateName(html$, "_requestAutocomplete_1");
html$.FormElement = class FormElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("form");
  }
  get [$acceptCharset]() {
    return this.acceptCharset;
  }
  set [$acceptCharset](value) {
    this.acceptCharset = value;
  }
  get [$action]() {
    return this.action;
  }
  set [$action](value) {
    this.action = value;
  }
  get [$autocomplete]() {
    return this.autocomplete;
  }
  set [$autocomplete](value) {
    this.autocomplete = value;
  }
  get [$encoding]() {
    return this.encoding;
  }
  set [$encoding](value) {
    this.encoding = value;
  }
  get [$enctype]() {
    return this.enctype;
  }
  set [$enctype](value) {
    this.enctype = value;
  }
  get [$length]() {
    return this.length;
  }
  get [$method]() {
    return this.method;
  }
  set [$method](value) {
    this.method = value;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$noValidate]() {
    return this.noValidate;
  }
  set [$noValidate](value) {
    this.noValidate = value;
  }
  get [$target]() {
    return this.target;
  }
  set [$target](value) {
    this.target = value;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [$checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [$requestAutocomplete](details) {
    let details_1 = html_common.convertDartToNative_Dictionary(details);
    this[_requestAutocomplete_1](details_1);
    return;
  }
  [_requestAutocomplete_1](...args) {
    return this.requestAutocomplete.apply(this, args);
  }
  [$reset](...args) {
    return this.reset.apply(this, args);
  }
  [$submit](...args) {
    return this.submit.apply(this, args);
  }
};
(html$.FormElement.created = function() {
  this[acceptCharset] = null;
  this[action] = null;
  this[autocomplete$] = null;
  this[encoding$0] = null;
  this[enctype] = null;
  this[length$8] = null;
  this[method] = null;
  this[name$17] = null;
  this[noValidate] = null;
  this[target$2] = null;
  html$.FormElement.__proto__.created.call(this);
}).prototype = html$.FormElement.prototype;
dart.addTypeTests(html$.FormElement);
const acceptCharset = Symbol("FormElement.acceptCharset");
const action = Symbol("FormElement.action");
const autocomplete$ = Symbol("FormElement.autocomplete");
const encoding$0 = Symbol("FormElement.encoding");
const enctype = Symbol("FormElement.enctype");
const length$8 = Symbol("FormElement.length");
const method = Symbol("FormElement.method");
const name$17 = Symbol("FormElement.name");
const noValidate = Symbol("FormElement.noValidate");
const target$2 = Symbol("FormElement.target");
dart.setMethodSignature(html$.FormElement, () => ({
  __proto__: dart.getMethods(html$.FormElement.__proto__),
  [__getter__]: dart.fnType(core.Object, [core.String]),
  [$checkValidity]: dart.fnType(core.bool, []),
  [$item]: dart.fnType(html$.Element, [core.int]),
  [$reportValidity]: dart.fnType(core.bool, []),
  [$requestAutocomplete]: dart.fnType(dart.void, [core.Map]),
  [_requestAutocomplete_1]: dart.fnType(dart.void, [dart.dynamic]),
  [$reset]: dart.fnType(dart.void, []),
  [$submit]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.FormElement, "dart:html");
dart.setFieldSignature(html$.FormElement, () => ({
  __proto__: dart.getFields(html$.FormElement.__proto__),
  [$acceptCharset]: dart.fieldType(core.String),
  [$action]: dart.fieldType(core.String),
  [$autocomplete]: dart.fieldType(core.String),
  [$encoding]: dart.fieldType(core.String),
  [$enctype]: dart.fieldType(core.String),
  [$length]: dart.finalFieldType(core.int),
  [$method]: dart.fieldType(core.String),
  [$name]: dart.fieldType(core.String),
  [$noValidate]: dart.fieldType(core.bool),
  [$target]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLFormElement", html$.FormElement);
html$.Gamepad = class Gamepad extends _interceptors.Interceptor {
  get [$axes]() {
    return this.axes;
  }
  get [$buttons]() {
    return this.buttons;
  }
  get [$connected]() {
    return this.connected;
  }
  get [$displayId]() {
    return this.displayId;
  }
  get [$hand]() {
    return this.hand;
  }
  get [$id]() {
    return this.id;
  }
  get [$index]() {
    return this.index;
  }
  get [$mapping]() {
    return this.mapping;
  }
  get [$pose]() {
    return this.pose;
  }
  get [$timestamp]() {
    return this.timestamp;
  }
};
dart.addTypeTests(html$.Gamepad);
const axes = Symbol("Gamepad.axes");
const buttons = Symbol("Gamepad.buttons");
const connected = Symbol("Gamepad.connected");
const displayId = Symbol("Gamepad.displayId");
const hand = Symbol("Gamepad.hand");
const id$6 = Symbol("Gamepad.id");
const index = Symbol("Gamepad.index");
const mapping = Symbol("Gamepad.mapping");
const pose = Symbol("Gamepad.pose");
const timestamp$ = Symbol("Gamepad.timestamp");
dart.setLibraryUri(html$.Gamepad, "dart:html");
dart.setFieldSignature(html$.Gamepad, () => ({
  __proto__: dart.getFields(html$.Gamepad.__proto__),
  [$axes]: dart.finalFieldType(ListOfnum()),
  [$buttons]: dart.finalFieldType(ListOfGamepadButton()),
  [$connected]: dart.finalFieldType(core.bool),
  [$displayId]: dart.finalFieldType(core.int),
  [$hand]: dart.finalFieldType(core.String),
  [$id]: dart.finalFieldType(core.String),
  [$index]: dart.finalFieldType(core.int),
  [$mapping]: dart.finalFieldType(core.String),
  [$pose]: dart.finalFieldType(html$.GamepadPose),
  [$timestamp]: dart.finalFieldType(core.int)
}));
dart.registerExtension("Gamepad", html$.Gamepad);
html$.GamepadButton = class GamepadButton extends _interceptors.Interceptor {
  get [$pressed]() {
    return this.pressed;
  }
  get [$touched]() {
    return this.touched;
  }
  get [$value]() {
    return this.value;
  }
};
dart.addTypeTests(html$.GamepadButton);
const pressed$ = Symbol("GamepadButton.pressed");
const touched = Symbol("GamepadButton.touched");
const value$6 = Symbol("GamepadButton.value");
dart.setLibraryUri(html$.GamepadButton, "dart:html");
dart.setFieldSignature(html$.GamepadButton, () => ({
  __proto__: dart.getFields(html$.GamepadButton.__proto__),
  [$pressed]: dart.finalFieldType(core.bool),
  [$touched]: dart.finalFieldType(core.bool),
  [$value]: dart.finalFieldType(core.num)
}));
dart.registerExtension("GamepadButton", html$.GamepadButton);
html$.GamepadEvent = class GamepadEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.GamepadEvent._create_1(type, eventInitDict_1);
    }
    return html$.GamepadEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new GamepadEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new GamepadEvent(type);
  }
  get [$gamepad]() {
    return this.gamepad;
  }
};
dart.addTypeTests(html$.GamepadEvent);
const gamepad = Symbol("GamepadEvent.gamepad");
dart.setLibraryUri(html$.GamepadEvent, "dart:html");
dart.setFieldSignature(html$.GamepadEvent, () => ({
  __proto__: dart.getFields(html$.GamepadEvent.__proto__),
  [$gamepad]: dart.finalFieldType(html$.Gamepad)
}));
dart.registerExtension("GamepadEvent", html$.GamepadEvent);
html$.GamepadPose = class GamepadPose extends _interceptors.Interceptor {
  get [$angularAcceleration]() {
    return this.angularAcceleration;
  }
  get [$angularVelocity]() {
    return this.angularVelocity;
  }
  get [$hasOrientation]() {
    return this.hasOrientation;
  }
  get [$hasPosition]() {
    return this.hasPosition;
  }
  get [$linearAcceleration]() {
    return this.linearAcceleration;
  }
  get [$linearVelocity]() {
    return this.linearVelocity;
  }
  get [$orientation]() {
    return this.orientation;
  }
  get [$position]() {
    return this.position;
  }
};
dart.addTypeTests(html$.GamepadPose);
const angularAcceleration = Symbol("GamepadPose.angularAcceleration");
const angularVelocity = Symbol("GamepadPose.angularVelocity");
const hasOrientation = Symbol("GamepadPose.hasOrientation");
const hasPosition = Symbol("GamepadPose.hasPosition");
const linearAcceleration = Symbol("GamepadPose.linearAcceleration");
const linearVelocity = Symbol("GamepadPose.linearVelocity");
const orientation$ = Symbol("GamepadPose.orientation");
const position$ = Symbol("GamepadPose.position");
dart.setLibraryUri(html$.GamepadPose, "dart:html");
dart.setFieldSignature(html$.GamepadPose, () => ({
  __proto__: dart.getFields(html$.GamepadPose.__proto__),
  [$angularAcceleration]: dart.finalFieldType(typed_data.Float32List),
  [$angularVelocity]: dart.finalFieldType(typed_data.Float32List),
  [$hasOrientation]: dart.finalFieldType(core.bool),
  [$hasPosition]: dart.finalFieldType(core.bool),
  [$linearAcceleration]: dart.finalFieldType(typed_data.Float32List),
  [$linearVelocity]: dart.finalFieldType(typed_data.Float32List),
  [$orientation]: dart.finalFieldType(typed_data.Float32List),
  [$position]: dart.finalFieldType(typed_data.Float32List)
}));
dart.registerExtension("GamepadPose", html$.GamepadPose);
const _ensurePosition = dart.privateName(html$, "_ensurePosition");
const _getCurrentPosition = dart.privateName(html$, "_getCurrentPosition");
const _watchPosition = dart.privateName(html$, "_watchPosition");
const _clearWatch = dart.privateName(html$, "_clearWatch");
const _getCurrentPosition_1 = dart.privateName(html$, "_getCurrentPosition_1");
const _getCurrentPosition_2 = dart.privateName(html$, "_getCurrentPosition_2");
const _getCurrentPosition_3 = dart.privateName(html$, "_getCurrentPosition_3");
const _watchPosition_1 = dart.privateName(html$, "_watchPosition_1");
const _watchPosition_2 = dart.privateName(html$, "_watchPosition_2");
const _watchPosition_3 = dart.privateName(html$, "_watchPosition_3");
html$.Geolocation = class Geolocation extends _interceptors.Interceptor {
  [$getCurrentPosition](opts) {
    let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
    let options = new _js_helper.LinkedMap.new();
    if (enableHighAccuracy != null) {
      options[$_set]("enableHighAccuracy", enableHighAccuracy);
    }
    if (timeout != null) {
      options[$_set]("timeout", timeout.inMilliseconds);
    }
    if (maximumAge != null) {
      options[$_set]("maximumAge", maximumAge.inMilliseconds);
    }
    let completer = CompleterOfGeoposition().new();
    try {
      this[_getCurrentPosition](dart.fn(position => {
        completer.complete(this[_ensurePosition](position));
      }, GeopositionToNull()), dart.fn(error => {
        completer.completeError(error);
      }, PositionErrorToNull()), options);
    } catch (e$) {
      let e = dart.getThrown(e$);
      let stacktrace = dart.stackTrace(e$);
      completer.completeError(e, stacktrace);
    }
    return completer.future;
  }
  [$watchPosition](opts) {
    let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
    let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
    let options = new _js_helper.LinkedMap.new();
    if (enableHighAccuracy != null) {
      options[$_set]("enableHighAccuracy", enableHighAccuracy);
    }
    if (timeout != null) {
      options[$_set]("timeout", timeout.inMilliseconds);
    }
    if (maximumAge != null) {
      options[$_set]("maximumAge", maximumAge.inMilliseconds);
    }
    let watchId = null;
    let controller = null;
    controller = StreamControllerOfGeoposition().new({sync: true, onListen: dart.fn(() => {
        if (!(watchId == null)) dart.assertFailed(null, "dart:html", 16185, 18, "watchId == null");
        watchId = this[_watchPosition](dart.fn(position => {
          controller.add(this[_ensurePosition](position));
        }, GeopositionToNull()), dart.fn(error => {
          controller.addError(error);
        }, PositionErrorToNull()), options);
      }, VoidToNull()), onCancel: dart.fn(() => {
        if (!(watchId != null)) dart.assertFailed(null, "dart:html", 16193, 18, "watchId != null");
        this[_clearWatch](watchId);
      }, VoidToNull())});
    return controller.stream;
  }
  [_ensurePosition](domPosition) {
    try {
      if (html$.Geoposition.is(domPosition)) {
        return domPosition;
      }
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    return new html$._GeopositionWrapper.new(domPosition);
  }
  [_clearWatch](...args) {
    return this.clearWatch.apply(this, args);
  }
  [_getCurrentPosition](successCallback, errorCallback, options) {
    if (errorCallback === void 0) errorCallback = null;
    if (options === void 0) options = null;
    if (options != null) {
      let successCallback_1 = _js_helper.convertDartClosureToJS(GeopositionTovoid(), successCallback, 1);
      let options_2 = html_common.convertDartToNative_Dictionary(options);
      this[_getCurrentPosition_1](successCallback_1, errorCallback, options_2);
      return;
    }
    if (errorCallback != null) {
      let successCallback_1 = _js_helper.convertDartClosureToJS(GeopositionTovoid(), successCallback, 1);
      this[_getCurrentPosition_2](successCallback_1, errorCallback);
      return;
    }
    let successCallback_1 = _js_helper.convertDartClosureToJS(GeopositionTovoid(), successCallback, 1);
    this[_getCurrentPosition_3](successCallback_1);
    return;
  }
  [_getCurrentPosition_1](...args) {
    return this.getCurrentPosition.apply(this, args);
  }
  [_getCurrentPosition_2](...args) {
    return this.getCurrentPosition.apply(this, args);
  }
  [_getCurrentPosition_3](...args) {
    return this.getCurrentPosition.apply(this, args);
  }
  [_watchPosition](successCallback, errorCallback, options) {
    if (errorCallback === void 0) errorCallback = null;
    if (options === void 0) options = null;
    if (options != null) {
      let successCallback_1 = _js_helper.convertDartClosureToJS(GeopositionTovoid(), successCallback, 1);
      let options_2 = html_common.convertDartToNative_Dictionary(options);
      return this[_watchPosition_1](successCallback_1, errorCallback, options_2);
    }
    if (errorCallback != null) {
      let successCallback_1 = _js_helper.convertDartClosureToJS(GeopositionTovoid(), successCallback, 1);
      return this[_watchPosition_2](successCallback_1, errorCallback);
    }
    let successCallback_1 = _js_helper.convertDartClosureToJS(GeopositionTovoid(), successCallback, 1);
    return this[_watchPosition_3](successCallback_1);
  }
  [_watchPosition_1](...args) {
    return this.watchPosition.apply(this, args);
  }
  [_watchPosition_2](...args) {
    return this.watchPosition.apply(this, args);
  }
  [_watchPosition_3](...args) {
    return this.watchPosition.apply(this, args);
  }
};
dart.addTypeTests(html$.Geolocation);
dart.setMethodSignature(html$.Geolocation, () => ({
  __proto__: dart.getMethods(html$.Geolocation.__proto__),
  [$getCurrentPosition]: dart.fnType(async.Future$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
  [$watchPosition]: dart.fnType(async.Stream$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
  [_ensurePosition]: dart.fnType(html$.Geoposition, [dart.dynamic]),
  [_clearWatch]: dart.fnType(dart.void, [core.int]),
  [_getCurrentPosition]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.Geoposition])], [dart.fnType(dart.void, [html$.PositionError]), core.Map]),
  [_getCurrentPosition_1]: dart.fnType(dart.void, [dart.dynamic, dart.fnType(dart.void, [html$.PositionError]), dart.dynamic]),
  [_getCurrentPosition_2]: dart.fnType(dart.void, [dart.dynamic, dart.fnType(dart.void, [html$.PositionError])]),
  [_getCurrentPosition_3]: dart.fnType(dart.void, [dart.dynamic]),
  [_watchPosition]: dart.fnType(core.int, [dart.fnType(dart.void, [html$.Geoposition])], [dart.fnType(dart.void, [html$.PositionError]), core.Map]),
  [_watchPosition_1]: dart.fnType(core.int, [dart.dynamic, dart.fnType(dart.void, [html$.PositionError]), dart.dynamic]),
  [_watchPosition_2]: dart.fnType(core.int, [dart.dynamic, dart.fnType(dart.void, [html$.PositionError])]),
  [_watchPosition_3]: dart.fnType(core.int, [dart.dynamic])
}));
dart.setLibraryUri(html$.Geolocation, "dart:html");
dart.registerExtension("Geolocation", html$.Geolocation);
html$._GeopositionWrapper = class _GeopositionWrapper extends core.Object {
  get coords() {
    return this[_ptr].coords;
  }
  get timestamp() {
    return this[_ptr].timestamp;
  }
};
(html$._GeopositionWrapper.new = function(ptr) {
  this[_ptr] = ptr;
}).prototype = html$._GeopositionWrapper.prototype;
dart.addTypeTests(html$._GeopositionWrapper);
html$._GeopositionWrapper[dart.implements] = () => [html$.Geoposition];
dart.setGetterSignature(html$._GeopositionWrapper, () => ({
  __proto__: dart.getGetters(html$._GeopositionWrapper.__proto__),
  coords: html$.Coordinates,
  [$coords]: html$.Coordinates,
  timestamp: core.int,
  [$timestamp]: core.int
}));
dart.setLibraryUri(html$._GeopositionWrapper, "dart:html");
dart.setFieldSignature(html$._GeopositionWrapper, () => ({
  __proto__: dart.getFields(html$._GeopositionWrapper.__proto__),
  [_ptr]: dart.fieldType(dart.dynamic)
}));
dart.defineExtensionAccessors(html$._GeopositionWrapper, ['coords', 'timestamp']);
html$.Geoposition = class Geoposition extends _interceptors.Interceptor {
  get [$coords]() {
    return this.coords;
  }
  get [$timestamp]() {
    return this.timestamp;
  }
};
dart.addTypeTests(html$.Geoposition);
const coords$ = Symbol("Geoposition.coords");
const timestamp$0 = Symbol("Geoposition.timestamp");
dart.setLibraryUri(html$.Geoposition, "dart:html");
dart.setFieldSignature(html$.Geoposition, () => ({
  __proto__: dart.getFields(html$.Geoposition.__proto__),
  [$coords]: dart.finalFieldType(html$.Coordinates),
  [$timestamp]: dart.finalFieldType(core.int)
}));
dart.registerExtension("Position", html$.Geoposition);
html$.GlobalEventHandlers = class GlobalEventHandlers extends core.Object {
  get onAbort() {
    return html$.GlobalEventHandlers.abortEvent.forTarget(this);
  }
  get onBlur() {
    return html$.GlobalEventHandlers.blurEvent.forTarget(this);
  }
  get onCanPlay() {
    return html$.GlobalEventHandlers.canPlayEvent.forTarget(this);
  }
  get onCanPlayThrough() {
    return html$.GlobalEventHandlers.canPlayThroughEvent.forTarget(this);
  }
  get onChange() {
    return html$.GlobalEventHandlers.changeEvent.forTarget(this);
  }
  get onClick() {
    return html$.GlobalEventHandlers.clickEvent.forTarget(this);
  }
  get onContextMenu() {
    return html$.GlobalEventHandlers.contextMenuEvent.forTarget(this);
  }
  get onDoubleClick() {
    return html$.GlobalEventHandlers.doubleClickEvent.forTarget(this);
  }
  get onDrag() {
    return html$.GlobalEventHandlers.dragEvent.forTarget(this);
  }
  get onDragEnd() {
    return html$.GlobalEventHandlers.dragEndEvent.forTarget(this);
  }
  get onDragEnter() {
    return html$.GlobalEventHandlers.dragEnterEvent.forTarget(this);
  }
  get onDragLeave() {
    return html$.GlobalEventHandlers.dragLeaveEvent.forTarget(this);
  }
  get onDragOver() {
    return html$.GlobalEventHandlers.dragOverEvent.forTarget(this);
  }
  get onDragStart() {
    return html$.GlobalEventHandlers.dragStartEvent.forTarget(this);
  }
  get onDrop() {
    return html$.GlobalEventHandlers.dropEvent.forTarget(this);
  }
  get onDurationChange() {
    return html$.GlobalEventHandlers.durationChangeEvent.forTarget(this);
  }
  get onEmptied() {
    return html$.GlobalEventHandlers.emptiedEvent.forTarget(this);
  }
  get onEnded() {
    return html$.GlobalEventHandlers.endedEvent.forTarget(this);
  }
  get onError() {
    return html$.GlobalEventHandlers.errorEvent.forTarget(this);
  }
  get onFocus() {
    return html$.GlobalEventHandlers.focusEvent.forTarget(this);
  }
  get onInput() {
    return html$.GlobalEventHandlers.inputEvent.forTarget(this);
  }
  get onInvalid() {
    return html$.GlobalEventHandlers.invalidEvent.forTarget(this);
  }
  get onKeyDown() {
    return html$.GlobalEventHandlers.keyDownEvent.forTarget(this);
  }
  get onKeyPress() {
    return html$.GlobalEventHandlers.keyPressEvent.forTarget(this);
  }
  get onKeyUp() {
    return html$.GlobalEventHandlers.keyUpEvent.forTarget(this);
  }
  get onLoad() {
    return html$.GlobalEventHandlers.loadEvent.forTarget(this);
  }
  get onLoadedData() {
    return html$.GlobalEventHandlers.loadedDataEvent.forTarget(this);
  }
  get onLoadedMetadata() {
    return html$.GlobalEventHandlers.loadedMetadataEvent.forTarget(this);
  }
  get onMouseDown() {
    return html$.GlobalEventHandlers.mouseDownEvent.forTarget(this);
  }
  get onMouseEnter() {
    return html$.GlobalEventHandlers.mouseEnterEvent.forTarget(this);
  }
  get onMouseLeave() {
    return html$.GlobalEventHandlers.mouseLeaveEvent.forTarget(this);
  }
  get onMouseMove() {
    return html$.GlobalEventHandlers.mouseMoveEvent.forTarget(this);
  }
  get onMouseOut() {
    return html$.GlobalEventHandlers.mouseOutEvent.forTarget(this);
  }
  get onMouseOver() {
    return html$.GlobalEventHandlers.mouseOverEvent.forTarget(this);
  }
  get onMouseUp() {
    return html$.GlobalEventHandlers.mouseUpEvent.forTarget(this);
  }
  get onMouseWheel() {
    return html$.GlobalEventHandlers.mouseWheelEvent.forTarget(this);
  }
  get onPause() {
    return html$.GlobalEventHandlers.pauseEvent.forTarget(this);
  }
  get onPlay() {
    return html$.GlobalEventHandlers.playEvent.forTarget(this);
  }
  get onPlaying() {
    return html$.GlobalEventHandlers.playingEvent.forTarget(this);
  }
  get onRateChange() {
    return html$.GlobalEventHandlers.rateChangeEvent.forTarget(this);
  }
  get onReset() {
    return html$.GlobalEventHandlers.resetEvent.forTarget(this);
  }
  get onResize() {
    return html$.GlobalEventHandlers.resizeEvent.forTarget(this);
  }
  get onScroll() {
    return html$.GlobalEventHandlers.scrollEvent.forTarget(this);
  }
  get onSeeked() {
    return html$.GlobalEventHandlers.seekedEvent.forTarget(this);
  }
  get onSeeking() {
    return html$.GlobalEventHandlers.seekingEvent.forTarget(this);
  }
  get onSelect() {
    return html$.GlobalEventHandlers.selectEvent.forTarget(this);
  }
  get onStalled() {
    return html$.GlobalEventHandlers.stalledEvent.forTarget(this);
  }
  get onSubmit() {
    return html$.GlobalEventHandlers.submitEvent.forTarget(this);
  }
  get onSuspend() {
    return html$.GlobalEventHandlers.suspendEvent.forTarget(this);
  }
  get onTimeUpdate() {
    return html$.GlobalEventHandlers.timeUpdateEvent.forTarget(this);
  }
  get onTouchCancel() {
    return html$.GlobalEventHandlers.touchCancelEvent.forTarget(this);
  }
  get onTouchEnd() {
    return html$.GlobalEventHandlers.touchEndEvent.forTarget(this);
  }
  get onTouchMove() {
    return html$.GlobalEventHandlers.touchMoveEvent.forTarget(this);
  }
  get onTouchStart() {
    return html$.GlobalEventHandlers.touchStartEvent.forTarget(this);
  }
  get onVolumeChange() {
    return html$.GlobalEventHandlers.volumeChangeEvent.forTarget(this);
  }
  get onWaiting() {
    return html$.GlobalEventHandlers.waitingEvent.forTarget(this);
  }
  get onWheel() {
    return html$.GlobalEventHandlers.wheelEvent.forTarget(this);
  }
};
(html$.GlobalEventHandlers[dart.mixinNew] = function() {
}).prototype = html$.GlobalEventHandlers.prototype;
dart.addTypeTests(html$.GlobalEventHandlers);
html$.GlobalEventHandlers[dart.implements] = () => [html$.EventTarget];
dart.setGetterSignature(html$.GlobalEventHandlers, () => ({
  __proto__: dart.getGetters(html$.GlobalEventHandlers.__proto__),
  onAbort: async.Stream$(html$.Event),
  [$onAbort]: async.Stream$(html$.Event),
  onBlur: async.Stream$(html$.Event),
  [$onBlur]: async.Stream$(html$.Event),
  onCanPlay: async.Stream$(html$.Event),
  [$onCanPlay]: async.Stream$(html$.Event),
  onCanPlayThrough: async.Stream$(html$.Event),
  [$onCanPlayThrough]: async.Stream$(html$.Event),
  onChange: async.Stream$(html$.Event),
  [$onChange]: async.Stream$(html$.Event),
  onClick: async.Stream$(html$.MouseEvent),
  [$onClick]: async.Stream$(html$.MouseEvent),
  onContextMenu: async.Stream$(html$.MouseEvent),
  [$onContextMenu]: async.Stream$(html$.MouseEvent),
  onDoubleClick: async.Stream$(html$.Event),
  [$onDoubleClick]: async.Stream$(html$.Event),
  onDrag: async.Stream$(html$.MouseEvent),
  [$onDrag]: async.Stream$(html$.MouseEvent),
  onDragEnd: async.Stream$(html$.MouseEvent),
  [$onDragEnd]: async.Stream$(html$.MouseEvent),
  onDragEnter: async.Stream$(html$.MouseEvent),
  [$onDragEnter]: async.Stream$(html$.MouseEvent),
  onDragLeave: async.Stream$(html$.MouseEvent),
  [$onDragLeave]: async.Stream$(html$.MouseEvent),
  onDragOver: async.Stream$(html$.MouseEvent),
  [$onDragOver]: async.Stream$(html$.MouseEvent),
  onDragStart: async.Stream$(html$.MouseEvent),
  [$onDragStart]: async.Stream$(html$.MouseEvent),
  onDrop: async.Stream$(html$.MouseEvent),
  [$onDrop]: async.Stream$(html$.MouseEvent),
  onDurationChange: async.Stream$(html$.Event),
  [$onDurationChange]: async.Stream$(html$.Event),
  onEmptied: async.Stream$(html$.Event),
  [$onEmptied]: async.Stream$(html$.Event),
  onEnded: async.Stream$(html$.Event),
  [$onEnded]: async.Stream$(html$.Event),
  onError: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event),
  onFocus: async.Stream$(html$.Event),
  [$onFocus]: async.Stream$(html$.Event),
  onInput: async.Stream$(html$.Event),
  [$onInput]: async.Stream$(html$.Event),
  onInvalid: async.Stream$(html$.Event),
  [$onInvalid]: async.Stream$(html$.Event),
  onKeyDown: async.Stream$(html$.KeyboardEvent),
  [$onKeyDown]: async.Stream$(html$.KeyboardEvent),
  onKeyPress: async.Stream$(html$.KeyboardEvent),
  [$onKeyPress]: async.Stream$(html$.KeyboardEvent),
  onKeyUp: async.Stream$(html$.KeyboardEvent),
  [$onKeyUp]: async.Stream$(html$.KeyboardEvent),
  onLoad: async.Stream$(html$.Event),
  [$onLoad]: async.Stream$(html$.Event),
  onLoadedData: async.Stream$(html$.Event),
  [$onLoadedData]: async.Stream$(html$.Event),
  onLoadedMetadata: async.Stream$(html$.Event),
  [$onLoadedMetadata]: async.Stream$(html$.Event),
  onMouseDown: async.Stream$(html$.MouseEvent),
  [$onMouseDown]: async.Stream$(html$.MouseEvent),
  onMouseEnter: async.Stream$(html$.MouseEvent),
  [$onMouseEnter]: async.Stream$(html$.MouseEvent),
  onMouseLeave: async.Stream$(html$.MouseEvent),
  [$onMouseLeave]: async.Stream$(html$.MouseEvent),
  onMouseMove: async.Stream$(html$.MouseEvent),
  [$onMouseMove]: async.Stream$(html$.MouseEvent),
  onMouseOut: async.Stream$(html$.MouseEvent),
  [$onMouseOut]: async.Stream$(html$.MouseEvent),
  onMouseOver: async.Stream$(html$.MouseEvent),
  [$onMouseOver]: async.Stream$(html$.MouseEvent),
  onMouseUp: async.Stream$(html$.MouseEvent),
  [$onMouseUp]: async.Stream$(html$.MouseEvent),
  onMouseWheel: async.Stream$(html$.WheelEvent),
  [$onMouseWheel]: async.Stream$(html$.WheelEvent),
  onPause: async.Stream$(html$.Event),
  [$onPause]: async.Stream$(html$.Event),
  onPlay: async.Stream$(html$.Event),
  [$onPlay]: async.Stream$(html$.Event),
  onPlaying: async.Stream$(html$.Event),
  [$onPlaying]: async.Stream$(html$.Event),
  onRateChange: async.Stream$(html$.Event),
  [$onRateChange]: async.Stream$(html$.Event),
  onReset: async.Stream$(html$.Event),
  [$onReset]: async.Stream$(html$.Event),
  onResize: async.Stream$(html$.Event),
  [$onResize]: async.Stream$(html$.Event),
  onScroll: async.Stream$(html$.Event),
  [$onScroll]: async.Stream$(html$.Event),
  onSeeked: async.Stream$(html$.Event),
  [$onSeeked]: async.Stream$(html$.Event),
  onSeeking: async.Stream$(html$.Event),
  [$onSeeking]: async.Stream$(html$.Event),
  onSelect: async.Stream$(html$.Event),
  [$onSelect]: async.Stream$(html$.Event),
  onStalled: async.Stream$(html$.Event),
  [$onStalled]: async.Stream$(html$.Event),
  onSubmit: async.Stream$(html$.Event),
  [$onSubmit]: async.Stream$(html$.Event),
  onSuspend: async.Stream$(html$.Event),
  [$onSuspend]: async.Stream$(html$.Event),
  onTimeUpdate: async.Stream$(html$.Event),
  [$onTimeUpdate]: async.Stream$(html$.Event),
  onTouchCancel: async.Stream$(html$.TouchEvent),
  [$onTouchCancel]: async.Stream$(html$.TouchEvent),
  onTouchEnd: async.Stream$(html$.TouchEvent),
  [$onTouchEnd]: async.Stream$(html$.TouchEvent),
  onTouchMove: async.Stream$(html$.TouchEvent),
  [$onTouchMove]: async.Stream$(html$.TouchEvent),
  onTouchStart: async.Stream$(html$.TouchEvent),
  [$onTouchStart]: async.Stream$(html$.TouchEvent),
  onVolumeChange: async.Stream$(html$.Event),
  [$onVolumeChange]: async.Stream$(html$.Event),
  onWaiting: async.Stream$(html$.Event),
  [$onWaiting]: async.Stream$(html$.Event),
  onWheel: async.Stream$(html$.WheelEvent),
  [$onWheel]: async.Stream$(html$.WheelEvent)
}));
dart.setLibraryUri(html$.GlobalEventHandlers, "dart:html");
dart.defineExtensionAccessors(html$.GlobalEventHandlers, [
  'onAbort',
  'onBlur',
  'onCanPlay',
  'onCanPlayThrough',
  'onChange',
  'onClick',
  'onContextMenu',
  'onDoubleClick',
  'onDrag',
  'onDragEnd',
  'onDragEnter',
  'onDragLeave',
  'onDragOver',
  'onDragStart',
  'onDrop',
  'onDurationChange',
  'onEmptied',
  'onEnded',
  'onError',
  'onFocus',
  'onInput',
  'onInvalid',
  'onKeyDown',
  'onKeyPress',
  'onKeyUp',
  'onLoad',
  'onLoadedData',
  'onLoadedMetadata',
  'onMouseDown',
  'onMouseEnter',
  'onMouseLeave',
  'onMouseMove',
  'onMouseOut',
  'onMouseOver',
  'onMouseUp',
  'onMouseWheel',
  'onPause',
  'onPlay',
  'onPlaying',
  'onRateChange',
  'onReset',
  'onResize',
  'onScroll',
  'onSeeked',
  'onSeeking',
  'onSelect',
  'onStalled',
  'onSubmit',
  'onSuspend',
  'onTimeUpdate',
  'onTouchCancel',
  'onTouchEnd',
  'onTouchMove',
  'onTouchStart',
  'onVolumeChange',
  'onWaiting',
  'onWheel'
]);
dart.defineLazy(html$.GlobalEventHandlers, {
  /*html$.GlobalEventHandlers.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("abort"));
  },
  /*html$.GlobalEventHandlers.blurEvent*/get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("blur"));
  },
  /*html$.GlobalEventHandlers.canPlayEvent*/get canPlayEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("canplay"));
  },
  /*html$.GlobalEventHandlers.canPlayThroughEvent*/get canPlayThroughEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("canplaythrough"));
  },
  /*html$.GlobalEventHandlers.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  },
  /*html$.GlobalEventHandlers.clickEvent*/get clickEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("click"));
  },
  /*html$.GlobalEventHandlers.contextMenuEvent*/get contextMenuEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("contextmenu"));
  },
  /*html$.GlobalEventHandlers.doubleClickEvent*/get doubleClickEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("dblclick"));
  },
  /*html$.GlobalEventHandlers.dragEvent*/get dragEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("drag"));
  },
  /*html$.GlobalEventHandlers.dragEndEvent*/get dragEndEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragend"));
  },
  /*html$.GlobalEventHandlers.dragEnterEvent*/get dragEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragenter"));
  },
  /*html$.GlobalEventHandlers.dragLeaveEvent*/get dragLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragleave"));
  },
  /*html$.GlobalEventHandlers.dragOverEvent*/get dragOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragover"));
  },
  /*html$.GlobalEventHandlers.dragStartEvent*/get dragStartEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragstart"));
  },
  /*html$.GlobalEventHandlers.dropEvent*/get dropEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("drop"));
  },
  /*html$.GlobalEventHandlers.durationChangeEvent*/get durationChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("durationchange"));
  },
  /*html$.GlobalEventHandlers.emptiedEvent*/get emptiedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("emptied"));
  },
  /*html$.GlobalEventHandlers.endedEvent*/get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("ended"));
  },
  /*html$.GlobalEventHandlers.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.GlobalEventHandlers.focusEvent*/get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("focus"));
  },
  /*html$.GlobalEventHandlers.inputEvent*/get inputEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("input"));
  },
  /*html$.GlobalEventHandlers.invalidEvent*/get invalidEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("invalid"));
  },
  /*html$.GlobalEventHandlers.keyDownEvent*/get keyDownEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keydown"));
  },
  /*html$.GlobalEventHandlers.keyPressEvent*/get keyPressEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keypress"));
  },
  /*html$.GlobalEventHandlers.keyUpEvent*/get keyUpEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keyup"));
  },
  /*html$.GlobalEventHandlers.loadEvent*/get loadEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("load"));
  },
  /*html$.GlobalEventHandlers.loadedDataEvent*/get loadedDataEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("loadeddata"));
  },
  /*html$.GlobalEventHandlers.loadedMetadataEvent*/get loadedMetadataEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("loadedmetadata"));
  },
  /*html$.GlobalEventHandlers.mouseDownEvent*/get mouseDownEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mousedown"));
  },
  /*html$.GlobalEventHandlers.mouseEnterEvent*/get mouseEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseenter"));
  },
  /*html$.GlobalEventHandlers.mouseLeaveEvent*/get mouseLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseleave"));
  },
  /*html$.GlobalEventHandlers.mouseMoveEvent*/get mouseMoveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mousemove"));
  },
  /*html$.GlobalEventHandlers.mouseOutEvent*/get mouseOutEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseout"));
  },
  /*html$.GlobalEventHandlers.mouseOverEvent*/get mouseOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseover"));
  },
  /*html$.GlobalEventHandlers.mouseUpEvent*/get mouseUpEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseup"));
  },
  /*html$.GlobalEventHandlers.mouseWheelEvent*/get mouseWheelEvent() {
    return dart.const(new (EventStreamProviderOfWheelEvent()).new("mousewheel"));
  },
  /*html$.GlobalEventHandlers.pauseEvent*/get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pause"));
  },
  /*html$.GlobalEventHandlers.playEvent*/get playEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("play"));
  },
  /*html$.GlobalEventHandlers.playingEvent*/get playingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("playing"));
  },
  /*html$.GlobalEventHandlers.rateChangeEvent*/get rateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("ratechange"));
  },
  /*html$.GlobalEventHandlers.resetEvent*/get resetEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("reset"));
  },
  /*html$.GlobalEventHandlers.resizeEvent*/get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("resize"));
  },
  /*html$.GlobalEventHandlers.scrollEvent*/get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("scroll"));
  },
  /*html$.GlobalEventHandlers.seekedEvent*/get seekedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("seeked"));
  },
  /*html$.GlobalEventHandlers.seekingEvent*/get seekingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("seeking"));
  },
  /*html$.GlobalEventHandlers.selectEvent*/get selectEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("select"));
  },
  /*html$.GlobalEventHandlers.stalledEvent*/get stalledEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("stalled"));
  },
  /*html$.GlobalEventHandlers.submitEvent*/get submitEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("submit"));
  },
  /*html$.GlobalEventHandlers.suspendEvent*/get suspendEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("suspend"));
  },
  /*html$.GlobalEventHandlers.timeUpdateEvent*/get timeUpdateEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("timeupdate"));
  },
  /*html$.GlobalEventHandlers.touchCancelEvent*/get touchCancelEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchcancel"));
  },
  /*html$.GlobalEventHandlers.touchEndEvent*/get touchEndEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchend"));
  },
  /*html$.GlobalEventHandlers.touchMoveEvent*/get touchMoveEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchmove"));
  },
  /*html$.GlobalEventHandlers.touchStartEvent*/get touchStartEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchstart"));
  },
  /*html$.GlobalEventHandlers.volumeChangeEvent*/get volumeChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("volumechange"));
  },
  /*html$.GlobalEventHandlers.waitingEvent*/get waitingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("waiting"));
  },
  /*html$.GlobalEventHandlers.wheelEvent*/get wheelEvent() {
    return dart.const(new (EventStreamProviderOfWheelEvent()).new("wheel"));
  }
});
html$.Gyroscope = class Gyroscope$ extends html$.Sensor {
  static new(sensorOptions) {
    if (sensorOptions === void 0) sensorOptions = null;
    if (sensorOptions != null) {
      let sensorOptions_1 = html_common.convertDartToNative_Dictionary(sensorOptions);
      return html$.Gyroscope._create_1(sensorOptions_1);
    }
    return html$.Gyroscope._create_2();
  }
  static _create_1(sensorOptions) {
    return new Gyroscope(sensorOptions);
  }
  static _create_2() {
    return new Gyroscope();
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$z]() {
    return this.z;
  }
};
dart.addTypeTests(html$.Gyroscope);
const x$4 = Symbol("Gyroscope.x");
const y$4 = Symbol("Gyroscope.y");
const z$3 = Symbol("Gyroscope.z");
dart.setLibraryUri(html$.Gyroscope, "dart:html");
dart.setFieldSignature(html$.Gyroscope, () => ({
  __proto__: dart.getFields(html$.Gyroscope.__proto__),
  [$x]: dart.finalFieldType(core.num),
  [$y]: dart.finalFieldType(core.num),
  [$z]: dart.finalFieldType(core.num)
}));
dart.registerExtension("Gyroscope", html$.Gyroscope);
html$.HRElement = class HRElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("hr");
  }
  get [$color]() {
    return this.color;
  }
  set [$color](value) {
    this.color = value;
  }
};
(html$.HRElement.created = function() {
  this[color] = null;
  html$.HRElement.__proto__.created.call(this);
}).prototype = html$.HRElement.prototype;
dart.addTypeTests(html$.HRElement);
const color = Symbol("HRElement.color");
dart.setLibraryUri(html$.HRElement, "dart:html");
dart.setFieldSignature(html$.HRElement, () => ({
  __proto__: dart.getFields(html$.HRElement.__proto__),
  [$color]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLHRElement", html$.HRElement);
html$.HashChangeEvent = class HashChangeEvent$ extends html$.Event {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let oldUrl = opts && 'oldUrl' in opts ? opts.oldUrl : null;
    let newUrl = opts && 'newUrl' in opts ? opts.newUrl : null;
    let options = new (IdentityMapOfString$Object()).from(["canBubble", canBubble, "cancelable", cancelable, "oldURL", oldUrl, "newURL", newUrl]);
    return new HashChangeEvent(type, html_common.convertDartToNative_Dictionary(options));
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.HashChangeEvent._create_1(type, eventInitDict_1);
    }
    return html$.HashChangeEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new HashChangeEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new HashChangeEvent(type);
  }
  static get supported() {
    return html_common.Device.isEventTypeSupported("HashChangeEvent");
  }
  get [$newUrl]() {
    return this.newURL;
  }
  get [$oldUrl]() {
    return this.oldURL;
  }
};
dart.addTypeTests(html$.HashChangeEvent);
const newUrl = Symbol("HashChangeEvent.newUrl");
const oldUrl = Symbol("HashChangeEvent.oldUrl");
dart.setLibraryUri(html$.HashChangeEvent, "dart:html");
dart.setFieldSignature(html$.HashChangeEvent, () => ({
  __proto__: dart.getFields(html$.HashChangeEvent.__proto__),
  [$newUrl]: dart.finalFieldType(core.String),
  [$oldUrl]: dart.finalFieldType(core.String)
}));
dart.registerExtension("HashChangeEvent", html$.HashChangeEvent);
html$.HeadElement = class HeadElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("head");
  }
};
(html$.HeadElement.created = function() {
  html$.HeadElement.__proto__.created.call(this);
}).prototype = html$.HeadElement.prototype;
dart.addTypeTests(html$.HeadElement);
dart.setLibraryUri(html$.HeadElement, "dart:html");
dart.registerExtension("HTMLHeadElement", html$.HeadElement);
html$.Headers = class Headers$ extends _interceptors.Interceptor {
  static new(init) {
    if (init === void 0) init = null;
    if (init != null) {
      return html$.Headers._create_1(init);
    }
    return html$.Headers._create_2();
  }
  static _create_1(init) {
    return new Headers(init);
  }
  static _create_2() {
    return new Headers();
  }
};
dart.addTypeTests(html$.Headers);
dart.setLibraryUri(html$.Headers, "dart:html");
dart.registerExtension("Headers", html$.Headers);
html$.HeadingElement = class HeadingElement extends html$.HtmlElement {
  static h1() {
    return html$.document.createElement("h1");
  }
  static h2() {
    return html$.document.createElement("h2");
  }
  static h3() {
    return html$.document.createElement("h3");
  }
  static h4() {
    return html$.document.createElement("h4");
  }
  static h5() {
    return html$.document.createElement("h5");
  }
  static h6() {
    return html$.document.createElement("h6");
  }
};
(html$.HeadingElement.created = function() {
  html$.HeadingElement.__proto__.created.call(this);
}).prototype = html$.HeadingElement.prototype;
dart.addTypeTests(html$.HeadingElement);
dart.setLibraryUri(html$.HeadingElement, "dart:html");
dart.registerExtension("HTMLHeadingElement", html$.HeadingElement);
const _get_state = dart.privateName(html$, "_get_state");
const _pushState_1 = dart.privateName(html$, "_pushState_1");
const _replaceState_1 = dart.privateName(html$, "_replaceState_1");
html$.History = class History extends _interceptors.Interceptor {
  static get supportsState() {
    return !!window.history.pushState;
  }
  get [$length]() {
    return this.length;
  }
  get [$scrollRestoration]() {
    return this.scrollRestoration;
  }
  set [$scrollRestoration](value) {
    this.scrollRestoration = value;
  }
  get [$state]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
  }
  get [_get_state]() {
    return this.state;
  }
  [$back](...args) {
    return this.back.apply(this, args);
  }
  [$forward](...args) {
    return this.forward.apply(this, args);
  }
  [$go](...args) {
    return this.go.apply(this, args);
  }
  [$pushState](data, title, url) {
    let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
    this[_pushState_1](data_1, title, url);
    return;
  }
  [_pushState_1](...args) {
    return this.pushState.apply(this, args);
  }
  [$replaceState](data, title, url) {
    let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
    this[_replaceState_1](data_1, title, url);
    return;
  }
  [_replaceState_1](...args) {
    return this.replaceState.apply(this, args);
  }
};
dart.addTypeTests(html$.History);
const length$9 = Symbol("History.length");
const scrollRestoration = Symbol("History.scrollRestoration");
html$.History[dart.implements] = () => [html$.HistoryBase];
dart.setMethodSignature(html$.History, () => ({
  __proto__: dart.getMethods(html$.History.__proto__),
  [$back]: dart.fnType(dart.void, []),
  [$forward]: dart.fnType(dart.void, []),
  [$go]: dart.fnType(dart.void, [], [core.int]),
  [$pushState]: dart.fnType(dart.void, [dart.dynamic, core.String, core.String]),
  [_pushState_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
  [$replaceState]: dart.fnType(dart.void, [dart.dynamic, core.String, core.String]),
  [_replaceState_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])
}));
dart.setGetterSignature(html$.History, () => ({
  __proto__: dart.getGetters(html$.History.__proto__),
  [$state]: dart.dynamic
}));
dart.setLibraryUri(html$.History, "dart:html");
dart.setFieldSignature(html$.History, () => ({
  __proto__: dart.getFields(html$.History.__proto__),
  [$length]: dart.finalFieldType(core.int),
  [$scrollRestoration]: dart.fieldType(core.String),
  [_get_state]: dart.finalFieldType(dart.dynamic)
}));
dart.registerExtension("History", html$.History);
const Interceptor_ListMixin$$1 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$1.new = function() {
  Interceptor_ListMixin$$1.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$1.prototype;
dart.applyMixin(Interceptor_ListMixin$$1, collection.ListMixin$(html$.Node));
const Interceptor_ImmutableListMixin$$1 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$1 {};
(Interceptor_ImmutableListMixin$$1.new = function() {
  Interceptor_ImmutableListMixin$$1.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$1.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$1, html$.ImmutableListMixin$(html$.Node));
html$.HtmlCollection = class HtmlCollection extends Interceptor_ImmutableListMixin$$1 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.Node._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
};
html$.HtmlCollection.prototype[dart.isList] = true;
dart.addTypeTests(html$.HtmlCollection);
html$.HtmlCollection[dart.implements] = () => [JavaScriptIndexingBehaviorOfNode(), ListOfNode()];
dart.setMethodSignature(html$.HtmlCollection, () => ({
  __proto__: dart.getMethods(html$.HtmlCollection.__proto__),
  [$_get]: dart.fnType(html$.Node, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.Node, [core.int]),
  [$item]: dart.fnType(html$.Node, [core.int]),
  [$namedItem]: dart.fnType(core.Object, [core.String])
}));
dart.setGetterSignature(html$.HtmlCollection, () => ({
  __proto__: dart.getGetters(html$.HtmlCollection.__proto__),
  [$length]: core.int,
  [$first]: html$.Node,
  [$last]: html$.Node,
  [$single]: html$.Node
}));
dart.setSetterSignature(html$.HtmlCollection, () => ({
  __proto__: dart.getSetters(html$.HtmlCollection.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.HtmlCollection, "dart:html");
dart.registerExtension("HTMLCollection", html$.HtmlCollection);
html$.HtmlDocument = class HtmlDocument extends html$.Document {
  get [$body]() {
    return this.body;
  }
  set [$body](value) {
    this.body = value;
  }
  [$caretRangeFromPoint](x, y) {
    return this[_caretRangeFromPoint](x, y);
  }
  [$elementFromPoint](x, y) {
    return this[_elementFromPoint](x, y);
  }
  get [$head]() {
    return this[_head$];
  }
  get [$lastModified]() {
    return this[_lastModified];
  }
  get [$preferredStylesheetSet]() {
    return this[_preferredStylesheetSet];
  }
  get [$referrer]() {
    return this[_referrer];
  }
  get [$selectedStylesheetSet]() {
    return this[_selectedStylesheetSet];
  }
  set [$selectedStylesheetSet](value) {
    this[_selectedStylesheetSet] = value;
  }
  get [$styleSheets]() {
    return this[_styleSheets];
  }
  get [$title]() {
    return this[_title];
  }
  set [$title](value) {
    this[_title] = value;
  }
  [$exitFullscreen]() {
    this[_webkitExitFullscreen]();
  }
  [$registerElement2](tag, options) {
    if (options === void 0) options = null;
    return html$._registerCustomElement(window, this, tag, options);
  }
  [$register](tag, customElementClass, opts) {
    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
    return this[$registerElement](tag, customElementClass, {extendsTag: extendsTag});
  }
  static _determineVisibilityChangeEventType(e) {
    if (typeof e.hidden !== "undefined") {
      return "visibilitychange";
    } else if (typeof e.mozHidden !== "undefined") {
      return "mozvisibilitychange";
    } else if (typeof e.msHidden !== "undefined") {
      return "msvisibilitychange";
    } else if (typeof e.webkitHidden !== "undefined") {
      return "webkitvisibilitychange";
    }
    return "visibilitychange";
  }
  get [$onVisibilityChange]() {
    return html$.HtmlDocument.visibilityChangeEvent.forTarget(this);
  }
  [$createElementUpgrader](type, opts) {
    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
    return new html$._JSElementUpgrader.new(this, type, extendsTag);
  }
};
dart.addTypeTests(html$.HtmlDocument);
const body = Symbol("HtmlDocument.body");
dart.setMethodSignature(html$.HtmlDocument, () => ({
  __proto__: dart.getMethods(html$.HtmlDocument.__proto__),
  [$caretRangeFromPoint]: dart.fnType(html$.Range, [core.int, core.int]),
  [$elementFromPoint]: dart.fnType(html$.Element, [core.int, core.int]),
  [$register]: dart.fnType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
  [$createElementUpgrader]: dart.fnType(html$.ElementUpgrader, [core.Type], {extendsTag: core.String})
}));
dart.setGetterSignature(html$.HtmlDocument, () => ({
  __proto__: dart.getGetters(html$.HtmlDocument.__proto__),
  [$head]: html$.HeadElement,
  [$lastModified]: core.String,
  [$preferredStylesheetSet]: core.String,
  [$referrer]: core.String,
  [$selectedStylesheetSet]: core.String,
  [$styleSheets]: core.List$(html$.StyleSheet),
  [$title]: core.String,
  [$onVisibilityChange]: async.Stream$(html$.Event)
}));
dart.setSetterSignature(html$.HtmlDocument, () => ({
  __proto__: dart.getSetters(html$.HtmlDocument.__proto__),
  [$selectedStylesheetSet]: core.String,
  [$title]: core.String
}));
dart.setLibraryUri(html$.HtmlDocument, "dart:html");
dart.setFieldSignature(html$.HtmlDocument, () => ({
  __proto__: dart.getFields(html$.HtmlDocument.__proto__),
  [$body]: dart.fieldType(html$.BodyElement)
}));
dart.defineLazy(html$.HtmlDocument, {
  /*html$.HtmlDocument.visibilityChangeEvent*/get visibilityChangeEvent() {
    return dart.const(new (_CustomEventStreamProviderOfEvent()).new(dart.fn(html$.HtmlDocument._determineVisibilityChangeEventType, EventTargetToString())));
  }
});
dart.registerExtension("HTMLDocument", html$.HtmlDocument);
html$.HtmlFormControlsCollection = class HtmlFormControlsCollection extends html$.HtmlCollection {
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
};
dart.addTypeTests(html$.HtmlFormControlsCollection);
dart.setLibraryUri(html$.HtmlFormControlsCollection, "dart:html");
dart.registerExtension("HTMLFormControlsCollection", html$.HtmlFormControlsCollection);
html$.HtmlHtmlElement = class HtmlHtmlElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("html");
  }
};
(html$.HtmlHtmlElement.created = function() {
  html$.HtmlHtmlElement.__proto__.created.call(this);
}).prototype = html$.HtmlHtmlElement.prototype;
dart.addTypeTests(html$.HtmlHtmlElement);
dart.setLibraryUri(html$.HtmlHtmlElement, "dart:html");
dart.registerExtension("HTMLHtmlElement", html$.HtmlHtmlElement);
html$.HtmlHyperlinkElementUtils = class HtmlHyperlinkElementUtils extends _interceptors.Interceptor {
  get [$hash]() {
    return this.hash;
  }
  set [$hash](value) {
    this.hash = value;
  }
  get [$host]() {
    return this.host;
  }
  set [$host](value) {
    this.host = value;
  }
  get [$hostname]() {
    return this.hostname;
  }
  set [$hostname](value) {
    this.hostname = value;
  }
  get [$href]() {
    return this.href;
  }
  set [$href](value) {
    this.href = value;
  }
  get [$origin]() {
    return this.origin;
  }
  get [$password]() {
    return this.password;
  }
  set [$password](value) {
    this.password = value;
  }
  get [$pathname]() {
    return this.pathname;
  }
  set [$pathname](value) {
    this.pathname = value;
  }
  get [$port]() {
    return this.port;
  }
  set [$port](value) {
    this.port = value;
  }
  get [$protocol]() {
    return this.protocol;
  }
  set [$protocol](value) {
    this.protocol = value;
  }
  get [$search]() {
    return this.search;
  }
  set [$search](value) {
    this.search = value;
  }
  get [$username]() {
    return this.username;
  }
  set [$username](value) {
    this.username = value;
  }
};
dart.addTypeTests(html$.HtmlHyperlinkElementUtils);
const hash$0 = Symbol("HtmlHyperlinkElementUtils.hash");
const host$0 = Symbol("HtmlHyperlinkElementUtils.host");
const hostname$0 = Symbol("HtmlHyperlinkElementUtils.hostname");
const href$3 = Symbol("HtmlHyperlinkElementUtils.href");
const origin$4 = Symbol("HtmlHyperlinkElementUtils.origin");
const password$0 = Symbol("HtmlHyperlinkElementUtils.password");
const pathname$0 = Symbol("HtmlHyperlinkElementUtils.pathname");
const port$2 = Symbol("HtmlHyperlinkElementUtils.port");
const protocol$1 = Symbol("HtmlHyperlinkElementUtils.protocol");
const search$0 = Symbol("HtmlHyperlinkElementUtils.search");
const username$0 = Symbol("HtmlHyperlinkElementUtils.username");
dart.setLibraryUri(html$.HtmlHyperlinkElementUtils, "dart:html");
dart.setFieldSignature(html$.HtmlHyperlinkElementUtils, () => ({
  __proto__: dart.getFields(html$.HtmlHyperlinkElementUtils.__proto__),
  [$hash]: dart.fieldType(core.String),
  [$host]: dart.fieldType(core.String),
  [$hostname]: dart.fieldType(core.String),
  [$href]: dart.fieldType(core.String),
  [$origin]: dart.finalFieldType(core.String),
  [$password]: dart.fieldType(core.String),
  [$pathname]: dart.fieldType(core.String),
  [$port]: dart.fieldType(core.String),
  [$protocol]: dart.fieldType(core.String),
  [$search]: dart.fieldType(core.String),
  [$username]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLHyperlinkElementUtils", html$.HtmlHyperlinkElementUtils);
const _item = dart.privateName(html$, "_item");
html$.HtmlOptionsCollection = class HtmlOptionsCollection extends html$.HtmlCollection {
  [_item](...args) {
    return this.item.apply(this, args);
  }
};
dart.addTypeTests(html$.HtmlOptionsCollection);
dart.setMethodSignature(html$.HtmlOptionsCollection, () => ({
  __proto__: dart.getMethods(html$.HtmlOptionsCollection.__proto__),
  [_item]: dart.fnType(html$.Element, [core.int])
}));
dart.setLibraryUri(html$.HtmlOptionsCollection, "dart:html");
dart.registerExtension("HTMLOptionsCollection", html$.HtmlOptionsCollection);
const _get_response = dart.privateName(html$, "_get_response");
html$.HttpRequestEventTarget = class HttpRequestEventTarget extends html$.EventTarget {
  get [$onAbort]() {
    return html$.HttpRequestEventTarget.abortEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.HttpRequestEventTarget.errorEvent.forTarget(this);
  }
  get [$onLoad]() {
    return html$.HttpRequestEventTarget.loadEvent.forTarget(this);
  }
  get [$onLoadEnd]() {
    return html$.HttpRequestEventTarget.loadEndEvent.forTarget(this);
  }
  get [$onLoadStart]() {
    return html$.HttpRequestEventTarget.loadStartEvent.forTarget(this);
  }
  get [$onProgress]() {
    return html$.HttpRequestEventTarget.progressEvent.forTarget(this);
  }
  get [$onTimeout]() {
    return html$.HttpRequestEventTarget.timeoutEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.HttpRequestEventTarget);
dart.setGetterSignature(html$.HttpRequestEventTarget, () => ({
  __proto__: dart.getGetters(html$.HttpRequestEventTarget.__proto__),
  [$onAbort]: async.Stream$(html$.ProgressEvent),
  [$onError]: async.Stream$(html$.ProgressEvent),
  [$onLoad]: async.Stream$(html$.ProgressEvent),
  [$onLoadEnd]: async.Stream$(html$.ProgressEvent),
  [$onLoadStart]: async.Stream$(html$.ProgressEvent),
  [$onProgress]: async.Stream$(html$.ProgressEvent),
  [$onTimeout]: async.Stream$(html$.ProgressEvent)
}));
dart.setLibraryUri(html$.HttpRequestEventTarget, "dart:html");
dart.defineLazy(html$.HttpRequestEventTarget, {
  /*html$.HttpRequestEventTarget.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("abort"));
  },
  /*html$.HttpRequestEventTarget.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("error"));
  },
  /*html$.HttpRequestEventTarget.loadEvent*/get loadEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("load"));
  },
  /*html$.HttpRequestEventTarget.loadEndEvent*/get loadEndEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("loadend"));
  },
  /*html$.HttpRequestEventTarget.loadStartEvent*/get loadStartEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("loadstart"));
  },
  /*html$.HttpRequestEventTarget.progressEvent*/get progressEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("progress"));
  },
  /*html$.HttpRequestEventTarget.timeoutEvent*/get timeoutEvent() {
    return dart.const(new (EventStreamProviderOfProgressEvent()).new("timeout"));
  }
});
dart.registerExtension("XMLHttpRequestEventTarget", html$.HttpRequestEventTarget);
html$.HttpRequest = class HttpRequest extends html$.HttpRequestEventTarget {
  static getString(url, opts) {
    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
    return FutureOfString()._check(html$.HttpRequest.request(url, {withCredentials: withCredentials, onProgress: onProgress}).then(core.String, dart.fn(xhr => xhr.responseText, HttpRequestToString())));
  }
  static postFormData(url, data, opts) {
    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
    let responseType = opts && 'responseType' in opts ? opts.responseType : null;
    let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
    let parts = [];
    data[$forEach](dart.fn((key, value) => {
      parts[$add](dart.str(core.Uri.encodeQueryComponent(key)) + "=" + dart.str(core.Uri.encodeQueryComponent(value)));
    }, StringAndStringToNull()));
    let formData = parts[$join]("&");
    if (requestHeaders == null) {
      requestHeaders = new (IdentityMapOfString$String()).new();
    }
    requestHeaders[$putIfAbsent]("Content-Type", dart.fn(() => "application/x-www-form-urlencoded; charset=UTF-8", VoidToString()));
    return html$.HttpRequest.request(url, {method: "POST", withCredentials: withCredentials, responseType: responseType, requestHeaders: requestHeaders, sendData: formData, onProgress: onProgress});
  }
  static request(url, opts) {
    let method = opts && 'method' in opts ? opts.method : null;
    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
    let responseType = opts && 'responseType' in opts ? opts.responseType : null;
    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
    let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
    let sendData = opts && 'sendData' in opts ? opts.sendData : null;
    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
    let completer = CompleterOfHttpRequest().new();
    let xhr = html$.HttpRequest.new();
    if (method == null) {
      method = "GET";
    }
    xhr.open(method, url, {async: true});
    if (withCredentials != null) {
      xhr.withCredentials = withCredentials;
    }
    if (responseType != null) {
      xhr.responseType = responseType;
    }
    if (mimeType != null) {
      xhr.overrideMimeType(mimeType);
    }
    if (requestHeaders != null) {
      requestHeaders[$forEach](dart.fn((header, value) => {
        xhr.setRequestHeader(header, value);
      }, StringAndStringToNull()));
    }
    if (onProgress != null) {
      xhr[$onProgress].listen(onProgress);
    }
    xhr[$onLoad].listen(dart.fn(e => {
      let accepted = dart.notNull(xhr.status) >= 200 && dart.notNull(xhr.status) < 300;
      let fileUri = xhr.status === 0;
      let notModified = xhr.status === 304;
      let unknownRedirect = dart.notNull(xhr.status) > 307 && dart.notNull(xhr.status) < 400;
      if (accepted || fileUri || notModified || unknownRedirect) {
        completer.complete(xhr);
      } else {
        completer.completeError(e);
      }
    }, ProgressEventToNull()));
    xhr[$onError].listen(dart.bind(completer, 'completeError'));
    if (sendData != null) {
      xhr.send(sendData);
    } else {
      xhr.send();
    }
    return completer.future;
  }
  static get supportsProgressEvent() {
    let xhr = html$.HttpRequest.new();
    return "onprogress" in xhr;
  }
  static get supportsCrossOrigin() {
    let xhr = html$.HttpRequest.new();
    return "withCredentials" in xhr;
  }
  static get supportsLoadEndEvent() {
    let xhr = html$.HttpRequest.new();
    return "onloadend" in xhr;
  }
  static get supportsOverrideMimeType() {
    let xhr = html$.HttpRequest.new();
    return "overrideMimeType" in xhr;
  }
  static requestCrossOrigin(url, opts) {
    let method = opts && 'method' in opts ? opts.method : null;
    let sendData = opts && 'sendData' in opts ? opts.sendData : null;
    if (dart.test(html$.HttpRequest.supportsCrossOrigin)) {
      return FutureOfString()._check(html$.HttpRequest.request(url, {method: method, sendData: sendData}).then(core.String, dart.fn(xhr => xhr.responseText, HttpRequestToString())));
    }
    let completer = CompleterOfString().new();
    if (method == null) {
      method = "GET";
    }
    let xhr = new XDomainRequest();
    xhr.open(method, url);
    xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull(), dart.fn(e => {
      let response = xhr.responseText;
      completer.complete(response);
    }, dynamicToNull()), 1);
    xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull(), dart.fn(e => {
      completer.completeError(e);
    }, dynamicToNull()), 1);
    xhr.onprogress = {};
    xhr.ontimeout = {};
    xhr.timeout = Number.MAX_VALUE;
    if (sendData != null) {
      xhr.send(sendData);
    } else {
      xhr.send();
    }
    return completer.future;
  }
  get [$responseHeaders]() {
    let headers = new (IdentityMapOfString$String()).new();
    let headersString = this.getAllResponseHeaders();
    if (headersString == null) {
      return headers;
    }
    let headersList = headersString[$split]("\r\n");
    for (let header of headersList) {
      if (header[$isEmpty]) {
        continue;
      }
      let splitIdx = header[$indexOf](": ");
      if (splitIdx === -1) {
        continue;
      }
      let key = header[$substring](0, splitIdx)[$toLowerCase]();
      let value = header[$substring](splitIdx + 2);
      if (dart.test(headers[$containsKey](key))) {
        headers[$_set](key, dart.str(headers[$_get](key)) + ", " + value);
      } else {
        headers[$_set](key, value);
      }
    }
    return headers;
  }
  [$open](...args) {
    return this.open.apply(this, args);
  }
  static new() {
    return html$.HttpRequest._create_1();
  }
  static _create_1() {
    return new XMLHttpRequest();
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [$response]() {
    return html$._convertNativeToDart_XHR_Response(this[_get_response]);
  }
  get [_get_response]() {
    return this.response;
  }
  get [$responseText]() {
    return this.responseText;
  }
  get [$responseType]() {
    return this.responseType;
  }
  set [$responseType](value) {
    this.responseType = value;
  }
  get [$responseUrl]() {
    return this.responseURL;
  }
  get [$responseXml]() {
    return this.responseXML;
  }
  get [$status]() {
    return this.status;
  }
  get [$statusText]() {
    return this.statusText;
  }
  get [$timeout]() {
    return this.timeout;
  }
  set [$timeout](value) {
    this.timeout = value;
  }
  get [$upload]() {
    return this.upload;
  }
  get [$withCredentials]() {
    return this.withCredentials;
  }
  set [$withCredentials](value) {
    this.withCredentials = value;
  }
  [$abort](...args) {
    return this.abort.apply(this, args);
  }
  [$getAllResponseHeaders](...args) {
    return this.getAllResponseHeaders.apply(this, args);
  }
  [$getResponseHeader](...args) {
    return this.getResponseHeader.apply(this, args);
  }
  [$overrideMimeType](...args) {
    return this.overrideMimeType.apply(this, args);
  }
  [$send](...args) {
    return this.send.apply(this, args);
  }
  [$setRequestHeader](...args) {
    return this.setRequestHeader.apply(this, args);
  }
  get [$onReadyStateChange]() {
    return html$.HttpRequest.readyStateChangeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.HttpRequest);
const readyState$5 = Symbol("HttpRequest.readyState");
const responseText = Symbol("HttpRequest.responseText");
const responseType = Symbol("HttpRequest.responseType");
const responseUrl = Symbol("HttpRequest.responseUrl");
const responseXml = Symbol("HttpRequest.responseXml");
const status$2 = Symbol("HttpRequest.status");
const statusText = Symbol("HttpRequest.statusText");
const timeout = Symbol("HttpRequest.timeout");
const upload = Symbol("HttpRequest.upload");
const withCredentials$ = Symbol("HttpRequest.withCredentials");
dart.setMethodSignature(html$.HttpRequest, () => ({
  __proto__: dart.getMethods(html$.HttpRequest.__proto__),
  [$open]: dart.fnType(dart.void, [core.String, core.String], {async: core.bool, user: core.String, password: core.String}),
  [$abort]: dart.fnType(dart.void, []),
  [$getAllResponseHeaders]: dart.fnType(core.String, []),
  [$getResponseHeader]: dart.fnType(core.String, [core.String]),
  [$overrideMimeType]: dart.fnType(dart.void, [core.String]),
  [$send]: dart.fnType(dart.void, [], [dart.dynamic]),
  [$setRequestHeader]: dart.fnType(dart.void, [core.String, core.String])
}));
dart.setGetterSignature(html$.HttpRequest, () => ({
  __proto__: dart.getGetters(html$.HttpRequest.__proto__),
  [$responseHeaders]: core.Map$(core.String, core.String),
  [$response]: dart.dynamic,
  [$onReadyStateChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.HttpRequest, "dart:html");
dart.setFieldSignature(html$.HttpRequest, () => ({
  __proto__: dart.getFields(html$.HttpRequest.__proto__),
  [$readyState]: dart.finalFieldType(core.int),
  [_get_response]: dart.finalFieldType(dart.dynamic),
  [$responseText]: dart.finalFieldType(core.String),
  [$responseType]: dart.fieldType(core.String),
  [$responseUrl]: dart.finalFieldType(core.String),
  [$responseXml]: dart.finalFieldType(html$.Document),
  [$status]: dart.finalFieldType(core.int),
  [$statusText]: dart.finalFieldType(core.String),
  [$timeout]: dart.fieldType(core.int),
  [$upload]: dart.finalFieldType(html$.HttpRequestUpload),
  [$withCredentials]: dart.fieldType(core.bool)
}));
dart.defineLazy(html$.HttpRequest, {
  /*html$.HttpRequest.readyStateChangeEvent*/get readyStateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("readystatechange"));
  },
  /*html$.HttpRequest.DONE*/get DONE() {
    return 4;
  },
  /*html$.HttpRequest.HEADERS_RECEIVED*/get HEADERS_RECEIVED() {
    return 2;
  },
  /*html$.HttpRequest.LOADING*/get LOADING() {
    return 3;
  },
  /*html$.HttpRequest.OPENED*/get OPENED() {
    return 1;
  },
  /*html$.HttpRequest.UNSENT*/get UNSENT() {
    return 0;
  }
});
dart.registerExtension("XMLHttpRequest", html$.HttpRequest);
html$.HttpRequestUpload = class HttpRequestUpload extends html$.HttpRequestEventTarget {};
dart.addTypeTests(html$.HttpRequestUpload);
dart.setLibraryUri(html$.HttpRequestUpload, "dart:html");
dart.registerExtension("XMLHttpRequestUpload", html$.HttpRequestUpload);
const _get_contentWindow = dart.privateName(html$, "_get_contentWindow");
html$.IFrameElement = class IFrameElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("iframe");
  }
  get [$allow]() {
    return this.allow;
  }
  set [$allow](value) {
    this.allow = value;
  }
  get [$allowFullscreen]() {
    return this.allowFullscreen;
  }
  set [$allowFullscreen](value) {
    this.allowFullscreen = value;
  }
  get [$allowPaymentRequest]() {
    return this.allowPaymentRequest;
  }
  set [$allowPaymentRequest](value) {
    this.allowPaymentRequest = value;
  }
  get [$contentWindow]() {
    return html$._convertNativeToDart_Window(this[_get_contentWindow]);
  }
  get [_get_contentWindow]() {
    return this.contentWindow;
  }
  get [$csp]() {
    return this.csp;
  }
  set [$csp](value) {
    this.csp = value;
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$referrerPolicy]() {
    return this.referrerPolicy;
  }
  set [$referrerPolicy](value) {
    this.referrerPolicy = value;
  }
  get [$sandbox]() {
    return this.sandbox;
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$srcdoc]() {
    return this.srcdoc;
  }
  set [$srcdoc](value) {
    this.srcdoc = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
};
(html$.IFrameElement.created = function() {
  this[allow] = null;
  this[allowFullscreen] = null;
  this[allowPaymentRequest] = null;
  this[_get_contentWindow] = null;
  this[csp] = null;
  this[height$0] = null;
  this[name$18] = null;
  this[referrerPolicy$0] = null;
  this[sandbox] = null;
  this[src$0] = null;
  this[srcdoc] = null;
  this[width$0] = null;
  html$.IFrameElement.__proto__.created.call(this);
}).prototype = html$.IFrameElement.prototype;
dart.addTypeTests(html$.IFrameElement);
const allow = Symbol("IFrameElement.allow");
const allowFullscreen = Symbol("IFrameElement.allowFullscreen");
const allowPaymentRequest = Symbol("IFrameElement.allowPaymentRequest");
const csp = Symbol("IFrameElement.csp");
const height$0 = Symbol("IFrameElement.height");
const name$18 = Symbol("IFrameElement.name");
const referrerPolicy$0 = Symbol("IFrameElement.referrerPolicy");
const sandbox = Symbol("IFrameElement.sandbox");
const src$0 = Symbol("IFrameElement.src");
const srcdoc = Symbol("IFrameElement.srcdoc");
const width$0 = Symbol("IFrameElement.width");
dart.setGetterSignature(html$.IFrameElement, () => ({
  __proto__: dart.getGetters(html$.IFrameElement.__proto__),
  [$contentWindow]: html$.WindowBase
}));
dart.setLibraryUri(html$.IFrameElement, "dart:html");
dart.setFieldSignature(html$.IFrameElement, () => ({
  __proto__: dart.getFields(html$.IFrameElement.__proto__),
  [$allow]: dart.fieldType(core.String),
  [$allowFullscreen]: dart.fieldType(core.bool),
  [$allowPaymentRequest]: dart.fieldType(core.bool),
  [_get_contentWindow]: dart.finalFieldType(dart.dynamic),
  [$csp]: dart.fieldType(core.String),
  [$height]: dart.fieldType(core.String),
  [$name]: dart.fieldType(core.String),
  [$referrerPolicy]: dart.fieldType(core.String),
  [$sandbox]: dart.finalFieldType(html$.DomTokenList),
  [$src]: dart.fieldType(core.String),
  [$srcdoc]: dart.fieldType(core.String),
  [$width]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLIFrameElement", html$.IFrameElement);
html$.IdleDeadline = class IdleDeadline extends _interceptors.Interceptor {
  get [$didTimeout]() {
    return this.didTimeout;
  }
  [$timeRemaining](...args) {
    return this.timeRemaining.apply(this, args);
  }
};
dart.addTypeTests(html$.IdleDeadline);
const didTimeout = Symbol("IdleDeadline.didTimeout");
dart.setMethodSignature(html$.IdleDeadline, () => ({
  __proto__: dart.getMethods(html$.IdleDeadline.__proto__),
  [$timeRemaining]: dart.fnType(core.double, [])
}));
dart.setLibraryUri(html$.IdleDeadline, "dart:html");
dart.setFieldSignature(html$.IdleDeadline, () => ({
  __proto__: dart.getFields(html$.IdleDeadline.__proto__),
  [$didTimeout]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("IdleDeadline", html$.IdleDeadline);
html$.ImageBitmap = class ImageBitmap extends _interceptors.Interceptor {
  get [$height]() {
    return this.height;
  }
  get [$width]() {
    return this.width;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
};
dart.addTypeTests(html$.ImageBitmap);
const height$1 = Symbol("ImageBitmap.height");
const width$1 = Symbol("ImageBitmap.width");
dart.setMethodSignature(html$.ImageBitmap, () => ({
  __proto__: dart.getMethods(html$.ImageBitmap.__proto__),
  [$close]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.ImageBitmap, "dart:html");
dart.setFieldSignature(html$.ImageBitmap, () => ({
  __proto__: dart.getFields(html$.ImageBitmap.__proto__),
  [$height]: dart.finalFieldType(core.int),
  [$width]: dart.finalFieldType(core.int)
}));
dart.registerExtension("ImageBitmap", html$.ImageBitmap);
html$.ImageBitmapRenderingContext = class ImageBitmapRenderingContext extends _interceptors.Interceptor {
  get [$canvas]() {
    return this.canvas;
  }
  [$transferFromImageBitmap](...args) {
    return this.transferFromImageBitmap.apply(this, args);
  }
};
dart.addTypeTests(html$.ImageBitmapRenderingContext);
const canvas$0 = Symbol("ImageBitmapRenderingContext.canvas");
dart.setMethodSignature(html$.ImageBitmapRenderingContext, () => ({
  __proto__: dart.getMethods(html$.ImageBitmapRenderingContext.__proto__),
  [$transferFromImageBitmap]: dart.fnType(dart.void, [html$.ImageBitmap])
}));
dart.setLibraryUri(html$.ImageBitmapRenderingContext, "dart:html");
dart.setFieldSignature(html$.ImageBitmapRenderingContext, () => ({
  __proto__: dart.getFields(html$.ImageBitmapRenderingContext.__proto__),
  [$canvas]: dart.finalFieldType(html$.CanvasElement)
}));
dart.registerExtension("ImageBitmapRenderingContext", html$.ImageBitmapRenderingContext);
html$.ImageCapture = class ImageCapture$ extends _interceptors.Interceptor {
  static new(track) {
    return html$.ImageCapture._create_1(track);
  }
  static _create_1(track) {
    return new ImageCapture(track);
  }
  get [$track]() {
    return this.track;
  }
  [$getPhotoCapabilities]() {
    return html$.promiseToFuture(html$.PhotoCapabilities, this.getPhotoCapabilities());
  }
  [$getPhotoSettings]() {
    return html$.promiseToFutureAsMap(this.getPhotoSettings());
  }
  [$grabFrame]() {
    return html$.promiseToFuture(html$.ImageBitmap, this.grabFrame());
  }
  [$setOptions](photoSettings) {
    let photoSettings_dict = html_common.convertDartToNative_Dictionary(photoSettings);
    return html$.promiseToFuture(dart.dynamic, this.setOptions(photoSettings_dict));
  }
  [$takePhoto](photoSettings) {
    if (photoSettings === void 0) photoSettings = null;
    let photoSettings_dict = null;
    if (photoSettings != null) {
      photoSettings_dict = html_common.convertDartToNative_Dictionary(photoSettings);
    }
    return html$.promiseToFuture(html$.Blob, this.takePhoto(photoSettings_dict));
  }
};
dart.addTypeTests(html$.ImageCapture);
const track = Symbol("ImageCapture.track");
dart.setMethodSignature(html$.ImageCapture, () => ({
  __proto__: dart.getMethods(html$.ImageCapture.__proto__),
  [$getPhotoCapabilities]: dart.fnType(async.Future$(html$.PhotoCapabilities), []),
  [$getPhotoSettings]: dart.fnType(async.Future$(core.Map$(core.String, dart.dynamic)), []),
  [$grabFrame]: dart.fnType(async.Future$(html$.ImageBitmap), []),
  [$setOptions]: dart.fnType(async.Future, [core.Map]),
  [$takePhoto]: dart.fnType(async.Future$(html$.Blob), [], [core.Map])
}));
dart.setLibraryUri(html$.ImageCapture, "dart:html");
dart.setFieldSignature(html$.ImageCapture, () => ({
  __proto__: dart.getFields(html$.ImageCapture.__proto__),
  [$track]: dart.finalFieldType(html$.MediaStreamTrack)
}));
dart.registerExtension("ImageCapture", html$.ImageCapture);
html$.ImageData = class ImageData$ extends _interceptors.Interceptor {
  static new(data_OR_sw, sh_OR_sw, sh) {
    if (sh === void 0) sh = null;
    if (core.int.is(sh_OR_sw) && core.int.is(data_OR_sw) && sh == null) {
      return html$.ImageData._create_1(data_OR_sw, sh_OR_sw);
    }
    if (core.int.is(sh_OR_sw) && typed_data.Uint8ClampedList.is(data_OR_sw) && sh == null) {
      return html$.ImageData._create_2(data_OR_sw, sh_OR_sw);
    }
    if (core.int.is(sh) && core.int.is(sh_OR_sw) && typed_data.Uint8ClampedList.is(data_OR_sw)) {
      return html$.ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1(data_OR_sw, sh_OR_sw) {
    return new ImageData(data_OR_sw, sh_OR_sw);
  }
  static _create_2(data_OR_sw, sh_OR_sw) {
    return new ImageData(data_OR_sw, sh_OR_sw);
  }
  static _create_3(data_OR_sw, sh_OR_sw, sh) {
    return new ImageData(data_OR_sw, sh_OR_sw, sh);
  }
  get [$data]() {
    return this.data;
  }
  get [$height]() {
    return this.height;
  }
  get [$width]() {
    return this.width;
  }
};
dart.addTypeTests(html$.ImageData);
const data$3 = Symbol("ImageData.data");
const height$2 = Symbol("ImageData.height");
const width$2 = Symbol("ImageData.width");
dart.setLibraryUri(html$.ImageData, "dart:html");
dart.setFieldSignature(html$.ImageData, () => ({
  __proto__: dart.getFields(html$.ImageData.__proto__),
  [$data]: dart.finalFieldType(typed_data.Uint8ClampedList),
  [$height]: dart.finalFieldType(core.int),
  [$width]: dart.finalFieldType(core.int)
}));
dart.registerExtension("ImageData", html$.ImageData);
html$.ImageElement = class ImageElement extends html$.HtmlElement {
  static new(opts) {
    let src = opts && 'src' in opts ? opts.src : null;
    let width = opts && 'width' in opts ? opts.width : null;
    let height = opts && 'height' in opts ? opts.height : null;
    let e = html$.document.createElement("img");
    if (src != null) e.src = src;
    if (width != null) e.width = width;
    if (height != null) e.height = height;
    return e;
  }
  get [$alt]() {
    return this.alt;
  }
  set [$alt](value) {
    this.alt = value;
  }
  get [$async]() {
    return this.async;
  }
  set [$async](value) {
    this.async = value;
  }
  get [$complete]() {
    return this.complete;
  }
  get [$crossOrigin]() {
    return this.crossOrigin;
  }
  set [$crossOrigin](value) {
    this.crossOrigin = value;
  }
  get [$currentSrc]() {
    return this.currentSrc;
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$isMap]() {
    return this.isMap;
  }
  set [$isMap](value) {
    this.isMap = value;
  }
  get [$naturalHeight]() {
    return this.naturalHeight;
  }
  get [$naturalWidth]() {
    return this.naturalWidth;
  }
  get [$referrerPolicy]() {
    return this.referrerPolicy;
  }
  set [$referrerPolicy](value) {
    this.referrerPolicy = value;
  }
  get [$sizes]() {
    return this.sizes;
  }
  set [$sizes](value) {
    this.sizes = value;
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$srcset]() {
    return this.srcset;
  }
  set [$srcset](value) {
    this.srcset = value;
  }
  get [$useMap]() {
    return this.useMap;
  }
  set [$useMap](value) {
    this.useMap = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  [$decode]() {
    return html$.promiseToFuture(dart.dynamic, this.decode());
  }
};
(html$.ImageElement.created = function() {
  this[alt$] = null;
  this[async$] = null;
  this[complete] = null;
  this[crossOrigin$] = null;
  this[currentSrc$] = null;
  this[height$3] = null;
  this[isMap] = null;
  this[naturalHeight] = null;
  this[naturalWidth] = null;
  this[referrerPolicy$1] = null;
  this[sizes] = null;
  this[src$1] = null;
  this[srcset] = null;
  this[useMap] = null;
  this[width$3] = null;
  html$.ImageElement.__proto__.created.call(this);
}).prototype = html$.ImageElement.prototype;
dart.addTypeTests(html$.ImageElement);
const alt$ = Symbol("ImageElement.alt");
const async$ = Symbol("ImageElement.async");
const complete = Symbol("ImageElement.complete");
const crossOrigin$ = Symbol("ImageElement.crossOrigin");
const currentSrc$ = Symbol("ImageElement.currentSrc");
const height$3 = Symbol("ImageElement.height");
const isMap = Symbol("ImageElement.isMap");
const naturalHeight = Symbol("ImageElement.naturalHeight");
const naturalWidth = Symbol("ImageElement.naturalWidth");
const referrerPolicy$1 = Symbol("ImageElement.referrerPolicy");
const sizes = Symbol("ImageElement.sizes");
const src$1 = Symbol("ImageElement.src");
const srcset = Symbol("ImageElement.srcset");
const useMap = Symbol("ImageElement.useMap");
const width$3 = Symbol("ImageElement.width");
html$.ImageElement[dart.implements] = () => [html$.CanvasImageSource];
dart.setMethodSignature(html$.ImageElement, () => ({
  __proto__: dart.getMethods(html$.ImageElement.__proto__),
  [$decode]: dart.fnType(async.Future, [])
}));
dart.setLibraryUri(html$.ImageElement, "dart:html");
dart.setFieldSignature(html$.ImageElement, () => ({
  __proto__: dart.getFields(html$.ImageElement.__proto__),
  [$alt]: dart.fieldType(core.String),
  [$async]: dart.fieldType(core.String),
  [$complete]: dart.finalFieldType(core.bool),
  [$crossOrigin]: dart.fieldType(core.String),
  [$currentSrc]: dart.finalFieldType(core.String),
  [$height]: dart.fieldType(core.int),
  [$isMap]: dart.fieldType(core.bool),
  [$naturalHeight]: dart.finalFieldType(core.int),
  [$naturalWidth]: dart.finalFieldType(core.int),
  [$referrerPolicy]: dart.fieldType(core.String),
  [$sizes]: dart.fieldType(core.String),
  [$src]: dart.fieldType(core.String),
  [$srcset]: dart.fieldType(core.String),
  [$useMap]: dart.fieldType(core.String),
  [$width]: dart.fieldType(core.int)
}));
dart.registerExtension("HTMLImageElement", html$.ImageElement);
html$.InputDeviceCapabilities = class InputDeviceCapabilities$ extends _interceptors.Interceptor {
  static new(deviceInitDict) {
    if (deviceInitDict === void 0) deviceInitDict = null;
    if (deviceInitDict != null) {
      let deviceInitDict_1 = html_common.convertDartToNative_Dictionary(deviceInitDict);
      return html$.InputDeviceCapabilities._create_1(deviceInitDict_1);
    }
    return html$.InputDeviceCapabilities._create_2();
  }
  static _create_1(deviceInitDict) {
    return new InputDeviceCapabilities(deviceInitDict);
  }
  static _create_2() {
    return new InputDeviceCapabilities();
  }
  get [$firesTouchEvents]() {
    return this.firesTouchEvents;
  }
};
dart.addTypeTests(html$.InputDeviceCapabilities);
const firesTouchEvents = Symbol("InputDeviceCapabilities.firesTouchEvents");
dart.setLibraryUri(html$.InputDeviceCapabilities, "dart:html");
dart.setFieldSignature(html$.InputDeviceCapabilities, () => ({
  __proto__: dart.getFields(html$.InputDeviceCapabilities.__proto__),
  [$firesTouchEvents]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("InputDeviceCapabilities", html$.InputDeviceCapabilities);
const _get_valueAsDate = dart.privateName(html$, "_get_valueAsDate");
const _set_valueAsDate = dart.privateName(html$, "_set_valueAsDate");
html$.InputElement = class InputElement extends html$.HtmlElement {
  static new(opts) {
    let type = opts && 'type' in opts ? opts.type : null;
    let e = html$.InputElement._check(html$.document[$createElement]("input"));
    if (type != null) {
      try {
        e.type = type;
      } catch (e$) {
        let _ = dart.getThrown(e$);
      }
    }
    return e;
  }
  get [$accept]() {
    return this.accept;
  }
  set [$accept](value) {
    this.accept = value;
  }
  get [$alt]() {
    return this.alt;
  }
  set [$alt](value) {
    this.alt = value;
  }
  get [$autocapitalize]() {
    return this.autocapitalize;
  }
  set [$autocapitalize](value) {
    this.autocapitalize = value;
  }
  get [$autocomplete]() {
    return this.autocomplete;
  }
  set [$autocomplete](value) {
    this.autocomplete = value;
  }
  get [$autofocus]() {
    return this.autofocus;
  }
  set [$autofocus](value) {
    this.autofocus = value;
  }
  get [$capture]() {
    return this.capture;
  }
  set [$capture](value) {
    this.capture = value;
  }
  get [$checked]() {
    return this.checked;
  }
  set [$checked](value) {
    this.checked = value;
  }
  get [$defaultChecked]() {
    return this.defaultChecked;
  }
  set [$defaultChecked](value) {
    this.defaultChecked = value;
  }
  get [$defaultValue]() {
    return this.defaultValue;
  }
  set [$defaultValue](value) {
    this.defaultValue = value;
  }
  get [$dirName]() {
    return this.dirName;
  }
  set [$dirName](value) {
    this.dirName = value;
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$files]() {
    return this.files;
  }
  set [$files](value) {
    this.files = value;
  }
  get [$form]() {
    return this.form;
  }
  get [$formAction]() {
    return this.formAction;
  }
  set [$formAction](value) {
    this.formAction = value;
  }
  get [$formEnctype]() {
    return this.formEnctype;
  }
  set [$formEnctype](value) {
    this.formEnctype = value;
  }
  get [$formMethod]() {
    return this.formMethod;
  }
  set [$formMethod](value) {
    this.formMethod = value;
  }
  get [$formNoValidate]() {
    return this.formNoValidate;
  }
  set [$formNoValidate](value) {
    this.formNoValidate = value;
  }
  get [$formTarget]() {
    return this.formTarget;
  }
  set [$formTarget](value) {
    this.formTarget = value;
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$incremental]() {
    return this.incremental;
  }
  set [$incremental](value) {
    this.incremental = value;
  }
  get [$indeterminate]() {
    return this.indeterminate;
  }
  set [$indeterminate](value) {
    this.indeterminate = value;
  }
  get [$labels]() {
    return this.labels;
  }
  get [$list]() {
    return this.list;
  }
  get [$max]() {
    return this.max;
  }
  set [$max](value) {
    this.max = value;
  }
  get [$maxLength]() {
    return this.maxLength;
  }
  set [$maxLength](value) {
    this.maxLength = value;
  }
  get [$min]() {
    return this.min;
  }
  set [$min](value) {
    this.min = value;
  }
  get [$minLength]() {
    return this.minLength;
  }
  set [$minLength](value) {
    this.minLength = value;
  }
  get [$multiple]() {
    return this.multiple;
  }
  set [$multiple](value) {
    this.multiple = value;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$pattern]() {
    return this.pattern;
  }
  set [$pattern](value) {
    this.pattern = value;
  }
  get [$placeholder]() {
    return this.placeholder;
  }
  set [$placeholder](value) {
    this.placeholder = value;
  }
  get [$readOnly]() {
    return this.readOnly;
  }
  set [$readOnly](value) {
    this.readOnly = value;
  }
  get [$required]() {
    return this.required;
  }
  set [$required](value) {
    this.required = value;
  }
  get [$selectionDirection]() {
    return this.selectionDirection;
  }
  set [$selectionDirection](value) {
    this.selectionDirection = value;
  }
  get [$selectionEnd]() {
    return this.selectionEnd;
  }
  set [$selectionEnd](value) {
    this.selectionEnd = value;
  }
  get [$selectionStart]() {
    return this.selectionStart;
  }
  set [$selectionStart](value) {
    this.selectionStart = value;
  }
  get [$size]() {
    return this.size;
  }
  set [$size](value) {
    this.size = value;
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$step]() {
    return this.step;
  }
  set [$step](value) {
    this.step = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  get [$validationMessage]() {
    return this.validationMessage;
  }
  get [$validity]() {
    return this.validity;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  get [$valueAsDate]() {
    return html_common.convertNativeToDart_DateTime(this[_get_valueAsDate]);
  }
  get [_get_valueAsDate]() {
    return this.valueAsDate;
  }
  set [$valueAsDate](value) {
    this[_set_valueAsDate] = html_common.convertDartToNative_DateTime(value);
  }
  set [_set_valueAsDate](value) {
    this.valueAsDate = value;
  }
  get [$valueAsNumber]() {
    return this.valueAsNumber;
  }
  set [$valueAsNumber](value) {
    this.valueAsNumber = value;
  }
  get [$entries]() {
    return this.webkitEntries;
  }
  get [$directory]() {
    return this.webkitdirectory;
  }
  set [$directory](value) {
    this.webkitdirectory = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  get [$willValidate]() {
    return this.willValidate;
  }
  [$checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [$reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [$select](...args) {
    return this.select.apply(this, args);
  }
  [$setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
  [$setRangeText](...args) {
    return this.setRangeText.apply(this, args);
  }
  [$setSelectionRange](...args) {
    return this.setSelectionRange.apply(this, args);
  }
  [$stepDown](...args) {
    return this.stepDown.apply(this, args);
  }
  [$stepUp](...args) {
    return this.stepUp.apply(this, args);
  }
};
(html$.InputElement.created = function() {
  this[accept] = null;
  this[alt$0] = null;
  this[autocapitalize] = null;
  this[autocomplete$0] = null;
  this[autofocus$] = null;
  this[capture] = null;
  this[checked$] = null;
  this[defaultChecked] = null;
  this[defaultValue] = null;
  this[dirName] = null;
  this[disabled$2] = null;
  this[files$] = null;
  this[form$0] = null;
  this[formAction$] = null;
  this[formEnctype$] = null;
  this[formMethod$] = null;
  this[formNoValidate$] = null;
  this[formTarget$] = null;
  this[height$4] = null;
  this[incremental] = null;
  this[indeterminate] = null;
  this[labels$] = null;
  this[list] = null;
  this[max] = null;
  this[maxLength] = null;
  this[min] = null;
  this[minLength] = null;
  this[multiple] = null;
  this[name$19] = null;
  this[pattern] = null;
  this[placeholder$] = null;
  this[readOnly$] = null;
  this[required$] = null;
  this[selectionDirection] = null;
  this[selectionEnd] = null;
  this[selectionStart] = null;
  this[size$0] = null;
  this[src$2] = null;
  this[step] = null;
  this[type$15] = null;
  this[validationMessage$0] = null;
  this[validity$0] = null;
  this[value$7] = null;
  this[_get_valueAsDate] = null;
  this[valueAsNumber] = null;
  this[entries] = null;
  this[directory] = null;
  this[width$4] = null;
  this[willValidate$0] = null;
  html$.InputElement.__proto__.created.call(this);
}).prototype = html$.InputElement.prototype;
dart.addTypeTests(html$.InputElement);
const accept = Symbol("InputElement.accept");
const alt$0 = Symbol("InputElement.alt");
const autocapitalize = Symbol("InputElement.autocapitalize");
const autocomplete$0 = Symbol("InputElement.autocomplete");
const autofocus$ = Symbol("InputElement.autofocus");
const capture = Symbol("InputElement.capture");
const checked$ = Symbol("InputElement.checked");
const defaultChecked = Symbol("InputElement.defaultChecked");
const defaultValue = Symbol("InputElement.defaultValue");
const dirName = Symbol("InputElement.dirName");
const disabled$2 = Symbol("InputElement.disabled");
const files$ = Symbol("InputElement.files");
const form$0 = Symbol("InputElement.form");
const formAction$ = Symbol("InputElement.formAction");
const formEnctype$ = Symbol("InputElement.formEnctype");
const formMethod$ = Symbol("InputElement.formMethod");
const formNoValidate$ = Symbol("InputElement.formNoValidate");
const formTarget$ = Symbol("InputElement.formTarget");
const height$4 = Symbol("InputElement.height");
const incremental = Symbol("InputElement.incremental");
const indeterminate = Symbol("InputElement.indeterminate");
const labels$ = Symbol("InputElement.labels");
const list = Symbol("InputElement.list");
const max = Symbol("InputElement.max");
const maxLength = Symbol("InputElement.maxLength");
const min = Symbol("InputElement.min");
const minLength = Symbol("InputElement.minLength");
const multiple = Symbol("InputElement.multiple");
const name$19 = Symbol("InputElement.name");
const pattern = Symbol("InputElement.pattern");
const placeholder$ = Symbol("InputElement.placeholder");
const readOnly$ = Symbol("InputElement.readOnly");
const required$ = Symbol("InputElement.required");
const selectionDirection = Symbol("InputElement.selectionDirection");
const selectionEnd = Symbol("InputElement.selectionEnd");
const selectionStart = Symbol("InputElement.selectionStart");
const size$0 = Symbol("InputElement.size");
const src$2 = Symbol("InputElement.src");
const step = Symbol("InputElement.step");
const type$15 = Symbol("InputElement.type");
const validationMessage$0 = Symbol("InputElement.validationMessage");
const validity$0 = Symbol("InputElement.validity");
const value$7 = Symbol("InputElement.value");
const valueAsNumber = Symbol("InputElement.valueAsNumber");
const entries = Symbol("InputElement.entries");
const directory = Symbol("InputElement.directory");
const width$4 = Symbol("InputElement.width");
const willValidate$0 = Symbol("InputElement.willValidate");
html$.InputElement[dart.implements] = () => [html$.HiddenInputElement, html$.SearchInputElement, html$.TextInputElement, html$.UrlInputElement, html$.TelephoneInputElement, html$.EmailInputElement, html$.PasswordInputElement, html$.DateInputElement, html$.MonthInputElement, html$.WeekInputElement, html$.TimeInputElement, html$.LocalDateTimeInputElement, html$.NumberInputElement, html$.RangeInputElement, html$.CheckboxInputElement, html$.RadioButtonInputElement, html$.FileUploadInputElement, html$.SubmitButtonInputElement, html$.ImageButtonInputElement, html$.ResetButtonInputElement, html$.ButtonInputElement];
dart.setMethodSignature(html$.InputElement, () => ({
  __proto__: dart.getMethods(html$.InputElement.__proto__),
  [$checkValidity]: dart.fnType(core.bool, []),
  [$reportValidity]: dart.fnType(core.bool, []),
  [$select]: dart.fnType(dart.void, []),
  [$setCustomValidity]: dart.fnType(dart.void, [core.String]),
  [$setRangeText]: dart.fnType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
  [$setSelectionRange]: dart.fnType(dart.void, [core.int, core.int], [core.String]),
  [$stepDown]: dart.fnType(dart.void, [], [core.int]),
  [$stepUp]: dart.fnType(dart.void, [], [core.int])
}));
dart.setGetterSignature(html$.InputElement, () => ({
  __proto__: dart.getGetters(html$.InputElement.__proto__),
  [$valueAsDate]: core.DateTime
}));
dart.setSetterSignature(html$.InputElement, () => ({
  __proto__: dart.getSetters(html$.InputElement.__proto__),
  [$valueAsDate]: core.DateTime,
  [_set_valueAsDate]: dart.dynamic
}));
dart.setLibraryUri(html$.InputElement, "dart:html");
dart.setFieldSignature(html$.InputElement, () => ({
  __proto__: dart.getFields(html$.InputElement.__proto__),
  [$accept]: dart.fieldType(core.String),
  [$alt]: dart.fieldType(core.String),
  [$autocapitalize]: dart.fieldType(core.String),
  [$autocomplete]: dart.fieldType(core.String),
  [$autofocus]: dart.fieldType(core.bool),
  [$capture]: dart.fieldType(core.String),
  [$checked]: dart.fieldType(core.bool),
  [$defaultChecked]: dart.fieldType(core.bool),
  [$defaultValue]: dart.fieldType(core.String),
  [$dirName]: dart.fieldType(core.String),
  [$disabled]: dart.fieldType(core.bool),
  [$files]: dart.fieldType(ListOfFile()),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$formAction]: dart.fieldType(core.String),
  [$formEnctype]: dart.fieldType(core.String),
  [$formMethod]: dart.fieldType(core.String),
  [$formNoValidate]: dart.fieldType(core.bool),
  [$formTarget]: dart.fieldType(core.String),
  [$height]: dart.fieldType(core.int),
  [$incremental]: dart.fieldType(core.bool),
  [$indeterminate]: dart.fieldType(core.bool),
  [$labels]: dart.finalFieldType(ListOfNode()),
  [$list]: dart.finalFieldType(html$.HtmlElement),
  [$max]: dart.fieldType(core.String),
  [$maxLength]: dart.fieldType(core.int),
  [$min]: dart.fieldType(core.String),
  [$minLength]: dart.fieldType(core.int),
  [$multiple]: dart.fieldType(core.bool),
  [$name]: dart.fieldType(core.String),
  [$pattern]: dart.fieldType(core.String),
  [$placeholder]: dart.fieldType(core.String),
  [$readOnly]: dart.fieldType(core.bool),
  [$required]: dart.fieldType(core.bool),
  [$selectionDirection]: dart.fieldType(core.String),
  [$selectionEnd]: dart.fieldType(core.int),
  [$selectionStart]: dart.fieldType(core.int),
  [$size]: dart.fieldType(core.int),
  [$src]: dart.fieldType(core.String),
  [$step]: dart.fieldType(core.String),
  [$type]: dart.fieldType(core.String),
  [$validationMessage]: dart.finalFieldType(core.String),
  [$validity]: dart.finalFieldType(html$.ValidityState),
  [$value]: dart.fieldType(core.String),
  [_get_valueAsDate]: dart.finalFieldType(dart.dynamic),
  [$valueAsNumber]: dart.fieldType(core.num),
  [$entries]: dart.finalFieldType(ListOfEntry()),
  [$directory]: dart.fieldType(core.bool),
  [$width]: dart.fieldType(core.int),
  [$willValidate]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("HTMLInputElement", html$.InputElement);
html$.InputElementBase = class InputElementBase extends core.Object {
  get autofocus() {
    return this[autofocus$0];
  }
  set autofocus(value) {
    this[autofocus$0] = value;
  }
  get disabled() {
    return this[disabled$3];
  }
  set disabled(value) {
    this[disabled$3] = value;
  }
  get incremental() {
    return this[incremental$];
  }
  set incremental(value) {
    this[incremental$] = value;
  }
  get indeterminate() {
    return this[indeterminate$];
  }
  set indeterminate(value) {
    this[indeterminate$] = value;
  }
  get name() {
    return this[name$20];
  }
  set name(value) {
    this[name$20] = value;
  }
  get value() {
    return this[value$8];
  }
  set value(value) {
    this[value$8] = value;
  }
};
(html$.InputElementBase.new = function() {
  this[autofocus$0] = null;
  this[disabled$3] = null;
  this[incremental$] = null;
  this[indeterminate$] = null;
  this[name$20] = null;
  this[value$8] = null;
}).prototype = html$.InputElementBase.prototype;
dart.addTypeTests(html$.InputElementBase);
const autofocus$0 = Symbol("InputElementBase.autofocus");
const disabled$3 = Symbol("InputElementBase.disabled");
const incremental$ = Symbol("InputElementBase.incremental");
const indeterminate$ = Symbol("InputElementBase.indeterminate");
const name$20 = Symbol("InputElementBase.name");
const value$8 = Symbol("InputElementBase.value");
html$.InputElementBase[dart.implements] = () => [html$.Element];
dart.setLibraryUri(html$.InputElementBase, "dart:html");
dart.setFieldSignature(html$.InputElementBase, () => ({
  __proto__: dart.getFields(html$.InputElementBase.__proto__),
  autofocus: dart.fieldType(core.bool),
  disabled: dart.fieldType(core.bool),
  incremental: dart.fieldType(core.bool),
  indeterminate: dart.fieldType(core.bool),
  name: dart.fieldType(core.String),
  value: dart.fieldType(core.String)
}));
dart.defineExtensionAccessors(html$.InputElementBase, [
  'autofocus',
  'disabled',
  'incremental',
  'indeterminate',
  'name',
  'value'
]);
html$.HiddenInputElement = class HiddenInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "hidden"});
  }
};
(html$.HiddenInputElement[dart.mixinNew] = function() {
}).prototype = html$.HiddenInputElement.prototype;
dart.addTypeTests(html$.HiddenInputElement);
html$.HiddenInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.HiddenInputElement, "dart:html");
html$.TextInputElementBase = class TextInputElementBase extends core.Object {
  get autocomplete() {
    return this[autocomplete$1];
  }
  set autocomplete(value) {
    this[autocomplete$1] = value;
  }
  get maxLength() {
    return this[maxLength$];
  }
  set maxLength(value) {
    this[maxLength$] = value;
  }
  get pattern() {
    return this[pattern$];
  }
  set pattern(value) {
    this[pattern$] = value;
  }
  get placeholder() {
    return this[placeholder$0];
  }
  set placeholder(value) {
    this[placeholder$0] = value;
  }
  get readOnly() {
    return this[readOnly$0];
  }
  set readOnly(value) {
    this[readOnly$0] = value;
  }
  get required() {
    return this[required$0];
  }
  set required(value) {
    this[required$0] = value;
  }
  get size() {
    return this[size$1];
  }
  set size(value) {
    this[size$1] = value;
  }
  get selectionDirection() {
    return this[selectionDirection$];
  }
  set selectionDirection(value) {
    this[selectionDirection$] = value;
  }
  get selectionEnd() {
    return this[selectionEnd$];
  }
  set selectionEnd(value) {
    this[selectionEnd$] = value;
  }
  get selectionStart() {
    return this[selectionStart$];
  }
  set selectionStart(value) {
    this[selectionStart$] = value;
  }
};
(html$.TextInputElementBase.new = function() {
  this[autocomplete$1] = null;
  this[maxLength$] = null;
  this[pattern$] = null;
  this[placeholder$0] = null;
  this[readOnly$0] = null;
  this[required$0] = null;
  this[size$1] = null;
  this[selectionDirection$] = null;
  this[selectionEnd$] = null;
  this[selectionStart$] = null;
}).prototype = html$.TextInputElementBase.prototype;
dart.addTypeTests(html$.TextInputElementBase);
const autocomplete$1 = Symbol("TextInputElementBase.autocomplete");
const maxLength$ = Symbol("TextInputElementBase.maxLength");
const pattern$ = Symbol("TextInputElementBase.pattern");
const placeholder$0 = Symbol("TextInputElementBase.placeholder");
const readOnly$0 = Symbol("TextInputElementBase.readOnly");
const required$0 = Symbol("TextInputElementBase.required");
const size$1 = Symbol("TextInputElementBase.size");
const selectionDirection$ = Symbol("TextInputElementBase.selectionDirection");
const selectionEnd$ = Symbol("TextInputElementBase.selectionEnd");
const selectionStart$ = Symbol("TextInputElementBase.selectionStart");
html$.TextInputElementBase[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.TextInputElementBase, "dart:html");
dart.setFieldSignature(html$.TextInputElementBase, () => ({
  __proto__: dart.getFields(html$.TextInputElementBase.__proto__),
  autocomplete: dart.fieldType(core.String),
  maxLength: dart.fieldType(core.int),
  pattern: dart.fieldType(core.String),
  placeholder: dart.fieldType(core.String),
  readOnly: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool),
  size: dart.fieldType(core.int),
  selectionDirection: dart.fieldType(core.String),
  selectionEnd: dart.fieldType(core.int),
  selectionStart: dart.fieldType(core.int)
}));
dart.defineExtensionAccessors(html$.TextInputElementBase, [
  'autocomplete',
  'maxLength',
  'pattern',
  'placeholder',
  'readOnly',
  'required',
  'size',
  'selectionDirection',
  'selectionEnd',
  'selectionStart'
]);
html$.SearchInputElement = class SearchInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "search"});
  }
  get dirName() {
    return this[dirName$];
  }
  set dirName(value) {
    this[dirName$] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: "search"}).type === "search";
  }
};
(html$.SearchInputElement[dart.mixinNew] = function() {
  this[dirName$] = null;
}).prototype = html$.SearchInputElement.prototype;
dart.addTypeTests(html$.SearchInputElement);
const dirName$ = Symbol("SearchInputElement.dirName");
html$.SearchInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setLibraryUri(html$.SearchInputElement, "dart:html");
dart.setFieldSignature(html$.SearchInputElement, () => ({
  __proto__: dart.getFields(html$.SearchInputElement.__proto__),
  dirName: dart.fieldType(core.String)
}));
dart.defineExtensionAccessors(html$.SearchInputElement, ['dirName']);
html$.TextInputElement = class TextInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "text"});
  }
  get dirName() {
    return this[dirName$0];
  }
  set dirName(value) {
    this[dirName$0] = value;
  }
};
(html$.TextInputElement[dart.mixinNew] = function() {
  this[dirName$0] = null;
}).prototype = html$.TextInputElement.prototype;
dart.addTypeTests(html$.TextInputElement);
const dirName$0 = Symbol("TextInputElement.dirName");
html$.TextInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setLibraryUri(html$.TextInputElement, "dart:html");
dart.setFieldSignature(html$.TextInputElement, () => ({
  __proto__: dart.getFields(html$.TextInputElement.__proto__),
  dirName: dart.fieldType(core.String)
}));
dart.defineExtensionAccessors(html$.TextInputElement, ['dirName']);
html$.UrlInputElement = class UrlInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "url"});
  }
  static get supported() {
    return html$.InputElement.new({type: "url"}).type === "url";
  }
};
(html$.UrlInputElement[dart.mixinNew] = function() {
}).prototype = html$.UrlInputElement.prototype;
dart.addTypeTests(html$.UrlInputElement);
html$.UrlInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setLibraryUri(html$.UrlInputElement, "dart:html");
html$.TelephoneInputElement = class TelephoneInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "tel"});
  }
  static get supported() {
    return html$.InputElement.new({type: "tel"}).type === "tel";
  }
};
(html$.TelephoneInputElement[dart.mixinNew] = function() {
}).prototype = html$.TelephoneInputElement.prototype;
dart.addTypeTests(html$.TelephoneInputElement);
html$.TelephoneInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setLibraryUri(html$.TelephoneInputElement, "dart:html");
html$.EmailInputElement = class EmailInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "email"});
  }
  get autocomplete() {
    return this[autocomplete$2];
  }
  set autocomplete(value) {
    this[autocomplete$2] = value;
  }
  get autofocus() {
    return this[autofocus$1];
  }
  set autofocus(value) {
    this[autofocus$1] = value;
  }
  get maxLength() {
    return this[maxLength$0];
  }
  set maxLength(value) {
    this[maxLength$0] = value;
  }
  get multiple() {
    return this[multiple$];
  }
  set multiple(value) {
    this[multiple$] = value;
  }
  get pattern() {
    return this[pattern$0];
  }
  set pattern(value) {
    this[pattern$0] = value;
  }
  get placeholder() {
    return this[placeholder$1];
  }
  set placeholder(value) {
    this[placeholder$1] = value;
  }
  get readOnly() {
    return this[readOnly$1];
  }
  set readOnly(value) {
    this[readOnly$1] = value;
  }
  get required() {
    return this[required$1];
  }
  set required(value) {
    this[required$1] = value;
  }
  get size() {
    return this[size$2];
  }
  set size(value) {
    this[size$2] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: "email"}).type === "email";
  }
};
(html$.EmailInputElement[dart.mixinNew] = function() {
  this[autocomplete$2] = null;
  this[autofocus$1] = null;
  this[maxLength$0] = null;
  this[multiple$] = null;
  this[pattern$0] = null;
  this[placeholder$1] = null;
  this[readOnly$1] = null;
  this[required$1] = null;
  this[size$2] = null;
}).prototype = html$.EmailInputElement.prototype;
dart.addTypeTests(html$.EmailInputElement);
const autocomplete$2 = Symbol("EmailInputElement.autocomplete");
const autofocus$1 = Symbol("EmailInputElement.autofocus");
const maxLength$0 = Symbol("EmailInputElement.maxLength");
const multiple$ = Symbol("EmailInputElement.multiple");
const pattern$0 = Symbol("EmailInputElement.pattern");
const placeholder$1 = Symbol("EmailInputElement.placeholder");
const readOnly$1 = Symbol("EmailInputElement.readOnly");
const required$1 = Symbol("EmailInputElement.required");
const size$2 = Symbol("EmailInputElement.size");
html$.EmailInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setLibraryUri(html$.EmailInputElement, "dart:html");
dart.setFieldSignature(html$.EmailInputElement, () => ({
  __proto__: dart.getFields(html$.EmailInputElement.__proto__),
  autocomplete: dart.fieldType(core.String),
  autofocus: dart.fieldType(core.bool),
  maxLength: dart.fieldType(core.int),
  multiple: dart.fieldType(core.bool),
  pattern: dart.fieldType(core.String),
  placeholder: dart.fieldType(core.String),
  readOnly: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool),
  size: dart.fieldType(core.int)
}));
dart.defineExtensionAccessors(html$.EmailInputElement, [
  'autocomplete',
  'autofocus',
  'maxLength',
  'multiple',
  'pattern',
  'placeholder',
  'readOnly',
  'required',
  'size'
]);
html$.PasswordInputElement = class PasswordInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "password"});
  }
};
(html$.PasswordInputElement[dart.mixinNew] = function() {
}).prototype = html$.PasswordInputElement.prototype;
dart.addTypeTests(html$.PasswordInputElement);
html$.PasswordInputElement[dart.implements] = () => [html$.TextInputElementBase];
dart.setLibraryUri(html$.PasswordInputElement, "dart:html");
html$.RangeInputElementBase = class RangeInputElementBase extends core.Object {
  get max() {
    return this[max$0];
  }
  set max(value) {
    this[max$0] = value;
  }
  get min() {
    return this[min$0];
  }
  set min(value) {
    this[min$0] = value;
  }
  get step() {
    return this[step$];
  }
  set step(value) {
    this[step$] = value;
  }
  get valueAsNumber() {
    return this[valueAsNumber$];
  }
  set valueAsNumber(value) {
    this[valueAsNumber$] = value;
  }
};
(html$.RangeInputElementBase.new = function() {
  this[max$0] = null;
  this[min$0] = null;
  this[step$] = null;
  this[valueAsNumber$] = null;
}).prototype = html$.RangeInputElementBase.prototype;
dart.addTypeTests(html$.RangeInputElementBase);
const max$0 = Symbol("RangeInputElementBase.max");
const min$0 = Symbol("RangeInputElementBase.min");
const step$ = Symbol("RangeInputElementBase.step");
const valueAsNumber$ = Symbol("RangeInputElementBase.valueAsNumber");
html$.RangeInputElementBase[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.RangeInputElementBase, "dart:html");
dart.setFieldSignature(html$.RangeInputElementBase, () => ({
  __proto__: dart.getFields(html$.RangeInputElementBase.__proto__),
  max: dart.fieldType(core.String),
  min: dart.fieldType(core.String),
  step: dart.fieldType(core.String),
  valueAsNumber: dart.fieldType(core.num)
}));
dart.defineExtensionAccessors(html$.RangeInputElementBase, ['max', 'min', 'step', 'valueAsNumber']);
html$.DateInputElement = class DateInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "date"});
  }
  get valueAsDate() {
    return this[valueAsDate];
  }
  set valueAsDate(value) {
    this[valueAsDate] = value;
  }
  get readOnly() {
    return this[readOnly$2];
  }
  set readOnly(value) {
    this[readOnly$2] = value;
  }
  get required() {
    return this[required$2];
  }
  set required(value) {
    this[required$2] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: "date"}).type === "date";
  }
};
(html$.DateInputElement[dart.mixinNew] = function() {
  this[valueAsDate] = null;
  this[readOnly$2] = null;
  this[required$2] = null;
}).prototype = html$.DateInputElement.prototype;
dart.addTypeTests(html$.DateInputElement);
const valueAsDate = Symbol("DateInputElement.valueAsDate");
const readOnly$2 = Symbol("DateInputElement.readOnly");
const required$2 = Symbol("DateInputElement.required");
html$.DateInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setLibraryUri(html$.DateInputElement, "dart:html");
dart.setFieldSignature(html$.DateInputElement, () => ({
  __proto__: dart.getFields(html$.DateInputElement.__proto__),
  valueAsDate: dart.fieldType(core.DateTime),
  readOnly: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.DateInputElement, ['valueAsDate', 'readOnly', 'required']);
html$.MonthInputElement = class MonthInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "month"});
  }
  get valueAsDate() {
    return this[valueAsDate$];
  }
  set valueAsDate(value) {
    this[valueAsDate$] = value;
  }
  get readOnly() {
    return this[readOnly$3];
  }
  set readOnly(value) {
    this[readOnly$3] = value;
  }
  get required() {
    return this[required$3];
  }
  set required(value) {
    this[required$3] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: "month"}).type === "month";
  }
};
(html$.MonthInputElement[dart.mixinNew] = function() {
  this[valueAsDate$] = null;
  this[readOnly$3] = null;
  this[required$3] = null;
}).prototype = html$.MonthInputElement.prototype;
dart.addTypeTests(html$.MonthInputElement);
const valueAsDate$ = Symbol("MonthInputElement.valueAsDate");
const readOnly$3 = Symbol("MonthInputElement.readOnly");
const required$3 = Symbol("MonthInputElement.required");
html$.MonthInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setLibraryUri(html$.MonthInputElement, "dart:html");
dart.setFieldSignature(html$.MonthInputElement, () => ({
  __proto__: dart.getFields(html$.MonthInputElement.__proto__),
  valueAsDate: dart.fieldType(core.DateTime),
  readOnly: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.MonthInputElement, ['valueAsDate', 'readOnly', 'required']);
html$.WeekInputElement = class WeekInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "week"});
  }
  get valueAsDate() {
    return this[valueAsDate$0];
  }
  set valueAsDate(value) {
    this[valueAsDate$0] = value;
  }
  get readOnly() {
    return this[readOnly$4];
  }
  set readOnly(value) {
    this[readOnly$4] = value;
  }
  get required() {
    return this[required$4];
  }
  set required(value) {
    this[required$4] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: "week"}).type === "week";
  }
};
(html$.WeekInputElement[dart.mixinNew] = function() {
  this[valueAsDate$0] = null;
  this[readOnly$4] = null;
  this[required$4] = null;
}).prototype = html$.WeekInputElement.prototype;
dart.addTypeTests(html$.WeekInputElement);
const valueAsDate$0 = Symbol("WeekInputElement.valueAsDate");
const readOnly$4 = Symbol("WeekInputElement.readOnly");
const required$4 = Symbol("WeekInputElement.required");
html$.WeekInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setLibraryUri(html$.WeekInputElement, "dart:html");
dart.setFieldSignature(html$.WeekInputElement, () => ({
  __proto__: dart.getFields(html$.WeekInputElement.__proto__),
  valueAsDate: dart.fieldType(core.DateTime),
  readOnly: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.WeekInputElement, ['valueAsDate', 'readOnly', 'required']);
html$.TimeInputElement = class TimeInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "time"});
  }
  get valueAsDate() {
    return this[valueAsDate$1];
  }
  set valueAsDate(value) {
    this[valueAsDate$1] = value;
  }
  get readOnly() {
    return this[readOnly$5];
  }
  set readOnly(value) {
    this[readOnly$5] = value;
  }
  get required() {
    return this[required$5];
  }
  set required(value) {
    this[required$5] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: "time"}).type === "time";
  }
};
(html$.TimeInputElement[dart.mixinNew] = function() {
  this[valueAsDate$1] = null;
  this[readOnly$5] = null;
  this[required$5] = null;
}).prototype = html$.TimeInputElement.prototype;
dart.addTypeTests(html$.TimeInputElement);
const valueAsDate$1 = Symbol("TimeInputElement.valueAsDate");
const readOnly$5 = Symbol("TimeInputElement.readOnly");
const required$5 = Symbol("TimeInputElement.required");
html$.TimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setLibraryUri(html$.TimeInputElement, "dart:html");
dart.setFieldSignature(html$.TimeInputElement, () => ({
  __proto__: dart.getFields(html$.TimeInputElement.__proto__),
  valueAsDate: dart.fieldType(core.DateTime),
  readOnly: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.TimeInputElement, ['valueAsDate', 'readOnly', 'required']);
html$.LocalDateTimeInputElement = class LocalDateTimeInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "datetime-local"});
  }
  get readOnly() {
    return this[readOnly$6];
  }
  set readOnly(value) {
    this[readOnly$6] = value;
  }
  get required() {
    return this[required$6];
  }
  set required(value) {
    this[required$6] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: "datetime-local"}).type === "datetime-local";
  }
};
(html$.LocalDateTimeInputElement[dart.mixinNew] = function() {
  this[readOnly$6] = null;
  this[required$6] = null;
}).prototype = html$.LocalDateTimeInputElement.prototype;
dart.addTypeTests(html$.LocalDateTimeInputElement);
const readOnly$6 = Symbol("LocalDateTimeInputElement.readOnly");
const required$6 = Symbol("LocalDateTimeInputElement.required");
html$.LocalDateTimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setLibraryUri(html$.LocalDateTimeInputElement, "dart:html");
dart.setFieldSignature(html$.LocalDateTimeInputElement, () => ({
  __proto__: dart.getFields(html$.LocalDateTimeInputElement.__proto__),
  readOnly: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.LocalDateTimeInputElement, ['readOnly', 'required']);
html$.NumberInputElement = class NumberInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "number"});
  }
  get placeholder() {
    return this[placeholder$2];
  }
  set placeholder(value) {
    this[placeholder$2] = value;
  }
  get readOnly() {
    return this[readOnly$7];
  }
  set readOnly(value) {
    this[readOnly$7] = value;
  }
  get required() {
    return this[required$7];
  }
  set required(value) {
    this[required$7] = value;
  }
  static get supported() {
    return html$.InputElement.new({type: "number"}).type === "number";
  }
};
(html$.NumberInputElement[dart.mixinNew] = function() {
  this[placeholder$2] = null;
  this[readOnly$7] = null;
  this[required$7] = null;
}).prototype = html$.NumberInputElement.prototype;
dart.addTypeTests(html$.NumberInputElement);
const placeholder$2 = Symbol("NumberInputElement.placeholder");
const readOnly$7 = Symbol("NumberInputElement.readOnly");
const required$7 = Symbol("NumberInputElement.required");
html$.NumberInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setLibraryUri(html$.NumberInputElement, "dart:html");
dart.setFieldSignature(html$.NumberInputElement, () => ({
  __proto__: dart.getFields(html$.NumberInputElement.__proto__),
  placeholder: dart.fieldType(core.String),
  readOnly: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.NumberInputElement, ['placeholder', 'readOnly', 'required']);
html$.RangeInputElement = class RangeInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "range"});
  }
  static get supported() {
    return html$.InputElement.new({type: "range"}).type === "range";
  }
};
(html$.RangeInputElement[dart.mixinNew] = function() {
}).prototype = html$.RangeInputElement.prototype;
dart.addTypeTests(html$.RangeInputElement);
html$.RangeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
dart.setLibraryUri(html$.RangeInputElement, "dart:html");
html$.CheckboxInputElement = class CheckboxInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "checkbox"});
  }
  get checked() {
    return this[checked$0];
  }
  set checked(value) {
    this[checked$0] = value;
  }
  get required() {
    return this[required$8];
  }
  set required(value) {
    this[required$8] = value;
  }
};
(html$.CheckboxInputElement[dart.mixinNew] = function() {
  this[checked$0] = null;
  this[required$8] = null;
}).prototype = html$.CheckboxInputElement.prototype;
dart.addTypeTests(html$.CheckboxInputElement);
const checked$0 = Symbol("CheckboxInputElement.checked");
const required$8 = Symbol("CheckboxInputElement.required");
html$.CheckboxInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.CheckboxInputElement, "dart:html");
dart.setFieldSignature(html$.CheckboxInputElement, () => ({
  __proto__: dart.getFields(html$.CheckboxInputElement.__proto__),
  checked: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.CheckboxInputElement, ['checked', 'required']);
html$.RadioButtonInputElement = class RadioButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "radio"});
  }
  get checked() {
    return this[checked$1];
  }
  set checked(value) {
    this[checked$1] = value;
  }
  get required() {
    return this[required$9];
  }
  set required(value) {
    this[required$9] = value;
  }
};
(html$.RadioButtonInputElement[dart.mixinNew] = function() {
  this[checked$1] = null;
  this[required$9] = null;
}).prototype = html$.RadioButtonInputElement.prototype;
dart.addTypeTests(html$.RadioButtonInputElement);
const checked$1 = Symbol("RadioButtonInputElement.checked");
const required$9 = Symbol("RadioButtonInputElement.required");
html$.RadioButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.RadioButtonInputElement, "dart:html");
dart.setFieldSignature(html$.RadioButtonInputElement, () => ({
  __proto__: dart.getFields(html$.RadioButtonInputElement.__proto__),
  checked: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.RadioButtonInputElement, ['checked', 'required']);
html$.FileUploadInputElement = class FileUploadInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "file"});
  }
  get accept() {
    return this[accept$];
  }
  set accept(value) {
    this[accept$] = value;
  }
  get multiple() {
    return this[multiple$0];
  }
  set multiple(value) {
    this[multiple$0] = value;
  }
  get required() {
    return this[required$10];
  }
  set required(value) {
    this[required$10] = value;
  }
  get files() {
    return this[files$0];
  }
  set files(value) {
    this[files$0] = value;
  }
};
(html$.FileUploadInputElement[dart.mixinNew] = function() {
  this[accept$] = null;
  this[multiple$0] = null;
  this[required$10] = null;
  this[files$0] = null;
}).prototype = html$.FileUploadInputElement.prototype;
dart.addTypeTests(html$.FileUploadInputElement);
const accept$ = Symbol("FileUploadInputElement.accept");
const multiple$0 = Symbol("FileUploadInputElement.multiple");
const required$10 = Symbol("FileUploadInputElement.required");
const files$0 = Symbol("FileUploadInputElement.files");
html$.FileUploadInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.FileUploadInputElement, "dart:html");
dart.setFieldSignature(html$.FileUploadInputElement, () => ({
  __proto__: dart.getFields(html$.FileUploadInputElement.__proto__),
  accept: dart.fieldType(core.String),
  multiple: dart.fieldType(core.bool),
  required: dart.fieldType(core.bool),
  files: dart.fieldType(ListOfFile())
}));
dart.defineExtensionAccessors(html$.FileUploadInputElement, ['accept', 'multiple', 'required', 'files']);
html$.SubmitButtonInputElement = class SubmitButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "submit"});
  }
  get formAction() {
    return this[formAction$0];
  }
  set formAction(value) {
    this[formAction$0] = value;
  }
  get formEnctype() {
    return this[formEnctype$0];
  }
  set formEnctype(value) {
    this[formEnctype$0] = value;
  }
  get formMethod() {
    return this[formMethod$0];
  }
  set formMethod(value) {
    this[formMethod$0] = value;
  }
  get formNoValidate() {
    return this[formNoValidate$0];
  }
  set formNoValidate(value) {
    this[formNoValidate$0] = value;
  }
  get formTarget() {
    return this[formTarget$0];
  }
  set formTarget(value) {
    this[formTarget$0] = value;
  }
};
(html$.SubmitButtonInputElement[dart.mixinNew] = function() {
  this[formAction$0] = null;
  this[formEnctype$0] = null;
  this[formMethod$0] = null;
  this[formNoValidate$0] = null;
  this[formTarget$0] = null;
}).prototype = html$.SubmitButtonInputElement.prototype;
dart.addTypeTests(html$.SubmitButtonInputElement);
const formAction$0 = Symbol("SubmitButtonInputElement.formAction");
const formEnctype$0 = Symbol("SubmitButtonInputElement.formEnctype");
const formMethod$0 = Symbol("SubmitButtonInputElement.formMethod");
const formNoValidate$0 = Symbol("SubmitButtonInputElement.formNoValidate");
const formTarget$0 = Symbol("SubmitButtonInputElement.formTarget");
html$.SubmitButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.SubmitButtonInputElement, "dart:html");
dart.setFieldSignature(html$.SubmitButtonInputElement, () => ({
  __proto__: dart.getFields(html$.SubmitButtonInputElement.__proto__),
  formAction: dart.fieldType(core.String),
  formEnctype: dart.fieldType(core.String),
  formMethod: dart.fieldType(core.String),
  formNoValidate: dart.fieldType(core.bool),
  formTarget: dart.fieldType(core.String)
}));
dart.defineExtensionAccessors(html$.SubmitButtonInputElement, [
  'formAction',
  'formEnctype',
  'formMethod',
  'formNoValidate',
  'formTarget'
]);
html$.ImageButtonInputElement = class ImageButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "image"});
  }
  get alt() {
    return this[alt$1];
  }
  set alt(value) {
    this[alt$1] = value;
  }
  get formAction() {
    return this[formAction$1];
  }
  set formAction(value) {
    this[formAction$1] = value;
  }
  get formEnctype() {
    return this[formEnctype$1];
  }
  set formEnctype(value) {
    this[formEnctype$1] = value;
  }
  get formMethod() {
    return this[formMethod$1];
  }
  set formMethod(value) {
    this[formMethod$1] = value;
  }
  get formNoValidate() {
    return this[formNoValidate$1];
  }
  set formNoValidate(value) {
    this[formNoValidate$1] = value;
  }
  get formTarget() {
    return this[formTarget$1];
  }
  set formTarget(value) {
    this[formTarget$1] = value;
  }
  get height() {
    return this[height$5];
  }
  set height(value) {
    this[height$5] = value;
  }
  get src() {
    return this[src$3];
  }
  set src(value) {
    this[src$3] = value;
  }
  get width() {
    return this[width$5];
  }
  set width(value) {
    this[width$5] = value;
  }
};
(html$.ImageButtonInputElement[dart.mixinNew] = function() {
  this[alt$1] = null;
  this[formAction$1] = null;
  this[formEnctype$1] = null;
  this[formMethod$1] = null;
  this[formNoValidate$1] = null;
  this[formTarget$1] = null;
  this[height$5] = null;
  this[src$3] = null;
  this[width$5] = null;
}).prototype = html$.ImageButtonInputElement.prototype;
dart.addTypeTests(html$.ImageButtonInputElement);
const alt$1 = Symbol("ImageButtonInputElement.alt");
const formAction$1 = Symbol("ImageButtonInputElement.formAction");
const formEnctype$1 = Symbol("ImageButtonInputElement.formEnctype");
const formMethod$1 = Symbol("ImageButtonInputElement.formMethod");
const formNoValidate$1 = Symbol("ImageButtonInputElement.formNoValidate");
const formTarget$1 = Symbol("ImageButtonInputElement.formTarget");
const height$5 = Symbol("ImageButtonInputElement.height");
const src$3 = Symbol("ImageButtonInputElement.src");
const width$5 = Symbol("ImageButtonInputElement.width");
html$.ImageButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.ImageButtonInputElement, "dart:html");
dart.setFieldSignature(html$.ImageButtonInputElement, () => ({
  __proto__: dart.getFields(html$.ImageButtonInputElement.__proto__),
  alt: dart.fieldType(core.String),
  formAction: dart.fieldType(core.String),
  formEnctype: dart.fieldType(core.String),
  formMethod: dart.fieldType(core.String),
  formNoValidate: dart.fieldType(core.bool),
  formTarget: dart.fieldType(core.String),
  height: dart.fieldType(core.int),
  src: dart.fieldType(core.String),
  width: dart.fieldType(core.int)
}));
dart.defineExtensionAccessors(html$.ImageButtonInputElement, [
  'alt',
  'formAction',
  'formEnctype',
  'formMethod',
  'formNoValidate',
  'formTarget',
  'height',
  'src',
  'width'
]);
html$.ResetButtonInputElement = class ResetButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "reset"});
  }
};
(html$.ResetButtonInputElement[dart.mixinNew] = function() {
}).prototype = html$.ResetButtonInputElement.prototype;
dart.addTypeTests(html$.ResetButtonInputElement);
html$.ResetButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.ResetButtonInputElement, "dart:html");
html$.ButtonInputElement = class ButtonInputElement extends core.Object {
  static new() {
    return html$.InputElement.new({type: "button"});
  }
};
(html$.ButtonInputElement[dart.mixinNew] = function() {
}).prototype = html$.ButtonInputElement.prototype;
dart.addTypeTests(html$.ButtonInputElement);
html$.ButtonInputElement[dart.implements] = () => [html$.InputElementBase];
dart.setLibraryUri(html$.ButtonInputElement, "dart:html");
const _registerForeignFetch_1 = dart.privateName(html$, "_registerForeignFetch_1");
html$.InstallEvent = class InstallEvent$ extends html$.ExtendableEvent {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.InstallEvent._create_1(type, eventInitDict_1);
    }
    return html$.InstallEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new InstallEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new InstallEvent(type);
  }
  [$registerForeignFetch](options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    this[_registerForeignFetch_1](options_1);
    return;
  }
  [_registerForeignFetch_1](...args) {
    return this.registerForeignFetch.apply(this, args);
  }
};
dart.addTypeTests(html$.InstallEvent);
dart.setMethodSignature(html$.InstallEvent, () => ({
  __proto__: dart.getMethods(html$.InstallEvent.__proto__),
  [$registerForeignFetch]: dart.fnType(dart.void, [core.Map]),
  [_registerForeignFetch_1]: dart.fnType(dart.void, [dart.dynamic])
}));
dart.setLibraryUri(html$.InstallEvent, "dart:html");
dart.registerExtension("InstallEvent", html$.InstallEvent);
html$.IntersectionObserver = class IntersectionObserver$ extends _interceptors.Interceptor {
  static new(callback, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let callback_1 = _js_helper.convertDartClosureToJS(ListAndIntersectionObserverTovoid(), callback, 2);
      let options_2 = html_common.convertDartToNative_Dictionary(options);
      return html$.IntersectionObserver._create_1(callback_1, options_2);
    }
    let callback_1 = _js_helper.convertDartClosureToJS(ListAndIntersectionObserverTovoid(), callback, 2);
    return html$.IntersectionObserver._create_2(callback_1);
  }
  static _create_1(callback, options) {
    return new IntersectionObserver(callback, options);
  }
  static _create_2(callback) {
    return new IntersectionObserver(callback);
  }
  get [$root]() {
    return this.root;
  }
  get [$rootMargin]() {
    return this.rootMargin;
  }
  get [$thresholds]() {
    return this.thresholds;
  }
  [$disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [$observe](...args) {
    return this.observe.apply(this, args);
  }
  [$takeRecords](...args) {
    return this.takeRecords.apply(this, args);
  }
  [$unobserve](...args) {
    return this.unobserve.apply(this, args);
  }
};
dart.addTypeTests(html$.IntersectionObserver);
const root$ = Symbol("IntersectionObserver.root");
const rootMargin = Symbol("IntersectionObserver.rootMargin");
const thresholds = Symbol("IntersectionObserver.thresholds");
dart.setMethodSignature(html$.IntersectionObserver, () => ({
  __proto__: dart.getMethods(html$.IntersectionObserver.__proto__),
  [$disconnect]: dart.fnType(dart.void, []),
  [$observe]: dart.fnType(dart.void, [html$.Element]),
  [$takeRecords]: dart.fnType(core.List$(html$.IntersectionObserverEntry), []),
  [$unobserve]: dart.fnType(dart.void, [html$.Element])
}));
dart.setLibraryUri(html$.IntersectionObserver, "dart:html");
dart.setFieldSignature(html$.IntersectionObserver, () => ({
  __proto__: dart.getFields(html$.IntersectionObserver.__proto__),
  [$root]: dart.finalFieldType(html$.Element),
  [$rootMargin]: dart.finalFieldType(core.String),
  [$thresholds]: dart.finalFieldType(ListOfnum())
}));
dart.registerExtension("IntersectionObserver", html$.IntersectionObserver);
html$.IntersectionObserverEntry = class IntersectionObserverEntry extends _interceptors.Interceptor {
  get [$boundingClientRect]() {
    return this.boundingClientRect;
  }
  get [$intersectionRatio]() {
    return this.intersectionRatio;
  }
  get [$intersectionRect]() {
    return this.intersectionRect;
  }
  get [$isIntersecting]() {
    return this.isIntersecting;
  }
  get [$rootBounds]() {
    return this.rootBounds;
  }
  get [$target]() {
    return this.target;
  }
  get [$time]() {
    return this.time;
  }
};
dart.addTypeTests(html$.IntersectionObserverEntry);
const boundingClientRect = Symbol("IntersectionObserverEntry.boundingClientRect");
const intersectionRatio = Symbol("IntersectionObserverEntry.intersectionRatio");
const intersectionRect = Symbol("IntersectionObserverEntry.intersectionRect");
const isIntersecting = Symbol("IntersectionObserverEntry.isIntersecting");
const rootBounds = Symbol("IntersectionObserverEntry.rootBounds");
const target$3 = Symbol("IntersectionObserverEntry.target");
const time$ = Symbol("IntersectionObserverEntry.time");
dart.setLibraryUri(html$.IntersectionObserverEntry, "dart:html");
dart.setFieldSignature(html$.IntersectionObserverEntry, () => ({
  __proto__: dart.getFields(html$.IntersectionObserverEntry.__proto__),
  [$boundingClientRect]: dart.finalFieldType(html$.DomRectReadOnly),
  [$intersectionRatio]: dart.finalFieldType(core.num),
  [$intersectionRect]: dart.finalFieldType(html$.DomRectReadOnly),
  [$isIntersecting]: dart.finalFieldType(core.bool),
  [$rootBounds]: dart.finalFieldType(html$.DomRectReadOnly),
  [$target]: dart.finalFieldType(html$.Element),
  [$time]: dart.finalFieldType(core.num)
}));
dart.registerExtension("IntersectionObserverEntry", html$.IntersectionObserverEntry);
html$.InterventionReport = class InterventionReport extends html$.ReportBody {
  get [$lineNumber]() {
    return this.lineNumber;
  }
  get [$message]() {
    return this.message;
  }
  get [$sourceFile]() {
    return this.sourceFile;
  }
};
dart.addTypeTests(html$.InterventionReport);
const lineNumber$ = Symbol("InterventionReport.lineNumber");
const message$20 = Symbol("InterventionReport.message");
const sourceFile$ = Symbol("InterventionReport.sourceFile");
dart.setLibraryUri(html$.InterventionReport, "dart:html");
dart.setFieldSignature(html$.InterventionReport, () => ({
  __proto__: dart.getFields(html$.InterventionReport.__proto__),
  [$lineNumber]: dart.finalFieldType(core.int),
  [$message]: dart.finalFieldType(core.String),
  [$sourceFile]: dart.finalFieldType(core.String)
}));
dart.registerExtension("InterventionReport", html$.InterventionReport);
const _initKeyboardEvent = dart.privateName(html$, "_initKeyboardEvent");
const _charCode = dart.privateName(html$, "_charCode");
const _keyCode = dart.privateName(html$, "_keyCode");
html$.KeyboardEvent = class KeyboardEvent$ extends html$.UIEvent {
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let location = opts && 'location' in opts ? opts.location : null;
    let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : null;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    if (view == null) {
      view = html$.window;
    }
    let t = location;
    t == null ? location = keyLocation != null ? keyLocation : 1 : t;
    let e = html$.KeyboardEvent._check(html$.document[_createEvent]("KeyboardEvent"));
    e[_initKeyboardEvent](type, canBubble, cancelable, view, "", location, ctrlKey, altKey, shiftKey, metaKey);
    return e;
  }
  [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey) {
    if (typeof this.initKeyEvent == "function") {
      this.initKeyEvent(type, canBubble, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, 0, 0);
    } else {
      this.initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
    }
  }
  get [$keyCode]() {
    return this.keyCode;
  }
  get [$charCode]() {
    return this.charCode;
  }
  get [$which]() {
    return this[_which];
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.KeyboardEvent._create_1(type, eventInitDict_1);
    }
    return html$.KeyboardEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new KeyboardEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new KeyboardEvent(type);
  }
  get [$altKey]() {
    return this.altKey;
  }
  get [_charCode]() {
    return this.charCode;
  }
  get [$code]() {
    return this.code;
  }
  get [$ctrlKey]() {
    return this.ctrlKey;
  }
  get [$isComposing]() {
    return this.isComposing;
  }
  get [$key]() {
    return this.key;
  }
  get [_keyCode]() {
    return this.keyCode;
  }
  get [$location]() {
    return this.location;
  }
  get [$metaKey]() {
    return this.metaKey;
  }
  get [$repeat]() {
    return this.repeat;
  }
  get [$shiftKey]() {
    return this.shiftKey;
  }
  [$getModifierState](...args) {
    return this.getModifierState.apply(this, args);
  }
};
dart.addTypeTests(html$.KeyboardEvent);
const keyCode = Symbol("KeyboardEvent.keyCode");
const charCode = Symbol("KeyboardEvent.charCode");
const altKey = Symbol("KeyboardEvent.altKey");
const code$ = Symbol("KeyboardEvent.code");
const ctrlKey = Symbol("KeyboardEvent.ctrlKey");
const isComposing = Symbol("KeyboardEvent.isComposing");
const key$0 = Symbol("KeyboardEvent.key");
const location$ = Symbol("KeyboardEvent.location");
const metaKey = Symbol("KeyboardEvent.metaKey");
const repeat = Symbol("KeyboardEvent.repeat");
const shiftKey = Symbol("KeyboardEvent.shiftKey");
dart.setMethodSignature(html$.KeyboardEvent, () => ({
  __proto__: dart.getMethods(html$.KeyboardEvent.__proto__),
  [_initKeyboardEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
  [$getModifierState]: dart.fnType(core.bool, [core.String])
}));
dart.setGetterSignature(html$.KeyboardEvent, () => ({
  __proto__: dart.getGetters(html$.KeyboardEvent.__proto__),
  [$which]: core.int
}));
dart.setLibraryUri(html$.KeyboardEvent, "dart:html");
dart.setFieldSignature(html$.KeyboardEvent, () => ({
  __proto__: dart.getFields(html$.KeyboardEvent.__proto__),
  [$keyCode]: dart.finalFieldType(core.int),
  [$charCode]: dart.finalFieldType(core.int),
  [$altKey]: dart.finalFieldType(core.bool),
  [_charCode]: dart.finalFieldType(core.int),
  [$code]: dart.finalFieldType(core.String),
  [$ctrlKey]: dart.finalFieldType(core.bool),
  [$isComposing]: dart.finalFieldType(core.bool),
  [$key]: dart.finalFieldType(core.String),
  [_keyCode]: dart.finalFieldType(core.int),
  [$location]: dart.finalFieldType(core.int),
  [$metaKey]: dart.finalFieldType(core.bool),
  [$repeat]: dart.finalFieldType(core.bool),
  [$shiftKey]: dart.finalFieldType(core.bool)
}));
dart.defineLazy(html$.KeyboardEvent, {
  /*html$.KeyboardEvent.DOM_KEY_LOCATION_LEFT*/get DOM_KEY_LOCATION_LEFT() {
    return 1;
  },
  /*html$.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD*/get DOM_KEY_LOCATION_NUMPAD() {
    return 3;
  },
  /*html$.KeyboardEvent.DOM_KEY_LOCATION_RIGHT*/get DOM_KEY_LOCATION_RIGHT() {
    return 2;
  },
  /*html$.KeyboardEvent.DOM_KEY_LOCATION_STANDARD*/get DOM_KEY_LOCATION_STANDARD() {
    return 0;
  }
});
dart.registerExtension("KeyboardEvent", html$.KeyboardEvent);
html$.KeyframeEffectReadOnly = class KeyframeEffectReadOnly$ extends html$.AnimationEffectReadOnly {
  static new(target, effect, options) {
    if (options === void 0) options = null;
    if (options != null) {
      return html$.KeyframeEffectReadOnly._create_1(target, effect, options);
    }
    return html$.KeyframeEffectReadOnly._create_2(target, effect);
  }
  static _create_1(target, effect, options) {
    return new KeyframeEffectReadOnly(target, effect, options);
  }
  static _create_2(target, effect) {
    return new KeyframeEffectReadOnly(target, effect);
  }
};
dart.addTypeTests(html$.KeyframeEffectReadOnly);
dart.setLibraryUri(html$.KeyframeEffectReadOnly, "dart:html");
dart.registerExtension("KeyframeEffectReadOnly", html$.KeyframeEffectReadOnly);
html$.KeyframeEffect = class KeyframeEffect$ extends html$.KeyframeEffectReadOnly {
  static new(target, effect, options) {
    if (options === void 0) options = null;
    if (options != null) {
      return html$.KeyframeEffect._create_1(target, effect, options);
    }
    return html$.KeyframeEffect._create_2(target, effect);
  }
  static _create_1(target, effect, options) {
    return new KeyframeEffect(target, effect, options);
  }
  static _create_2(target, effect) {
    return new KeyframeEffect(target, effect);
  }
};
dart.addTypeTests(html$.KeyframeEffect);
dart.setLibraryUri(html$.KeyframeEffect, "dart:html");
dart.registerExtension("KeyframeEffect", html$.KeyframeEffect);
html$.LIElement = class LIElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("li");
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
(html$.LIElement.created = function() {
  this[value$9] = null;
  html$.LIElement.__proto__.created.call(this);
}).prototype = html$.LIElement.prototype;
dart.addTypeTests(html$.LIElement);
const value$9 = Symbol("LIElement.value");
dart.setLibraryUri(html$.LIElement, "dart:html");
dart.setFieldSignature(html$.LIElement, () => ({
  __proto__: dart.getFields(html$.LIElement.__proto__),
  [$value]: dart.fieldType(core.int)
}));
dart.registerExtension("HTMLLIElement", html$.LIElement);
html$.LabelElement = class LabelElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("label");
  }
  get [$control]() {
    return this.control;
  }
  get [$form]() {
    return this.form;
  }
  get [$htmlFor]() {
    return this.htmlFor;
  }
  set [$htmlFor](value) {
    this.htmlFor = value;
  }
};
(html$.LabelElement.created = function() {
  this[control] = null;
  this[form$1] = null;
  this[htmlFor] = null;
  html$.LabelElement.__proto__.created.call(this);
}).prototype = html$.LabelElement.prototype;
dart.addTypeTests(html$.LabelElement);
const control = Symbol("LabelElement.control");
const form$1 = Symbol("LabelElement.form");
const htmlFor = Symbol("LabelElement.htmlFor");
dart.setLibraryUri(html$.LabelElement, "dart:html");
dart.setFieldSignature(html$.LabelElement, () => ({
  __proto__: dart.getFields(html$.LabelElement.__proto__),
  [$control]: dart.finalFieldType(html$.HtmlElement),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$htmlFor]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLLabelElement", html$.LabelElement);
html$.LegendElement = class LegendElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("legend");
  }
  get [$form]() {
    return this.form;
  }
};
(html$.LegendElement.created = function() {
  this[form$2] = null;
  html$.LegendElement.__proto__.created.call(this);
}).prototype = html$.LegendElement.prototype;
dart.addTypeTests(html$.LegendElement);
const form$2 = Symbol("LegendElement.form");
dart.setLibraryUri(html$.LegendElement, "dart:html");
dart.setFieldSignature(html$.LegendElement, () => ({
  __proto__: dart.getFields(html$.LegendElement.__proto__),
  [$form]: dart.finalFieldType(html$.FormElement)
}));
dart.registerExtension("HTMLLegendElement", html$.LegendElement);
html$.LinearAccelerationSensor = class LinearAccelerationSensor$ extends html$.Accelerometer {
  static new(sensorOptions) {
    if (sensorOptions === void 0) sensorOptions = null;
    if (sensorOptions != null) {
      let sensorOptions_1 = html_common.convertDartToNative_Dictionary(sensorOptions);
      return html$.LinearAccelerationSensor._create_1(sensorOptions_1);
    }
    return html$.LinearAccelerationSensor._create_2();
  }
  static _create_1(sensorOptions) {
    return new LinearAccelerationSensor(sensorOptions);
  }
  static _create_2() {
    return new LinearAccelerationSensor();
  }
};
dart.addTypeTests(html$.LinearAccelerationSensor);
dart.setLibraryUri(html$.LinearAccelerationSensor, "dart:html");
dart.registerExtension("LinearAccelerationSensor", html$.LinearAccelerationSensor);
html$.LinkElement = class LinkElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("link");
  }
  get [$as]() {
    return this.as;
  }
  set [$as](value) {
    this.as = value;
  }
  get [$crossOrigin]() {
    return this.crossOrigin;
  }
  set [$crossOrigin](value) {
    this.crossOrigin = value;
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$href]() {
    return this.href;
  }
  set [$href](value) {
    this.href = value;
  }
  get [$hreflang]() {
    return this.hreflang;
  }
  set [$hreflang](value) {
    this.hreflang = value;
  }
  get [$import]() {
    return this.import;
  }
  get [$integrity]() {
    return this.integrity;
  }
  set [$integrity](value) {
    this.integrity = value;
  }
  get [$media]() {
    return this.media;
  }
  set [$media](value) {
    this.media = value;
  }
  get [$referrerPolicy]() {
    return this.referrerPolicy;
  }
  set [$referrerPolicy](value) {
    this.referrerPolicy = value;
  }
  get [$rel]() {
    return this.rel;
  }
  set [$rel](value) {
    this.rel = value;
  }
  get [$relList]() {
    return this.relList;
  }
  get [$scope]() {
    return this.scope;
  }
  set [$scope](value) {
    this.scope = value;
  }
  get [$sheet]() {
    return this.sheet;
  }
  get [$sizes]() {
    return this.sizes;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  get [$supportsImport]() {
    return "import" in this;
  }
};
(html$.LinkElement.created = function() {
  this[as] = null;
  this[crossOrigin$0] = null;
  this[disabled$4] = null;
  this[href$4] = null;
  this[hreflang$] = null;
  this[import$] = null;
  this[integrity] = null;
  this[media$1] = null;
  this[referrerPolicy$2] = null;
  this[rel$0] = null;
  this[relList] = null;
  this[scope] = null;
  this[sheet] = null;
  this[sizes$] = null;
  this[type$16] = null;
  html$.LinkElement.__proto__.created.call(this);
}).prototype = html$.LinkElement.prototype;
dart.addTypeTests(html$.LinkElement);
const as = Symbol("LinkElement.as");
const crossOrigin$0 = Symbol("LinkElement.crossOrigin");
const disabled$4 = Symbol("LinkElement.disabled");
const href$4 = Symbol("LinkElement.href");
const hreflang$ = Symbol("LinkElement.hreflang");
const import$ = Symbol("LinkElement.import");
const integrity = Symbol("LinkElement.integrity");
const media$1 = Symbol("LinkElement.media");
const referrerPolicy$2 = Symbol("LinkElement.referrerPolicy");
const rel$0 = Symbol("LinkElement.rel");
const relList = Symbol("LinkElement.relList");
const scope = Symbol("LinkElement.scope");
const sheet = Symbol("LinkElement.sheet");
const sizes$ = Symbol("LinkElement.sizes");
const type$16 = Symbol("LinkElement.type");
dart.setGetterSignature(html$.LinkElement, () => ({
  __proto__: dart.getGetters(html$.LinkElement.__proto__),
  [$supportsImport]: core.bool
}));
dart.setLibraryUri(html$.LinkElement, "dart:html");
dart.setFieldSignature(html$.LinkElement, () => ({
  __proto__: dart.getFields(html$.LinkElement.__proto__),
  [$as]: dart.fieldType(core.String),
  [$crossOrigin]: dart.fieldType(core.String),
  [$disabled]: dart.fieldType(core.bool),
  [$href]: dart.fieldType(core.String),
  [$hreflang]: dart.fieldType(core.String),
  [$import]: dart.finalFieldType(html$.Document),
  [$integrity]: dart.fieldType(core.String),
  [$media]: dart.fieldType(core.String),
  [$referrerPolicy]: dart.fieldType(core.String),
  [$rel]: dart.fieldType(core.String),
  [$relList]: dart.finalFieldType(html$.DomTokenList),
  [$scope]: dart.fieldType(core.String),
  [$sheet]: dart.finalFieldType(html$.StyleSheet),
  [$sizes]: dart.finalFieldType(html$.DomTokenList),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLLinkElement", html$.LinkElement);
html$.Location = class Location extends _interceptors.Interceptor {
  get [$ancestorOrigins]() {
    return this.ancestorOrigins;
  }
  get [$hash]() {
    return this.hash;
  }
  set [$hash](value) {
    this.hash = value;
  }
  get [$host]() {
    return this.host;
  }
  set [$host](value) {
    this.host = value;
  }
  get [$hostname]() {
    return this.hostname;
  }
  set [$hostname](value) {
    this.hostname = value;
  }
  get [$href]() {
    return this.href;
  }
  set [$href](value) {
    this.href = value;
  }
  get [$pathname]() {
    return this.pathname;
  }
  set [$pathname](value) {
    this.pathname = value;
  }
  get [$port]() {
    return this.port;
  }
  set [$port](value) {
    this.port = value;
  }
  get [$protocol]() {
    return this.protocol;
  }
  set [$protocol](value) {
    this.protocol = value;
  }
  get [$search]() {
    return this.search;
  }
  set [$search](value) {
    this.search = value;
  }
  get [$trustedHref]() {
    return this.trustedHref;
  }
  set [$trustedHref](value) {
    this.trustedHref = value;
  }
  [$assign](...args) {
    return this.assign.apply(this, args);
  }
  [$reload](...args) {
    return this.reload.apply(this, args);
  }
  [$replace](...args) {
    return this.replace.apply(this, args);
  }
  get [$origin]() {
    if ("origin" in this) {
      return this.origin;
    }
    return dart.str(this.protocol) + "//" + dart.str(this.host);
  }
  [$toString]() {
    return String(this);
  }
};
dart.addTypeTests(html$.Location);
const ancestorOrigins = Symbol("Location.ancestorOrigins");
const hash$1 = Symbol("Location.hash");
const host$1 = Symbol("Location.host");
const hostname$1 = Symbol("Location.hostname");
const href$5 = Symbol("Location.href");
const pathname$1 = Symbol("Location.pathname");
const port$3 = Symbol("Location.port");
const protocol$2 = Symbol("Location.protocol");
const search$1 = Symbol("Location.search");
const trustedHref = Symbol("Location.trustedHref");
html$.Location[dart.implements] = () => [html$.LocationBase];
dart.setMethodSignature(html$.Location, () => ({
  __proto__: dart.getMethods(html$.Location.__proto__),
  [$assign]: dart.fnType(dart.void, [], [core.String]),
  [$reload]: dart.fnType(dart.void, []),
  [$replace]: dart.fnType(dart.void, [core.String])
}));
dart.setGetterSignature(html$.Location, () => ({
  __proto__: dart.getGetters(html$.Location.__proto__),
  [$origin]: core.String
}));
dart.setLibraryUri(html$.Location, "dart:html");
dart.setFieldSignature(html$.Location, () => ({
  __proto__: dart.getFields(html$.Location.__proto__),
  [$ancestorOrigins]: dart.finalFieldType(ListOfString()),
  [$hash]: dart.fieldType(core.String),
  [$host]: dart.fieldType(core.String),
  [$hostname]: dart.fieldType(core.String),
  [$href]: dart.fieldType(core.String),
  [$pathname]: dart.fieldType(core.String),
  [$port]: dart.fieldType(core.String),
  [$protocol]: dart.fieldType(core.String),
  [$search]: dart.fieldType(core.String),
  [$trustedHref]: dart.fieldType(html$.TrustedUrl)
}));
dart.registerExtension("Location", html$.Location);
html$.Magnetometer = class Magnetometer$ extends html$.Sensor {
  static new(sensorOptions) {
    if (sensorOptions === void 0) sensorOptions = null;
    if (sensorOptions != null) {
      let sensorOptions_1 = html_common.convertDartToNative_Dictionary(sensorOptions);
      return html$.Magnetometer._create_1(sensorOptions_1);
    }
    return html$.Magnetometer._create_2();
  }
  static _create_1(sensorOptions) {
    return new Magnetometer(sensorOptions);
  }
  static _create_2() {
    return new Magnetometer();
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$z]() {
    return this.z;
  }
};
dart.addTypeTests(html$.Magnetometer);
const x$5 = Symbol("Magnetometer.x");
const y$5 = Symbol("Magnetometer.y");
const z$4 = Symbol("Magnetometer.z");
dart.setLibraryUri(html$.Magnetometer, "dart:html");
dart.setFieldSignature(html$.Magnetometer, () => ({
  __proto__: dart.getFields(html$.Magnetometer.__proto__),
  [$x]: dart.finalFieldType(core.num),
  [$y]: dart.finalFieldType(core.num),
  [$z]: dart.finalFieldType(core.num)
}));
dart.registerExtension("Magnetometer", html$.Magnetometer);
html$.MapElement = class MapElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("map");
  }
  get [$areas]() {
    return this.areas;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
};
(html$.MapElement.created = function() {
  this[areas] = null;
  this[name$21] = null;
  html$.MapElement.__proto__.created.call(this);
}).prototype = html$.MapElement.prototype;
dart.addTypeTests(html$.MapElement);
const areas = Symbol("MapElement.areas");
const name$21 = Symbol("MapElement.name");
dart.setLibraryUri(html$.MapElement, "dart:html");
dart.setFieldSignature(html$.MapElement, () => ({
  __proto__: dart.getFields(html$.MapElement.__proto__),
  [$areas]: dart.finalFieldType(ListOfNode()),
  [$name]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLMapElement", html$.MapElement);
html$.MediaCapabilities = class MediaCapabilities extends _interceptors.Interceptor {
  [$decodingInfo](configuration) {
    let configuration_dict = html_common.convertDartToNative_Dictionary(configuration);
    return html$.promiseToFuture(html$.MediaCapabilitiesInfo, this.decodingInfo(configuration_dict));
  }
  [$encodingInfo](configuration) {
    let configuration_dict = html_common.convertDartToNative_Dictionary(configuration);
    return html$.promiseToFuture(html$.MediaCapabilitiesInfo, this.encodingInfo(configuration_dict));
  }
};
dart.addTypeTests(html$.MediaCapabilities);
dart.setMethodSignature(html$.MediaCapabilities, () => ({
  __proto__: dart.getMethods(html$.MediaCapabilities.__proto__),
  [$decodingInfo]: dart.fnType(async.Future$(html$.MediaCapabilitiesInfo), [core.Map]),
  [$encodingInfo]: dart.fnType(async.Future$(html$.MediaCapabilitiesInfo), [core.Map])
}));
dart.setLibraryUri(html$.MediaCapabilities, "dart:html");
dart.registerExtension("MediaCapabilities", html$.MediaCapabilities);
html$.MediaCapabilitiesInfo = class MediaCapabilitiesInfo extends _interceptors.Interceptor {
  get [$powerEfficient]() {
    return this.powerEfficient;
  }
  get [$smooth]() {
    return this.smooth;
  }
  get [$supported]() {
    return this.supported;
  }
};
dart.addTypeTests(html$.MediaCapabilitiesInfo);
const powerEfficient = Symbol("MediaCapabilitiesInfo.powerEfficient");
const smooth = Symbol("MediaCapabilitiesInfo.smooth");
const supported = Symbol("MediaCapabilitiesInfo.supported");
dart.setLibraryUri(html$.MediaCapabilitiesInfo, "dart:html");
dart.setFieldSignature(html$.MediaCapabilitiesInfo, () => ({
  __proto__: dart.getFields(html$.MediaCapabilitiesInfo.__proto__),
  [$powerEfficient]: dart.finalFieldType(core.bool),
  [$smooth]: dart.finalFieldType(core.bool),
  [$supported]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("MediaCapabilitiesInfo", html$.MediaCapabilitiesInfo);
html$.MediaDeviceInfo = class MediaDeviceInfo extends _interceptors.Interceptor {
  get [$deviceId]() {
    return this.deviceId;
  }
  get [$groupId]() {
    return this.groupId;
  }
  get [$kind]() {
    return this.kind;
  }
  get [$label]() {
    return this.label;
  }
};
dart.addTypeTests(html$.MediaDeviceInfo);
const deviceId = Symbol("MediaDeviceInfo.deviceId");
const groupId = Symbol("MediaDeviceInfo.groupId");
const kind$0 = Symbol("MediaDeviceInfo.kind");
const label$0 = Symbol("MediaDeviceInfo.label");
dart.setLibraryUri(html$.MediaDeviceInfo, "dart:html");
dart.setFieldSignature(html$.MediaDeviceInfo, () => ({
  __proto__: dart.getFields(html$.MediaDeviceInfo.__proto__),
  [$deviceId]: dart.finalFieldType(core.String),
  [$groupId]: dart.finalFieldType(core.String),
  [$kind]: dart.finalFieldType(core.String),
  [$label]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MediaDeviceInfo", html$.MediaDeviceInfo);
const _getSupportedConstraints_1 = dart.privateName(html$, "_getSupportedConstraints_1");
html$.MediaDevices = class MediaDevices extends html$.EventTarget {
  [$enumerateDevices]() {
    return html$.promiseToFuture(ListOfMediaDeviceInfo(), this.enumerateDevices());
  }
  [$getSupportedConstraints]() {
    return html_common.convertNativeToDart_Dictionary(this[_getSupportedConstraints_1]());
  }
  [_getSupportedConstraints_1](...args) {
    return this.getSupportedConstraints.apply(this, args);
  }
};
dart.addTypeTests(html$.MediaDevices);
dart.setMethodSignature(html$.MediaDevices, () => ({
  __proto__: dart.getMethods(html$.MediaDevices.__proto__),
  [$enumerateDevices]: dart.fnType(async.Future$(core.List$(html$.MediaDeviceInfo)), []),
  [$getSupportedConstraints]: dart.fnType(core.Map, []),
  [_getSupportedConstraints_1]: dart.fnType(dart.dynamic, [])
}));
dart.setLibraryUri(html$.MediaDevices, "dart:html");
dart.registerExtension("MediaDevices", html$.MediaDevices);
html$.MediaEncryptedEvent = class MediaEncryptedEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MediaEncryptedEvent._create_1(type, eventInitDict_1);
    }
    return html$.MediaEncryptedEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MediaEncryptedEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MediaEncryptedEvent(type);
  }
  get [$initData]() {
    return this.initData;
  }
  get [$initDataType]() {
    return this.initDataType;
  }
};
dart.addTypeTests(html$.MediaEncryptedEvent);
const initData = Symbol("MediaEncryptedEvent.initData");
const initDataType = Symbol("MediaEncryptedEvent.initDataType");
dart.setLibraryUri(html$.MediaEncryptedEvent, "dart:html");
dart.setFieldSignature(html$.MediaEncryptedEvent, () => ({
  __proto__: dart.getFields(html$.MediaEncryptedEvent.__proto__),
  [$initData]: dart.finalFieldType(typed_data.ByteBuffer),
  [$initDataType]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MediaEncryptedEvent", html$.MediaEncryptedEvent);
html$.MediaError = class MediaError extends _interceptors.Interceptor {
  get [$code]() {
    return this.code;
  }
  get [$message]() {
    return this.message;
  }
};
dart.addTypeTests(html$.MediaError);
const code$0 = Symbol("MediaError.code");
const message$21 = Symbol("MediaError.message");
dart.setLibraryUri(html$.MediaError, "dart:html");
dart.setFieldSignature(html$.MediaError, () => ({
  __proto__: dart.getFields(html$.MediaError.__proto__),
  [$code]: dart.finalFieldType(core.int),
  [$message]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.MediaError, {
  /*html$.MediaError.MEDIA_ERR_ABORTED*/get MEDIA_ERR_ABORTED() {
    return 1;
  },
  /*html$.MediaError.MEDIA_ERR_DECODE*/get MEDIA_ERR_DECODE() {
    return 3;
  },
  /*html$.MediaError.MEDIA_ERR_NETWORK*/get MEDIA_ERR_NETWORK() {
    return 2;
  },
  /*html$.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED*/get MEDIA_ERR_SRC_NOT_SUPPORTED() {
    return 4;
  }
});
dart.registerExtension("MediaError", html$.MediaError);
html$.MediaKeyMessageEvent = class MediaKeyMessageEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.MediaKeyMessageEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new MediaKeyMessageEvent(type, eventInitDict);
  }
  get [$message]() {
    return this.message;
  }
  get [$messageType]() {
    return this.messageType;
  }
};
dart.addTypeTests(html$.MediaKeyMessageEvent);
const message$22 = Symbol("MediaKeyMessageEvent.message");
const messageType = Symbol("MediaKeyMessageEvent.messageType");
dart.setLibraryUri(html$.MediaKeyMessageEvent, "dart:html");
dart.setFieldSignature(html$.MediaKeyMessageEvent, () => ({
  __proto__: dart.getFields(html$.MediaKeyMessageEvent.__proto__),
  [$message]: dart.finalFieldType(typed_data.ByteBuffer),
  [$messageType]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MediaKeyMessageEvent", html$.MediaKeyMessageEvent);
const _update$ = dart.privateName(html$, "_update");
html$.MediaKeySession = class MediaKeySession extends html$.EventTarget {
  get [$closed]() {
    return html$.promiseToFuture(dart.void, this.closed);
  }
  get [$expiration]() {
    return this.expiration;
  }
  get [$keyStatuses]() {
    return this.keyStatuses;
  }
  get [$sessionId]() {
    return this.sessionId;
  }
  [$close]() {
    return html$.promiseToFuture(dart.dynamic, this.close());
  }
  [$generateRequest](initDataType, initData) {
    return html$.promiseToFuture(dart.dynamic, this.generateRequest(initDataType, initData));
  }
  [$load](sessionId) {
    return html$.promiseToFuture(dart.dynamic, this.load(sessionId));
  }
  [$remove]() {
    return html$.promiseToFuture(dart.dynamic, this.remove());
  }
  [_update$](...args) {
    return this.update.apply(this, args);
  }
  get [$onMessage]() {
    return html$.MediaKeySession.messageEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.MediaKeySession);
const expiration = Symbol("MediaKeySession.expiration");
const keyStatuses = Symbol("MediaKeySession.keyStatuses");
const sessionId = Symbol("MediaKeySession.sessionId");
dart.setMethodSignature(html$.MediaKeySession, () => ({
  __proto__: dart.getMethods(html$.MediaKeySession.__proto__),
  [$close]: dart.fnType(async.Future, []),
  [$generateRequest]: dart.fnType(async.Future, [core.String, dart.dynamic]),
  [$load]: dart.fnType(async.Future, [core.String]),
  [$remove]: dart.fnType(async.Future, []),
  [_update$]: dart.fnType(async.Future, [dart.dynamic])
}));
dart.setGetterSignature(html$.MediaKeySession, () => ({
  __proto__: dart.getGetters(html$.MediaKeySession.__proto__),
  [$closed]: async.Future$(dart.void),
  [$onMessage]: async.Stream$(html$.MessageEvent)
}));
dart.setLibraryUri(html$.MediaKeySession, "dart:html");
dart.setFieldSignature(html$.MediaKeySession, () => ({
  __proto__: dart.getFields(html$.MediaKeySession.__proto__),
  [$expiration]: dart.finalFieldType(core.num),
  [$keyStatuses]: dart.finalFieldType(html$.MediaKeyStatusMap),
  [$sessionId]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.MediaKeySession, {
  /*html$.MediaKeySession.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  }
});
dart.registerExtension("MediaKeySession", html$.MediaKeySession);
html$.MediaKeyStatusMap = class MediaKeyStatusMap extends _interceptors.Interceptor {
  get [$size]() {
    return this.size;
  }
  [$get](...args) {
    return this.get.apply(this, args);
  }
  [$has](...args) {
    return this.has.apply(this, args);
  }
};
dart.addTypeTests(html$.MediaKeyStatusMap);
const size$3 = Symbol("MediaKeyStatusMap.size");
dart.setMethodSignature(html$.MediaKeyStatusMap, () => ({
  __proto__: dart.getMethods(html$.MediaKeyStatusMap.__proto__),
  [$get]: dart.fnType(core.Object, [dart.dynamic]),
  [$has]: dart.fnType(core.bool, [dart.dynamic])
}));
dart.setLibraryUri(html$.MediaKeyStatusMap, "dart:html");
dart.setFieldSignature(html$.MediaKeyStatusMap, () => ({
  __proto__: dart.getFields(html$.MediaKeyStatusMap.__proto__),
  [$size]: dart.finalFieldType(core.int)
}));
dart.registerExtension("MediaKeyStatusMap", html$.MediaKeyStatusMap);
const _getConfiguration_1 = dart.privateName(html$, "_getConfiguration_1");
html$.MediaKeySystemAccess = class MediaKeySystemAccess extends _interceptors.Interceptor {
  get [$keySystem]() {
    return this.keySystem;
  }
  [$createMediaKeys]() {
    return html$.promiseToFuture(dart.dynamic, this.createMediaKeys());
  }
  [$getConfiguration]() {
    return html_common.convertNativeToDart_Dictionary(this[_getConfiguration_1]());
  }
  [_getConfiguration_1](...args) {
    return this.getConfiguration.apply(this, args);
  }
};
dart.addTypeTests(html$.MediaKeySystemAccess);
const keySystem = Symbol("MediaKeySystemAccess.keySystem");
dart.setMethodSignature(html$.MediaKeySystemAccess, () => ({
  __proto__: dart.getMethods(html$.MediaKeySystemAccess.__proto__),
  [$createMediaKeys]: dart.fnType(async.Future, []),
  [$getConfiguration]: dart.fnType(core.Map, []),
  [_getConfiguration_1]: dart.fnType(dart.dynamic, [])
}));
dart.setLibraryUri(html$.MediaKeySystemAccess, "dart:html");
dart.setFieldSignature(html$.MediaKeySystemAccess, () => ({
  __proto__: dart.getFields(html$.MediaKeySystemAccess.__proto__),
  [$keySystem]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MediaKeySystemAccess", html$.MediaKeySystemAccess);
const _createSession = dart.privateName(html$, "_createSession");
html$.MediaKeys = class MediaKeys extends _interceptors.Interceptor {
  [_createSession](...args) {
    return this.createSession.apply(this, args);
  }
  [$getStatusForPolicy](policy) {
    return html$.promiseToFuture(dart.dynamic, this.getStatusForPolicy(policy));
  }
  [$setServerCertificate](serverCertificate) {
    return html$.promiseToFuture(dart.dynamic, this.setServerCertificate(serverCertificate));
  }
};
dart.addTypeTests(html$.MediaKeys);
dart.setMethodSignature(html$.MediaKeys, () => ({
  __proto__: dart.getMethods(html$.MediaKeys.__proto__),
  [_createSession]: dart.fnType(html$.MediaKeySession, [], [core.String]),
  [$getStatusForPolicy]: dart.fnType(async.Future, [html$.MediaKeysPolicy]),
  [$setServerCertificate]: dart.fnType(async.Future, [dart.dynamic])
}));
dart.setLibraryUri(html$.MediaKeys, "dart:html");
dart.registerExtension("MediaKeys", html$.MediaKeys);
html$.MediaKeysPolicy = class MediaKeysPolicy$ extends _interceptors.Interceptor {
  static new(init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.MediaKeysPolicy._create_1(init_1);
  }
  static _create_1(init) {
    return new MediaKeysPolicy(init);
  }
  get [$minHdcpVersion]() {
    return this.minHdcpVersion;
  }
};
dart.addTypeTests(html$.MediaKeysPolicy);
const minHdcpVersion = Symbol("MediaKeysPolicy.minHdcpVersion");
dart.setLibraryUri(html$.MediaKeysPolicy, "dart:html");
dart.setFieldSignature(html$.MediaKeysPolicy, () => ({
  __proto__: dart.getFields(html$.MediaKeysPolicy.__proto__),
  [$minHdcpVersion]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MediaKeysPolicy", html$.MediaKeysPolicy);
html$.MediaList = class MediaList extends _interceptors.Interceptor {
  get [$length]() {
    return this.length;
  }
  get [$mediaText]() {
    return this.mediaText;
  }
  set [$mediaText](value) {
    this.mediaText = value;
  }
  [$appendMedium](...args) {
    return this.appendMedium.apply(this, args);
  }
  [$deleteMedium](...args) {
    return this.deleteMedium.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
dart.addTypeTests(html$.MediaList);
const length$10 = Symbol("MediaList.length");
const mediaText = Symbol("MediaList.mediaText");
dart.setMethodSignature(html$.MediaList, () => ({
  __proto__: dart.getMethods(html$.MediaList.__proto__),
  [$appendMedium]: dart.fnType(dart.void, [core.String]),
  [$deleteMedium]: dart.fnType(dart.void, [core.String]),
  [$item]: dart.fnType(core.String, [core.int])
}));
dart.setLibraryUri(html$.MediaList, "dart:html");
dart.setFieldSignature(html$.MediaList, () => ({
  __proto__: dart.getFields(html$.MediaList.__proto__),
  [$length]: dart.finalFieldType(core.int),
  [$mediaText]: dart.fieldType(core.String)
}));
dart.registerExtension("MediaList", html$.MediaList);
html$.MediaMetadata = class MediaMetadata$ extends _interceptors.Interceptor {
  static new(metadata) {
    if (metadata === void 0) metadata = null;
    if (metadata != null) {
      let metadata_1 = html_common.convertDartToNative_Dictionary(metadata);
      return html$.MediaMetadata._create_1(metadata_1);
    }
    return html$.MediaMetadata._create_2();
  }
  static _create_1(metadata) {
    return new MediaMetadata(metadata);
  }
  static _create_2() {
    return new MediaMetadata();
  }
  get [$album]() {
    return this.album;
  }
  set [$album](value) {
    this.album = value;
  }
  get [$artist]() {
    return this.artist;
  }
  set [$artist](value) {
    this.artist = value;
  }
  get [$artwork]() {
    return this.artwork;
  }
  set [$artwork](value) {
    this.artwork = value;
  }
  get [$title]() {
    return this.title;
  }
  set [$title](value) {
    this.title = value;
  }
};
dart.addTypeTests(html$.MediaMetadata);
const album = Symbol("MediaMetadata.album");
const artist = Symbol("MediaMetadata.artist");
const artwork = Symbol("MediaMetadata.artwork");
const title$1 = Symbol("MediaMetadata.title");
dart.setLibraryUri(html$.MediaMetadata, "dart:html");
dart.setFieldSignature(html$.MediaMetadata, () => ({
  __proto__: dart.getFields(html$.MediaMetadata.__proto__),
  [$album]: dart.fieldType(core.String),
  [$artist]: dart.fieldType(core.String),
  [$artwork]: dart.fieldType(core.List),
  [$title]: dart.fieldType(core.String)
}));
dart.registerExtension("MediaMetadata", html$.MediaMetadata);
html$.MediaQueryList = class MediaQueryList extends html$.EventTarget {
  get [$matches]() {
    return this.matches;
  }
  get [$media]() {
    return this.media;
  }
  [$addListener](...args) {
    return this.addListener.apply(this, args);
  }
  [$removeListener](...args) {
    return this.removeListener.apply(this, args);
  }
  get [$onChange]() {
    return html$.MediaQueryList.changeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.MediaQueryList);
const matches = Symbol("MediaQueryList.matches");
const media$2 = Symbol("MediaQueryList.media");
dart.setMethodSignature(html$.MediaQueryList, () => ({
  __proto__: dart.getMethods(html$.MediaQueryList.__proto__),
  [$addListener]: dart.fnType(dart.void, [dart.fnType(dart.dynamic, [html$.Event])]),
  [$removeListener]: dart.fnType(dart.void, [dart.fnType(dart.dynamic, [html$.Event])])
}));
dart.setGetterSignature(html$.MediaQueryList, () => ({
  __proto__: dart.getGetters(html$.MediaQueryList.__proto__),
  [$onChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.MediaQueryList, "dart:html");
dart.setFieldSignature(html$.MediaQueryList, () => ({
  __proto__: dart.getFields(html$.MediaQueryList.__proto__),
  [$matches]: dart.finalFieldType(core.bool),
  [$media]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.MediaQueryList, {
  /*html$.MediaQueryList.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  }
});
dart.registerExtension("MediaQueryList", html$.MediaQueryList);
html$.MediaQueryListEvent = class MediaQueryListEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MediaQueryListEvent._create_1(type, eventInitDict_1);
    }
    return html$.MediaQueryListEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MediaQueryListEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MediaQueryListEvent(type);
  }
  get [$matches]() {
    return this.matches;
  }
  get [$media]() {
    return this.media;
  }
};
dart.addTypeTests(html$.MediaQueryListEvent);
const matches$ = Symbol("MediaQueryListEvent.matches");
const media$3 = Symbol("MediaQueryListEvent.media");
dart.setLibraryUri(html$.MediaQueryListEvent, "dart:html");
dart.setFieldSignature(html$.MediaQueryListEvent, () => ({
  __proto__: dart.getFields(html$.MediaQueryListEvent.__proto__),
  [$matches]: dart.finalFieldType(core.bool),
  [$media]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MediaQueryListEvent", html$.MediaQueryListEvent);
html$.MediaRecorder = class MediaRecorder$ extends html$.EventTarget {
  static new(stream, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return html$.MediaRecorder._create_1(stream, options_1);
    }
    return html$.MediaRecorder._create_2(stream);
  }
  static _create_1(stream, options) {
    return new MediaRecorder(stream, options);
  }
  static _create_2(stream) {
    return new MediaRecorder(stream);
  }
  get [$audioBitsPerSecond]() {
    return this.audioBitsPerSecond;
  }
  get [$mimeType]() {
    return this.mimeType;
  }
  get [$state]() {
    return this.state;
  }
  get [$stream]() {
    return this.stream;
  }
  get [$videoBitsPerSecond]() {
    return this.videoBitsPerSecond;
  }
  [$pause](...args) {
    return this.pause.apply(this, args);
  }
  [$requestData](...args) {
    return this.requestData.apply(this, args);
  }
  [$resume](...args) {
    return this.resume.apply(this, args);
  }
  [$start](...args) {
    return this.start.apply(this, args);
  }
  [$stop](...args) {
    return this.stop.apply(this, args);
  }
  get [$onError]() {
    return html$.MediaRecorder.errorEvent.forTarget(this);
  }
  get [$onPause]() {
    return html$.MediaRecorder.pauseEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.MediaRecorder);
const audioBitsPerSecond = Symbol("MediaRecorder.audioBitsPerSecond");
const mimeType = Symbol("MediaRecorder.mimeType");
const state$0 = Symbol("MediaRecorder.state");
const stream = Symbol("MediaRecorder.stream");
const videoBitsPerSecond = Symbol("MediaRecorder.videoBitsPerSecond");
dart.setMethodSignature(html$.MediaRecorder, () => ({
  __proto__: dart.getMethods(html$.MediaRecorder.__proto__),
  [$pause]: dart.fnType(dart.void, []),
  [$requestData]: dart.fnType(dart.void, []),
  [$resume]: dart.fnType(dart.void, []),
  [$start]: dart.fnType(dart.void, [], [core.int]),
  [$stop]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.MediaRecorder, () => ({
  __proto__: dart.getGetters(html$.MediaRecorder.__proto__),
  [$onError]: async.Stream$(html$.Event),
  [$onPause]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.MediaRecorder, "dart:html");
dart.setFieldSignature(html$.MediaRecorder, () => ({
  __proto__: dart.getFields(html$.MediaRecorder.__proto__),
  [$audioBitsPerSecond]: dart.finalFieldType(core.int),
  [$mimeType]: dart.finalFieldType(core.String),
  [$state]: dart.finalFieldType(core.String),
  [$stream]: dart.finalFieldType(html$.MediaStream),
  [$videoBitsPerSecond]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.MediaRecorder, {
  /*html$.MediaRecorder.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.MediaRecorder.pauseEvent*/get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pause"));
  }
});
dart.registerExtension("MediaRecorder", html$.MediaRecorder);
html$.MediaSession = class MediaSession extends _interceptors.Interceptor {
  get [$metadata]() {
    return this.metadata;
  }
  set [$metadata](value) {
    this.metadata = value;
  }
  get [$playbackState]() {
    return this.playbackState;
  }
  set [$playbackState](value) {
    this.playbackState = value;
  }
  [$setActionHandler](...args) {
    return this.setActionHandler.apply(this, args);
  }
};
dart.addTypeTests(html$.MediaSession);
const metadata = Symbol("MediaSession.metadata");
const playbackState = Symbol("MediaSession.playbackState");
dart.setMethodSignature(html$.MediaSession, () => ({
  __proto__: dart.getMethods(html$.MediaSession.__proto__),
  [$setActionHandler]: dart.fnType(dart.void, [core.String, dart.fnType(dart.void, [])])
}));
dart.setLibraryUri(html$.MediaSession, "dart:html");
dart.setFieldSignature(html$.MediaSession, () => ({
  __proto__: dart.getFields(html$.MediaSession.__proto__),
  [$metadata]: dart.fieldType(html$.MediaMetadata),
  [$playbackState]: dart.fieldType(core.String)
}));
dart.registerExtension("MediaSession", html$.MediaSession);
html$.MediaSettingsRange = class MediaSettingsRange extends _interceptors.Interceptor {
  get [$max]() {
    return this.max;
  }
  get [$min]() {
    return this.min;
  }
  get [$step]() {
    return this.step;
  }
};
dart.addTypeTests(html$.MediaSettingsRange);
const max$1 = Symbol("MediaSettingsRange.max");
const min$1 = Symbol("MediaSettingsRange.min");
const step$0 = Symbol("MediaSettingsRange.step");
dart.setLibraryUri(html$.MediaSettingsRange, "dart:html");
dart.setFieldSignature(html$.MediaSettingsRange, () => ({
  __proto__: dart.getFields(html$.MediaSettingsRange.__proto__),
  [$max]: dart.finalFieldType(core.num),
  [$min]: dart.finalFieldType(core.num),
  [$step]: dart.finalFieldType(core.num)
}));
dart.registerExtension("MediaSettingsRange", html$.MediaSettingsRange);
html$.MediaSource = class MediaSource$ extends html$.EventTarget {
  static new() {
    return html$.MediaSource._create_1();
  }
  static _create_1() {
    return new MediaSource();
  }
  static get supported() {
    return !!window.MediaSource;
  }
  get [$activeSourceBuffers]() {
    return this.activeSourceBuffers;
  }
  get [$duration]() {
    return this.duration;
  }
  set [$duration](value) {
    this.duration = value;
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [$sourceBuffers]() {
    return this.sourceBuffers;
  }
  [$addSourceBuffer](...args) {
    return this.addSourceBuffer.apply(this, args);
  }
  [$clearLiveSeekableRange](...args) {
    return this.clearLiveSeekableRange.apply(this, args);
  }
  [$endOfStream](...args) {
    return this.endOfStream.apply(this, args);
  }
  [$removeSourceBuffer](...args) {
    return this.removeSourceBuffer.apply(this, args);
  }
  [$setLiveSeekableRange](...args) {
    return this.setLiveSeekableRange.apply(this, args);
  }
};
dart.addTypeTests(html$.MediaSource);
const activeSourceBuffers = Symbol("MediaSource.activeSourceBuffers");
const duration$1 = Symbol("MediaSource.duration");
const readyState$6 = Symbol("MediaSource.readyState");
const sourceBuffers = Symbol("MediaSource.sourceBuffers");
dart.setMethodSignature(html$.MediaSource, () => ({
  __proto__: dart.getMethods(html$.MediaSource.__proto__),
  [$addSourceBuffer]: dart.fnType(html$.SourceBuffer, [core.String]),
  [$clearLiveSeekableRange]: dart.fnType(dart.void, []),
  [$endOfStream]: dart.fnType(dart.void, [], [core.String]),
  [$removeSourceBuffer]: dart.fnType(dart.void, [html$.SourceBuffer]),
  [$setLiveSeekableRange]: dart.fnType(dart.void, [core.num, core.num])
}));
dart.setLibraryUri(html$.MediaSource, "dart:html");
dart.setFieldSignature(html$.MediaSource, () => ({
  __proto__: dart.getFields(html$.MediaSource.__proto__),
  [$activeSourceBuffers]: dart.finalFieldType(html$.SourceBufferList),
  [$duration]: dart.fieldType(core.num),
  [$readyState]: dart.finalFieldType(core.String),
  [$sourceBuffers]: dart.finalFieldType(html$.SourceBufferList)
}));
dart.registerExtension("MediaSource", html$.MediaSource);
html$.MediaStream = class MediaStream$ extends html$.EventTarget {
  static new(stream_OR_tracks) {
    if (stream_OR_tracks === void 0) stream_OR_tracks = null;
    if (stream_OR_tracks == null) {
      return html$.MediaStream._create_1();
    }
    if (html$.MediaStream.is(stream_OR_tracks)) {
      return html$.MediaStream._create_2(stream_OR_tracks);
    }
    if (ListOfMediaStreamTrack().is(stream_OR_tracks)) {
      return html$.MediaStream._create_3(stream_OR_tracks);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1() {
    return new MediaStream();
  }
  static _create_2(stream_OR_tracks) {
    return new MediaStream(stream_OR_tracks);
  }
  static _create_3(stream_OR_tracks) {
    return new MediaStream(stream_OR_tracks);
  }
  get [$active]() {
    return this.active;
  }
  get [$id]() {
    return this.id;
  }
  [$addTrack](...args) {
    return this.addTrack.apply(this, args);
  }
  [$clone](...args) {
    return this.clone.apply(this, args);
  }
  [$getAudioTracks](...args) {
    return this.getAudioTracks.apply(this, args);
  }
  [$getTrackById](...args) {
    return this.getTrackById.apply(this, args);
  }
  [$getTracks](...args) {
    return this.getTracks.apply(this, args);
  }
  [$getVideoTracks](...args) {
    return this.getVideoTracks.apply(this, args);
  }
  [$removeTrack](...args) {
    return this.removeTrack.apply(this, args);
  }
  get [$onAddTrack]() {
    return html$.MediaStream.addTrackEvent.forTarget(this);
  }
  get [$onRemoveTrack]() {
    return html$.MediaStream.removeTrackEvent.forTarget(this);
  }
  static get supported() {
    return !!(html$.window.navigator.getUserMedia || html$.window.navigator.webkitGetUserMedia || html$.window.navigator.mozGetUserMedia || html$.window.navigator.msGetUserMedia);
  }
};
dart.addTypeTests(html$.MediaStream);
const active = Symbol("MediaStream.active");
const id$7 = Symbol("MediaStream.id");
dart.setMethodSignature(html$.MediaStream, () => ({
  __proto__: dart.getMethods(html$.MediaStream.__proto__),
  [$addTrack]: dart.fnType(dart.void, [html$.MediaStreamTrack]),
  [$clone]: dart.fnType(html$.MediaStream, []),
  [$getAudioTracks]: dart.fnType(core.List$(html$.MediaStreamTrack), []),
  [$getTrackById]: dart.fnType(html$.MediaStreamTrack, [core.String]),
  [$getTracks]: dart.fnType(core.List$(html$.MediaStreamTrack), []),
  [$getVideoTracks]: dart.fnType(core.List$(html$.MediaStreamTrack), []),
  [$removeTrack]: dart.fnType(dart.void, [html$.MediaStreamTrack])
}));
dart.setGetterSignature(html$.MediaStream, () => ({
  __proto__: dart.getGetters(html$.MediaStream.__proto__),
  [$onAddTrack]: async.Stream$(html$.Event),
  [$onRemoveTrack]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.MediaStream, "dart:html");
dart.setFieldSignature(html$.MediaStream, () => ({
  __proto__: dart.getFields(html$.MediaStream.__proto__),
  [$active]: dart.finalFieldType(core.bool),
  [$id]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.MediaStream, {
  /*html$.MediaStream.addTrackEvent*/get addTrackEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("addtrack"));
  },
  /*html$.MediaStream.removeTrackEvent*/get removeTrackEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("removetrack"));
  }
});
dart.registerExtension("MediaStream", html$.MediaStream);
html$.MediaStreamEvent = class MediaStreamEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MediaStreamEvent._create_1(type, eventInitDict_1);
    }
    return html$.MediaStreamEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MediaStreamEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MediaStreamEvent(type);
  }
  static get supported() {
    return html_common.Device.isEventTypeSupported("MediaStreamEvent");
  }
  get [$stream]() {
    return this.stream;
  }
};
dart.addTypeTests(html$.MediaStreamEvent);
const stream$ = Symbol("MediaStreamEvent.stream");
dart.setLibraryUri(html$.MediaStreamEvent, "dart:html");
dart.setFieldSignature(html$.MediaStreamEvent, () => ({
  __proto__: dart.getFields(html$.MediaStreamEvent.__proto__),
  [$stream]: dart.finalFieldType(html$.MediaStream)
}));
dart.registerExtension("MediaStreamEvent", html$.MediaStreamEvent);
html$.MediaStreamTrackEvent = class MediaStreamTrackEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.MediaStreamTrackEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new MediaStreamTrackEvent(type, eventInitDict);
  }
  static get supported() {
    return html_common.Device.isEventTypeSupported("MediaStreamTrackEvent");
  }
  get [$track]() {
    return this.track;
  }
};
dart.addTypeTests(html$.MediaStreamTrackEvent);
const track$ = Symbol("MediaStreamTrackEvent.track");
dart.setLibraryUri(html$.MediaStreamTrackEvent, "dart:html");
dart.setFieldSignature(html$.MediaStreamTrackEvent, () => ({
  __proto__: dart.getFields(html$.MediaStreamTrackEvent.__proto__),
  [$track]: dart.finalFieldType(html$.MediaStreamTrack)
}));
dart.registerExtension("MediaStreamTrackEvent", html$.MediaStreamTrackEvent);
html$.MemoryInfo = class MemoryInfo extends _interceptors.Interceptor {
  get [$jsHeapSizeLimit]() {
    return this.jsHeapSizeLimit;
  }
  get [$totalJSHeapSize]() {
    return this.totalJSHeapSize;
  }
  get [$usedJSHeapSize]() {
    return this.usedJSHeapSize;
  }
};
dart.addTypeTests(html$.MemoryInfo);
const jsHeapSizeLimit = Symbol("MemoryInfo.jsHeapSizeLimit");
const totalJSHeapSize = Symbol("MemoryInfo.totalJSHeapSize");
const usedJSHeapSize = Symbol("MemoryInfo.usedJSHeapSize");
dart.setLibraryUri(html$.MemoryInfo, "dart:html");
dart.setFieldSignature(html$.MemoryInfo, () => ({
  __proto__: dart.getFields(html$.MemoryInfo.__proto__),
  [$jsHeapSizeLimit]: dart.finalFieldType(core.int),
  [$totalJSHeapSize]: dart.finalFieldType(core.int),
  [$usedJSHeapSize]: dart.finalFieldType(core.int)
}));
dart.registerExtension("MemoryInfo", html$.MemoryInfo);
html$.MenuElement = class MenuElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("menu");
  }
};
(html$.MenuElement.created = function() {
  html$.MenuElement.__proto__.created.call(this);
}).prototype = html$.MenuElement.prototype;
dart.addTypeTests(html$.MenuElement);
dart.setLibraryUri(html$.MenuElement, "dart:html");
dart.registerExtension("HTMLMenuElement", html$.MenuElement);
html$.MessageChannel = class MessageChannel$ extends _interceptors.Interceptor {
  static new() {
    return html$.MessageChannel._create_1();
  }
  static _create_1() {
    return new MessageChannel();
  }
  get [$port1]() {
    return this.port1;
  }
  get [$port2]() {
    return this.port2;
  }
};
dart.addTypeTests(html$.MessageChannel);
const port1 = Symbol("MessageChannel.port1");
const port2 = Symbol("MessageChannel.port2");
dart.setLibraryUri(html$.MessageChannel, "dart:html");
dart.setFieldSignature(html$.MessageChannel, () => ({
  __proto__: dart.getFields(html$.MessageChannel.__proto__),
  [$port1]: dart.finalFieldType(html$.MessagePort),
  [$port2]: dart.finalFieldType(html$.MessagePort)
}));
dart.registerExtension("MessageChannel", html$.MessageChannel);
let const$78;
const _initMessageEvent = dart.privateName(html$, "_initMessageEvent");
const _get_data = dart.privateName(html$, "_get_data");
const _get_source = dart.privateName(html$, "_get_source");
const _initMessageEvent_1 = dart.privateName(html$, "_initMessageEvent_1");
html$.MessageEvent = class MessageEvent$ extends html$.Event {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
    let data = opts && 'data' in opts ? opts.data : null;
    let origin = opts && 'origin' in opts ? opts.origin : null;
    let lastEventId = opts && 'lastEventId' in opts ? opts.lastEventId : null;
    let source = opts && 'source' in opts ? opts.source : null;
    let messagePorts = opts && 'messagePorts' in opts ? opts.messagePorts : const$78 || (const$78 = dart.constList([], html$.MessagePort));
    if (source == null) {
      source = html$.window;
    }
    if (!dart.test(html_common.Device.isIE)) {
      return new MessageEvent(type, {bubbles: canBubble, cancelable: cancelable, data: data, origin: origin, lastEventId: lastEventId, source: source, ports: messagePorts});
    }
    let event = html$.MessageEvent._check(html$.document[_createEvent]("MessageEvent"));
    event[_initMessageEvent](type, canBubble, cancelable, data, origin, lastEventId, source, messagePorts);
    return event;
  }
  get [$data]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
  }
  get [_get_data]() {
    return this.data;
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MessageEvent._create_1(type, eventInitDict_1);
    }
    return html$.MessageEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MessageEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MessageEvent(type);
  }
  get [$lastEventId]() {
    return this.lastEventId;
  }
  get [$origin]() {
    return this.origin;
  }
  get [$ports]() {
    return this.ports;
  }
  get [$source]() {
    return html$._convertNativeToDart_EventTarget(this[_get_source]);
  }
  get [_get_source]() {
    return this.source;
  }
  get [$suborigin]() {
    return this.suborigin;
  }
  [_initMessageEvent](typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, portsArg) {
    let sourceArg_1 = html$._convertDartToNative_EventTarget(sourceArg);
    this[_initMessageEvent_1](typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg_1, portsArg);
    return;
  }
  [_initMessageEvent_1](...args) {
    return this.initMessageEvent.apply(this, args);
  }
};
dart.addTypeTests(html$.MessageEvent);
const lastEventId$ = Symbol("MessageEvent.lastEventId");
const origin$5 = Symbol("MessageEvent.origin");
const ports$ = Symbol("MessageEvent.ports");
const suborigin$ = Symbol("MessageEvent.suborigin");
dart.setMethodSignature(html$.MessageEvent, () => ({
  __proto__: dart.getMethods(html$.MessageEvent.__proto__),
  [_initMessageEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, core.Object, core.String, core.String, html$.EventTarget, core.List$(html$.MessagePort)]),
  [_initMessageEvent_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.List$(html$.MessagePort)])
}));
dart.setGetterSignature(html$.MessageEvent, () => ({
  __proto__: dart.getGetters(html$.MessageEvent.__proto__),
  [$data]: dart.dynamic,
  [$source]: html$.EventTarget
}));
dart.setLibraryUri(html$.MessageEvent, "dart:html");
dart.setFieldSignature(html$.MessageEvent, () => ({
  __proto__: dart.getFields(html$.MessageEvent.__proto__),
  [_get_data]: dart.finalFieldType(dart.dynamic),
  [$lastEventId]: dart.finalFieldType(core.String),
  [$origin]: dart.finalFieldType(core.String),
  [$ports]: dart.finalFieldType(ListOfMessagePort()),
  [_get_source]: dart.finalFieldType(dart.dynamic),
  [$suborigin]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MessageEvent", html$.MessageEvent);
const _start$3 = dart.privateName(html$, "_start");
html$.MessagePort = class MessagePort extends html$.EventTarget {
  [$addEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    if (type === "message") {
      this[_start$3]();
    }
    super[$addEventListener](type, listener, useCapture);
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [_start$3](...args) {
    return this.start.apply(this, args);
  }
  get [$onMessage]() {
    return html$.MessagePort.messageEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.MessagePort);
dart.setMethodSignature(html$.MessagePort, () => ({
  __proto__: dart.getMethods(html$.MessagePort.__proto__),
  [$close]: dart.fnType(dart.void, []),
  [$postMessage]: dart.fnType(dart.void, [dart.dynamic], [core.List$(core.Object)]),
  [_postMessage_1]: dart.fnType(dart.void, [dart.dynamic, core.List$(core.Object)]),
  [_postMessage_2]: dart.fnType(dart.void, [dart.dynamic]),
  [_start$3]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.MessagePort, () => ({
  __proto__: dart.getGetters(html$.MessagePort.__proto__),
  [$onMessage]: async.Stream$(html$.MessageEvent)
}));
dart.setLibraryUri(html$.MessagePort, "dart:html");
dart.defineLazy(html$.MessagePort, {
  /*html$.MessagePort.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  }
});
dart.registerExtension("MessagePort", html$.MessagePort);
html$.MetaElement = class MetaElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("meta");
  }
  get [$content]() {
    return this.content;
  }
  set [$content](value) {
    this.content = value;
  }
  get [$httpEquiv]() {
    return this.httpEquiv;
  }
  set [$httpEquiv](value) {
    this.httpEquiv = value;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
};
(html$.MetaElement.created = function() {
  this[content] = null;
  this[httpEquiv] = null;
  this[name$22] = null;
  html$.MetaElement.__proto__.created.call(this);
}).prototype = html$.MetaElement.prototype;
dart.addTypeTests(html$.MetaElement);
const content = Symbol("MetaElement.content");
const httpEquiv = Symbol("MetaElement.httpEquiv");
const name$22 = Symbol("MetaElement.name");
dart.setLibraryUri(html$.MetaElement, "dart:html");
dart.setFieldSignature(html$.MetaElement, () => ({
  __proto__: dart.getFields(html$.MetaElement.__proto__),
  [$content]: dart.fieldType(core.String),
  [$httpEquiv]: dart.fieldType(core.String),
  [$name]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLMetaElement", html$.MetaElement);
const _get_modificationTime = dart.privateName(html$, "_get_modificationTime");
html$.Metadata = class Metadata extends _interceptors.Interceptor {
  get [$modificationTime]() {
    return html_common.convertNativeToDart_DateTime(this[_get_modificationTime]);
  }
  get [_get_modificationTime]() {
    return this.modificationTime;
  }
  get [$size]() {
    return this.size;
  }
};
dart.addTypeTests(html$.Metadata);
const size$4 = Symbol("Metadata.size");
dart.setGetterSignature(html$.Metadata, () => ({
  __proto__: dart.getGetters(html$.Metadata.__proto__),
  [$modificationTime]: core.DateTime
}));
dart.setLibraryUri(html$.Metadata, "dart:html");
dart.setFieldSignature(html$.Metadata, () => ({
  __proto__: dart.getFields(html$.Metadata.__proto__),
  [_get_modificationTime]: dart.finalFieldType(dart.dynamic),
  [$size]: dart.finalFieldType(core.int)
}));
dart.registerExtension("Metadata", html$.Metadata);
html$.MeterElement = class MeterElement extends html$.HtmlElement {
  static new() {
    return html$.MeterElement._check(html$.document[$createElement]("meter"));
  }
  static get supported() {
    return html$.Element.isTagSupported("meter");
  }
  get [$high]() {
    return this.high;
  }
  set [$high](value) {
    this.high = value;
  }
  get [$labels]() {
    return this.labels;
  }
  get [$low]() {
    return this.low;
  }
  set [$low](value) {
    this.low = value;
  }
  get [$max]() {
    return this.max;
  }
  set [$max](value) {
    this.max = value;
  }
  get [$min]() {
    return this.min;
  }
  set [$min](value) {
    this.min = value;
  }
  get [$optimum]() {
    return this.optimum;
  }
  set [$optimum](value) {
    this.optimum = value;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
(html$.MeterElement.created = function() {
  this[high] = null;
  this[labels$0] = null;
  this[low] = null;
  this[max$2] = null;
  this[min$2] = null;
  this[optimum] = null;
  this[value$10] = null;
  html$.MeterElement.__proto__.created.call(this);
}).prototype = html$.MeterElement.prototype;
dart.addTypeTests(html$.MeterElement);
const high = Symbol("MeterElement.high");
const labels$0 = Symbol("MeterElement.labels");
const low = Symbol("MeterElement.low");
const max$2 = Symbol("MeterElement.max");
const min$2 = Symbol("MeterElement.min");
const optimum = Symbol("MeterElement.optimum");
const value$10 = Symbol("MeterElement.value");
dart.setLibraryUri(html$.MeterElement, "dart:html");
dart.setFieldSignature(html$.MeterElement, () => ({
  __proto__: dart.getFields(html$.MeterElement.__proto__),
  [$high]: dart.fieldType(core.num),
  [$labels]: dart.finalFieldType(ListOfNode()),
  [$low]: dart.fieldType(core.num),
  [$max]: dart.fieldType(core.num),
  [$min]: dart.fieldType(core.num),
  [$optimum]: dart.fieldType(core.num),
  [$value]: dart.fieldType(core.num)
}));
dart.registerExtension("HTMLMeterElement", html$.MeterElement);
html$.MidiAccess = class MidiAccess extends html$.EventTarget {
  get [$inputs]() {
    return this.inputs;
  }
  get [$outputs]() {
    return this.outputs;
  }
  get [$sysexEnabled]() {
    return this.sysexEnabled;
  }
};
dart.addTypeTests(html$.MidiAccess);
const inputs = Symbol("MidiAccess.inputs");
const outputs = Symbol("MidiAccess.outputs");
const sysexEnabled = Symbol("MidiAccess.sysexEnabled");
dart.setLibraryUri(html$.MidiAccess, "dart:html");
dart.setFieldSignature(html$.MidiAccess, () => ({
  __proto__: dart.getFields(html$.MidiAccess.__proto__),
  [$inputs]: dart.finalFieldType(html$.MidiInputMap),
  [$outputs]: dart.finalFieldType(html$.MidiOutputMap),
  [$sysexEnabled]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("MIDIAccess", html$.MidiAccess);
html$.MidiConnectionEvent = class MidiConnectionEvent extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MidiConnectionEvent._create_1(type, eventInitDict_1);
    }
    return html$.MidiConnectionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MIDIConnectionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MIDIConnectionEvent(type);
  }
  get [$port]() {
    return this.port;
  }
};
dart.addTypeTests(html$.MidiConnectionEvent);
const port$4 = Symbol("MidiConnectionEvent.port");
dart.setLibraryUri(html$.MidiConnectionEvent, "dart:html");
dart.setFieldSignature(html$.MidiConnectionEvent, () => ({
  __proto__: dart.getFields(html$.MidiConnectionEvent.__proto__),
  [$port]: dart.finalFieldType(html$.MidiPort)
}));
dart.registerExtension("MIDIConnectionEvent", html$.MidiConnectionEvent);
html$.MidiPort = class MidiPort extends html$.EventTarget {
  get [$connection]() {
    return this.connection;
  }
  get [$id]() {
    return this.id;
  }
  get [$manufacturer]() {
    return this.manufacturer;
  }
  get [$name]() {
    return this.name;
  }
  get [$state]() {
    return this.state;
  }
  get [$type]() {
    return this.type;
  }
  get [$version]() {
    return this.version;
  }
  [$close]() {
    return html$.promiseToFuture(dart.dynamic, this.close());
  }
  [$open]() {
    return html$.promiseToFuture(dart.dynamic, this.open());
  }
};
dart.addTypeTests(html$.MidiPort);
const connection = Symbol("MidiPort.connection");
const id$8 = Symbol("MidiPort.id");
const manufacturer = Symbol("MidiPort.manufacturer");
const name$23 = Symbol("MidiPort.name");
const state$1 = Symbol("MidiPort.state");
const type$17 = Symbol("MidiPort.type");
const version$0 = Symbol("MidiPort.version");
dart.setMethodSignature(html$.MidiPort, () => ({
  __proto__: dart.getMethods(html$.MidiPort.__proto__),
  [$close]: dart.fnType(async.Future, []),
  [$open]: dart.fnType(async.Future, [])
}));
dart.setLibraryUri(html$.MidiPort, "dart:html");
dart.setFieldSignature(html$.MidiPort, () => ({
  __proto__: dart.getFields(html$.MidiPort.__proto__),
  [$connection]: dart.finalFieldType(core.String),
  [$id]: dart.finalFieldType(core.String),
  [$manufacturer]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String),
  [$state]: dart.finalFieldType(core.String),
  [$type]: dart.finalFieldType(core.String),
  [$version]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MIDIPort", html$.MidiPort);
html$.MidiInput = class MidiInput extends html$.MidiPort {
  get [$onMidiMessage]() {
    return html$.MidiInput.midiMessageEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.MidiInput);
dart.setGetterSignature(html$.MidiInput, () => ({
  __proto__: dart.getGetters(html$.MidiInput.__proto__),
  [$onMidiMessage]: async.Stream$(html$.MidiMessageEvent)
}));
dart.setLibraryUri(html$.MidiInput, "dart:html");
dart.defineLazy(html$.MidiInput, {
  /*html$.MidiInput.midiMessageEvent*/get midiMessageEvent() {
    return dart.const(new (EventStreamProviderOfMidiMessageEvent()).new("midimessage"));
  }
});
dart.registerExtension("MIDIInput", html$.MidiInput);
const _getItem = dart.privateName(html$, "_getItem");
const Interceptor_MapMixin$ = class Interceptor_MapMixin extends _interceptors.Interceptor {};
(Interceptor_MapMixin$.new = function() {
  Interceptor_MapMixin$.__proto__.new.call(this);
}).prototype = Interceptor_MapMixin$.prototype;
dart.applyMixin(Interceptor_MapMixin$, collection.MapMixin$(core.String, dart.dynamic));
html$.MidiInputMap = class MidiInputMap extends Interceptor_MapMixin$ {
  [_getItem](key) {
    return html_common.convertNativeToDart_Dictionary(this.get(key));
  }
  [$addAll](other) {
    MapOfString$dynamic()._check(other);
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$containsValue](value) {
    return this[$values][$any](dart.fn(e => dart.equals(e, value), MapTobool()));
  }
  [$containsKey](key) {
    return this[_getItem](core.String._check(key)) != null;
  }
  [$_get](key) {
    return this[_getItem](core.String._check(key));
  }
  [$forEach](f) {
    let entries = this.entries();
    while (true) {
      let entry = entries.next();
      if (entry.done) return;
      f(entry.value[0], html_common.convertNativeToDart_Dictionary(entry.value[1]));
    }
  }
  get [$keys]() {
    let keys = JSArrayOfString().of([]);
    this[$forEach](dart.fn((k, v) => keys[$add](k), StringAnddynamicTovoid()));
    return keys;
  }
  get [$values]() {
    let values = JSArrayOfMap().of([]);
    this[$forEach](dart.fn((k, v) => values[$add](core.Map._check(v)), StringAnddynamicTovoid()));
    return values;
  }
  get [$length]() {
    return this.size;
  }
  get [$isEmpty]() {
    return this[$length] === 0;
  }
  get [$isNotEmpty]() {
    return !dart.test(this[$isEmpty]);
  }
  [$_set](key, value) {
    core.String._check(key);
    dart.throw(new core.UnsupportedError.new("Not supported"));
    return value;
  }
  [$putIfAbsent](key, ifAbsent) {
    core.String._check(key);
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$remove](key) {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$clear]() {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
};
dart.addTypeTests(html$.MidiInputMap);
dart.setMethodSignature(html$.MidiInputMap, () => ({
  __proto__: dart.getMethods(html$.MidiInputMap.__proto__),
  [_getItem]: dart.fnType(core.Map, [core.String]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [dart.dynamic]),
  [$containsKey]: dart.fnType(core.bool, [dart.dynamic]),
  [$_get]: dart.fnType(core.Map, [dart.dynamic]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, dart.dynamic])]),
  [$_set]: dart.fnType(dart.void, [core.Object, dart.dynamic]),
  [$putIfAbsent]: dart.fnType(dart.dynamic, [core.Object, dart.fnType(dart.dynamic, [])]),
  [$remove]: dart.fnType(core.String, [dart.dynamic]),
  [$clear]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.MidiInputMap, () => ({
  __proto__: dart.getGetters(html$.MidiInputMap.__proto__),
  [$keys]: core.Iterable$(core.String),
  [$values]: core.Iterable$(core.Map),
  [$length]: core.int,
  [$isEmpty]: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setLibraryUri(html$.MidiInputMap, "dart:html");
dart.registerExtension("MIDIInputMap", html$.MidiInputMap);
html$.MidiMessageEvent = class MidiMessageEvent extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MidiMessageEvent._create_1(type, eventInitDict_1);
    }
    return html$.MidiMessageEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MIDIMessageEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MIDIMessageEvent(type);
  }
  get [$data]() {
    return this.data;
  }
};
dart.addTypeTests(html$.MidiMessageEvent);
const data$4 = Symbol("MidiMessageEvent.data");
dart.setLibraryUri(html$.MidiMessageEvent, "dart:html");
dart.setFieldSignature(html$.MidiMessageEvent, () => ({
  __proto__: dart.getFields(html$.MidiMessageEvent.__proto__),
  [$data]: dart.finalFieldType(typed_data.Uint8List)
}));
dart.registerExtension("MIDIMessageEvent", html$.MidiMessageEvent);
html$.MidiOutput = class MidiOutput extends html$.MidiPort {
  [$send](...args) {
    return this.send.apply(this, args);
  }
};
dart.addTypeTests(html$.MidiOutput);
dart.setMethodSignature(html$.MidiOutput, () => ({
  __proto__: dart.getMethods(html$.MidiOutput.__proto__),
  [$send]: dart.fnType(dart.void, [typed_data.Uint8List], [core.num])
}));
dart.setLibraryUri(html$.MidiOutput, "dart:html");
dart.registerExtension("MIDIOutput", html$.MidiOutput);
const Interceptor_MapMixin$$ = class Interceptor_MapMixin extends _interceptors.Interceptor {};
(Interceptor_MapMixin$$.new = function() {
  Interceptor_MapMixin$$.__proto__.new.call(this);
}).prototype = Interceptor_MapMixin$$.prototype;
dart.applyMixin(Interceptor_MapMixin$$, collection.MapMixin$(core.String, dart.dynamic));
html$.MidiOutputMap = class MidiOutputMap extends Interceptor_MapMixin$$ {
  [_getItem](key) {
    return html_common.convertNativeToDart_Dictionary(this.get(key));
  }
  [$addAll](other) {
    MapOfString$dynamic()._check(other);
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$containsValue](value) {
    return this[$values][$any](dart.fn(e => dart.equals(e, value), MapTobool()));
  }
  [$containsKey](key) {
    return this[_getItem](core.String._check(key)) != null;
  }
  [$_get](key) {
    return this[_getItem](core.String._check(key));
  }
  [$forEach](f) {
    let entries = this.entries();
    while (true) {
      let entry = entries.next();
      if (entry.done) return;
      f(entry.value[0], html_common.convertNativeToDart_Dictionary(entry.value[1]));
    }
  }
  get [$keys]() {
    let keys = JSArrayOfString().of([]);
    this[$forEach](dart.fn((k, v) => keys[$add](k), StringAnddynamicTovoid()));
    return keys;
  }
  get [$values]() {
    let values = JSArrayOfMap().of([]);
    this[$forEach](dart.fn((k, v) => values[$add](core.Map._check(v)), StringAnddynamicTovoid()));
    return values;
  }
  get [$length]() {
    return this.size;
  }
  get [$isEmpty]() {
    return this[$length] === 0;
  }
  get [$isNotEmpty]() {
    return !dart.test(this[$isEmpty]);
  }
  [$_set](key, value) {
    core.String._check(key);
    dart.throw(new core.UnsupportedError.new("Not supported"));
    return value;
  }
  [$putIfAbsent](key, ifAbsent) {
    core.String._check(key);
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$remove](key) {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$clear]() {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
};
dart.addTypeTests(html$.MidiOutputMap);
dart.setMethodSignature(html$.MidiOutputMap, () => ({
  __proto__: dart.getMethods(html$.MidiOutputMap.__proto__),
  [_getItem]: dart.fnType(core.Map, [core.String]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [dart.dynamic]),
  [$containsKey]: dart.fnType(core.bool, [dart.dynamic]),
  [$_get]: dart.fnType(core.Map, [dart.dynamic]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, dart.dynamic])]),
  [$_set]: dart.fnType(dart.void, [core.Object, dart.dynamic]),
  [$putIfAbsent]: dart.fnType(dart.dynamic, [core.Object, dart.fnType(dart.dynamic, [])]),
  [$remove]: dart.fnType(core.String, [dart.dynamic]),
  [$clear]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.MidiOutputMap, () => ({
  __proto__: dart.getGetters(html$.MidiOutputMap.__proto__),
  [$keys]: core.Iterable$(core.String),
  [$values]: core.Iterable$(core.Map),
  [$length]: core.int,
  [$isEmpty]: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setLibraryUri(html$.MidiOutputMap, "dart:html");
dart.registerExtension("MIDIOutputMap", html$.MidiOutputMap);
html$.MimeType = class MimeType extends _interceptors.Interceptor {
  get [$description]() {
    return this.description;
  }
  get [$enabledPlugin]() {
    return this.enabledPlugin;
  }
  get [$suffixes]() {
    return this.suffixes;
  }
  get [$type]() {
    return this.type;
  }
};
dart.addTypeTests(html$.MimeType);
const description = Symbol("MimeType.description");
const enabledPlugin = Symbol("MimeType.enabledPlugin");
const suffixes = Symbol("MimeType.suffixes");
const type$18 = Symbol("MimeType.type");
dart.setLibraryUri(html$.MimeType, "dart:html");
dart.setFieldSignature(html$.MimeType, () => ({
  __proto__: dart.getFields(html$.MimeType.__proto__),
  [$description]: dart.finalFieldType(core.String),
  [$enabledPlugin]: dart.finalFieldType(html$.Plugin),
  [$suffixes]: dart.finalFieldType(core.String),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MimeType", html$.MimeType);
const Interceptor_ListMixin$$2 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$2.new = function() {
  Interceptor_ListMixin$$2.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$2.prototype;
dart.applyMixin(Interceptor_ListMixin$$2, collection.ListMixin$(html$.MimeType));
const Interceptor_ImmutableListMixin$$2 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$2 {};
(Interceptor_ImmutableListMixin$$2.new = function() {
  Interceptor_ImmutableListMixin$$2.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$2.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$2, html$.ImmutableListMixin$(html$.MimeType));
html$.MimeTypeArray = class MimeTypeArray extends Interceptor_ImmutableListMixin$$2 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.MimeType._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
};
html$.MimeTypeArray.prototype[dart.isList] = true;
dart.addTypeTests(html$.MimeTypeArray);
html$.MimeTypeArray[dart.implements] = () => [ListOfMimeType(), JavaScriptIndexingBehaviorOfMimeType()];
dart.setMethodSignature(html$.MimeTypeArray, () => ({
  __proto__: dart.getMethods(html$.MimeTypeArray.__proto__),
  [$_get]: dart.fnType(html$.MimeType, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.MimeType, [core.int]),
  [$item]: dart.fnType(html$.MimeType, [core.int]),
  [$namedItem]: dart.fnType(html$.MimeType, [core.String])
}));
dart.setGetterSignature(html$.MimeTypeArray, () => ({
  __proto__: dart.getGetters(html$.MimeTypeArray.__proto__),
  [$length]: core.int,
  [$first]: html$.MimeType,
  [$last]: html$.MimeType,
  [$single]: html$.MimeType
}));
dart.setSetterSignature(html$.MimeTypeArray, () => ({
  __proto__: dart.getSetters(html$.MimeTypeArray.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.MimeTypeArray, "dart:html");
dart.registerExtension("MimeTypeArray", html$.MimeTypeArray);
html$.ModElement = class ModElement extends html$.HtmlElement {
  get [$cite]() {
    return this.cite;
  }
  set [$cite](value) {
    this.cite = value;
  }
  get [$dateTime]() {
    return this.dateTime;
  }
  set [$dateTime](value) {
    this.dateTime = value;
  }
};
(html$.ModElement.created = function() {
  this[cite] = null;
  this[dateTime] = null;
  html$.ModElement.__proto__.created.call(this);
}).prototype = html$.ModElement.prototype;
dart.addTypeTests(html$.ModElement);
const cite = Symbol("ModElement.cite");
const dateTime = Symbol("ModElement.dateTime");
dart.setLibraryUri(html$.ModElement, "dart:html");
dart.setFieldSignature(html$.ModElement, () => ({
  __proto__: dart.getFields(html$.ModElement.__proto__),
  [$cite]: dart.fieldType(core.String),
  [$dateTime]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLModElement", html$.ModElement);
const _initMouseEvent = dart.privateName(html$, "_initMouseEvent");
const _clientX = dart.privateName(html$, "_clientX");
const _clientY = dart.privateName(html$, "_clientY");
const _layerX = dart.privateName(html$, "_layerX");
const _layerY = dart.privateName(html$, "_layerY");
const _movementX = dart.privateName(html$, "_movementX");
const _movementY = dart.privateName(html$, "_movementY");
const _pageX = dart.privateName(html$, "_pageX");
const _pageY = dart.privateName(html$, "_pageY");
const _screenX = dart.privateName(html$, "_screenX");
const _screenY = dart.privateName(html$, "_screenY");
const _initMouseEvent_1 = dart.privateName(html$, "_initMouseEvent_1");
html$.MouseEvent = class MouseEvent$ extends html$.UIEvent {
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let detail = opts && 'detail' in opts ? opts.detail : 0;
    let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
    let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
    let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
    let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
    let button = opts && 'button' in opts ? opts.button : 0;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
    if (view == null) {
      view = html$.window;
    }
    let event = html$.MouseEvent._check(html$.document[_createEvent]("MouseEvent"));
    event[_initMouseEvent](type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
    return event;
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.MouseEvent._create_1(type, eventInitDict_1);
    }
    return html$.MouseEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MouseEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MouseEvent(type);
  }
  get [$altKey]() {
    return this.altKey;
  }
  get [$button]() {
    return this.button;
  }
  get [$buttons]() {
    return this.buttons;
  }
  get [_clientX]() {
    return this.clientX;
  }
  get [_clientY]() {
    return this.clientY;
  }
  get [$ctrlKey]() {
    return this.ctrlKey;
  }
  get [$fromElement]() {
    return this.fromElement;
  }
  get [_layerX]() {
    return this.layerX;
  }
  get [_layerY]() {
    return this.layerY;
  }
  get [$metaKey]() {
    return this.metaKey;
  }
  get [_movementX]() {
    return this.movementX;
  }
  get [_movementY]() {
    return this.movementY;
  }
  get [_pageX]() {
    return this.pageX;
  }
  get [_pageY]() {
    return this.pageY;
  }
  get [$region]() {
    return this.region;
  }
  get [$relatedTarget]() {
    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
  }
  get [_get_relatedTarget]() {
    return this.relatedTarget;
  }
  get [_screenX]() {
    return this.screenX;
  }
  get [_screenY]() {
    return this.screenY;
  }
  get [$shiftKey]() {
    return this.shiftKey;
  }
  get [$toElement]() {
    return this.toElement;
  }
  [$getModifierState](...args) {
    return this.getModifierState.apply(this, args);
  }
  [_initMouseEvent](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
    let relatedTarget_1 = html$._convertDartToNative_EventTarget(relatedTarget);
    this[_initMouseEvent_1](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
    return;
  }
  [_initMouseEvent_1](...args) {
    return this.initMouseEvent.apply(this, args);
  }
  get [$client]() {
    return new (PointOfnum()).new(this[_clientX], this[_clientY]);
  }
  get [$movement]() {
    return new (PointOfnum()).new(this[_movementX], this[_movementY]);
  }
  get [$offset]() {
    if (!!this.offsetX) {
      let x = this.offsetX;
      let y = this.offsetY;
      return new (PointOfnum()).new(x, y);
    } else {
      if (!html$.Element.is(this[$target])) {
        dart.throw(new core.UnsupportedError.new("offsetX is only supported on elements"));
      }
      let target = html$.Element._check(this[$target]);
      let point = this[$client]['-'](target.getBoundingClientRect()[$topLeft]);
      return new (PointOfnum()).new(point.x[$toInt](), point.y[$toInt]());
    }
  }
  get [$screen]() {
    return new (PointOfnum()).new(this[_screenX], this[_screenY]);
  }
  get [$layer]() {
    return new (PointOfnum()).new(this[_layerX], this[_layerY]);
  }
  get [$page]() {
    return new (PointOfnum()).new(this[_pageX], this[_pageY]);
  }
  get [$dataTransfer]() {
    return this.dataTransfer;
  }
};
dart.addTypeTests(html$.MouseEvent);
const altKey$ = Symbol("MouseEvent.altKey");
const button = Symbol("MouseEvent.button");
const buttons$ = Symbol("MouseEvent.buttons");
const ctrlKey$ = Symbol("MouseEvent.ctrlKey");
const fromElement = Symbol("MouseEvent.fromElement");
const metaKey$ = Symbol("MouseEvent.metaKey");
const region = Symbol("MouseEvent.region");
const shiftKey$ = Symbol("MouseEvent.shiftKey");
const toElement = Symbol("MouseEvent.toElement");
dart.setMethodSignature(html$.MouseEvent, () => ({
  __proto__: dart.getMethods(html$.MouseEvent.__proto__),
  [$getModifierState]: dart.fnType(core.bool, [core.String]),
  [_initMouseEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget]),
  [_initMouseEvent_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
}));
dart.setGetterSignature(html$.MouseEvent, () => ({
  __proto__: dart.getGetters(html$.MouseEvent.__proto__),
  [$relatedTarget]: html$.EventTarget,
  [$client]: math.Point$(core.num),
  [$movement]: math.Point$(core.num),
  [$offset]: math.Point$(core.num),
  [$screen]: math.Point$(core.num),
  [$layer]: math.Point$(core.num),
  [$page]: math.Point$(core.num),
  [$dataTransfer]: html$.DataTransfer
}));
dart.setLibraryUri(html$.MouseEvent, "dart:html");
dart.setFieldSignature(html$.MouseEvent, () => ({
  __proto__: dart.getFields(html$.MouseEvent.__proto__),
  [$altKey]: dart.finalFieldType(core.bool),
  [$button]: dart.finalFieldType(core.int),
  [$buttons]: dart.finalFieldType(core.int),
  [_clientX]: dart.finalFieldType(core.num),
  [_clientY]: dart.finalFieldType(core.num),
  [$ctrlKey]: dart.finalFieldType(core.bool),
  [$fromElement]: dart.finalFieldType(html$.Node),
  [_layerX]: dart.finalFieldType(core.int),
  [_layerY]: dart.finalFieldType(core.int),
  [$metaKey]: dart.finalFieldType(core.bool),
  [_movementX]: dart.finalFieldType(core.int),
  [_movementY]: dart.finalFieldType(core.int),
  [_pageX]: dart.finalFieldType(core.num),
  [_pageY]: dart.finalFieldType(core.num),
  [$region]: dart.finalFieldType(core.String),
  [_get_relatedTarget]: dart.finalFieldType(dart.dynamic),
  [_screenX]: dart.finalFieldType(core.num),
  [_screenY]: dart.finalFieldType(core.num),
  [$shiftKey]: dart.finalFieldType(core.bool),
  [$toElement]: dart.finalFieldType(html$.Node)
}));
dart.registerExtension("MouseEvent", html$.MouseEvent);
dart.registerExtension("DragEvent", html$.MouseEvent);
html$.MutationEvent = class MutationEvent extends html$.Event {
  get [$attrChange]() {
    return this.attrChange;
  }
  get [$attrName]() {
    return this.attrName;
  }
  get [$newValue]() {
    return this.newValue;
  }
  get [$prevValue]() {
    return this.prevValue;
  }
  get [$relatedNode]() {
    return this.relatedNode;
  }
  [$initMutationEvent](...args) {
    return this.initMutationEvent.apply(this, args);
  }
};
dart.addTypeTests(html$.MutationEvent);
const attrChange = Symbol("MutationEvent.attrChange");
const attrName = Symbol("MutationEvent.attrName");
const newValue = Symbol("MutationEvent.newValue");
const prevValue = Symbol("MutationEvent.prevValue");
const relatedNode = Symbol("MutationEvent.relatedNode");
dart.setMethodSignature(html$.MutationEvent, () => ({
  __proto__: dart.getMethods(html$.MutationEvent.__proto__),
  [$initMutationEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Node, core.String, core.String, core.String, core.int])
}));
dart.setLibraryUri(html$.MutationEvent, "dart:html");
dart.setFieldSignature(html$.MutationEvent, () => ({
  __proto__: dart.getFields(html$.MutationEvent.__proto__),
  [$attrChange]: dart.finalFieldType(core.int),
  [$attrName]: dart.finalFieldType(core.String),
  [$newValue]: dart.finalFieldType(core.String),
  [$prevValue]: dart.finalFieldType(core.String),
  [$relatedNode]: dart.finalFieldType(html$.Node)
}));
dart.defineLazy(html$.MutationEvent, {
  /*html$.MutationEvent.ADDITION*/get ADDITION() {
    return 2;
  },
  /*html$.MutationEvent.MODIFICATION*/get MODIFICATION() {
    return 1;
  },
  /*html$.MutationEvent.REMOVAL*/get REMOVAL() {
    return 3;
  }
});
dart.registerExtension("MutationEvent", html$.MutationEvent);
const _observe_1$ = dart.privateName(html$, "_observe_1");
const _observe_2 = dart.privateName(html$, "_observe_2");
const _observe = dart.privateName(html$, "_observe");
const _call = dart.privateName(html$, "_call");
html$.MutationObserver = class MutationObserver extends _interceptors.Interceptor {
  [$disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [_observe](target, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[_observe_1$](target, options_1);
      return;
    }
    this[_observe_2](target);
    return;
  }
  [_observe_1$](...args) {
    return this.observe.apply(this, args);
  }
  [_observe_2](...args) {
    return this.observe.apply(this, args);
  }
  [$takeRecords](...args) {
    return this.takeRecords.apply(this, args);
  }
  static get supported() {
    return !!(window.MutationObserver || window.WebKitMutationObserver);
  }
  [$observe](target, opts) {
    let childList = opts && 'childList' in opts ? opts.childList : null;
    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
    let characterData = opts && 'characterData' in opts ? opts.characterData : null;
    let subtree = opts && 'subtree' in opts ? opts.subtree : null;
    let attributeOldValue = opts && 'attributeOldValue' in opts ? opts.attributeOldValue : null;
    let characterDataOldValue = opts && 'characterDataOldValue' in opts ? opts.characterDataOldValue : null;
    let attributeFilter = opts && 'attributeFilter' in opts ? opts.attributeFilter : null;
    let parsedOptions = html$.MutationObserver._createDict();
    function override(key, value) {
      if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
    }
    dart.fn(override, dynamicAnddynamicToNull());
    override("childList", childList);
    override("attributes", attributes);
    override("characterData", characterData);
    override("subtree", subtree);
    override("attributeOldValue", attributeOldValue);
    override("characterDataOldValue", characterDataOldValue);
    if (attributeFilter != null) {
      override("attributeFilter", html$.MutationObserver._fixupList(attributeFilter));
    }
    this[_call](target, parsedOptions);
  }
  static _createDict() {
    return {};
  }
  static _add(m, key, value) {
    m[key] = value;
  }
  static _fixupList(list) {
    return list;
  }
  [_call](...args) {
    return this.observe.apply(this, args);
  }
  static new(callback) {
    0;
    return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(_js_helper.convertDartClosureToJS(ListAndMutationObserverTovoid(), html$._wrapBinaryZone(core.List, html$.MutationObserver, callback), 2));
  }
};
dart.addTypeTests(html$.MutationObserver);
dart.setMethodSignature(html$.MutationObserver, () => ({
  __proto__: dart.getMethods(html$.MutationObserver.__proto__),
  [$disconnect]: dart.fnType(dart.void, []),
  [_observe]: dart.fnType(dart.void, [html$.Node], [core.Map]),
  [_observe_1$]: dart.fnType(dart.void, [html$.Node, dart.dynamic]),
  [_observe_2]: dart.fnType(dart.void, [html$.Node]),
  [$takeRecords]: dart.fnType(core.List$(html$.MutationRecord), []),
  [$observe]: dart.fnType(dart.void, [html$.Node], {childList: core.bool, attributes: core.bool, characterData: core.bool, subtree: core.bool, attributeOldValue: core.bool, characterDataOldValue: core.bool, attributeFilter: core.List$(core.String)}),
  [_call]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic])
}));
dart.setLibraryUri(html$.MutationObserver, "dart:html");
dart.defineLazy(html$.MutationObserver, {
  /*html$.MutationObserver._boolKeys*/get _boolKeys() {
    return dart.constMap(core.String, core.bool, ["childList", true, "attributes", true, "characterData", true, "subtree", true, "attributeOldValue", true, "characterDataOldValue", true]);
  }
});
dart.registerExtension("MutationObserver", html$.MutationObserver);
dart.registerExtension("WebKitMutationObserver", html$.MutationObserver);
html$.MutationRecord = class MutationRecord extends _interceptors.Interceptor {
  get [$addedNodes]() {
    return this.addedNodes;
  }
  get [$attributeName]() {
    return this.attributeName;
  }
  get [$attributeNamespace]() {
    return this.attributeNamespace;
  }
  get [$nextSibling]() {
    return this.nextSibling;
  }
  get [$oldValue]() {
    return this.oldValue;
  }
  get [$previousSibling]() {
    return this.previousSibling;
  }
  get [$removedNodes]() {
    return this.removedNodes;
  }
  get [$target]() {
    return this.target;
  }
  get [$type]() {
    return this.type;
  }
};
dart.addTypeTests(html$.MutationRecord);
const addedNodes = Symbol("MutationRecord.addedNodes");
const attributeName = Symbol("MutationRecord.attributeName");
const attributeNamespace = Symbol("MutationRecord.attributeNamespace");
const nextSibling = Symbol("MutationRecord.nextSibling");
const oldValue = Symbol("MutationRecord.oldValue");
const previousSibling = Symbol("MutationRecord.previousSibling");
const removedNodes = Symbol("MutationRecord.removedNodes");
const target$4 = Symbol("MutationRecord.target");
const type$19 = Symbol("MutationRecord.type");
dart.setLibraryUri(html$.MutationRecord, "dart:html");
dart.setFieldSignature(html$.MutationRecord, () => ({
  __proto__: dart.getFields(html$.MutationRecord.__proto__),
  [$addedNodes]: dart.finalFieldType(ListOfNode()),
  [$attributeName]: dart.finalFieldType(core.String),
  [$attributeNamespace]: dart.finalFieldType(core.String),
  [$nextSibling]: dart.finalFieldType(html$.Node),
  [$oldValue]: dart.finalFieldType(core.String),
  [$previousSibling]: dart.finalFieldType(html$.Node),
  [$removedNodes]: dart.finalFieldType(ListOfNode()),
  [$target]: dart.finalFieldType(html$.Node),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("MutationRecord", html$.MutationRecord);
html$.NavigationPreloadManager = class NavigationPreloadManager extends _interceptors.Interceptor {
  [$disable]() {
    return html$.promiseToFuture(dart.dynamic, this.disable());
  }
  [$enable]() {
    return html$.promiseToFuture(dart.dynamic, this.enable());
  }
  [$getState]() {
    return html$.promiseToFutureAsMap(this.getState());
  }
};
dart.addTypeTests(html$.NavigationPreloadManager);
dart.setMethodSignature(html$.NavigationPreloadManager, () => ({
  __proto__: dart.getMethods(html$.NavigationPreloadManager.__proto__),
  [$disable]: dart.fnType(async.Future, []),
  [$enable]: dart.fnType(async.Future, []),
  [$getState]: dart.fnType(async.Future$(core.Map$(core.String, dart.dynamic)), [])
}));
dart.setLibraryUri(html$.NavigationPreloadManager, "dart:html");
dart.registerExtension("NavigationPreloadManager", html$.NavigationPreloadManager);
const _getGamepads = dart.privateName(html$, "_getGamepads");
const _ensureGetUserMedia = dart.privateName(html$, "_ensureGetUserMedia");
const _getUserMedia = dart.privateName(html$, "_getUserMedia");
const _requestKeyboardLock_1 = dart.privateName(html$, "_requestKeyboardLock_1");
const _requestKeyboardLock_2 = dart.privateName(html$, "_requestKeyboardLock_2");
html$.NavigatorConcurrentHardware = class NavigatorConcurrentHardware extends _interceptors.Interceptor {
  get [$hardwareConcurrency]() {
    return this.hardwareConcurrency;
  }
};
dart.addTypeTests(html$.NavigatorConcurrentHardware);
const hardwareConcurrency = Symbol("NavigatorConcurrentHardware.hardwareConcurrency");
dart.setLibraryUri(html$.NavigatorConcurrentHardware, "dart:html");
dart.setFieldSignature(html$.NavigatorConcurrentHardware, () => ({
  __proto__: dart.getFields(html$.NavigatorConcurrentHardware.__proto__),
  [$hardwareConcurrency]: dart.finalFieldType(core.int)
}));
dart.registerExtension("NavigatorConcurrentHardware", html$.NavigatorConcurrentHardware);
html$.Navigator = class Navigator extends html$.NavigatorConcurrentHardware {
  [$getGamepads]() {
    let gamepadList = this[_getGamepads]();
    let jsProto = gamepadList.prototype;
    if (jsProto == null) {
      gamepadList.prototype = Object.create(null);
    }
    _js_helper.applyExtension("GamepadList", gamepadList);
    return gamepadList;
  }
  get [$language]() {
    return this.language || this.userLanguage;
  }
  [$getUserMedia](opts) {
    let audio = opts && 'audio' in opts ? opts.audio : false;
    let video = opts && 'video' in opts ? opts.video : false;
    let completer = CompleterOfMediaStream().new();
    let options = new (IdentityMapOfString$dynamic()).from(["audio", audio, "video", video]);
    this[_ensureGetUserMedia]();
    this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
      completer.complete(stream);
    }, MediaStreamToNull()), dart.fn(error => {
      completer.completeError(error);
    }, NavigatorUserMediaErrorToNull()));
    return completer.future;
  }
  [_ensureGetUserMedia]() {
    if (!this.getUserMedia) {
      this.getUserMedia = this.getUserMedia || this.webkitGetUserMedia || this.mozGetUserMedia || this.msGetUserMedia;
    }
  }
  [_getUserMedia](...args) {
    return this.getUserMedia.apply(this, args);
  }
  get [$budget]() {
    return this.budget;
  }
  get [$clipboard]() {
    return this.clipboard;
  }
  get [$connection]() {
    return this.connection;
  }
  get [$credentials]() {
    return this.credentials;
  }
  get [$deviceMemory]() {
    return this.deviceMemory;
  }
  get [$doNotTrack]() {
    return this.doNotTrack;
  }
  get [$geolocation]() {
    return this.geolocation;
  }
  get [$maxTouchPoints]() {
    return this.maxTouchPoints;
  }
  get [$mediaCapabilities]() {
    return this.mediaCapabilities;
  }
  get [$mediaDevices]() {
    return this.mediaDevices;
  }
  get [$mediaSession]() {
    return this.mediaSession;
  }
  get [$mimeTypes]() {
    return this.mimeTypes;
  }
  get [$nfc]() {
    return this.nfc;
  }
  get [$permissions]() {
    return this.permissions;
  }
  get [$presentation]() {
    return this.presentation;
  }
  get [$productSub]() {
    return this.productSub;
  }
  get [$serviceWorker]() {
    return this.serviceWorker;
  }
  get [$storage]() {
    return this.storage;
  }
  get [$vendor]() {
    return this.vendor;
  }
  get [$vendorSub]() {
    return this.vendorSub;
  }
  get [$vr]() {
    return this.vr;
  }
  get [$persistentStorage]() {
    return this.webkitPersistentStorage;
  }
  get [$temporaryStorage]() {
    return this.webkitTemporaryStorage;
  }
  [$cancelKeyboardLock](...args) {
    return this.cancelKeyboardLock.apply(this, args);
  }
  [$getBattery]() {
    return html$.promiseToFuture(dart.dynamic, this.getBattery());
  }
  [_getGamepads](...args) {
    return this.getGamepads.apply(this, args);
  }
  [$getInstalledRelatedApps]() {
    return html$.promiseToFuture(html$.RelatedApplication, this.getInstalledRelatedApps());
  }
  [$getVRDisplays]() {
    return html$.promiseToFuture(dart.dynamic, this.getVRDisplays());
  }
  [$registerProtocolHandler](...args) {
    return this.registerProtocolHandler.apply(this, args);
  }
  [$requestKeyboardLock](keyCodes) {
    if (keyCodes === void 0) keyCodes = null;
    if (keyCodes != null) {
      let keyCodes_1 = html_common.convertDartToNative_StringArray(keyCodes);
      return this[_requestKeyboardLock_1](keyCodes_1);
    }
    return this[_requestKeyboardLock_2]();
  }
  [_requestKeyboardLock_1](keyCodes) {
    return html$.promiseToFuture(dart.dynamic, this.requestKeyboardLock(keyCodes));
  }
  [_requestKeyboardLock_2]() {
    return html$.promiseToFuture(dart.dynamic, this.requestKeyboardLock());
  }
  [$requestMidiAccess](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.requestMidiAccess(options_dict));
  }
  [$requestMediaKeySystemAccess](keySystem, supportedConfigurations) {
    return html$.promiseToFuture(dart.dynamic, this.requestMediaKeySystemAccess(keySystem, supportedConfigurations));
  }
  [$sendBeacon](...args) {
    return this.sendBeacon.apply(this, args);
  }
  [$share](data) {
    if (data === void 0) data = null;
    let data_dict = null;
    if (data != null) {
      data_dict = html_common.convertDartToNative_Dictionary(data);
    }
    return html$.promiseToFuture(dart.dynamic, this.share(data_dict));
  }
  get [$webdriver]() {
    return this.webdriver;
  }
  get [$cookieEnabled]() {
    return this.cookieEnabled;
  }
  get [$appCodeName]() {
    return this.appCodeName;
  }
  get [$appName]() {
    return this.appName;
  }
  get [$appVersion]() {
    return this.appVersion;
  }
  get [$dartEnabled]() {
    return this.dartEnabled;
  }
  get [$platform]() {
    return this.platform;
  }
  get [$product]() {
    return this.product;
  }
  get [$userAgent]() {
    return this.userAgent;
  }
  get [$languages]() {
    return this.languages;
  }
  get [$onLine]() {
    return this.onLine;
  }
};
dart.addTypeTests(html$.Navigator);
const budget = Symbol("Navigator.budget");
const clipboard = Symbol("Navigator.clipboard");
const connection$ = Symbol("Navigator.connection");
const credentials = Symbol("Navigator.credentials");
const deviceMemory = Symbol("Navigator.deviceMemory");
const doNotTrack = Symbol("Navigator.doNotTrack");
const geolocation = Symbol("Navigator.geolocation");
const maxTouchPoints = Symbol("Navigator.maxTouchPoints");
const mediaCapabilities = Symbol("Navigator.mediaCapabilities");
const mediaDevices = Symbol("Navigator.mediaDevices");
const mediaSession = Symbol("Navigator.mediaSession");
const mimeTypes = Symbol("Navigator.mimeTypes");
const nfc = Symbol("Navigator.nfc");
const permissions = Symbol("Navigator.permissions");
const presentation = Symbol("Navigator.presentation");
const productSub = Symbol("Navigator.productSub");
const serviceWorker = Symbol("Navigator.serviceWorker");
const storage = Symbol("Navigator.storage");
const vendor = Symbol("Navigator.vendor");
const vendorSub = Symbol("Navigator.vendorSub");
const vr = Symbol("Navigator.vr");
const persistentStorage = Symbol("Navigator.persistentStorage");
const temporaryStorage = Symbol("Navigator.temporaryStorage");
const webdriver = Symbol("Navigator.webdriver");
const cookieEnabled = Symbol("Navigator.cookieEnabled");
const appCodeName = Symbol("Navigator.appCodeName");
const appName = Symbol("Navigator.appName");
const appVersion = Symbol("Navigator.appVersion");
const dartEnabled = Symbol("Navigator.dartEnabled");
const platform = Symbol("Navigator.platform");
const product = Symbol("Navigator.product");
const userAgent = Symbol("Navigator.userAgent");
const languages = Symbol("Navigator.languages");
const onLine = Symbol("Navigator.onLine");
html$.Navigator[dart.implements] = () => [html$.NavigatorCookies, html$.NavigatorLanguage, html$.NavigatorOnLine, html$.NavigatorAutomationInformation, html$.NavigatorID];
dart.setMethodSignature(html$.Navigator, () => ({
  __proto__: dart.getMethods(html$.Navigator.__proto__),
  [$getGamepads]: dart.fnType(core.List$(html$.Gamepad), []),
  [$getUserMedia]: dart.fnType(async.Future$(html$.MediaStream), [], {audio: dart.dynamic, video: dart.dynamic}),
  [_ensureGetUserMedia]: dart.fnType(dart.dynamic, []),
  [_getUserMedia]: dart.fnType(dart.void, [dart.dynamic, dart.fnType(dart.void, [html$.MediaStream]), dart.fnType(dart.void, [html$.NavigatorUserMediaError])]),
  [$cancelKeyboardLock]: dart.fnType(dart.void, []),
  [$getBattery]: dart.fnType(async.Future, []),
  [_getGamepads]: dart.fnType(core.List$(html$.Gamepad), []),
  [$getInstalledRelatedApps]: dart.fnType(async.Future$(html$.RelatedApplication), []),
  [$getVRDisplays]: dart.fnType(async.Future, []),
  [$registerProtocolHandler]: dart.fnType(dart.void, [core.String, core.String, core.String]),
  [$requestKeyboardLock]: dart.fnType(async.Future, [], [core.List$(core.String)]),
  [_requestKeyboardLock_1]: dart.fnType(async.Future, [core.List]),
  [_requestKeyboardLock_2]: dart.fnType(async.Future, []),
  [$requestMidiAccess]: dart.fnType(async.Future, [], [core.Map]),
  [$requestMediaKeySystemAccess]: dart.fnType(async.Future, [core.String, core.List$(core.Map)]),
  [$sendBeacon]: dart.fnType(core.bool, [core.String, core.Object]),
  [$share]: dart.fnType(async.Future, [], [core.Map])
}));
dart.setGetterSignature(html$.Navigator, () => ({
  __proto__: dart.getGetters(html$.Navigator.__proto__),
  [$language]: core.String
}));
dart.setLibraryUri(html$.Navigator, "dart:html");
dart.setFieldSignature(html$.Navigator, () => ({
  __proto__: dart.getFields(html$.Navigator.__proto__),
  [$budget]: dart.finalFieldType(html$._BudgetService),
  [$clipboard]: dart.finalFieldType(html$._Clipboard),
  [$connection]: dart.finalFieldType(html$.NetworkInformation),
  [$credentials]: dart.finalFieldType(html$.CredentialsContainer),
  [$deviceMemory]: dart.finalFieldType(core.num),
  [$doNotTrack]: dart.finalFieldType(core.String),
  [$geolocation]: dart.finalFieldType(html$.Geolocation),
  [$maxTouchPoints]: dart.finalFieldType(core.int),
  [$mediaCapabilities]: dart.finalFieldType(html$.MediaCapabilities),
  [$mediaDevices]: dart.finalFieldType(html$.MediaDevices),
  [$mediaSession]: dart.finalFieldType(html$.MediaSession),
  [$mimeTypes]: dart.finalFieldType(html$.MimeTypeArray),
  [$nfc]: dart.finalFieldType(html$._NFC),
  [$permissions]: dart.finalFieldType(html$.Permissions),
  [$presentation]: dart.finalFieldType(html$.Presentation),
  [$productSub]: dart.finalFieldType(core.String),
  [$serviceWorker]: dart.finalFieldType(html$.ServiceWorkerContainer),
  [$storage]: dart.finalFieldType(html$.StorageManager),
  [$vendor]: dart.finalFieldType(core.String),
  [$vendorSub]: dart.finalFieldType(core.String),
  [$vr]: dart.finalFieldType(html$.VR),
  [$persistentStorage]: dart.finalFieldType(html$.DeprecatedStorageQuota),
  [$temporaryStorage]: dart.finalFieldType(html$.DeprecatedStorageQuota),
  [$webdriver]: dart.finalFieldType(core.bool),
  [$cookieEnabled]: dart.finalFieldType(core.bool),
  [$appCodeName]: dart.finalFieldType(core.String),
  [$appName]: dart.finalFieldType(core.String),
  [$appVersion]: dart.finalFieldType(core.String),
  [$dartEnabled]: dart.finalFieldType(core.bool),
  [$platform]: dart.finalFieldType(core.String),
  [$product]: dart.finalFieldType(core.String),
  [$userAgent]: dart.finalFieldType(core.String),
  [$languages]: dart.finalFieldType(ListOfString()),
  [$onLine]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("Navigator", html$.Navigator);
html$.NavigatorAutomationInformation = class NavigatorAutomationInformation extends _interceptors.Interceptor {
  get [$webdriver]() {
    return this.webdriver;
  }
};
dart.addTypeTests(html$.NavigatorAutomationInformation);
const webdriver$ = Symbol("NavigatorAutomationInformation.webdriver");
dart.setLibraryUri(html$.NavigatorAutomationInformation, "dart:html");
dart.setFieldSignature(html$.NavigatorAutomationInformation, () => ({
  __proto__: dart.getFields(html$.NavigatorAutomationInformation.__proto__),
  [$webdriver]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("NavigatorAutomationInformation", html$.NavigatorAutomationInformation);
html$.NavigatorCookies = class NavigatorCookies extends _interceptors.Interceptor {
  get [$cookieEnabled]() {
    return this.cookieEnabled;
  }
};
dart.addTypeTests(html$.NavigatorCookies);
const cookieEnabled$ = Symbol("NavigatorCookies.cookieEnabled");
dart.setLibraryUri(html$.NavigatorCookies, "dart:html");
dart.setFieldSignature(html$.NavigatorCookies, () => ({
  __proto__: dart.getFields(html$.NavigatorCookies.__proto__),
  [$cookieEnabled]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("NavigatorCookies", html$.NavigatorCookies);
html$.NavigatorID = class NavigatorID extends _interceptors.Interceptor {
  get appCodeName() {
    return this[appCodeName$];
  }
  set appCodeName(value) {
    super.appCodeName = value;
  }
  get appName() {
    return this[appName$];
  }
  set appName(value) {
    super.appName = value;
  }
  get appVersion() {
    return this[appVersion$];
  }
  set appVersion(value) {
    super.appVersion = value;
  }
  get dartEnabled() {
    return this[dartEnabled$];
  }
  set dartEnabled(value) {
    super.dartEnabled = value;
  }
  get platform() {
    return this[platform$];
  }
  set platform(value) {
    super.platform = value;
  }
  get product() {
    return this[product$];
  }
  set product(value) {
    super.product = value;
  }
  get userAgent() {
    return this[userAgent$];
  }
  set userAgent(value) {
    super.userAgent = value;
  }
};
dart.addTypeTests(html$.NavigatorID);
const appCodeName$ = Symbol("NavigatorID.appCodeName");
const appName$ = Symbol("NavigatorID.appName");
const appVersion$ = Symbol("NavigatorID.appVersion");
const dartEnabled$ = Symbol("NavigatorID.dartEnabled");
const platform$ = Symbol("NavigatorID.platform");
const product$ = Symbol("NavigatorID.product");
const userAgent$ = Symbol("NavigatorID.userAgent");
dart.setLibraryUri(html$.NavigatorID, "dart:html");
dart.setFieldSignature(html$.NavigatorID, () => ({
  __proto__: dart.getFields(html$.NavigatorID.__proto__),
  appCodeName: dart.finalFieldType(core.String),
  appName: dart.finalFieldType(core.String),
  appVersion: dart.finalFieldType(core.String),
  dartEnabled: dart.finalFieldType(core.bool),
  platform: dart.finalFieldType(core.String),
  product: dart.finalFieldType(core.String),
  userAgent: dart.finalFieldType(core.String)
}));
dart.defineExtensionAccessors(html$.NavigatorID, [
  'appCodeName',
  'appName',
  'appVersion',
  'dartEnabled',
  'platform',
  'product',
  'userAgent'
]);
html$.NavigatorLanguage = class NavigatorLanguage extends _interceptors.Interceptor {
  get language() {
    return this[language];
  }
  set language(value) {
    super.language = value;
  }
  get languages() {
    return this[languages$];
  }
  set languages(value) {
    super.languages = value;
  }
};
dart.addTypeTests(html$.NavigatorLanguage);
const language = Symbol("NavigatorLanguage.language");
const languages$ = Symbol("NavigatorLanguage.languages");
dart.setLibraryUri(html$.NavigatorLanguage, "dart:html");
dart.setFieldSignature(html$.NavigatorLanguage, () => ({
  __proto__: dart.getFields(html$.NavigatorLanguage.__proto__),
  language: dart.finalFieldType(core.String),
  languages: dart.finalFieldType(ListOfString())
}));
dart.defineExtensionAccessors(html$.NavigatorLanguage, ['language', 'languages']);
html$.NavigatorOnLine = class NavigatorOnLine extends _interceptors.Interceptor {
  get onLine() {
    return this[onLine$];
  }
  set onLine(value) {
    super.onLine = value;
  }
};
dart.addTypeTests(html$.NavigatorOnLine);
const onLine$ = Symbol("NavigatorOnLine.onLine");
dart.setLibraryUri(html$.NavigatorOnLine, "dart:html");
dart.setFieldSignature(html$.NavigatorOnLine, () => ({
  __proto__: dart.getFields(html$.NavigatorOnLine.__proto__),
  onLine: dart.finalFieldType(core.bool)
}));
dart.defineExtensionAccessors(html$.NavigatorOnLine, ['onLine']);
html$.NavigatorUserMediaError = class NavigatorUserMediaError extends _interceptors.Interceptor {
  get [$constraintName]() {
    return this.constraintName;
  }
  get [$message]() {
    return this.message;
  }
  get [$name]() {
    return this.name;
  }
};
dart.addTypeTests(html$.NavigatorUserMediaError);
const constraintName = Symbol("NavigatorUserMediaError.constraintName");
const message$23 = Symbol("NavigatorUserMediaError.message");
const name$24 = Symbol("NavigatorUserMediaError.name");
dart.setLibraryUri(html$.NavigatorUserMediaError, "dart:html");
dart.setFieldSignature(html$.NavigatorUserMediaError, () => ({
  __proto__: dart.getFields(html$.NavigatorUserMediaError.__proto__),
  [$constraintName]: dart.finalFieldType(core.String),
  [$message]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("NavigatorUserMediaError", html$.NavigatorUserMediaError);
html$.NetworkInformation = class NetworkInformation extends html$.EventTarget {
  get [$downlink]() {
    return this.downlink;
  }
  get [$downlinkMax]() {
    return this.downlinkMax;
  }
  get [$effectiveType]() {
    return this.effectiveType;
  }
  get [$rtt]() {
    return this.rtt;
  }
  get [$type]() {
    return this.type;
  }
  get [$onChange]() {
    return html$.NetworkInformation.changeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.NetworkInformation);
const downlink = Symbol("NetworkInformation.downlink");
const downlinkMax = Symbol("NetworkInformation.downlinkMax");
const effectiveType = Symbol("NetworkInformation.effectiveType");
const rtt = Symbol("NetworkInformation.rtt");
const type$20 = Symbol("NetworkInformation.type");
dart.setGetterSignature(html$.NetworkInformation, () => ({
  __proto__: dart.getGetters(html$.NetworkInformation.__proto__),
  [$onChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.NetworkInformation, "dart:html");
dart.setFieldSignature(html$.NetworkInformation, () => ({
  __proto__: dart.getFields(html$.NetworkInformation.__proto__),
  [$downlink]: dart.finalFieldType(core.num),
  [$downlinkMax]: dart.finalFieldType(core.num),
  [$effectiveType]: dart.finalFieldType(core.String),
  [$rtt]: dart.finalFieldType(core.int),
  [$type]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.NetworkInformation, {
  /*html$.NetworkInformation.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  }
});
dart.registerExtension("NetworkInformation", html$.NetworkInformation);
html$._ChildNodeListLazy = class _ChildNodeListLazy extends collection.ListBase$(html$.Node) {
  get first() {
    let result = this[_this].firstChild;
    if (result == null) dart.throw(new core.StateError.new("No elements"));
    return result;
  }
  set first(value) {
    super.first = value;
  }
  get last() {
    let result = this[_this].lastChild;
    if (result == null) dart.throw(new core.StateError.new("No elements"));
    return result;
  }
  set last(value) {
    super.last = value;
  }
  get single() {
    let l = this.length;
    if (l === 0) dart.throw(new core.StateError.new("No elements"));
    if (dart.notNull(l) > 1) dart.throw(new core.StateError.new("More than one element"));
    return this[_this].firstChild;
  }
  add(value) {
    html$.Node._check(value);
    this[_this][$append](value);
  }
  addAll(iterable) {
    IterableOfNode()._check(iterable);
    if (html$._ChildNodeListLazy.is(iterable)) {
      let otherList = iterable;
      if (!(otherList[_this] == this[_this])) {
        for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
          this[_this][$append](otherList[_this].firstChild);
        }
      }
      return;
    }
    for (let node of iterable) {
      this[_this][$append](node);
    }
  }
  insert(index, node) {
    html$.Node._check(node);
    if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
      dart.throw(new core.RangeError.range(index, 0, this.length));
    }
    if (index == this.length) {
      this[_this][$append](node);
    } else {
      this[_this].insertBefore(node, this._get(index));
    }
  }
  insertAll(index, iterable) {
    IterableOfNode()._check(iterable);
    if (index == this.length) {
      this.addAll(iterable);
    } else {
      let item = this._get(index);
      this[_this][$insertAllBefore](iterable, item);
    }
  }
  setAll(index, iterable) {
    IterableOfNode()._check(iterable);
    dart.throw(new core.UnsupportedError.new("Cannot setAll on Node list"));
  }
  removeLast() {
    let result = this.last;
    if (result != null) {
      this[_this][_removeChild](result);
    }
    return result;
  }
  removeAt(index) {
    let result = this._get(index);
    if (result != null) {
      this[_this][_removeChild](result);
    }
    return result;
  }
  remove(object) {
    if (!html$.Node.is(object)) return false;
    let node = html$.Node._check(object);
    if (!(this[_this] == node.parentNode)) return false;
    this[_this][_removeChild](node);
    return true;
  }
  [_filter$0](test, removeMatching) {
    let child = this[_this].firstChild;
    while (child != null) {
      let nextChild = child[$nextNode];
      if (test(child) == removeMatching) {
        this[_this][_removeChild](child);
      }
      child = nextChild;
    }
  }
  removeWhere(test) {
    this[_filter$0](test, true);
  }
  retainWhere(test) {
    this[_filter$0](test, false);
  }
  clear() {
    this[_this][_clearChildren]();
  }
  _set(index, value) {
    html$.Node._check(value);
    this[_this][_replaceChild](value, this._get(index));
    return value;
  }
  get iterator() {
    return this[_this].childNodes[$iterator];
  }
  sort(compare) {
    if (compare === void 0) compare = null;
    dart.throw(new core.UnsupportedError.new("Cannot sort Node list"));
  }
  shuffle(random) {
    if (random === void 0) random = null;
    dart.throw(new core.UnsupportedError.new("Cannot shuffle Node list"));
  }
  setRange(start, end, iterable, skipCount) {
    IterableOfNode()._check(iterable);
    if (skipCount === void 0) skipCount = 0;
    dart.throw(new core.UnsupportedError.new("Cannot setRange on Node list"));
  }
  fillRange(start, end, fill) {
    if (fill === void 0) fill = null;
    html$.Node._check(fill);
    dart.throw(new core.UnsupportedError.new("Cannot fillRange on Node list"));
  }
  removeRange(start, end) {
    dart.throw(new core.UnsupportedError.new("Cannot removeRange on Node list"));
  }
  get length() {
    return this[_this].childNodes[$length];
  }
  set length(value) {
    dart.throw(new core.UnsupportedError.new("Cannot set length on immutable List."));
  }
  _get(index) {
    return this[_this].childNodes[$_get](index);
  }
  get rawList() {
    return this[_this].childNodes;
  }
};
(html$._ChildNodeListLazy.new = function(this$) {
  this[_this] = this$;
}).prototype = html$._ChildNodeListLazy.prototype;
dart.addTypeTests(html$._ChildNodeListLazy);
html$._ChildNodeListLazy[dart.implements] = () => [html_common.NodeListWrapper];
dart.setMethodSignature(html$._ChildNodeListLazy, () => ({
  __proto__: dart.getMethods(html$._ChildNodeListLazy.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  [$add]: dart.fnType(dart.void, [core.Object]),
  addAll: dart.fnType(dart.void, [core.Object]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  insert: dart.fnType(dart.void, [core.int, core.Object]),
  [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
  insertAll: dart.fnType(dart.void, [core.int, core.Object]),
  [$insertAll]: dart.fnType(dart.void, [core.int, core.Object]),
  setAll: dart.fnType(dart.void, [core.int, core.Object]),
  [$setAll]: dart.fnType(dart.void, [core.int, core.Object]),
  removeLast: dart.fnType(html$.Node, []),
  [$removeLast]: dart.fnType(html$.Node, []),
  removeAt: dart.fnType(html$.Node, [core.int]),
  [$removeAt]: dart.fnType(html$.Node, [core.int]),
  remove: dart.fnType(core.bool, [core.Object]),
  [$remove]: dart.fnType(core.bool, [core.Object]),
  [_filter$0]: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Node]), core.bool]),
  removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Node])]),
  [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Node])]),
  retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Node])]),
  [$retainWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [html$.Node])]),
  clear: dart.fnType(dart.void, []),
  [$clear]: dart.fnType(dart.void, []),
  _set: dart.fnType(dart.void, [core.int, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  sort: dart.fnType(dart.void, [], [dart.fnType(core.int, [html$.Node, html$.Node])]),
  [$sort]: dart.fnType(dart.void, [], [dart.fnType(core.int, [html$.Node, html$.Node])]),
  shuffle: dart.fnType(dart.void, [], [math.Random]),
  [$shuffle]: dart.fnType(dart.void, [], [math.Random]),
  setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
  [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
  fillRange: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
  [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
  removeRange: dart.fnType(dart.void, [core.int, core.int]),
  [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
  _get: dart.fnType(html$.Node, [core.int]),
  [$_get]: dart.fnType(html$.Node, [core.int])
}));
dart.setGetterSignature(html$._ChildNodeListLazy, () => ({
  __proto__: dart.getGetters(html$._ChildNodeListLazy.__proto__),
  first: html$.Node,
  [$first]: html$.Node,
  last: html$.Node,
  [$last]: html$.Node,
  single: html$.Node,
  [$single]: html$.Node,
  iterator: core.Iterator$(html$.Node),
  [$iterator]: core.Iterator$(html$.Node),
  length: core.int,
  [$length]: core.int,
  rawList: core.List$(html$.Node)
}));
dart.setSetterSignature(html$._ChildNodeListLazy, () => ({
  __proto__: dart.getSetters(html$._ChildNodeListLazy.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(html$._ChildNodeListLazy, "dart:html");
dart.setFieldSignature(html$._ChildNodeListLazy, () => ({
  __proto__: dart.getFields(html$._ChildNodeListLazy.__proto__),
  [_this]: dart.finalFieldType(html$.Node)
}));
dart.defineExtensionMethods(html$._ChildNodeListLazy, [
  'add',
  'addAll',
  'insert',
  'insertAll',
  'setAll',
  'removeLast',
  'removeAt',
  'remove',
  'removeWhere',
  'retainWhere',
  'clear',
  '_set',
  'sort',
  'shuffle',
  'setRange',
  'fillRange',
  'removeRange',
  '_get'
]);
dart.defineExtensionAccessors(html$._ChildNodeListLazy, [
  'first',
  'last',
  'single',
  'iterator',
  'length'
]);
html$.NodeFilter = class NodeFilter extends _interceptors.Interceptor {};
dart.addTypeTests(html$.NodeFilter);
dart.setLibraryUri(html$.NodeFilter, "dart:html");
dart.defineLazy(html$.NodeFilter, {
  /*html$.NodeFilter.FILTER_ACCEPT*/get FILTER_ACCEPT() {
    return 1;
  },
  /*html$.NodeFilter.FILTER_REJECT*/get FILTER_REJECT() {
    return 2;
  },
  /*html$.NodeFilter.FILTER_SKIP*/get FILTER_SKIP() {
    return 3;
  },
  /*html$.NodeFilter.SHOW_ALL*/get SHOW_ALL() {
    return 4294967295;
  },
  /*html$.NodeFilter.SHOW_COMMENT*/get SHOW_COMMENT() {
    return 128;
  },
  /*html$.NodeFilter.SHOW_DOCUMENT*/get SHOW_DOCUMENT() {
    return 256;
  },
  /*html$.NodeFilter.SHOW_DOCUMENT_FRAGMENT*/get SHOW_DOCUMENT_FRAGMENT() {
    return 1024;
  },
  /*html$.NodeFilter.SHOW_DOCUMENT_TYPE*/get SHOW_DOCUMENT_TYPE() {
    return 512;
  },
  /*html$.NodeFilter.SHOW_ELEMENT*/get SHOW_ELEMENT() {
    return 1;
  },
  /*html$.NodeFilter.SHOW_PROCESSING_INSTRUCTION*/get SHOW_PROCESSING_INSTRUCTION() {
    return 64;
  },
  /*html$.NodeFilter.SHOW_TEXT*/get SHOW_TEXT() {
    return 4;
  }
});
dart.registerExtension("NodeFilter", html$.NodeFilter);
html$.NodeIterator = class NodeIterator extends _interceptors.Interceptor {
  static new(root, whatToShow) {
    return html$.document[_createNodeIterator](root, whatToShow, null);
  }
  get [$pointerBeforeReferenceNode]() {
    return this.pointerBeforeReferenceNode;
  }
  get [$referenceNode]() {
    return this.referenceNode;
  }
  get [$root]() {
    return this.root;
  }
  get [$whatToShow]() {
    return this.whatToShow;
  }
  [$detach](...args) {
    return this.detach.apply(this, args);
  }
  [$nextNode](...args) {
    return this.nextNode.apply(this, args);
  }
  [$previousNode](...args) {
    return this.previousNode.apply(this, args);
  }
};
dart.addTypeTests(html$.NodeIterator);
const pointerBeforeReferenceNode = Symbol("NodeIterator.pointerBeforeReferenceNode");
const referenceNode = Symbol("NodeIterator.referenceNode");
const root$0 = Symbol("NodeIterator.root");
const whatToShow = Symbol("NodeIterator.whatToShow");
dart.setMethodSignature(html$.NodeIterator, () => ({
  __proto__: dart.getMethods(html$.NodeIterator.__proto__),
  [$detach]: dart.fnType(dart.void, []),
  [$nextNode]: dart.fnType(html$.Node, []),
  [$previousNode]: dart.fnType(html$.Node, [])
}));
dart.setLibraryUri(html$.NodeIterator, "dart:html");
dart.setFieldSignature(html$.NodeIterator, () => ({
  __proto__: dart.getFields(html$.NodeIterator.__proto__),
  [$pointerBeforeReferenceNode]: dart.finalFieldType(core.bool),
  [$referenceNode]: dart.finalFieldType(html$.Node),
  [$root]: dart.finalFieldType(html$.Node),
  [$whatToShow]: dart.finalFieldType(core.int)
}));
dart.registerExtension("NodeIterator", html$.NodeIterator);
const Interceptor_ListMixin$$3 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$3.new = function() {
  Interceptor_ListMixin$$3.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$3.prototype;
dart.applyMixin(Interceptor_ListMixin$$3, collection.ListMixin$(html$.Node));
const Interceptor_ImmutableListMixin$$3 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$3 {};
(Interceptor_ImmutableListMixin$$3.new = function() {
  Interceptor_ImmutableListMixin$$3.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$3.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$3, html$.ImmutableListMixin$(html$.Node));
html$.NodeList = class NodeList extends Interceptor_ImmutableListMixin$$3 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.Node._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [_item](...args) {
    return this.item.apply(this, args);
  }
};
html$.NodeList.prototype[dart.isList] = true;
dart.addTypeTests(html$.NodeList);
html$.NodeList[dart.implements] = () => [JavaScriptIndexingBehaviorOfNode(), ListOfNode()];
dart.setMethodSignature(html$.NodeList, () => ({
  __proto__: dart.getMethods(html$.NodeList.__proto__),
  [$_get]: dart.fnType(html$.Node, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.Node, [core.int]),
  [_item]: dart.fnType(html$.Node, [core.int])
}));
dart.setGetterSignature(html$.NodeList, () => ({
  __proto__: dart.getGetters(html$.NodeList.__proto__),
  [$length]: core.int,
  [$first]: html$.Node,
  [$last]: html$.Node,
  [$single]: html$.Node
}));
dart.setSetterSignature(html$.NodeList, () => ({
  __proto__: dart.getSetters(html$.NodeList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.NodeList, "dart:html");
dart.registerExtension("NodeList", html$.NodeList);
dart.registerExtension("RadioNodeList", html$.NodeList);
html$.NonDocumentTypeChildNode = class NonDocumentTypeChildNode extends _interceptors.Interceptor {
  get [$nextElementSibling]() {
    return this.nextElementSibling;
  }
  get [$previousElementSibling]() {
    return this.previousElementSibling;
  }
};
dart.addTypeTests(html$.NonDocumentTypeChildNode);
const nextElementSibling$0 = Symbol("NonDocumentTypeChildNode.nextElementSibling");
const previousElementSibling$0 = Symbol("NonDocumentTypeChildNode.previousElementSibling");
dart.setLibraryUri(html$.NonDocumentTypeChildNode, "dart:html");
dart.setFieldSignature(html$.NonDocumentTypeChildNode, () => ({
  __proto__: dart.getFields(html$.NonDocumentTypeChildNode.__proto__),
  [$nextElementSibling]: dart.finalFieldType(html$.Element),
  [$previousElementSibling]: dart.finalFieldType(html$.Element)
}));
dart.registerExtension("NonDocumentTypeChildNode", html$.NonDocumentTypeChildNode);
html$.NonElementParentNode = class NonElementParentNode extends _interceptors.Interceptor {
  [$getElementById](...args) {
    return this.getElementById.apply(this, args);
  }
};
dart.addTypeTests(html$.NonElementParentNode);
dart.setMethodSignature(html$.NonElementParentNode, () => ({
  __proto__: dart.getMethods(html$.NonElementParentNode.__proto__),
  [$getElementById]: dart.fnType(html$.Element, [core.String])
}));
dart.setLibraryUri(html$.NonElementParentNode, "dart:html");
dart.registerExtension("NonElementParentNode", html$.NonElementParentNode);
html$.NoncedElement = class NoncedElement extends _interceptors.Interceptor {
  get [$nonce]() {
    return this.nonce;
  }
  set [$nonce](value) {
    this.nonce = value;
  }
};
dart.addTypeTests(html$.NoncedElement);
const nonce$ = Symbol("NoncedElement.nonce");
dart.setLibraryUri(html$.NoncedElement, "dart:html");
dart.setFieldSignature(html$.NoncedElement, () => ({
  __proto__: dart.getFields(html$.NoncedElement.__proto__),
  [$nonce]: dart.fieldType(core.String)
}));
dart.registerExtension("NoncedElement", html$.NoncedElement);
html$.Notification = class Notification$ extends html$.EventTarget {
  static new(title, opts) {
    let dir = opts && 'dir' in opts ? opts.dir : null;
    let body = opts && 'body' in opts ? opts.body : null;
    let lang = opts && 'lang' in opts ? opts.lang : null;
    let tag = opts && 'tag' in opts ? opts.tag : null;
    let icon = opts && 'icon' in opts ? opts.icon : null;
    let parsedOptions = new _js_helper.LinkedMap.new();
    if (dir != null) parsedOptions[$_set]("dir", dir);
    if (body != null) parsedOptions[$_set]("body", body);
    if (lang != null) parsedOptions[$_set]("lang", lang);
    if (tag != null) parsedOptions[$_set]("tag", tag);
    if (icon != null) parsedOptions[$_set]("icon", icon);
    return html$.Notification._factoryNotification(title, parsedOptions);
  }
  static _factoryNotification(title, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return html$.Notification._create_1(title, options_1);
    }
    return html$.Notification._create_2(title);
  }
  static _create_1(title, options) {
    return new Notification(title, options);
  }
  static _create_2(title) {
    return new Notification(title);
  }
  static get supported() {
    return !!window.Notification;
  }
  get [$actions]() {
    return this.actions;
  }
  get [$badge]() {
    return this.badge;
  }
  get [$body]() {
    return this.body;
  }
  get [$data]() {
    return this.data;
  }
  get [$dir]() {
    return this.dir;
  }
  get [$icon]() {
    return this.icon;
  }
  get [$image]() {
    return this.image;
  }
  get [$lang]() {
    return this.lang;
  }
  get [$renotify]() {
    return this.renotify;
  }
  get [$requireInteraction]() {
    return this.requireInteraction;
  }
  get [$silent]() {
    return this.silent;
  }
  get [$tag]() {
    return this.tag;
  }
  get [$timestamp]() {
    return this.timestamp;
  }
  get [$title]() {
    return this.title;
  }
  get [$vibrate]() {
    return this.vibrate;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  static requestPermission() {
    let completer = CompleterOfString().new();
    dart.global.Notification.requestPermission(dart.fn(value => {
      completer.complete(value);
    }, StringToNull()));
    return completer.future;
  }
  get [$onClick]() {
    return html$.Notification.clickEvent.forTarget(this);
  }
  get [$onClose]() {
    return html$.Notification.closeEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.Notification.errorEvent.forTarget(this);
  }
  get [$onShow]() {
    return html$.Notification.showEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.Notification);
const actions = Symbol("Notification.actions");
const badge = Symbol("Notification.badge");
const body$ = Symbol("Notification.body");
const data$5 = Symbol("Notification.data");
const dir$ = Symbol("Notification.dir");
const icon = Symbol("Notification.icon");
const image = Symbol("Notification.image");
const lang$ = Symbol("Notification.lang");
const renotify = Symbol("Notification.renotify");
const requireInteraction = Symbol("Notification.requireInteraction");
const silent = Symbol("Notification.silent");
const tag = Symbol("Notification.tag");
const timestamp$1 = Symbol("Notification.timestamp");
const title$2 = Symbol("Notification.title");
const vibrate = Symbol("Notification.vibrate");
dart.setMethodSignature(html$.Notification, () => ({
  __proto__: dart.getMethods(html$.Notification.__proto__),
  [$close]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.Notification, () => ({
  __proto__: dart.getGetters(html$.Notification.__proto__),
  [$onClick]: async.Stream$(html$.Event),
  [$onClose]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event),
  [$onShow]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.Notification, "dart:html");
dart.setFieldSignature(html$.Notification, () => ({
  __proto__: dart.getFields(html$.Notification.__proto__),
  [$actions]: dart.finalFieldType(core.List),
  [$badge]: dart.finalFieldType(core.String),
  [$body]: dart.finalFieldType(core.String),
  [$data]: dart.finalFieldType(core.Object),
  [$dir]: dart.finalFieldType(core.String),
  [$icon]: dart.finalFieldType(core.String),
  [$image]: dart.finalFieldType(core.String),
  [$lang]: dart.finalFieldType(core.String),
  [$renotify]: dart.finalFieldType(core.bool),
  [$requireInteraction]: dart.finalFieldType(core.bool),
  [$silent]: dart.finalFieldType(core.bool),
  [$tag]: dart.finalFieldType(core.String),
  [$timestamp]: dart.finalFieldType(core.int),
  [$title]: dart.finalFieldType(core.String),
  [$vibrate]: dart.finalFieldType(ListOfint())
}));
dart.defineLazy(html$.Notification, {
  /*html$.Notification.clickEvent*/get clickEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("click"));
  },
  /*html$.Notification.closeEvent*/get closeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("close"));
  },
  /*html$.Notification.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.Notification.showEvent*/get showEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("show"));
  },
  /*html$.Notification.maxActions*/get maxActions() {
    return null;
  },
  /*html$.Notification.permission*/get permission() {
    return null;
  }
});
dart.registerExtension("Notification", html$.Notification);
html$.NotificationEvent = class NotificationEvent$ extends html$.ExtendableEvent {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.NotificationEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new NotificationEvent(type, eventInitDict);
  }
  get [$action]() {
    return this.action;
  }
  get [$notification]() {
    return this.notification;
  }
  get [$reply]() {
    return this.reply;
  }
};
dart.addTypeTests(html$.NotificationEvent);
const action$ = Symbol("NotificationEvent.action");
const notification = Symbol("NotificationEvent.notification");
const reply = Symbol("NotificationEvent.reply");
dart.setLibraryUri(html$.NotificationEvent, "dart:html");
dart.setFieldSignature(html$.NotificationEvent, () => ({
  __proto__: dart.getFields(html$.NotificationEvent.__proto__),
  [$action]: dart.finalFieldType(core.String),
  [$notification]: dart.finalFieldType(html$.Notification),
  [$reply]: dart.finalFieldType(core.String)
}));
dart.registerExtension("NotificationEvent", html$.NotificationEvent);
html$.OListElement = class OListElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("ol");
  }
  get [$reversed]() {
    return this.reversed;
  }
  set [$reversed](value) {
    this.reversed = value;
  }
  get [$start]() {
    return this.start;
  }
  set [$start](value) {
    this.start = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
};
(html$.OListElement.created = function() {
  this[reversed] = null;
  this[start$] = null;
  this[type$21] = null;
  html$.OListElement.__proto__.created.call(this);
}).prototype = html$.OListElement.prototype;
dart.addTypeTests(html$.OListElement);
const reversed = Symbol("OListElement.reversed");
const start$ = Symbol("OListElement.start");
const type$21 = Symbol("OListElement.type");
dart.setLibraryUri(html$.OListElement, "dart:html");
dart.setFieldSignature(html$.OListElement, () => ({
  __proto__: dart.getFields(html$.OListElement.__proto__),
  [$reversed]: dart.fieldType(core.bool),
  [$start]: dart.fieldType(core.int),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLOListElement", html$.OListElement);
html$.ObjectElement = class ObjectElement extends html$.HtmlElement {
  static new() {
    return html$.ObjectElement._check(html$.document[$createElement]("object"));
  }
  static get supported() {
    return html$.Element.isTagSupported("object");
  }
  get [$contentWindow]() {
    return html$._convertNativeToDart_Window(this[_get_contentWindow]);
  }
  get [_get_contentWindow]() {
    return this.contentWindow;
  }
  get [$data]() {
    return this.data;
  }
  set [$data](value) {
    this.data = value;
  }
  get [$form]() {
    return this.form;
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  get [$useMap]() {
    return this.useMap;
  }
  set [$useMap](value) {
    this.useMap = value;
  }
  get [$validationMessage]() {
    return this.validationMessage;
  }
  get [$validity]() {
    return this.validity;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  get [$willValidate]() {
    return this.willValidate;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
  [$checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [$reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [$setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
(html$.ObjectElement.created = function() {
  this[_get_contentWindow] = null;
  this[data$6] = null;
  this[form$3] = null;
  this[height$6] = null;
  this[name$25] = null;
  this[type$22] = null;
  this[useMap$] = null;
  this[validationMessage$1] = null;
  this[validity$1] = null;
  this[width$6] = null;
  this[willValidate$1] = null;
  html$.ObjectElement.__proto__.created.call(this);
}).prototype = html$.ObjectElement.prototype;
dart.addTypeTests(html$.ObjectElement);
const data$6 = Symbol("ObjectElement.data");
const form$3 = Symbol("ObjectElement.form");
const height$6 = Symbol("ObjectElement.height");
const name$25 = Symbol("ObjectElement.name");
const type$22 = Symbol("ObjectElement.type");
const useMap$ = Symbol("ObjectElement.useMap");
const validationMessage$1 = Symbol("ObjectElement.validationMessage");
const validity$1 = Symbol("ObjectElement.validity");
const width$6 = Symbol("ObjectElement.width");
const willValidate$1 = Symbol("ObjectElement.willValidate");
dart.setMethodSignature(html$.ObjectElement, () => ({
  __proto__: dart.getMethods(html$.ObjectElement.__proto__),
  [__getter__]: dart.fnType(html$.Node, [core.String]),
  [__setter__]: dart.fnType(dart.void, [core.String, html$.Node]),
  [$checkValidity]: dart.fnType(core.bool, []),
  [$reportValidity]: dart.fnType(core.bool, []),
  [$setCustomValidity]: dart.fnType(dart.void, [core.String])
}));
dart.setGetterSignature(html$.ObjectElement, () => ({
  __proto__: dart.getGetters(html$.ObjectElement.__proto__),
  [$contentWindow]: html$.WindowBase
}));
dart.setLibraryUri(html$.ObjectElement, "dart:html");
dart.setFieldSignature(html$.ObjectElement, () => ({
  __proto__: dart.getFields(html$.ObjectElement.__proto__),
  [_get_contentWindow]: dart.finalFieldType(dart.dynamic),
  [$data]: dart.fieldType(core.String),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$height]: dart.fieldType(core.String),
  [$name]: dart.fieldType(core.String),
  [$type]: dart.fieldType(core.String),
  [$useMap]: dart.fieldType(core.String),
  [$validationMessage]: dart.finalFieldType(core.String),
  [$validity]: dart.finalFieldType(html$.ValidityState),
  [$width]: dart.fieldType(core.String),
  [$willValidate]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("HTMLObjectElement", html$.ObjectElement);
html$.OffscreenCanvas = class OffscreenCanvas$ extends html$.EventTarget {
  static new(width, height) {
    return html$.OffscreenCanvas._create_1(width, height);
  }
  static _create_1(width, height) {
    return new OffscreenCanvas(width, height);
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  [$convertToBlob](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(html$.Blob, this.convertToBlob(options_dict));
  }
  [$getContext](contextType, attributes) {
    if (attributes === void 0) attributes = null;
    if (attributes != null) {
      let attributes_1 = html_common.convertDartToNative_Dictionary(attributes);
      return this[_getContext_1](contextType, attributes_1);
    }
    return this[_getContext_2](contextType);
  }
  [_getContext_1](...args) {
    return this.getContext.apply(this, args);
  }
  [_getContext_2](...args) {
    return this.getContext.apply(this, args);
  }
  [$transferToImageBitmap](...args) {
    return this.transferToImageBitmap.apply(this, args);
  }
};
dart.addTypeTests(html$.OffscreenCanvas);
const height$7 = Symbol("OffscreenCanvas.height");
const width$7 = Symbol("OffscreenCanvas.width");
dart.setMethodSignature(html$.OffscreenCanvas, () => ({
  __proto__: dart.getMethods(html$.OffscreenCanvas.__proto__),
  [$convertToBlob]: dart.fnType(async.Future$(html$.Blob), [], [core.Map]),
  [$getContext]: dart.fnType(core.Object, [core.String], [core.Map]),
  [_getContext_1]: dart.fnType(core.Object, [dart.dynamic, dart.dynamic]),
  [_getContext_2]: dart.fnType(core.Object, [dart.dynamic]),
  [$transferToImageBitmap]: dart.fnType(html$.ImageBitmap, [])
}));
dart.setLibraryUri(html$.OffscreenCanvas, "dart:html");
dart.setFieldSignature(html$.OffscreenCanvas, () => ({
  __proto__: dart.getFields(html$.OffscreenCanvas.__proto__),
  [$height]: dart.fieldType(core.int),
  [$width]: dart.fieldType(core.int)
}));
dart.registerExtension("OffscreenCanvas", html$.OffscreenCanvas);
html$.OffscreenCanvasRenderingContext2D = class OffscreenCanvasRenderingContext2D extends _interceptors.Interceptor {
  get [$canvas]() {
    return this.canvas;
  }
  get [$direction]() {
    return this.direction;
  }
  set [$direction](value) {
    this.direction = value;
  }
  get [$fillStyle]() {
    return this.fillStyle;
  }
  set [$fillStyle](value) {
    this.fillStyle = value;
  }
  get [$filter]() {
    return this.filter;
  }
  set [$filter](value) {
    this.filter = value;
  }
  get [$font]() {
    return this.font;
  }
  set [$font](value) {
    this.font = value;
  }
  get [$globalAlpha]() {
    return this.globalAlpha;
  }
  set [$globalAlpha](value) {
    this.globalAlpha = value;
  }
  get [$globalCompositeOperation]() {
    return this.globalCompositeOperation;
  }
  set [$globalCompositeOperation](value) {
    this.globalCompositeOperation = value;
  }
  get [$imageSmoothingEnabled]() {
    return this.imageSmoothingEnabled;
  }
  set [$imageSmoothingEnabled](value) {
    this.imageSmoothingEnabled = value;
  }
  get [$imageSmoothingQuality]() {
    return this.imageSmoothingQuality;
  }
  set [$imageSmoothingQuality](value) {
    this.imageSmoothingQuality = value;
  }
  get [$lineCap]() {
    return this.lineCap;
  }
  set [$lineCap](value) {
    this.lineCap = value;
  }
  get [$lineDashOffset]() {
    return this.lineDashOffset;
  }
  set [$lineDashOffset](value) {
    this.lineDashOffset = value;
  }
  get [$lineJoin]() {
    return this.lineJoin;
  }
  set [$lineJoin](value) {
    this.lineJoin = value;
  }
  get [$lineWidth]() {
    return this.lineWidth;
  }
  set [$lineWidth](value) {
    this.lineWidth = value;
  }
  get [$miterLimit]() {
    return this.miterLimit;
  }
  set [$miterLimit](value) {
    this.miterLimit = value;
  }
  get [$shadowBlur]() {
    return this.shadowBlur;
  }
  set [$shadowBlur](value) {
    this.shadowBlur = value;
  }
  get [$shadowColor]() {
    return this.shadowColor;
  }
  set [$shadowColor](value) {
    this.shadowColor = value;
  }
  get [$shadowOffsetX]() {
    return this.shadowOffsetX;
  }
  set [$shadowOffsetX](value) {
    this.shadowOffsetX = value;
  }
  get [$shadowOffsetY]() {
    return this.shadowOffsetY;
  }
  set [$shadowOffsetY](value) {
    this.shadowOffsetY = value;
  }
  get [$strokeStyle]() {
    return this.strokeStyle;
  }
  set [$strokeStyle](value) {
    this.strokeStyle = value;
  }
  get [$textAlign]() {
    return this.textAlign;
  }
  set [$textAlign](value) {
    this.textAlign = value;
  }
  get [$textBaseline]() {
    return this.textBaseline;
  }
  set [$textBaseline](value) {
    this.textBaseline = value;
  }
  [$beginPath](...args) {
    return this.beginPath.apply(this, args);
  }
  [$clearRect](...args) {
    return this.clearRect.apply(this, args);
  }
  [$clip](...args) {
    return this.clip.apply(this, args);
  }
  [$commit]() {
    return html$.promiseToFuture(dart.dynamic, this.commit());
  }
  [$createImageData](data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_OR_sh, imageDataColorSettings) {
    if (sh_OR_sw === void 0) sh_OR_sw = null;
    if (imageDataColorSettings_OR_sh === void 0) imageDataColorSettings_OR_sh = null;
    if (imageDataColorSettings === void 0) imageDataColorSettings = null;
    if (html$.ImageData.is(data_OR_imagedata_OR_sw) && sh_OR_sw == null && imageDataColorSettings_OR_sh == null && imageDataColorSettings == null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(data_OR_imagedata_OR_sw);
      return html_common.convertNativeToDart_ImageData(this[_createImageData_1](imagedata_1));
    }
    if (sh_OR_sw != null && core.int.is(data_OR_imagedata_OR_sw) && imageDataColorSettings_OR_sh == null && imageDataColorSettings == null) {
      return html_common.convertNativeToDart_ImageData(this[_createImageData_2](data_OR_imagedata_OR_sw, sh_OR_sw));
    }
    if (core.Map.is(imageDataColorSettings_OR_sh) && sh_OR_sw != null && core.int.is(data_OR_imagedata_OR_sw) && imageDataColorSettings == null) {
      let imageDataColorSettings_1 = html_common.convertDartToNative_Dictionary(imageDataColorSettings_OR_sh);
      return html_common.convertNativeToDart_ImageData(this[_createImageData_3](data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_1));
    }
    if (imageDataColorSettings != null && core.int.is(imageDataColorSettings_OR_sh) && sh_OR_sw != null && data_OR_imagedata_OR_sw != null) {
      let imageDataColorSettings_1 = html_common.convertDartToNative_Dictionary(imageDataColorSettings);
      return html_common.convertNativeToDart_ImageData(this[_createImageData_4](data_OR_imagedata_OR_sw, sh_OR_sw, imageDataColorSettings_OR_sh, imageDataColorSettings_1));
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_createImageData_1](...args) {
    return this.createImageData.apply(this, args);
  }
  [_createImageData_2](...args) {
    return this.createImageData.apply(this, args);
  }
  [_createImageData_3](...args) {
    return this.createImageData.apply(this, args);
  }
  [_createImageData_4](...args) {
    return this.createImageData.apply(this, args);
  }
  [$createLinearGradient](...args) {
    return this.createLinearGradient.apply(this, args);
  }
  [$createPattern](...args) {
    return this.createPattern.apply(this, args);
  }
  [$createRadialGradient](...args) {
    return this.createRadialGradient.apply(this, args);
  }
  [$drawImage](...args) {
    return this.drawImage.apply(this, args);
  }
  [$fill](...args) {
    return this.fill.apply(this, args);
  }
  [$fillRect](...args) {
    return this.fillRect.apply(this, args);
  }
  [$fillText](...args) {
    return this.fillText.apply(this, args);
  }
  [$getImageData](sx, sy, sw, sh) {
    return html_common.convertNativeToDart_ImageData(this[_getImageData_1](sx, sy, sw, sh));
  }
  [_getImageData_1](...args) {
    return this.getImageData.apply(this, args);
  }
  [$getLineDash](...args) {
    return this.getLineDash.apply(this, args);
  }
  [$isPointInPath](...args) {
    return this.isPointInPath.apply(this, args);
  }
  [$isPointInStroke](...args) {
    return this.isPointInStroke.apply(this, args);
  }
  [$measureText](...args) {
    return this.measureText.apply(this, args);
  }
  [$putImageData](imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
    if (dirtyX === void 0) dirtyX = null;
    if (dirtyY === void 0) dirtyY = null;
    if (dirtyWidth === void 0) dirtyWidth = null;
    if (dirtyHeight === void 0) dirtyHeight = null;
    if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
      this[_putImageData_1](imagedata_1, dx, dy);
      return;
    }
    if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
      this[_putImageData_2](imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_putImageData_1](...args) {
    return this.putImageData.apply(this, args);
  }
  [_putImageData_2](...args) {
    return this.putImageData.apply(this, args);
  }
  [$resetTransform](...args) {
    return this.resetTransform.apply(this, args);
  }
  [$restore](...args) {
    return this.restore.apply(this, args);
  }
  [$rotate](...args) {
    return this.rotate.apply(this, args);
  }
  [$save](...args) {
    return this.save.apply(this, args);
  }
  [$scale](...args) {
    return this.scale.apply(this, args);
  }
  [$setLineDash](...args) {
    return this.setLineDash.apply(this, args);
  }
  [$setTransform](...args) {
    return this.setTransform.apply(this, args);
  }
  [$stroke](...args) {
    return this.stroke.apply(this, args);
  }
  [$strokeRect](...args) {
    return this.strokeRect.apply(this, args);
  }
  [$strokeText](...args) {
    return this.strokeText.apply(this, args);
  }
  [$transform](...args) {
    return this.transform.apply(this, args);
  }
  [$translate](...args) {
    return this.translate.apply(this, args);
  }
  [$arc](...args) {
    return this.arc.apply(this, args);
  }
  [$arcTo](...args) {
    return this.arcTo.apply(this, args);
  }
  [$bezierCurveTo](...args) {
    return this.bezierCurveTo.apply(this, args);
  }
  [$closePath](...args) {
    return this.closePath.apply(this, args);
  }
  [$ellipse](...args) {
    return this.ellipse.apply(this, args);
  }
  [$lineTo](...args) {
    return this.lineTo.apply(this, args);
  }
  [$moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [$quadraticCurveTo](...args) {
    return this.quadraticCurveTo.apply(this, args);
  }
  [$rect](...args) {
    return this.rect.apply(this, args);
  }
};
dart.addTypeTests(html$.OffscreenCanvasRenderingContext2D);
const canvas$1 = Symbol("OffscreenCanvasRenderingContext2D.canvas");
const direction$1 = Symbol("OffscreenCanvasRenderingContext2D.direction");
const fillStyle$ = Symbol("OffscreenCanvasRenderingContext2D.fillStyle");
const filter$ = Symbol("OffscreenCanvasRenderingContext2D.filter");
const font$ = Symbol("OffscreenCanvasRenderingContext2D.font");
const globalAlpha$ = Symbol("OffscreenCanvasRenderingContext2D.globalAlpha");
const globalCompositeOperation$ = Symbol("OffscreenCanvasRenderingContext2D.globalCompositeOperation");
const imageSmoothingEnabled$ = Symbol("OffscreenCanvasRenderingContext2D.imageSmoothingEnabled");
const imageSmoothingQuality$ = Symbol("OffscreenCanvasRenderingContext2D.imageSmoothingQuality");
const lineCap$ = Symbol("OffscreenCanvasRenderingContext2D.lineCap");
const lineDashOffset = Symbol("OffscreenCanvasRenderingContext2D.lineDashOffset");
const lineJoin$ = Symbol("OffscreenCanvasRenderingContext2D.lineJoin");
const lineWidth$ = Symbol("OffscreenCanvasRenderingContext2D.lineWidth");
const miterLimit$ = Symbol("OffscreenCanvasRenderingContext2D.miterLimit");
const shadowBlur$ = Symbol("OffscreenCanvasRenderingContext2D.shadowBlur");
const shadowColor$ = Symbol("OffscreenCanvasRenderingContext2D.shadowColor");
const shadowOffsetX$ = Symbol("OffscreenCanvasRenderingContext2D.shadowOffsetX");
const shadowOffsetY$ = Symbol("OffscreenCanvasRenderingContext2D.shadowOffsetY");
const strokeStyle$ = Symbol("OffscreenCanvasRenderingContext2D.strokeStyle");
const textAlign$ = Symbol("OffscreenCanvasRenderingContext2D.textAlign");
const textBaseline$ = Symbol("OffscreenCanvasRenderingContext2D.textBaseline");
html$.OffscreenCanvasRenderingContext2D[dart.implements] = () => [html$._CanvasPath];
dart.setMethodSignature(html$.OffscreenCanvasRenderingContext2D, () => ({
  __proto__: dart.getMethods(html$.OffscreenCanvasRenderingContext2D.__proto__),
  [$beginPath]: dart.fnType(dart.void, []),
  [$clearRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$clip]: dart.fnType(dart.void, [], [html$.Path2D]),
  [$commit]: dart.fnType(async.Future, []),
  [$createImageData]: dart.fnType(html$.ImageData, [dart.dynamic], [core.int, dart.dynamic, core.Map]),
  [_createImageData_1]: dart.fnType(dart.dynamic, [dart.dynamic]),
  [_createImageData_2]: dart.fnType(dart.dynamic, [core.int, dart.dynamic]),
  [_createImageData_3]: dart.fnType(dart.dynamic, [core.int, dart.dynamic, dart.dynamic]),
  [_createImageData_4]: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic, core.int, dart.dynamic]),
  [$createLinearGradient]: dart.fnType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
  [$createPattern]: dart.fnType(html$.CanvasPattern, [dart.dynamic, core.String]),
  [$createRadialGradient]: dart.fnType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$drawImage]: dart.fnType(dart.void, [dart.dynamic, core.num, core.num], [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$fill]: dart.fnType(dart.void, [], [dart.dynamic, core.String]),
  [$fillRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$fillText]: dart.fnType(dart.void, [core.String, core.num, core.num], [core.num]),
  [$getImageData]: dart.fnType(html$.ImageData, [core.int, core.int, core.int, core.int]),
  [_getImageData_1]: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [$getLineDash]: dart.fnType(core.List$(core.num), []),
  [$isPointInPath]: dart.fnType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
  [$isPointInStroke]: dart.fnType(core.bool, [dart.dynamic, core.num], [core.num]),
  [$measureText]: dart.fnType(html$.TextMetrics, [core.String]),
  [$putImageData]: dart.fnType(dart.void, [html$.ImageData, core.int, core.int], [core.int, core.int, core.int, core.int]),
  [_putImageData_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
  [_putImageData_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [$resetTransform]: dart.fnType(dart.void, []),
  [$restore]: dart.fnType(dart.void, []),
  [$rotate]: dart.fnType(dart.void, [core.num]),
  [$save]: dart.fnType(dart.void, []),
  [$scale]: dart.fnType(dart.void, [core.num, core.num]),
  [$setLineDash]: dart.fnType(dart.void, [core.List$(core.num)]),
  [$setTransform]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$stroke]: dart.fnType(dart.void, [], [html$.Path2D]),
  [$strokeRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$strokeText]: dart.fnType(dart.void, [core.String, core.num, core.num], [core.num]),
  [$transform]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$translate]: dart.fnType(dart.void, [core.num, core.num]),
  [$arc]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
  [$arcTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
  [$bezierCurveTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$closePath]: dart.fnType(dart.void, []),
  [$ellipse]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
  [$lineTo]: dart.fnType(dart.void, [core.num, core.num]),
  [$moveTo]: dart.fnType(dart.void, [core.num, core.num]),
  [$quadraticCurveTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$rect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num])
}));
dart.setLibraryUri(html$.OffscreenCanvasRenderingContext2D, "dart:html");
dart.setFieldSignature(html$.OffscreenCanvasRenderingContext2D, () => ({
  __proto__: dart.getFields(html$.OffscreenCanvasRenderingContext2D.__proto__),
  [$canvas]: dart.finalFieldType(html$.OffscreenCanvas),
  [$direction]: dart.fieldType(core.String),
  [$fillStyle]: dart.fieldType(core.Object),
  [$filter]: dart.fieldType(core.String),
  [$font]: dart.fieldType(core.String),
  [$globalAlpha]: dart.fieldType(core.num),
  [$globalCompositeOperation]: dart.fieldType(core.String),
  [$imageSmoothingEnabled]: dart.fieldType(core.bool),
  [$imageSmoothingQuality]: dart.fieldType(core.String),
  [$lineCap]: dart.fieldType(core.String),
  [$lineDashOffset]: dart.fieldType(core.num),
  [$lineJoin]: dart.fieldType(core.String),
  [$lineWidth]: dart.fieldType(core.num),
  [$miterLimit]: dart.fieldType(core.num),
  [$shadowBlur]: dart.fieldType(core.num),
  [$shadowColor]: dart.fieldType(core.String),
  [$shadowOffsetX]: dart.fieldType(core.num),
  [$shadowOffsetY]: dart.fieldType(core.num),
  [$strokeStyle]: dart.fieldType(core.Object),
  [$textAlign]: dart.fieldType(core.String),
  [$textBaseline]: dart.fieldType(core.String)
}));
dart.registerExtension("OffscreenCanvasRenderingContext2D", html$.OffscreenCanvasRenderingContext2D);
html$.OptGroupElement = class OptGroupElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("optgroup");
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$label]() {
    return this.label;
  }
  set [$label](value) {
    this.label = value;
  }
};
(html$.OptGroupElement.created = function() {
  this[disabled$5] = null;
  this[label$1] = null;
  html$.OptGroupElement.__proto__.created.call(this);
}).prototype = html$.OptGroupElement.prototype;
dart.addTypeTests(html$.OptGroupElement);
const disabled$5 = Symbol("OptGroupElement.disabled");
const label$1 = Symbol("OptGroupElement.label");
dart.setLibraryUri(html$.OptGroupElement, "dart:html");
dart.setFieldSignature(html$.OptGroupElement, () => ({
  __proto__: dart.getFields(html$.OptGroupElement.__proto__),
  [$disabled]: dart.fieldType(core.bool),
  [$label]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLOptGroupElement", html$.OptGroupElement);
html$.OptionElement = class OptionElement extends html$.HtmlElement {
  static new(opts) {
    let data = opts && 'data' in opts ? opts.data : "";
    let value = opts && 'value' in opts ? opts.value : "";
    let selected = opts && 'selected' in opts ? opts.selected : false;
    return html$.OptionElement.__(data, value, null, selected);
  }
  static __(data, value, defaultSelected, selected) {
    if (data === void 0) data = null;
    if (value === void 0) value = null;
    if (defaultSelected === void 0) defaultSelected = null;
    if (selected === void 0) selected = null;
    if (selected != null) {
      return html$.OptionElement._create_1(data, value, defaultSelected, selected);
    }
    if (defaultSelected != null) {
      return html$.OptionElement._create_2(data, value, defaultSelected);
    }
    if (value != null) {
      return html$.OptionElement._create_3(data, value);
    }
    if (data != null) {
      return html$.OptionElement._create_4(data);
    }
    return html$.OptionElement._create_5();
  }
  static _create_1(data, value, defaultSelected, selected) {
    return new Option(data, value, defaultSelected, selected);
  }
  static _create_2(data, value, defaultSelected) {
    return new Option(data, value, defaultSelected);
  }
  static _create_3(data, value) {
    return new Option(data, value);
  }
  static _create_4(data) {
    return new Option(data);
  }
  static _create_5() {
    return new Option();
  }
  get [$defaultSelected]() {
    return this.defaultSelected;
  }
  set [$defaultSelected](value) {
    this.defaultSelected = value;
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$form]() {
    return this.form;
  }
  get [$index]() {
    return this.index;
  }
  get [$label]() {
    return this.label;
  }
  set [$label](value) {
    this.label = value;
  }
  get [$selected]() {
    return this.selected;
  }
  set [$selected](value) {
    this.selected = value;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
(html$.OptionElement.created = function() {
  this[defaultSelected] = null;
  this[disabled$6] = null;
  this[form$4] = null;
  this[index$] = null;
  this[label$2] = null;
  this[selected$] = null;
  this[value$11] = null;
  html$.OptionElement.__proto__.created.call(this);
}).prototype = html$.OptionElement.prototype;
dart.addTypeTests(html$.OptionElement);
const defaultSelected = Symbol("OptionElement.defaultSelected");
const disabled$6 = Symbol("OptionElement.disabled");
const form$4 = Symbol("OptionElement.form");
const index$ = Symbol("OptionElement.index");
const label$2 = Symbol("OptionElement.label");
const selected$ = Symbol("OptionElement.selected");
const value$11 = Symbol("OptionElement.value");
dart.setLibraryUri(html$.OptionElement, "dart:html");
dart.setFieldSignature(html$.OptionElement, () => ({
  __proto__: dart.getFields(html$.OptionElement.__proto__),
  [$defaultSelected]: dart.fieldType(core.bool),
  [$disabled]: dart.fieldType(core.bool),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$index]: dart.finalFieldType(core.int),
  [$label]: dart.fieldType(core.String),
  [$selected]: dart.fieldType(core.bool),
  [$value]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLOptionElement", html$.OptionElement);
html$.OutputElement = class OutputElement extends html$.HtmlElement {
  static new() {
    return html$.OutputElement._check(html$.document[$createElement]("output"));
  }
  static get supported() {
    return html$.Element.isTagSupported("output");
  }
  get [$defaultValue]() {
    return this.defaultValue;
  }
  set [$defaultValue](value) {
    this.defaultValue = value;
  }
  get [$form]() {
    return this.form;
  }
  get [$htmlFor]() {
    return this.htmlFor;
  }
  get [$labels]() {
    return this.labels;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$type]() {
    return this.type;
  }
  get [$validationMessage]() {
    return this.validationMessage;
  }
  get [$validity]() {
    return this.validity;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  get [$willValidate]() {
    return this.willValidate;
  }
  [$checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [$reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [$setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
};
(html$.OutputElement.created = function() {
  this[defaultValue$] = null;
  this[form$5] = null;
  this[htmlFor$] = null;
  this[labels$1] = null;
  this[name$26] = null;
  this[type$23] = null;
  this[validationMessage$2] = null;
  this[validity$2] = null;
  this[value$12] = null;
  this[willValidate$2] = null;
  html$.OutputElement.__proto__.created.call(this);
}).prototype = html$.OutputElement.prototype;
dart.addTypeTests(html$.OutputElement);
const defaultValue$ = Symbol("OutputElement.defaultValue");
const form$5 = Symbol("OutputElement.form");
const htmlFor$ = Symbol("OutputElement.htmlFor");
const labels$1 = Symbol("OutputElement.labels");
const name$26 = Symbol("OutputElement.name");
const type$23 = Symbol("OutputElement.type");
const validationMessage$2 = Symbol("OutputElement.validationMessage");
const validity$2 = Symbol("OutputElement.validity");
const value$12 = Symbol("OutputElement.value");
const willValidate$2 = Symbol("OutputElement.willValidate");
dart.setMethodSignature(html$.OutputElement, () => ({
  __proto__: dart.getMethods(html$.OutputElement.__proto__),
  [$checkValidity]: dart.fnType(core.bool, []),
  [$reportValidity]: dart.fnType(core.bool, []),
  [$setCustomValidity]: dart.fnType(dart.void, [core.String])
}));
dart.setLibraryUri(html$.OutputElement, "dart:html");
dart.setFieldSignature(html$.OutputElement, () => ({
  __proto__: dart.getFields(html$.OutputElement.__proto__),
  [$defaultValue]: dart.fieldType(core.String),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$htmlFor]: dart.finalFieldType(html$.DomTokenList),
  [$labels]: dart.finalFieldType(ListOfNode()),
  [$name]: dart.fieldType(core.String),
  [$type]: dart.finalFieldType(core.String),
  [$validationMessage]: dart.finalFieldType(core.String),
  [$validity]: dart.finalFieldType(html$.ValidityState),
  [$value]: dart.fieldType(core.String),
  [$willValidate]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("HTMLOutputElement", html$.OutputElement);
html$.OverconstrainedError = class OverconstrainedError$ extends _interceptors.Interceptor {
  static new(constraint, message) {
    return html$.OverconstrainedError._create_1(constraint, message);
  }
  static _create_1(constraint, message) {
    return new OverconstrainedError(constraint, message);
  }
  get [$constraint]() {
    return this.constraint;
  }
  get [$message]() {
    return this.message;
  }
  get [$name]() {
    return this.name;
  }
};
dart.addTypeTests(html$.OverconstrainedError);
const constraint = Symbol("OverconstrainedError.constraint");
const message$24 = Symbol("OverconstrainedError.message");
const name$27 = Symbol("OverconstrainedError.name");
dart.setLibraryUri(html$.OverconstrainedError, "dart:html");
dart.setFieldSignature(html$.OverconstrainedError, () => ({
  __proto__: dart.getFields(html$.OverconstrainedError.__proto__),
  [$constraint]: dart.finalFieldType(core.String),
  [$message]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("OverconstrainedError", html$.OverconstrainedError);
html$.PageTransitionEvent = class PageTransitionEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PageTransitionEvent._create_1(type, eventInitDict_1);
    }
    return html$.PageTransitionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new PageTransitionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new PageTransitionEvent(type);
  }
  get [$persisted]() {
    return this.persisted;
  }
};
dart.addTypeTests(html$.PageTransitionEvent);
const persisted = Symbol("PageTransitionEvent.persisted");
dart.setLibraryUri(html$.PageTransitionEvent, "dart:html");
dart.setFieldSignature(html$.PageTransitionEvent, () => ({
  __proto__: dart.getFields(html$.PageTransitionEvent.__proto__),
  [$persisted]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("PageTransitionEvent", html$.PageTransitionEvent);
html$.PaintRenderingContext2D = class PaintRenderingContext2D extends _interceptors.Interceptor {
  get [$currentTransform]() {
    return this.currentTransform;
  }
  set [$currentTransform](value) {
    this.currentTransform = value;
  }
  get [$fillStyle]() {
    return this.fillStyle;
  }
  set [$fillStyle](value) {
    this.fillStyle = value;
  }
  get [$filter]() {
    return this.filter;
  }
  set [$filter](value) {
    this.filter = value;
  }
  get [$globalAlpha]() {
    return this.globalAlpha;
  }
  set [$globalAlpha](value) {
    this.globalAlpha = value;
  }
  get [$globalCompositeOperation]() {
    return this.globalCompositeOperation;
  }
  set [$globalCompositeOperation](value) {
    this.globalCompositeOperation = value;
  }
  get [$imageSmoothingEnabled]() {
    return this.imageSmoothingEnabled;
  }
  set [$imageSmoothingEnabled](value) {
    this.imageSmoothingEnabled = value;
  }
  get [$imageSmoothingQuality]() {
    return this.imageSmoothingQuality;
  }
  set [$imageSmoothingQuality](value) {
    this.imageSmoothingQuality = value;
  }
  get [$lineCap]() {
    return this.lineCap;
  }
  set [$lineCap](value) {
    this.lineCap = value;
  }
  get [$lineDashOffset]() {
    return this.lineDashOffset;
  }
  set [$lineDashOffset](value) {
    this.lineDashOffset = value;
  }
  get [$lineJoin]() {
    return this.lineJoin;
  }
  set [$lineJoin](value) {
    this.lineJoin = value;
  }
  get [$lineWidth]() {
    return this.lineWidth;
  }
  set [$lineWidth](value) {
    this.lineWidth = value;
  }
  get [$miterLimit]() {
    return this.miterLimit;
  }
  set [$miterLimit](value) {
    this.miterLimit = value;
  }
  get [$shadowBlur]() {
    return this.shadowBlur;
  }
  set [$shadowBlur](value) {
    this.shadowBlur = value;
  }
  get [$shadowColor]() {
    return this.shadowColor;
  }
  set [$shadowColor](value) {
    this.shadowColor = value;
  }
  get [$shadowOffsetX]() {
    return this.shadowOffsetX;
  }
  set [$shadowOffsetX](value) {
    this.shadowOffsetX = value;
  }
  get [$shadowOffsetY]() {
    return this.shadowOffsetY;
  }
  set [$shadowOffsetY](value) {
    this.shadowOffsetY = value;
  }
  get [$strokeStyle]() {
    return this.strokeStyle;
  }
  set [$strokeStyle](value) {
    this.strokeStyle = value;
  }
  [$beginPath](...args) {
    return this.beginPath.apply(this, args);
  }
  [$clearRect](...args) {
    return this.clearRect.apply(this, args);
  }
  [$clip](...args) {
    return this.clip.apply(this, args);
  }
  [$createLinearGradient](...args) {
    return this.createLinearGradient.apply(this, args);
  }
  [$createPattern](...args) {
    return this.createPattern.apply(this, args);
  }
  [$createRadialGradient](...args) {
    return this.createRadialGradient.apply(this, args);
  }
  [$drawImage](...args) {
    return this.drawImage.apply(this, args);
  }
  [$fill](...args) {
    return this.fill.apply(this, args);
  }
  [$fillRect](...args) {
    return this.fillRect.apply(this, args);
  }
  [$getLineDash](...args) {
    return this.getLineDash.apply(this, args);
  }
  [$isPointInPath](...args) {
    return this.isPointInPath.apply(this, args);
  }
  [$isPointInStroke](...args) {
    return this.isPointInStroke.apply(this, args);
  }
  [$resetTransform](...args) {
    return this.resetTransform.apply(this, args);
  }
  [$restore](...args) {
    return this.restore.apply(this, args);
  }
  [$rotate](...args) {
    return this.rotate.apply(this, args);
  }
  [$save](...args) {
    return this.save.apply(this, args);
  }
  [$scale](...args) {
    return this.scale.apply(this, args);
  }
  [$setLineDash](...args) {
    return this.setLineDash.apply(this, args);
  }
  [$setTransform](...args) {
    return this.setTransform.apply(this, args);
  }
  [$stroke](...args) {
    return this.stroke.apply(this, args);
  }
  [$strokeRect](...args) {
    return this.strokeRect.apply(this, args);
  }
  [$transform](...args) {
    return this.transform.apply(this, args);
  }
  [$translate](...args) {
    return this.translate.apply(this, args);
  }
  [$arc](...args) {
    return this.arc.apply(this, args);
  }
  [$arcTo](...args) {
    return this.arcTo.apply(this, args);
  }
  [$bezierCurveTo](...args) {
    return this.bezierCurveTo.apply(this, args);
  }
  [$closePath](...args) {
    return this.closePath.apply(this, args);
  }
  [$ellipse](...args) {
    return this.ellipse.apply(this, args);
  }
  [$lineTo](...args) {
    return this.lineTo.apply(this, args);
  }
  [$moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [$quadraticCurveTo](...args) {
    return this.quadraticCurveTo.apply(this, args);
  }
  [$rect](...args) {
    return this.rect.apply(this, args);
  }
};
dart.addTypeTests(html$.PaintRenderingContext2D);
const currentTransform$ = Symbol("PaintRenderingContext2D.currentTransform");
const fillStyle$0 = Symbol("PaintRenderingContext2D.fillStyle");
const filter$0 = Symbol("PaintRenderingContext2D.filter");
const globalAlpha$0 = Symbol("PaintRenderingContext2D.globalAlpha");
const globalCompositeOperation$0 = Symbol("PaintRenderingContext2D.globalCompositeOperation");
const imageSmoothingEnabled$0 = Symbol("PaintRenderingContext2D.imageSmoothingEnabled");
const imageSmoothingQuality$0 = Symbol("PaintRenderingContext2D.imageSmoothingQuality");
const lineCap$0 = Symbol("PaintRenderingContext2D.lineCap");
const lineDashOffset$ = Symbol("PaintRenderingContext2D.lineDashOffset");
const lineJoin$0 = Symbol("PaintRenderingContext2D.lineJoin");
const lineWidth$0 = Symbol("PaintRenderingContext2D.lineWidth");
const miterLimit$0 = Symbol("PaintRenderingContext2D.miterLimit");
const shadowBlur$0 = Symbol("PaintRenderingContext2D.shadowBlur");
const shadowColor$0 = Symbol("PaintRenderingContext2D.shadowColor");
const shadowOffsetX$0 = Symbol("PaintRenderingContext2D.shadowOffsetX");
const shadowOffsetY$0 = Symbol("PaintRenderingContext2D.shadowOffsetY");
const strokeStyle$0 = Symbol("PaintRenderingContext2D.strokeStyle");
html$.PaintRenderingContext2D[dart.implements] = () => [html$._CanvasPath];
dart.setMethodSignature(html$.PaintRenderingContext2D, () => ({
  __proto__: dart.getMethods(html$.PaintRenderingContext2D.__proto__),
  [$beginPath]: dart.fnType(dart.void, []),
  [$clearRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$clip]: dart.fnType(dart.void, [], [dart.dynamic, core.String]),
  [$createLinearGradient]: dart.fnType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
  [$createPattern]: dart.fnType(html$.CanvasPattern, [dart.dynamic, core.String]),
  [$createRadialGradient]: dart.fnType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$drawImage]: dart.fnType(dart.void, [dart.dynamic, core.num, core.num], [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$fill]: dart.fnType(dart.void, [], [dart.dynamic, core.String]),
  [$fillRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$getLineDash]: dart.fnType(core.List$(core.num), []),
  [$isPointInPath]: dart.fnType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
  [$isPointInStroke]: dart.fnType(core.bool, [dart.dynamic, core.num], [core.num]),
  [$resetTransform]: dart.fnType(dart.void, []),
  [$restore]: dart.fnType(dart.void, []),
  [$rotate]: dart.fnType(dart.void, [core.num]),
  [$save]: dart.fnType(dart.void, []),
  [$scale]: dart.fnType(dart.void, [core.num, core.num]),
  [$setLineDash]: dart.fnType(dart.void, [core.List$(core.num)]),
  [$setTransform]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$stroke]: dart.fnType(dart.void, [], [html$.Path2D]),
  [$strokeRect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$transform]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$translate]: dart.fnType(dart.void, [core.num, core.num]),
  [$arc]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
  [$arcTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
  [$bezierCurveTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$closePath]: dart.fnType(dart.void, []),
  [$ellipse]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
  [$lineTo]: dart.fnType(dart.void, [core.num, core.num]),
  [$moveTo]: dart.fnType(dart.void, [core.num, core.num]),
  [$quadraticCurveTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$rect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num])
}));
dart.setLibraryUri(html$.PaintRenderingContext2D, "dart:html");
dart.setFieldSignature(html$.PaintRenderingContext2D, () => ({
  __proto__: dart.getFields(html$.PaintRenderingContext2D.__proto__),
  [$currentTransform]: dart.fieldType(svg$.Matrix),
  [$fillStyle]: dart.fieldType(core.Object),
  [$filter]: dart.fieldType(core.String),
  [$globalAlpha]: dart.fieldType(core.num),
  [$globalCompositeOperation]: dart.fieldType(core.String),
  [$imageSmoothingEnabled]: dart.fieldType(core.bool),
  [$imageSmoothingQuality]: dart.fieldType(core.String),
  [$lineCap]: dart.fieldType(core.String),
  [$lineDashOffset]: dart.fieldType(core.num),
  [$lineJoin]: dart.fieldType(core.String),
  [$lineWidth]: dart.fieldType(core.num),
  [$miterLimit]: dart.fieldType(core.num),
  [$shadowBlur]: dart.fieldType(core.num),
  [$shadowColor]: dart.fieldType(core.String),
  [$shadowOffsetX]: dart.fieldType(core.num),
  [$shadowOffsetY]: dart.fieldType(core.num),
  [$strokeStyle]: dart.fieldType(core.Object)
}));
dart.registerExtension("PaintRenderingContext2D", html$.PaintRenderingContext2D);
html$.PaintSize = class PaintSize extends _interceptors.Interceptor {
  get [$height]() {
    return this.height;
  }
  get [$width]() {
    return this.width;
  }
};
dart.addTypeTests(html$.PaintSize);
const height$8 = Symbol("PaintSize.height");
const width$8 = Symbol("PaintSize.width");
dart.setLibraryUri(html$.PaintSize, "dart:html");
dart.setFieldSignature(html$.PaintSize, () => ({
  __proto__: dart.getFields(html$.PaintSize.__proto__),
  [$height]: dart.finalFieldType(core.num),
  [$width]: dart.finalFieldType(core.num)
}));
dart.registerExtension("PaintSize", html$.PaintSize);
html$.PaintWorkletGlobalScope = class PaintWorkletGlobalScope extends html$.WorkletGlobalScope {
  get [$devicePixelRatio]() {
    return this.devicePixelRatio;
  }
  [$registerPaint](...args) {
    return this.registerPaint.apply(this, args);
  }
};
dart.addTypeTests(html$.PaintWorkletGlobalScope);
const devicePixelRatio = Symbol("PaintWorkletGlobalScope.devicePixelRatio");
dart.setMethodSignature(html$.PaintWorkletGlobalScope, () => ({
  __proto__: dart.getMethods(html$.PaintWorkletGlobalScope.__proto__),
  [$registerPaint]: dart.fnType(dart.void, [core.String, core.Object])
}));
dart.setLibraryUri(html$.PaintWorkletGlobalScope, "dart:html");
dart.setFieldSignature(html$.PaintWorkletGlobalScope, () => ({
  __proto__: dart.getFields(html$.PaintWorkletGlobalScope.__proto__),
  [$devicePixelRatio]: dart.finalFieldType(core.num)
}));
dart.registerExtension("PaintWorkletGlobalScope", html$.PaintWorkletGlobalScope);
html$.ParagraphElement = class ParagraphElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("p");
  }
};
(html$.ParagraphElement.created = function() {
  html$.ParagraphElement.__proto__.created.call(this);
}).prototype = html$.ParagraphElement.prototype;
dart.addTypeTests(html$.ParagraphElement);
dart.setLibraryUri(html$.ParagraphElement, "dart:html");
dart.registerExtension("HTMLParagraphElement", html$.ParagraphElement);
html$.ParamElement = class ParamElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("param");
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
(html$.ParamElement.created = function() {
  this[name$28] = null;
  this[value$13] = null;
  html$.ParamElement.__proto__.created.call(this);
}).prototype = html$.ParamElement.prototype;
dart.addTypeTests(html$.ParamElement);
const name$28 = Symbol("ParamElement.name");
const value$13 = Symbol("ParamElement.value");
dart.setLibraryUri(html$.ParamElement, "dart:html");
dart.setFieldSignature(html$.ParamElement, () => ({
  __proto__: dart.getFields(html$.ParamElement.__proto__),
  [$name]: dart.fieldType(core.String),
  [$value]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLParamElement", html$.ParamElement);
html$.ParentNode = class ParentNode extends _interceptors.Interceptor {};
dart.addTypeTests(html$.ParentNode);
dart.setLibraryUri(html$.ParentNode, "dart:html");
dart.setFieldSignature(html$.ParentNode, () => ({
  __proto__: dart.getFields(html$.ParentNode.__proto__),
  [_childElementCount]: dart.finalFieldType(core.int),
  [_children]: dart.finalFieldType(ListOfNode()),
  [_firstElementChild]: dart.finalFieldType(html$.Element),
  [_lastElementChild]: dart.finalFieldType(html$.Element)
}));
html$.PasswordCredential = class PasswordCredential$ extends html$.Credential {
  static new(data_OR_form) {
    if (core.Map.is(data_OR_form)) {
      let data_1 = html_common.convertDartToNative_Dictionary(data_OR_form);
      return html$.PasswordCredential._create_1(data_1);
    }
    if (html$.FormElement.is(data_OR_form)) {
      return html$.PasswordCredential._create_2(data_OR_form);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1(data_OR_form) {
    return new PasswordCredential(data_OR_form);
  }
  static _create_2(data_OR_form) {
    return new PasswordCredential(data_OR_form);
  }
  get [$additionalData]() {
    return this.additionalData;
  }
  set [$additionalData](value) {
    this.additionalData = value;
  }
  get [$idName]() {
    return this.idName;
  }
  set [$idName](value) {
    this.idName = value;
  }
  get [$password]() {
    return this.password;
  }
  get [$passwordName]() {
    return this.passwordName;
  }
  set [$passwordName](value) {
    this.passwordName = value;
  }
  get [$iconUrl]() {
    return this.iconURL;
  }
  get [$name]() {
    return this.name;
  }
};
dart.addTypeTests(html$.PasswordCredential);
const additionalData = Symbol("PasswordCredential.additionalData");
const idName = Symbol("PasswordCredential.idName");
const password$1 = Symbol("PasswordCredential.password");
const passwordName = Symbol("PasswordCredential.passwordName");
const iconUrl$0 = Symbol("PasswordCredential.iconUrl");
const name$29 = Symbol("PasswordCredential.name");
html$.PasswordCredential[dart.implements] = () => [html$.CredentialUserData];
dart.setLibraryUri(html$.PasswordCredential, "dart:html");
dart.setFieldSignature(html$.PasswordCredential, () => ({
  __proto__: dart.getFields(html$.PasswordCredential.__proto__),
  [$additionalData]: dart.fieldType(core.Object),
  [$idName]: dart.fieldType(core.String),
  [$password]: dart.finalFieldType(core.String),
  [$passwordName]: dart.fieldType(core.String),
  [$iconUrl]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("PasswordCredential", html$.PasswordCredential);
html$.Path2D = class Path2D$ extends _interceptors.Interceptor {
  static new(path_OR_text) {
    if (path_OR_text === void 0) path_OR_text = null;
    if (path_OR_text == null) {
      return html$.Path2D._create_1();
    }
    if (html$.Path2D.is(path_OR_text)) {
      return html$.Path2D._create_2(path_OR_text);
    }
    if (typeof path_OR_text == 'string') {
      return html$.Path2D._create_3(path_OR_text);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1() {
    return new Path2D();
  }
  static _create_2(path_OR_text) {
    return new Path2D(path_OR_text);
  }
  static _create_3(path_OR_text) {
    return new Path2D(path_OR_text);
  }
  [$addPath](...args) {
    return this.addPath.apply(this, args);
  }
  [$arc](...args) {
    return this.arc.apply(this, args);
  }
  [$arcTo](...args) {
    return this.arcTo.apply(this, args);
  }
  [$bezierCurveTo](...args) {
    return this.bezierCurveTo.apply(this, args);
  }
  [$closePath](...args) {
    return this.closePath.apply(this, args);
  }
  [$ellipse](...args) {
    return this.ellipse.apply(this, args);
  }
  [$lineTo](...args) {
    return this.lineTo.apply(this, args);
  }
  [$moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [$quadraticCurveTo](...args) {
    return this.quadraticCurveTo.apply(this, args);
  }
  [$rect](...args) {
    return this.rect.apply(this, args);
  }
};
dart.addTypeTests(html$.Path2D);
html$.Path2D[dart.implements] = () => [html$._CanvasPath];
dart.setMethodSignature(html$.Path2D, () => ({
  __proto__: dart.getMethods(html$.Path2D.__proto__),
  [$addPath]: dart.fnType(dart.void, [html$.Path2D], [svg$.Matrix]),
  [$arc]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
  [$arcTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
  [$bezierCurveTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$closePath]: dart.fnType(dart.void, []),
  [$ellipse]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
  [$lineTo]: dart.fnType(dart.void, [core.num, core.num]),
  [$moveTo]: dart.fnType(dart.void, [core.num, core.num]),
  [$quadraticCurveTo]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$rect]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num])
}));
dart.setLibraryUri(html$.Path2D, "dart:html");
dart.registerExtension("Path2D", html$.Path2D);
html$.PaymentAddress = class PaymentAddress extends _interceptors.Interceptor {
  get [$addressLine]() {
    return this.addressLine;
  }
  get [$city]() {
    return this.city;
  }
  get [$country]() {
    return this.country;
  }
  get [$dependentLocality]() {
    return this.dependentLocality;
  }
  get [$languageCode]() {
    return this.languageCode;
  }
  get [$organization]() {
    return this.organization;
  }
  get [$phone]() {
    return this.phone;
  }
  get [$postalCode]() {
    return this.postalCode;
  }
  get [$recipient]() {
    return this.recipient;
  }
  get [$region]() {
    return this.region;
  }
  get [$sortingCode]() {
    return this.sortingCode;
  }
};
dart.addTypeTests(html$.PaymentAddress);
const addressLine = Symbol("PaymentAddress.addressLine");
const city = Symbol("PaymentAddress.city");
const country = Symbol("PaymentAddress.country");
const dependentLocality = Symbol("PaymentAddress.dependentLocality");
const languageCode = Symbol("PaymentAddress.languageCode");
const organization = Symbol("PaymentAddress.organization");
const phone = Symbol("PaymentAddress.phone");
const postalCode = Symbol("PaymentAddress.postalCode");
const recipient = Symbol("PaymentAddress.recipient");
const region$ = Symbol("PaymentAddress.region");
const sortingCode = Symbol("PaymentAddress.sortingCode");
dart.setLibraryUri(html$.PaymentAddress, "dart:html");
dart.setFieldSignature(html$.PaymentAddress, () => ({
  __proto__: dart.getFields(html$.PaymentAddress.__proto__),
  [$addressLine]: dart.finalFieldType(ListOfString()),
  [$city]: dart.finalFieldType(core.String),
  [$country]: dart.finalFieldType(core.String),
  [$dependentLocality]: dart.finalFieldType(core.String),
  [$languageCode]: dart.finalFieldType(core.String),
  [$organization]: dart.finalFieldType(core.String),
  [$phone]: dart.finalFieldType(core.String),
  [$postalCode]: dart.finalFieldType(core.String),
  [$recipient]: dart.finalFieldType(core.String),
  [$region]: dart.finalFieldType(core.String),
  [$sortingCode]: dart.finalFieldType(core.String)
}));
dart.registerExtension("PaymentAddress", html$.PaymentAddress);
html$.PaymentInstruments = class PaymentInstruments extends _interceptors.Interceptor {
  [$clear]() {
    return html$.promiseToFuture(dart.dynamic, this.clear());
  }
  [$delete](instrumentKey) {
    return html$.promiseToFuture(core.bool, this.delete(instrumentKey));
  }
  [$get](instrumentKey) {
    return html$.promiseToFutureAsMap(this.get(instrumentKey));
  }
  [$has](instrumentKey) {
    return html$.promiseToFuture(dart.dynamic, this.has(instrumentKey));
  }
  [$keys]() {
    return html$.promiseToFuture(ListOfString(), this.keys());
  }
  [$set](instrumentKey, details) {
    let details_dict = html_common.convertDartToNative_Dictionary(details);
    return html$.promiseToFuture(dart.dynamic, this.set(instrumentKey, details_dict));
  }
};
dart.addTypeTests(html$.PaymentInstruments);
dart.setMethodSignature(html$.PaymentInstruments, () => ({
  __proto__: dart.getMethods(html$.PaymentInstruments.__proto__),
  [$clear]: dart.fnType(async.Future, []),
  [$delete]: dart.fnType(async.Future$(core.bool), [core.String]),
  [$get]: dart.fnType(async.Future$(core.Map$(core.String, dart.dynamic)), [core.String]),
  [$has]: dart.fnType(async.Future, [core.String]),
  [$keys]: dart.fnType(async.Future$(core.List$(core.String)), []),
  [$set]: dart.fnType(async.Future, [core.String, core.Map])
}));
dart.setLibraryUri(html$.PaymentInstruments, "dart:html");
dart.registerExtension("PaymentInstruments", html$.PaymentInstruments);
html$.PaymentManager = class PaymentManager extends _interceptors.Interceptor {
  get [$instruments]() {
    return this.instruments;
  }
  get [$userHint]() {
    return this.userHint;
  }
  set [$userHint](value) {
    this.userHint = value;
  }
};
dart.addTypeTests(html$.PaymentManager);
const instruments = Symbol("PaymentManager.instruments");
const userHint = Symbol("PaymentManager.userHint");
dart.setLibraryUri(html$.PaymentManager, "dart:html");
dart.setFieldSignature(html$.PaymentManager, () => ({
  __proto__: dart.getFields(html$.PaymentManager.__proto__),
  [$instruments]: dart.finalFieldType(html$.PaymentInstruments),
  [$userHint]: dart.fieldType(core.String)
}));
dart.registerExtension("PaymentManager", html$.PaymentManager);
html$.PaymentRequest = class PaymentRequest$ extends html$.EventTarget {
  static new(methodData, details, options) {
    if (options === void 0) options = null;
    let methodData_1 = [];
    for (let i of methodData) {
      methodData_1[$add](html_common.convertDartToNative_Dictionary(i));
    }
    if (options != null) {
      let details_1 = html_common.convertDartToNative_Dictionary(details);
      let options_2 = html_common.convertDartToNative_Dictionary(options);
      return html$.PaymentRequest._create_1(methodData_1, details_1, options_2);
    }
    let details_1 = html_common.convertDartToNative_Dictionary(details);
    return html$.PaymentRequest._create_2(methodData_1, details_1);
  }
  static _create_1(methodData, details, options) {
    return new PaymentRequest(methodData, details, options);
  }
  static _create_2(methodData, details) {
    return new PaymentRequest(methodData, details);
  }
  get [$id]() {
    return this.id;
  }
  get [$shippingAddress]() {
    return this.shippingAddress;
  }
  get [$shippingOption]() {
    return this.shippingOption;
  }
  get [$shippingType]() {
    return this.shippingType;
  }
  [$abort]() {
    return html$.promiseToFuture(dart.dynamic, this.abort());
  }
  [$canMakePayment]() {
    return html$.promiseToFuture(core.bool, this.canMakePayment());
  }
  [$show]() {
    return html$.promiseToFuture(html$.PaymentResponse, this.show());
  }
};
dart.addTypeTests(html$.PaymentRequest);
const id$9 = Symbol("PaymentRequest.id");
const shippingAddress = Symbol("PaymentRequest.shippingAddress");
const shippingOption = Symbol("PaymentRequest.shippingOption");
const shippingType = Symbol("PaymentRequest.shippingType");
dart.setMethodSignature(html$.PaymentRequest, () => ({
  __proto__: dart.getMethods(html$.PaymentRequest.__proto__),
  [$abort]: dart.fnType(async.Future, []),
  [$canMakePayment]: dart.fnType(async.Future$(core.bool), []),
  [$show]: dart.fnType(async.Future$(html$.PaymentResponse), [])
}));
dart.setLibraryUri(html$.PaymentRequest, "dart:html");
dart.setFieldSignature(html$.PaymentRequest, () => ({
  __proto__: dart.getFields(html$.PaymentRequest.__proto__),
  [$id]: dart.finalFieldType(core.String),
  [$shippingAddress]: dart.finalFieldType(html$.PaymentAddress),
  [$shippingOption]: dart.finalFieldType(core.String),
  [$shippingType]: dart.finalFieldType(core.String)
}));
dart.registerExtension("PaymentRequest", html$.PaymentRequest);
html$.PaymentRequestEvent = class PaymentRequestEvent$ extends html$.ExtendableEvent {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.PaymentRequestEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new PaymentRequestEvent(type, eventInitDict);
  }
  get [$instrumentKey]() {
    return this.instrumentKey;
  }
  get [$methodData]() {
    return this.methodData;
  }
  get [$modifiers]() {
    return this.modifiers;
  }
  get [$paymentRequestId]() {
    return this.paymentRequestId;
  }
  get [$paymentRequestOrigin]() {
    return this.paymentRequestOrigin;
  }
  get [$topLevelOrigin]() {
    return this.topLevelOrigin;
  }
  get [$total]() {
    return this.total;
  }
  [$openWindow](url) {
    return html$.promiseToFuture(html$.WindowClient, this.openWindow(url));
  }
  [$respondWith](...args) {
    return this.respondWith.apply(this, args);
  }
};
dart.addTypeTests(html$.PaymentRequestEvent);
const instrumentKey = Symbol("PaymentRequestEvent.instrumentKey");
const methodData$ = Symbol("PaymentRequestEvent.methodData");
const modifiers$ = Symbol("PaymentRequestEvent.modifiers");
const paymentRequestId = Symbol("PaymentRequestEvent.paymentRequestId");
const paymentRequestOrigin$ = Symbol("PaymentRequestEvent.paymentRequestOrigin");
const topLevelOrigin$ = Symbol("PaymentRequestEvent.topLevelOrigin");
const total = Symbol("PaymentRequestEvent.total");
dart.setMethodSignature(html$.PaymentRequestEvent, () => ({
  __proto__: dart.getMethods(html$.PaymentRequestEvent.__proto__),
  [$openWindow]: dart.fnType(async.Future$(html$.WindowClient), [core.String]),
  [$respondWith]: dart.fnType(dart.void, [async.Future])
}));
dart.setLibraryUri(html$.PaymentRequestEvent, "dart:html");
dart.setFieldSignature(html$.PaymentRequestEvent, () => ({
  __proto__: dart.getFields(html$.PaymentRequestEvent.__proto__),
  [$instrumentKey]: dart.finalFieldType(core.String),
  [$methodData]: dart.finalFieldType(core.List),
  [$modifiers]: dart.finalFieldType(core.List),
  [$paymentRequestId]: dart.finalFieldType(core.String),
  [$paymentRequestOrigin]: dart.finalFieldType(core.String),
  [$topLevelOrigin]: dart.finalFieldType(core.String),
  [$total]: dart.finalFieldType(core.Object)
}));
dart.registerExtension("PaymentRequestEvent", html$.PaymentRequestEvent);
html$.PaymentRequestUpdateEvent = class PaymentRequestUpdateEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PaymentRequestUpdateEvent._create_1(type, eventInitDict_1);
    }
    return html$.PaymentRequestUpdateEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new PaymentRequestUpdateEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new PaymentRequestUpdateEvent(type);
  }
  [$updateWith](...args) {
    return this.updateWith.apply(this, args);
  }
};
dart.addTypeTests(html$.PaymentRequestUpdateEvent);
dart.setMethodSignature(html$.PaymentRequestUpdateEvent, () => ({
  __proto__: dart.getMethods(html$.PaymentRequestUpdateEvent.__proto__),
  [$updateWith]: dart.fnType(dart.void, [async.Future])
}));
dart.setLibraryUri(html$.PaymentRequestUpdateEvent, "dart:html");
dart.registerExtension("PaymentRequestUpdateEvent", html$.PaymentRequestUpdateEvent);
html$.PaymentResponse = class PaymentResponse extends _interceptors.Interceptor {
  get [$details]() {
    return this.details;
  }
  get [$methodName]() {
    return this.methodName;
  }
  get [$payerEmail]() {
    return this.payerEmail;
  }
  get [$payerName]() {
    return this.payerName;
  }
  get [$payerPhone]() {
    return this.payerPhone;
  }
  get [$requestId]() {
    return this.requestId;
  }
  get [$shippingAddress]() {
    return this.shippingAddress;
  }
  get [$shippingOption]() {
    return this.shippingOption;
  }
  [$complete](paymentResult) {
    if (paymentResult === void 0) paymentResult = null;
    return html$.promiseToFuture(dart.dynamic, this.complete(paymentResult));
  }
};
dart.addTypeTests(html$.PaymentResponse);
const details$ = Symbol("PaymentResponse.details");
const methodName = Symbol("PaymentResponse.methodName");
const payerEmail = Symbol("PaymentResponse.payerEmail");
const payerName = Symbol("PaymentResponse.payerName");
const payerPhone = Symbol("PaymentResponse.payerPhone");
const requestId = Symbol("PaymentResponse.requestId");
const shippingAddress$ = Symbol("PaymentResponse.shippingAddress");
const shippingOption$ = Symbol("PaymentResponse.shippingOption");
dart.setMethodSignature(html$.PaymentResponse, () => ({
  __proto__: dart.getMethods(html$.PaymentResponse.__proto__),
  [$complete]: dart.fnType(async.Future, [], [core.String])
}));
dart.setLibraryUri(html$.PaymentResponse, "dart:html");
dart.setFieldSignature(html$.PaymentResponse, () => ({
  __proto__: dart.getFields(html$.PaymentResponse.__proto__),
  [$details]: dart.finalFieldType(core.Object),
  [$methodName]: dart.finalFieldType(core.String),
  [$payerEmail]: dart.finalFieldType(core.String),
  [$payerName]: dart.finalFieldType(core.String),
  [$payerPhone]: dart.finalFieldType(core.String),
  [$requestId]: dart.finalFieldType(core.String),
  [$shippingAddress]: dart.finalFieldType(html$.PaymentAddress),
  [$shippingOption]: dart.finalFieldType(core.String)
}));
dart.registerExtension("PaymentResponse", html$.PaymentResponse);
html$.Performance = class Performance extends html$.EventTarget {
  static get supported() {
    return !!window.performance;
  }
  get [$memory]() {
    return this.memory;
  }
  get [$navigation]() {
    return this.navigation;
  }
  get [$timeOrigin]() {
    return this.timeOrigin;
  }
  get [$timing]() {
    return this.timing;
  }
  [$clearMarks](...args) {
    return this.clearMarks.apply(this, args);
  }
  [$clearMeasures](...args) {
    return this.clearMeasures.apply(this, args);
  }
  [$clearResourceTimings](...args) {
    return this.clearResourceTimings.apply(this, args);
  }
  [$getEntries](...args) {
    return this.getEntries.apply(this, args);
  }
  [$getEntriesByName](...args) {
    return this.getEntriesByName.apply(this, args);
  }
  [$getEntriesByType](...args) {
    return this.getEntriesByType.apply(this, args);
  }
  [$mark](...args) {
    return this.mark.apply(this, args);
  }
  [$measure](...args) {
    return this.measure.apply(this, args);
  }
  [$now](...args) {
    return this.now.apply(this, args);
  }
  [$setResourceTimingBufferSize](...args) {
    return this.setResourceTimingBufferSize.apply(this, args);
  }
};
dart.addTypeTests(html$.Performance);
const memory = Symbol("Performance.memory");
const navigation = Symbol("Performance.navigation");
const timeOrigin = Symbol("Performance.timeOrigin");
const timing$ = Symbol("Performance.timing");
dart.setMethodSignature(html$.Performance, () => ({
  __proto__: dart.getMethods(html$.Performance.__proto__),
  [$clearMarks]: dart.fnType(dart.void, [core.String]),
  [$clearMeasures]: dart.fnType(dart.void, [core.String]),
  [$clearResourceTimings]: dart.fnType(dart.void, []),
  [$getEntries]: dart.fnType(core.List$(html$.PerformanceEntry), []),
  [$getEntriesByName]: dart.fnType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
  [$getEntriesByType]: dart.fnType(core.List$(html$.PerformanceEntry), [core.String]),
  [$mark]: dart.fnType(dart.void, [core.String]),
  [$measure]: dart.fnType(dart.void, [core.String, core.String, core.String]),
  [$now]: dart.fnType(core.double, []),
  [$setResourceTimingBufferSize]: dart.fnType(dart.void, [core.int])
}));
dart.setLibraryUri(html$.Performance, "dart:html");
dart.setFieldSignature(html$.Performance, () => ({
  __proto__: dart.getFields(html$.Performance.__proto__),
  [$memory]: dart.finalFieldType(html$.MemoryInfo),
  [$navigation]: dart.finalFieldType(html$.PerformanceNavigation),
  [$timeOrigin]: dart.finalFieldType(core.num),
  [$timing]: dart.finalFieldType(html$.PerformanceTiming)
}));
dart.registerExtension("Performance", html$.Performance);
html$.PerformanceEntry = class PerformanceEntry extends _interceptors.Interceptor {
  get [$duration]() {
    return this.duration;
  }
  get [$entryType]() {
    return this.entryType;
  }
  get [$name]() {
    return this.name;
  }
  get [$startTime]() {
    return this.startTime;
  }
};
dart.addTypeTests(html$.PerformanceEntry);
const duration$2 = Symbol("PerformanceEntry.duration");
const entryType = Symbol("PerformanceEntry.entryType");
const name$30 = Symbol("PerformanceEntry.name");
const startTime$ = Symbol("PerformanceEntry.startTime");
dart.setLibraryUri(html$.PerformanceEntry, "dart:html");
dart.setFieldSignature(html$.PerformanceEntry, () => ({
  __proto__: dart.getFields(html$.PerformanceEntry.__proto__),
  [$duration]: dart.finalFieldType(core.num),
  [$entryType]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String),
  [$startTime]: dart.finalFieldType(core.num)
}));
dart.registerExtension("PerformanceEntry", html$.PerformanceEntry);
html$.PerformanceLongTaskTiming = class PerformanceLongTaskTiming extends html$.PerformanceEntry {
  get [$attribution]() {
    return this.attribution;
  }
};
dart.addTypeTests(html$.PerformanceLongTaskTiming);
const attribution = Symbol("PerformanceLongTaskTiming.attribution");
dart.setLibraryUri(html$.PerformanceLongTaskTiming, "dart:html");
dart.setFieldSignature(html$.PerformanceLongTaskTiming, () => ({
  __proto__: dart.getFields(html$.PerformanceLongTaskTiming.__proto__),
  [$attribution]: dart.finalFieldType(ListOfTaskAttributionTiming())
}));
dart.registerExtension("PerformanceLongTaskTiming", html$.PerformanceLongTaskTiming);
html$.PerformanceMark = class PerformanceMark extends html$.PerformanceEntry {};
dart.addTypeTests(html$.PerformanceMark);
dart.setLibraryUri(html$.PerformanceMark, "dart:html");
dart.registerExtension("PerformanceMark", html$.PerformanceMark);
html$.PerformanceMeasure = class PerformanceMeasure extends html$.PerformanceEntry {};
dart.addTypeTests(html$.PerformanceMeasure);
dart.setLibraryUri(html$.PerformanceMeasure, "dart:html");
dart.registerExtension("PerformanceMeasure", html$.PerformanceMeasure);
html$.PerformanceNavigation = class PerformanceNavigation extends _interceptors.Interceptor {
  get [$redirectCount]() {
    return this.redirectCount;
  }
  get [$type]() {
    return this.type;
  }
};
dart.addTypeTests(html$.PerformanceNavigation);
const redirectCount = Symbol("PerformanceNavigation.redirectCount");
const type$24 = Symbol("PerformanceNavigation.type");
dart.setLibraryUri(html$.PerformanceNavigation, "dart:html");
dart.setFieldSignature(html$.PerformanceNavigation, () => ({
  __proto__: dart.getFields(html$.PerformanceNavigation.__proto__),
  [$redirectCount]: dart.finalFieldType(core.int),
  [$type]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.PerformanceNavigation, {
  /*html$.PerformanceNavigation.TYPE_BACK_FORWARD*/get TYPE_BACK_FORWARD() {
    return 2;
  },
  /*html$.PerformanceNavigation.TYPE_NAVIGATE*/get TYPE_NAVIGATE() {
    return 0;
  },
  /*html$.PerformanceNavigation.TYPE_RELOAD*/get TYPE_RELOAD() {
    return 1;
  },
  /*html$.PerformanceNavigation.TYPE_RESERVED*/get TYPE_RESERVED() {
    return 255;
  }
});
dart.registerExtension("PerformanceNavigation", html$.PerformanceNavigation);
html$.PerformanceResourceTiming = class PerformanceResourceTiming extends html$.PerformanceEntry {
  get [$connectEnd]() {
    return this.connectEnd;
  }
  get [$connectStart]() {
    return this.connectStart;
  }
  get [$decodedBodySize]() {
    return this.decodedBodySize;
  }
  get [$domainLookupEnd]() {
    return this.domainLookupEnd;
  }
  get [$domainLookupStart]() {
    return this.domainLookupStart;
  }
  get [$encodedBodySize]() {
    return this.encodedBodySize;
  }
  get [$fetchStart]() {
    return this.fetchStart;
  }
  get [$initiatorType]() {
    return this.initiatorType;
  }
  get [$nextHopProtocol]() {
    return this.nextHopProtocol;
  }
  get [$redirectEnd]() {
    return this.redirectEnd;
  }
  get [$redirectStart]() {
    return this.redirectStart;
  }
  get [$requestStart]() {
    return this.requestStart;
  }
  get [$responseEnd]() {
    return this.responseEnd;
  }
  get [$responseStart]() {
    return this.responseStart;
  }
  get [$secureConnectionStart]() {
    return this.secureConnectionStart;
  }
  get [$serverTiming]() {
    return this.serverTiming;
  }
  get [$transferSize]() {
    return this.transferSize;
  }
  get [$workerStart]() {
    return this.workerStart;
  }
};
dart.addTypeTests(html$.PerformanceResourceTiming);
const connectEnd = Symbol("PerformanceResourceTiming.connectEnd");
const connectStart = Symbol("PerformanceResourceTiming.connectStart");
const decodedBodySize = Symbol("PerformanceResourceTiming.decodedBodySize");
const domainLookupEnd = Symbol("PerformanceResourceTiming.domainLookupEnd");
const domainLookupStart = Symbol("PerformanceResourceTiming.domainLookupStart");
const encodedBodySize = Symbol("PerformanceResourceTiming.encodedBodySize");
const fetchStart = Symbol("PerformanceResourceTiming.fetchStart");
const initiatorType = Symbol("PerformanceResourceTiming.initiatorType");
const nextHopProtocol = Symbol("PerformanceResourceTiming.nextHopProtocol");
const redirectEnd = Symbol("PerformanceResourceTiming.redirectEnd");
const redirectStart = Symbol("PerformanceResourceTiming.redirectStart");
const requestStart = Symbol("PerformanceResourceTiming.requestStart");
const responseEnd = Symbol("PerformanceResourceTiming.responseEnd");
const responseStart = Symbol("PerformanceResourceTiming.responseStart");
const secureConnectionStart = Symbol("PerformanceResourceTiming.secureConnectionStart");
const serverTiming = Symbol("PerformanceResourceTiming.serverTiming");
const transferSize = Symbol("PerformanceResourceTiming.transferSize");
const workerStart = Symbol("PerformanceResourceTiming.workerStart");
dart.setLibraryUri(html$.PerformanceResourceTiming, "dart:html");
dart.setFieldSignature(html$.PerformanceResourceTiming, () => ({
  __proto__: dart.getFields(html$.PerformanceResourceTiming.__proto__),
  [$connectEnd]: dart.finalFieldType(core.num),
  [$connectStart]: dart.finalFieldType(core.num),
  [$decodedBodySize]: dart.finalFieldType(core.int),
  [$domainLookupEnd]: dart.finalFieldType(core.num),
  [$domainLookupStart]: dart.finalFieldType(core.num),
  [$encodedBodySize]: dart.finalFieldType(core.int),
  [$fetchStart]: dart.finalFieldType(core.num),
  [$initiatorType]: dart.finalFieldType(core.String),
  [$nextHopProtocol]: dart.finalFieldType(core.String),
  [$redirectEnd]: dart.finalFieldType(core.num),
  [$redirectStart]: dart.finalFieldType(core.num),
  [$requestStart]: dart.finalFieldType(core.num),
  [$responseEnd]: dart.finalFieldType(core.num),
  [$responseStart]: dart.finalFieldType(core.num),
  [$secureConnectionStart]: dart.finalFieldType(core.num),
  [$serverTiming]: dart.finalFieldType(ListOfPerformanceServerTiming()),
  [$transferSize]: dart.finalFieldType(core.int),
  [$workerStart]: dart.finalFieldType(core.num)
}));
dart.registerExtension("PerformanceResourceTiming", html$.PerformanceResourceTiming);
html$.PerformanceNavigationTiming = class PerformanceNavigationTiming extends html$.PerformanceResourceTiming {
  get [$domComplete]() {
    return this.domComplete;
  }
  get [$domContentLoadedEventEnd]() {
    return this.domContentLoadedEventEnd;
  }
  get [$domContentLoadedEventStart]() {
    return this.domContentLoadedEventStart;
  }
  get [$domInteractive]() {
    return this.domInteractive;
  }
  get [$loadEventEnd]() {
    return this.loadEventEnd;
  }
  get [$loadEventStart]() {
    return this.loadEventStart;
  }
  get [$redirectCount]() {
    return this.redirectCount;
  }
  get [$type]() {
    return this.type;
  }
  get [$unloadEventEnd]() {
    return this.unloadEventEnd;
  }
  get [$unloadEventStart]() {
    return this.unloadEventStart;
  }
};
dart.addTypeTests(html$.PerformanceNavigationTiming);
const domComplete = Symbol("PerformanceNavigationTiming.domComplete");
const domContentLoadedEventEnd = Symbol("PerformanceNavigationTiming.domContentLoadedEventEnd");
const domContentLoadedEventStart = Symbol("PerformanceNavigationTiming.domContentLoadedEventStart");
const domInteractive = Symbol("PerformanceNavigationTiming.domInteractive");
const loadEventEnd = Symbol("PerformanceNavigationTiming.loadEventEnd");
const loadEventStart = Symbol("PerformanceNavigationTiming.loadEventStart");
const redirectCount$ = Symbol("PerformanceNavigationTiming.redirectCount");
const type$25 = Symbol("PerformanceNavigationTiming.type");
const unloadEventEnd = Symbol("PerformanceNavigationTiming.unloadEventEnd");
const unloadEventStart = Symbol("PerformanceNavigationTiming.unloadEventStart");
dart.setLibraryUri(html$.PerformanceNavigationTiming, "dart:html");
dart.setFieldSignature(html$.PerformanceNavigationTiming, () => ({
  __proto__: dart.getFields(html$.PerformanceNavigationTiming.__proto__),
  [$domComplete]: dart.finalFieldType(core.num),
  [$domContentLoadedEventEnd]: dart.finalFieldType(core.num),
  [$domContentLoadedEventStart]: dart.finalFieldType(core.num),
  [$domInteractive]: dart.finalFieldType(core.num),
  [$loadEventEnd]: dart.finalFieldType(core.num),
  [$loadEventStart]: dart.finalFieldType(core.num),
  [$redirectCount]: dart.finalFieldType(core.int),
  [$type]: dart.finalFieldType(core.String),
  [$unloadEventEnd]: dart.finalFieldType(core.num),
  [$unloadEventStart]: dart.finalFieldType(core.num)
}));
dart.registerExtension("PerformanceNavigationTiming", html$.PerformanceNavigationTiming);
html$.PerformanceObserver = class PerformanceObserver$ extends _interceptors.Interceptor {
  static new(callback) {
    let callback_1 = _js_helper.convertDartClosureToJS(PerformanceObserverEntryListAndPerformanceObserverTovoid(), callback, 2);
    return html$.PerformanceObserver._create_1(callback_1);
  }
  static _create_1(callback) {
    return new PerformanceObserver(callback);
  }
  [$disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [$observe](options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    this[_observe_1$](options_1);
    return;
  }
  [_observe_1$](...args) {
    return this.observe.apply(this, args);
  }
};
dart.addTypeTests(html$.PerformanceObserver);
dart.setMethodSignature(html$.PerformanceObserver, () => ({
  __proto__: dart.getMethods(html$.PerformanceObserver.__proto__),
  [$disconnect]: dart.fnType(dart.void, []),
  [$observe]: dart.fnType(dart.void, [core.Map]),
  [_observe_1$]: dart.fnType(dart.void, [dart.dynamic])
}));
dart.setLibraryUri(html$.PerformanceObserver, "dart:html");
dart.registerExtension("PerformanceObserver", html$.PerformanceObserver);
html$.PerformanceObserverEntryList = class PerformanceObserverEntryList extends _interceptors.Interceptor {
  [$getEntries](...args) {
    return this.getEntries.apply(this, args);
  }
  [$getEntriesByName](...args) {
    return this.getEntriesByName.apply(this, args);
  }
  [$getEntriesByType](...args) {
    return this.getEntriesByType.apply(this, args);
  }
};
dart.addTypeTests(html$.PerformanceObserverEntryList);
dart.setMethodSignature(html$.PerformanceObserverEntryList, () => ({
  __proto__: dart.getMethods(html$.PerformanceObserverEntryList.__proto__),
  [$getEntries]: dart.fnType(core.List$(html$.PerformanceEntry), []),
  [$getEntriesByName]: dart.fnType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
  [$getEntriesByType]: dart.fnType(core.List$(html$.PerformanceEntry), [core.String])
}));
dart.setLibraryUri(html$.PerformanceObserverEntryList, "dart:html");
dart.registerExtension("PerformanceObserverEntryList", html$.PerformanceObserverEntryList);
html$.PerformancePaintTiming = class PerformancePaintTiming extends html$.PerformanceEntry {};
dart.addTypeTests(html$.PerformancePaintTiming);
dart.setLibraryUri(html$.PerformancePaintTiming, "dart:html");
dart.registerExtension("PerformancePaintTiming", html$.PerformancePaintTiming);
html$.PerformanceServerTiming = class PerformanceServerTiming extends _interceptors.Interceptor {
  get [$description]() {
    return this.description;
  }
  get [$duration]() {
    return this.duration;
  }
  get [$name]() {
    return this.name;
  }
};
dart.addTypeTests(html$.PerformanceServerTiming);
const description$0 = Symbol("PerformanceServerTiming.description");
const duration$3 = Symbol("PerformanceServerTiming.duration");
const name$31 = Symbol("PerformanceServerTiming.name");
dart.setLibraryUri(html$.PerformanceServerTiming, "dart:html");
dart.setFieldSignature(html$.PerformanceServerTiming, () => ({
  __proto__: dart.getFields(html$.PerformanceServerTiming.__proto__),
  [$description]: dart.finalFieldType(core.String),
  [$duration]: dart.finalFieldType(core.num),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("PerformanceServerTiming", html$.PerformanceServerTiming);
html$.PerformanceTiming = class PerformanceTiming extends _interceptors.Interceptor {
  get [$connectEnd]() {
    return this.connectEnd;
  }
  get [$connectStart]() {
    return this.connectStart;
  }
  get [$domComplete]() {
    return this.domComplete;
  }
  get [$domContentLoadedEventEnd]() {
    return this.domContentLoadedEventEnd;
  }
  get [$domContentLoadedEventStart]() {
    return this.domContentLoadedEventStart;
  }
  get [$domInteractive]() {
    return this.domInteractive;
  }
  get [$domLoading]() {
    return this.domLoading;
  }
  get [$domainLookupEnd]() {
    return this.domainLookupEnd;
  }
  get [$domainLookupStart]() {
    return this.domainLookupStart;
  }
  get [$fetchStart]() {
    return this.fetchStart;
  }
  get [$loadEventEnd]() {
    return this.loadEventEnd;
  }
  get [$loadEventStart]() {
    return this.loadEventStart;
  }
  get [$navigationStart]() {
    return this.navigationStart;
  }
  get [$redirectEnd]() {
    return this.redirectEnd;
  }
  get [$redirectStart]() {
    return this.redirectStart;
  }
  get [$requestStart]() {
    return this.requestStart;
  }
  get [$responseEnd]() {
    return this.responseEnd;
  }
  get [$responseStart]() {
    return this.responseStart;
  }
  get [$secureConnectionStart]() {
    return this.secureConnectionStart;
  }
  get [$unloadEventEnd]() {
    return this.unloadEventEnd;
  }
  get [$unloadEventStart]() {
    return this.unloadEventStart;
  }
};
dart.addTypeTests(html$.PerformanceTiming);
const connectEnd$ = Symbol("PerformanceTiming.connectEnd");
const connectStart$ = Symbol("PerformanceTiming.connectStart");
const domComplete$ = Symbol("PerformanceTiming.domComplete");
const domContentLoadedEventEnd$ = Symbol("PerformanceTiming.domContentLoadedEventEnd");
const domContentLoadedEventStart$ = Symbol("PerformanceTiming.domContentLoadedEventStart");
const domInteractive$ = Symbol("PerformanceTiming.domInteractive");
const domLoading = Symbol("PerformanceTiming.domLoading");
const domainLookupEnd$ = Symbol("PerformanceTiming.domainLookupEnd");
const domainLookupStart$ = Symbol("PerformanceTiming.domainLookupStart");
const fetchStart$ = Symbol("PerformanceTiming.fetchStart");
const loadEventEnd$ = Symbol("PerformanceTiming.loadEventEnd");
const loadEventStart$ = Symbol("PerformanceTiming.loadEventStart");
const navigationStart = Symbol("PerformanceTiming.navigationStart");
const redirectEnd$ = Symbol("PerformanceTiming.redirectEnd");
const redirectStart$ = Symbol("PerformanceTiming.redirectStart");
const requestStart$ = Symbol("PerformanceTiming.requestStart");
const responseEnd$ = Symbol("PerformanceTiming.responseEnd");
const responseStart$ = Symbol("PerformanceTiming.responseStart");
const secureConnectionStart$ = Symbol("PerformanceTiming.secureConnectionStart");
const unloadEventEnd$ = Symbol("PerformanceTiming.unloadEventEnd");
const unloadEventStart$ = Symbol("PerformanceTiming.unloadEventStart");
dart.setLibraryUri(html$.PerformanceTiming, "dart:html");
dart.setFieldSignature(html$.PerformanceTiming, () => ({
  __proto__: dart.getFields(html$.PerformanceTiming.__proto__),
  [$connectEnd]: dart.finalFieldType(core.int),
  [$connectStart]: dart.finalFieldType(core.int),
  [$domComplete]: dart.finalFieldType(core.int),
  [$domContentLoadedEventEnd]: dart.finalFieldType(core.int),
  [$domContentLoadedEventStart]: dart.finalFieldType(core.int),
  [$domInteractive]: dart.finalFieldType(core.int),
  [$domLoading]: dart.finalFieldType(core.int),
  [$domainLookupEnd]: dart.finalFieldType(core.int),
  [$domainLookupStart]: dart.finalFieldType(core.int),
  [$fetchStart]: dart.finalFieldType(core.int),
  [$loadEventEnd]: dart.finalFieldType(core.int),
  [$loadEventStart]: dart.finalFieldType(core.int),
  [$navigationStart]: dart.finalFieldType(core.int),
  [$redirectEnd]: dart.finalFieldType(core.int),
  [$redirectStart]: dart.finalFieldType(core.int),
  [$requestStart]: dart.finalFieldType(core.int),
  [$responseEnd]: dart.finalFieldType(core.int),
  [$responseStart]: dart.finalFieldType(core.int),
  [$secureConnectionStart]: dart.finalFieldType(core.int),
  [$unloadEventEnd]: dart.finalFieldType(core.int),
  [$unloadEventStart]: dart.finalFieldType(core.int)
}));
dart.registerExtension("PerformanceTiming", html$.PerformanceTiming);
html$.PermissionStatus = class PermissionStatus extends html$.EventTarget {
  get [$state]() {
    return this.state;
  }
  get [$onChange]() {
    return html$.PermissionStatus.changeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.PermissionStatus);
const state$2 = Symbol("PermissionStatus.state");
dart.setGetterSignature(html$.PermissionStatus, () => ({
  __proto__: dart.getGetters(html$.PermissionStatus.__proto__),
  [$onChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.PermissionStatus, "dart:html");
dart.setFieldSignature(html$.PermissionStatus, () => ({
  __proto__: dart.getFields(html$.PermissionStatus.__proto__),
  [$state]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.PermissionStatus, {
  /*html$.PermissionStatus.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  }
});
dart.registerExtension("PermissionStatus", html$.PermissionStatus);
html$.Permissions = class Permissions extends _interceptors.Interceptor {
  [$query](permission) {
    let permission_dict = html_common.convertDartToNative_Dictionary(permission);
    return html$.promiseToFuture(html$.PermissionStatus, this.query(permission_dict));
  }
  [$request](permissions) {
    let permissions_dict = html_common.convertDartToNative_Dictionary(permissions);
    return html$.promiseToFuture(html$.PermissionStatus, this.request(permissions_dict));
  }
  [$requestAll](permissions) {
    return html$.promiseToFuture(html$.PermissionStatus, this.requestAll(permissions));
  }
  [$revoke](permission) {
    let permission_dict = html_common.convertDartToNative_Dictionary(permission);
    return html$.promiseToFuture(html$.PermissionStatus, this.revoke(permission_dict));
  }
};
dart.addTypeTests(html$.Permissions);
dart.setMethodSignature(html$.Permissions, () => ({
  __proto__: dart.getMethods(html$.Permissions.__proto__),
  [$query]: dart.fnType(async.Future$(html$.PermissionStatus), [core.Map]),
  [$request]: dart.fnType(async.Future$(html$.PermissionStatus), [core.Map]),
  [$requestAll]: dart.fnType(async.Future$(html$.PermissionStatus), [core.List$(core.Map)]),
  [$revoke]: dart.fnType(async.Future$(html$.PermissionStatus), [core.Map])
}));
dart.setLibraryUri(html$.Permissions, "dart:html");
dart.registerExtension("Permissions", html$.Permissions);
html$.PhotoCapabilities = class PhotoCapabilities extends _interceptors.Interceptor {
  get [$fillLightMode]() {
    return this.fillLightMode;
  }
  get [$imageHeight]() {
    return this.imageHeight;
  }
  get [$imageWidth]() {
    return this.imageWidth;
  }
  get [$redEyeReduction]() {
    return this.redEyeReduction;
  }
};
dart.addTypeTests(html$.PhotoCapabilities);
const fillLightMode = Symbol("PhotoCapabilities.fillLightMode");
const imageHeight = Symbol("PhotoCapabilities.imageHeight");
const imageWidth = Symbol("PhotoCapabilities.imageWidth");
const redEyeReduction = Symbol("PhotoCapabilities.redEyeReduction");
dart.setLibraryUri(html$.PhotoCapabilities, "dart:html");
dart.setFieldSignature(html$.PhotoCapabilities, () => ({
  __proto__: dart.getFields(html$.PhotoCapabilities.__proto__),
  [$fillLightMode]: dart.finalFieldType(core.List),
  [$imageHeight]: dart.finalFieldType(html$.MediaSettingsRange),
  [$imageWidth]: dart.finalFieldType(html$.MediaSettingsRange),
  [$redEyeReduction]: dart.finalFieldType(core.String)
}));
dart.registerExtension("PhotoCapabilities", html$.PhotoCapabilities);
html$.PictureElement = class PictureElement extends html$.HtmlElement {};
(html$.PictureElement.created = function() {
  html$.PictureElement.__proto__.created.call(this);
}).prototype = html$.PictureElement.prototype;
dart.addTypeTests(html$.PictureElement);
dart.setLibraryUri(html$.PictureElement, "dart:html");
dart.registerExtension("HTMLPictureElement", html$.PictureElement);
html$.Plugin = class Plugin extends _interceptors.Interceptor {
  get [$description]() {
    return this.description;
  }
  get [$filename]() {
    return this.filename;
  }
  get [$length]() {
    return this.length;
  }
  get [$name]() {
    return this.name;
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
};
dart.addTypeTests(html$.Plugin);
const description$1 = Symbol("Plugin.description");
const filename$ = Symbol("Plugin.filename");
const length$11 = Symbol("Plugin.length");
const name$32 = Symbol("Plugin.name");
dart.setMethodSignature(html$.Plugin, () => ({
  __proto__: dart.getMethods(html$.Plugin.__proto__),
  [$item]: dart.fnType(html$.MimeType, [core.int]),
  [$namedItem]: dart.fnType(html$.MimeType, [core.String])
}));
dart.setLibraryUri(html$.Plugin, "dart:html");
dart.setFieldSignature(html$.Plugin, () => ({
  __proto__: dart.getFields(html$.Plugin.__proto__),
  [$description]: dart.finalFieldType(core.String),
  [$filename]: dart.finalFieldType(core.String),
  [$length]: dart.finalFieldType(core.int),
  [$name]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Plugin", html$.Plugin);
const Interceptor_ListMixin$$4 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$4.new = function() {
  Interceptor_ListMixin$$4.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$4.prototype;
dart.applyMixin(Interceptor_ListMixin$$4, collection.ListMixin$(html$.Plugin));
const Interceptor_ImmutableListMixin$$4 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$4 {};
(Interceptor_ImmutableListMixin$$4.new = function() {
  Interceptor_ImmutableListMixin$$4.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$4.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$4, html$.ImmutableListMixin$(html$.Plugin));
html$.PluginArray = class PluginArray extends Interceptor_ImmutableListMixin$$4 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.Plugin._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
  [$refresh](...args) {
    return this.refresh.apply(this, args);
  }
};
html$.PluginArray.prototype[dart.isList] = true;
dart.addTypeTests(html$.PluginArray);
html$.PluginArray[dart.implements] = () => [JavaScriptIndexingBehaviorOfPlugin(), ListOfPlugin()];
dart.setMethodSignature(html$.PluginArray, () => ({
  __proto__: dart.getMethods(html$.PluginArray.__proto__),
  [$_get]: dart.fnType(html$.Plugin, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.Plugin, [core.int]),
  [$item]: dart.fnType(html$.Plugin, [core.int]),
  [$namedItem]: dart.fnType(html$.Plugin, [core.String]),
  [$refresh]: dart.fnType(dart.void, [core.bool])
}));
dart.setGetterSignature(html$.PluginArray, () => ({
  __proto__: dart.getGetters(html$.PluginArray.__proto__),
  [$length]: core.int,
  [$first]: html$.Plugin,
  [$last]: html$.Plugin,
  [$single]: html$.Plugin
}));
dart.setSetterSignature(html$.PluginArray, () => ({
  __proto__: dart.getSetters(html$.PluginArray.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.PluginArray, "dart:html");
dart.registerExtension("PluginArray", html$.PluginArray);
html$.PointerEvent = class PointerEvent$ extends html$.MouseEvent {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PointerEvent._create_1(type, eventInitDict_1);
    }
    return html$.PointerEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new PointerEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new PointerEvent(type);
  }
  get [$height]() {
    return this.height;
  }
  get [$isPrimary]() {
    return this.isPrimary;
  }
  get [$pointerId]() {
    return this.pointerId;
  }
  get [$pointerType]() {
    return this.pointerType;
  }
  get [$pressure]() {
    return this.pressure;
  }
  get [$tangentialPressure]() {
    return this.tangentialPressure;
  }
  get [$tiltX]() {
    return this.tiltX;
  }
  get [$tiltY]() {
    return this.tiltY;
  }
  get [$twist]() {
    return this.twist;
  }
  get [$width]() {
    return this.width;
  }
  [$getCoalescedEvents](...args) {
    return this.getCoalescedEvents.apply(this, args);
  }
};
dart.addTypeTests(html$.PointerEvent);
const height$9 = Symbol("PointerEvent.height");
const isPrimary = Symbol("PointerEvent.isPrimary");
const pointerId = Symbol("PointerEvent.pointerId");
const pointerType = Symbol("PointerEvent.pointerType");
const pressure = Symbol("PointerEvent.pressure");
const tangentialPressure = Symbol("PointerEvent.tangentialPressure");
const tiltX = Symbol("PointerEvent.tiltX");
const tiltY = Symbol("PointerEvent.tiltY");
const twist = Symbol("PointerEvent.twist");
const width$9 = Symbol("PointerEvent.width");
dart.setMethodSignature(html$.PointerEvent, () => ({
  __proto__: dart.getMethods(html$.PointerEvent.__proto__),
  [$getCoalescedEvents]: dart.fnType(core.List$(html$.PointerEvent), [])
}));
dart.setLibraryUri(html$.PointerEvent, "dart:html");
dart.setFieldSignature(html$.PointerEvent, () => ({
  __proto__: dart.getFields(html$.PointerEvent.__proto__),
  [$height]: dart.finalFieldType(core.num),
  [$isPrimary]: dart.finalFieldType(core.bool),
  [$pointerId]: dart.finalFieldType(core.int),
  [$pointerType]: dart.finalFieldType(core.String),
  [$pressure]: dart.finalFieldType(core.num),
  [$tangentialPressure]: dart.finalFieldType(core.num),
  [$tiltX]: dart.finalFieldType(core.int),
  [$tiltY]: dart.finalFieldType(core.int),
  [$twist]: dart.finalFieldType(core.int),
  [$width]: dart.finalFieldType(core.num)
}));
dart.registerExtension("PointerEvent", html$.PointerEvent);
html$.PopStateEvent = class PopStateEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PopStateEvent._create_1(type, eventInitDict_1);
    }
    return html$.PopStateEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new PopStateEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new PopStateEvent(type);
  }
  get [$state]() {
    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
  }
  get [_get_state]() {
    return this.state;
  }
};
dart.addTypeTests(html$.PopStateEvent);
dart.setGetterSignature(html$.PopStateEvent, () => ({
  __proto__: dart.getGetters(html$.PopStateEvent.__proto__),
  [$state]: dart.dynamic
}));
dart.setLibraryUri(html$.PopStateEvent, "dart:html");
dart.setFieldSignature(html$.PopStateEvent, () => ({
  __proto__: dart.getFields(html$.PopStateEvent.__proto__),
  [_get_state]: dart.finalFieldType(dart.dynamic)
}));
dart.registerExtension("PopStateEvent", html$.PopStateEvent);
html$.PositionError = class PositionError extends _interceptors.Interceptor {
  get [$code]() {
    return this.code;
  }
  get [$message]() {
    return this.message;
  }
};
dart.addTypeTests(html$.PositionError);
const code$1 = Symbol("PositionError.code");
const message$25 = Symbol("PositionError.message");
dart.setLibraryUri(html$.PositionError, "dart:html");
dart.setFieldSignature(html$.PositionError, () => ({
  __proto__: dart.getFields(html$.PositionError.__proto__),
  [$code]: dart.finalFieldType(core.int),
  [$message]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.PositionError, {
  /*html$.PositionError.PERMISSION_DENIED*/get PERMISSION_DENIED() {
    return 1;
  },
  /*html$.PositionError.POSITION_UNAVAILABLE*/get POSITION_UNAVAILABLE() {
    return 2;
  },
  /*html$.PositionError.TIMEOUT*/get TIMEOUT() {
    return 3;
  }
});
dart.registerExtension("PositionError", html$.PositionError);
html$.PreElement = class PreElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("pre");
  }
};
(html$.PreElement.created = function() {
  html$.PreElement.__proto__.created.call(this);
}).prototype = html$.PreElement.prototype;
dart.addTypeTests(html$.PreElement);
dart.setLibraryUri(html$.PreElement, "dart:html");
dart.registerExtension("HTMLPreElement", html$.PreElement);
html$.Presentation = class Presentation extends _interceptors.Interceptor {
  get [$defaultRequest]() {
    return this.defaultRequest;
  }
  set [$defaultRequest](value) {
    this.defaultRequest = value;
  }
  get [$receiver]() {
    return this.receiver;
  }
};
dart.addTypeTests(html$.Presentation);
const defaultRequest = Symbol("Presentation.defaultRequest");
const receiver = Symbol("Presentation.receiver");
dart.setLibraryUri(html$.Presentation, "dart:html");
dart.setFieldSignature(html$.Presentation, () => ({
  __proto__: dart.getFields(html$.Presentation.__proto__),
  [$defaultRequest]: dart.fieldType(html$.PresentationRequest),
  [$receiver]: dart.finalFieldType(html$.PresentationReceiver)
}));
dart.registerExtension("Presentation", html$.Presentation);
html$.PresentationAvailability = class PresentationAvailability extends html$.EventTarget {
  get [$value]() {
    return this.value;
  }
  get [$onChange]() {
    return html$.PresentationAvailability.changeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.PresentationAvailability);
const value$14 = Symbol("PresentationAvailability.value");
dart.setGetterSignature(html$.PresentationAvailability, () => ({
  __proto__: dart.getGetters(html$.PresentationAvailability.__proto__),
  [$onChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.PresentationAvailability, "dart:html");
dart.setFieldSignature(html$.PresentationAvailability, () => ({
  __proto__: dart.getFields(html$.PresentationAvailability.__proto__),
  [$value]: dart.finalFieldType(core.bool)
}));
dart.defineLazy(html$.PresentationAvailability, {
  /*html$.PresentationAvailability.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  }
});
dart.registerExtension("PresentationAvailability", html$.PresentationAvailability);
html$.PresentationConnection = class PresentationConnection extends html$.EventTarget {
  get [$binaryType]() {
    return this.binaryType;
  }
  set [$binaryType](value) {
    this.binaryType = value;
  }
  get [$id]() {
    return this.id;
  }
  get [$state]() {
    return this.state;
  }
  get [$url]() {
    return this.url;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$send](...args) {
    return this.send.apply(this, args);
  }
  [$terminate](...args) {
    return this.terminate.apply(this, args);
  }
  get [$onMessage]() {
    return html$.PresentationConnection.messageEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.PresentationConnection);
const binaryType = Symbol("PresentationConnection.binaryType");
const id$10 = Symbol("PresentationConnection.id");
const state$3 = Symbol("PresentationConnection.state");
const url$2 = Symbol("PresentationConnection.url");
dart.setMethodSignature(html$.PresentationConnection, () => ({
  __proto__: dart.getMethods(html$.PresentationConnection.__proto__),
  [$close]: dart.fnType(dart.void, []),
  [$send]: dart.fnType(dart.void, [dart.dynamic]),
  [$terminate]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.PresentationConnection, () => ({
  __proto__: dart.getGetters(html$.PresentationConnection.__proto__),
  [$onMessage]: async.Stream$(html$.MessageEvent)
}));
dart.setLibraryUri(html$.PresentationConnection, "dart:html");
dart.setFieldSignature(html$.PresentationConnection, () => ({
  __proto__: dart.getFields(html$.PresentationConnection.__proto__),
  [$binaryType]: dart.fieldType(core.String),
  [$id]: dart.finalFieldType(core.String),
  [$state]: dart.finalFieldType(core.String),
  [$url]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.PresentationConnection, {
  /*html$.PresentationConnection.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  }
});
dart.registerExtension("PresentationConnection", html$.PresentationConnection);
html$.PresentationConnectionAvailableEvent = class PresentationConnectionAvailableEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.PresentationConnectionAvailableEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new PresentationConnectionAvailableEvent(type, eventInitDict);
  }
  get [$connection]() {
    return this.connection;
  }
};
dart.addTypeTests(html$.PresentationConnectionAvailableEvent);
const connection$0 = Symbol("PresentationConnectionAvailableEvent.connection");
dart.setLibraryUri(html$.PresentationConnectionAvailableEvent, "dart:html");
dart.setFieldSignature(html$.PresentationConnectionAvailableEvent, () => ({
  __proto__: dart.getFields(html$.PresentationConnectionAvailableEvent.__proto__),
  [$connection]: dart.finalFieldType(html$.PresentationConnection)
}));
dart.registerExtension("PresentationConnectionAvailableEvent", html$.PresentationConnectionAvailableEvent);
html$.PresentationConnectionCloseEvent = class PresentationConnectionCloseEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.PresentationConnectionCloseEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new PresentationConnectionCloseEvent(type, eventInitDict);
  }
  get [$message]() {
    return this.message;
  }
  get [$reason]() {
    return this.reason;
  }
};
dart.addTypeTests(html$.PresentationConnectionCloseEvent);
const message$26 = Symbol("PresentationConnectionCloseEvent.message");
const reason$0 = Symbol("PresentationConnectionCloseEvent.reason");
dart.setLibraryUri(html$.PresentationConnectionCloseEvent, "dart:html");
dart.setFieldSignature(html$.PresentationConnectionCloseEvent, () => ({
  __proto__: dart.getFields(html$.PresentationConnectionCloseEvent.__proto__),
  [$message]: dart.finalFieldType(core.String),
  [$reason]: dart.finalFieldType(core.String)
}));
dart.registerExtension("PresentationConnectionCloseEvent", html$.PresentationConnectionCloseEvent);
html$.PresentationConnectionList = class PresentationConnectionList extends html$.EventTarget {
  get [$connections]() {
    return this.connections;
  }
};
dart.addTypeTests(html$.PresentationConnectionList);
const connections = Symbol("PresentationConnectionList.connections");
dart.setLibraryUri(html$.PresentationConnectionList, "dart:html");
dart.setFieldSignature(html$.PresentationConnectionList, () => ({
  __proto__: dart.getFields(html$.PresentationConnectionList.__proto__),
  [$connections]: dart.finalFieldType(ListOfPresentationConnection())
}));
dart.registerExtension("PresentationConnectionList", html$.PresentationConnectionList);
html$.PresentationReceiver = class PresentationReceiver extends _interceptors.Interceptor {
  get [$connectionList]() {
    return html$.promiseToFuture(html$.PresentationConnectionList, this.connectionList);
  }
};
dart.addTypeTests(html$.PresentationReceiver);
dart.setGetterSignature(html$.PresentationReceiver, () => ({
  __proto__: dart.getGetters(html$.PresentationReceiver.__proto__),
  [$connectionList]: async.Future$(html$.PresentationConnectionList)
}));
dart.setLibraryUri(html$.PresentationReceiver, "dart:html");
dart.registerExtension("PresentationReceiver", html$.PresentationReceiver);
html$.PresentationRequest = class PresentationRequest$ extends html$.EventTarget {
  static new(url_OR_urls) {
    if (typeof url_OR_urls == 'string') {
      return html$.PresentationRequest._create_1(url_OR_urls);
    }
    if (ListOfString().is(url_OR_urls)) {
      let urls_1 = html_common.convertDartToNative_StringArray(url_OR_urls);
      return html$.PresentationRequest._create_2(urls_1);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1(url_OR_urls) {
    return new PresentationRequest(url_OR_urls);
  }
  static _create_2(url_OR_urls) {
    return new PresentationRequest(url_OR_urls);
  }
  [$getAvailability]() {
    return html$.promiseToFuture(html$.PresentationAvailability, this.getAvailability());
  }
  [$reconnect](id) {
    return html$.promiseToFuture(html$.PresentationConnection, this.reconnect(id));
  }
  [$start]() {
    return html$.promiseToFuture(html$.PresentationConnection, this.start());
  }
};
dart.addTypeTests(html$.PresentationRequest);
dart.setMethodSignature(html$.PresentationRequest, () => ({
  __proto__: dart.getMethods(html$.PresentationRequest.__proto__),
  [$getAvailability]: dart.fnType(async.Future$(html$.PresentationAvailability), []),
  [$reconnect]: dart.fnType(async.Future$(html$.PresentationConnection), [core.String]),
  [$start]: dart.fnType(async.Future$(html$.PresentationConnection), [])
}));
dart.setLibraryUri(html$.PresentationRequest, "dart:html");
dart.registerExtension("PresentationRequest", html$.PresentationRequest);
html$.ProcessingInstruction = class ProcessingInstruction extends html$.CharacterData {
  get [$sheet]() {
    return this.sheet;
  }
  get [$target]() {
    return this.target;
  }
};
dart.addTypeTests(html$.ProcessingInstruction);
const sheet$ = Symbol("ProcessingInstruction.sheet");
const target$5 = Symbol("ProcessingInstruction.target");
dart.setLibraryUri(html$.ProcessingInstruction, "dart:html");
dart.setFieldSignature(html$.ProcessingInstruction, () => ({
  __proto__: dart.getFields(html$.ProcessingInstruction.__proto__),
  [$sheet]: dart.finalFieldType(html$.StyleSheet),
  [$target]: dart.finalFieldType(core.String)
}));
dart.registerExtension("ProcessingInstruction", html$.ProcessingInstruction);
html$.ProgressElement = class ProgressElement extends html$.HtmlElement {
  static new() {
    return html$.ProgressElement._check(html$.document[$createElement]("progress"));
  }
  static get supported() {
    return html$.Element.isTagSupported("progress");
  }
  get [$labels]() {
    return this.labels;
  }
  get [$max]() {
    return this.max;
  }
  set [$max](value) {
    this.max = value;
  }
  get [$position]() {
    return this.position;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
(html$.ProgressElement.created = function() {
  this[labels$2] = null;
  this[max$3] = null;
  this[position$0] = null;
  this[value$15] = null;
  html$.ProgressElement.__proto__.created.call(this);
}).prototype = html$.ProgressElement.prototype;
dart.addTypeTests(html$.ProgressElement);
const labels$2 = Symbol("ProgressElement.labels");
const max$3 = Symbol("ProgressElement.max");
const position$0 = Symbol("ProgressElement.position");
const value$15 = Symbol("ProgressElement.value");
dart.setLibraryUri(html$.ProgressElement, "dart:html");
dart.setFieldSignature(html$.ProgressElement, () => ({
  __proto__: dart.getFields(html$.ProgressElement.__proto__),
  [$labels]: dart.finalFieldType(ListOfNode()),
  [$max]: dart.fieldType(core.num),
  [$position]: dart.finalFieldType(core.num),
  [$value]: dart.fieldType(core.num)
}));
dart.registerExtension("HTMLProgressElement", html$.ProgressElement);
html$.ProgressEvent = class ProgressEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.ProgressEvent._create_1(type, eventInitDict_1);
    }
    return html$.ProgressEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new ProgressEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new ProgressEvent(type);
  }
  get [$lengthComputable]() {
    return this.lengthComputable;
  }
  get [$loaded]() {
    return this.loaded;
  }
  get [$total]() {
    return this.total;
  }
};
dart.addTypeTests(html$.ProgressEvent);
const lengthComputable = Symbol("ProgressEvent.lengthComputable");
const loaded = Symbol("ProgressEvent.loaded");
const total$ = Symbol("ProgressEvent.total");
dart.setLibraryUri(html$.ProgressEvent, "dart:html");
dart.setFieldSignature(html$.ProgressEvent, () => ({
  __proto__: dart.getFields(html$.ProgressEvent.__proto__),
  [$lengthComputable]: dart.finalFieldType(core.bool),
  [$loaded]: dart.finalFieldType(core.int),
  [$total]: dart.finalFieldType(core.int)
}));
dart.registerExtension("ProgressEvent", html$.ProgressEvent);
html$.PromiseRejectionEvent = class PromiseRejectionEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.PromiseRejectionEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new PromiseRejectionEvent(type, eventInitDict);
  }
  get [$promise]() {
    return html$.promiseToFuture(dart.dynamic, this.promise);
  }
  get [$reason]() {
    return this.reason;
  }
};
dart.addTypeTests(html$.PromiseRejectionEvent);
const reason$1 = Symbol("PromiseRejectionEvent.reason");
dart.setGetterSignature(html$.PromiseRejectionEvent, () => ({
  __proto__: dart.getGetters(html$.PromiseRejectionEvent.__proto__),
  [$promise]: async.Future
}));
dart.setLibraryUri(html$.PromiseRejectionEvent, "dart:html");
dart.setFieldSignature(html$.PromiseRejectionEvent, () => ({
  __proto__: dart.getFields(html$.PromiseRejectionEvent.__proto__),
  [$reason]: dart.finalFieldType(core.Object)
}));
dart.registerExtension("PromiseRejectionEvent", html$.PromiseRejectionEvent);
html$.PublicKeyCredential = class PublicKeyCredential extends html$.Credential {
  get [$rawId]() {
    return this.rawId;
  }
  get [$response]() {
    return this.response;
  }
};
dart.addTypeTests(html$.PublicKeyCredential);
const rawId = Symbol("PublicKeyCredential.rawId");
const response$ = Symbol("PublicKeyCredential.response");
dart.setLibraryUri(html$.PublicKeyCredential, "dart:html");
dart.setFieldSignature(html$.PublicKeyCredential, () => ({
  __proto__: dart.getFields(html$.PublicKeyCredential.__proto__),
  [$rawId]: dart.finalFieldType(typed_data.ByteBuffer),
  [$response]: dart.finalFieldType(html$.AuthenticatorResponse)
}));
dart.registerExtension("PublicKeyCredential", html$.PublicKeyCredential);
html$.PushEvent = class PushEvent$ extends html$.ExtendableEvent {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.PushEvent._create_1(type, eventInitDict_1);
    }
    return html$.PushEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new PushEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new PushEvent(type);
  }
  get [$data]() {
    return this.data;
  }
};
dart.addTypeTests(html$.PushEvent);
const data$7 = Symbol("PushEvent.data");
dart.setLibraryUri(html$.PushEvent, "dart:html");
dart.setFieldSignature(html$.PushEvent, () => ({
  __proto__: dart.getFields(html$.PushEvent.__proto__),
  [$data]: dart.finalFieldType(html$.PushMessageData)
}));
dart.registerExtension("PushEvent", html$.PushEvent);
html$.PushManager = class PushManager extends _interceptors.Interceptor {
  [$getSubscription]() {
    return html$.promiseToFuture(html$.PushSubscription, this.getSubscription());
  }
  [$permissionState](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.permissionState(options_dict));
  }
  [$subscribe](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(html$.PushSubscription, this.subscribe(options_dict));
  }
};
dart.addTypeTests(html$.PushManager);
dart.setMethodSignature(html$.PushManager, () => ({
  __proto__: dart.getMethods(html$.PushManager.__proto__),
  [$getSubscription]: dart.fnType(async.Future$(html$.PushSubscription), []),
  [$permissionState]: dart.fnType(async.Future, [], [core.Map]),
  [$subscribe]: dart.fnType(async.Future$(html$.PushSubscription), [], [core.Map])
}));
dart.setLibraryUri(html$.PushManager, "dart:html");
dart.defineLazy(html$.PushManager, {
  /*html$.PushManager.supportedContentEncodings*/get supportedContentEncodings() {
    return null;
  }
});
dart.registerExtension("PushManager", html$.PushManager);
html$.PushMessageData = class PushMessageData extends _interceptors.Interceptor {
  [$arrayBuffer](...args) {
    return this.arrayBuffer.apply(this, args);
  }
  [$blob](...args) {
    return this.blob.apply(this, args);
  }
  [$json](...args) {
    return this.json.apply(this, args);
  }
  [$text](...args) {
    return this.text.apply(this, args);
  }
};
dart.addTypeTests(html$.PushMessageData);
dart.setMethodSignature(html$.PushMessageData, () => ({
  __proto__: dart.getMethods(html$.PushMessageData.__proto__),
  [$arrayBuffer]: dart.fnType(typed_data.ByteBuffer, []),
  [$blob]: dart.fnType(html$.Blob, []),
  [$json]: dart.fnType(core.Object, []),
  [$text]: dart.fnType(core.String, [])
}));
dart.setLibraryUri(html$.PushMessageData, "dart:html");
dart.registerExtension("PushMessageData", html$.PushMessageData);
html$.PushSubscription = class PushSubscription extends _interceptors.Interceptor {
  get [$endpoint]() {
    return this.endpoint;
  }
  get [$expirationTime]() {
    return this.expirationTime;
  }
  get [$options]() {
    return this.options;
  }
  [$getKey](...args) {
    return this.getKey.apply(this, args);
  }
  [$unsubscribe]() {
    return html$.promiseToFuture(core.bool, this.unsubscribe());
  }
};
dart.addTypeTests(html$.PushSubscription);
const endpoint = Symbol("PushSubscription.endpoint");
const expirationTime = Symbol("PushSubscription.expirationTime");
const options$0 = Symbol("PushSubscription.options");
dart.setMethodSignature(html$.PushSubscription, () => ({
  __proto__: dart.getMethods(html$.PushSubscription.__proto__),
  [$getKey]: dart.fnType(typed_data.ByteBuffer, [core.String]),
  [$unsubscribe]: dart.fnType(async.Future$(core.bool), [])
}));
dart.setLibraryUri(html$.PushSubscription, "dart:html");
dart.setFieldSignature(html$.PushSubscription, () => ({
  __proto__: dart.getFields(html$.PushSubscription.__proto__),
  [$endpoint]: dart.finalFieldType(core.String),
  [$expirationTime]: dart.finalFieldType(core.int),
  [$options]: dart.finalFieldType(html$.PushSubscriptionOptions)
}));
dart.registerExtension("PushSubscription", html$.PushSubscription);
html$.PushSubscriptionOptions = class PushSubscriptionOptions extends _interceptors.Interceptor {
  get [$applicationServerKey]() {
    return this.applicationServerKey;
  }
  get [$userVisibleOnly]() {
    return this.userVisibleOnly;
  }
};
dart.addTypeTests(html$.PushSubscriptionOptions);
const applicationServerKey = Symbol("PushSubscriptionOptions.applicationServerKey");
const userVisibleOnly = Symbol("PushSubscriptionOptions.userVisibleOnly");
dart.setLibraryUri(html$.PushSubscriptionOptions, "dart:html");
dart.setFieldSignature(html$.PushSubscriptionOptions, () => ({
  __proto__: dart.getFields(html$.PushSubscriptionOptions.__proto__),
  [$applicationServerKey]: dart.finalFieldType(typed_data.ByteBuffer),
  [$userVisibleOnly]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("PushSubscriptionOptions", html$.PushSubscriptionOptions);
html$.QuoteElement = class QuoteElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("q");
  }
  get [$cite]() {
    return this.cite;
  }
  set [$cite](value) {
    this.cite = value;
  }
};
(html$.QuoteElement.created = function() {
  this[cite$] = null;
  html$.QuoteElement.__proto__.created.call(this);
}).prototype = html$.QuoteElement.prototype;
dart.addTypeTests(html$.QuoteElement);
const cite$ = Symbol("QuoteElement.cite");
dart.setLibraryUri(html$.QuoteElement, "dart:html");
dart.setFieldSignature(html$.QuoteElement, () => ({
  __proto__: dart.getFields(html$.QuoteElement.__proto__),
  [$cite]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLQuoteElement", html$.QuoteElement);
html$.Range = class Range extends _interceptors.Interceptor {
  static new() {
    return html$.document.createRange();
  }
  static fromPoint(point) {
    return html$.document[_caretRangeFromPoint](dart.asInt(point.x), dart.asInt(point.y));
  }
  get [$collapsed]() {
    return this.collapsed;
  }
  get [$commonAncestorContainer]() {
    return this.commonAncestorContainer;
  }
  get [$endContainer]() {
    return this.endContainer;
  }
  get [$endOffset]() {
    return this.endOffset;
  }
  get [$startContainer]() {
    return this.startContainer;
  }
  get [$startOffset]() {
    return this.startOffset;
  }
  [$cloneContents](...args) {
    return this.cloneContents.apply(this, args);
  }
  [$cloneRange](...args) {
    return this.cloneRange.apply(this, args);
  }
  [$collapse](...args) {
    return this.collapse.apply(this, args);
  }
  [$compareBoundaryPoints](...args) {
    return this.compareBoundaryPoints.apply(this, args);
  }
  [$comparePoint](...args) {
    return this.comparePoint.apply(this, args);
  }
  [$createContextualFragment](...args) {
    return this.createContextualFragment.apply(this, args);
  }
  [$deleteContents](...args) {
    return this.deleteContents.apply(this, args);
  }
  [$detach](...args) {
    return this.detach.apply(this, args);
  }
  [$expand](...args) {
    return this.expand.apply(this, args);
  }
  [$extractContents](...args) {
    return this.extractContents.apply(this, args);
  }
  [$getBoundingClientRect](...args) {
    return this.getBoundingClientRect.apply(this, args);
  }
  [_getClientRects](...args) {
    return this.getClientRects.apply(this, args);
  }
  [$insertNode](...args) {
    return this.insertNode.apply(this, args);
  }
  [$isPointInRange](...args) {
    return this.isPointInRange.apply(this, args);
  }
  [$selectNode](...args) {
    return this.selectNode.apply(this, args);
  }
  [$selectNodeContents](...args) {
    return this.selectNodeContents.apply(this, args);
  }
  [$setEnd](...args) {
    return this.setEnd.apply(this, args);
  }
  [$setEndAfter](...args) {
    return this.setEndAfter.apply(this, args);
  }
  [$setEndBefore](...args) {
    return this.setEndBefore.apply(this, args);
  }
  [$setStart](...args) {
    return this.setStart.apply(this, args);
  }
  [$setStartAfter](...args) {
    return this.setStartAfter.apply(this, args);
  }
  [$setStartBefore](...args) {
    return this.setStartBefore.apply(this, args);
  }
  [$surroundContents](...args) {
    return this.surroundContents.apply(this, args);
  }
  [$getClientRects]() {
    let value = this[_getClientRects]();
    let jsProto = value.prototype;
    if (jsProto == null) {
      value.prototype = Object.create(null);
    }
    _js_helper.applyExtension("DOMRectList", value);
    return value;
  }
  static get supportsCreateContextualFragment() {
    return "createContextualFragment" in window.Range.prototype;
  }
};
dart.addTypeTests(html$.Range);
const collapsed = Symbol("Range.collapsed");
const commonAncestorContainer = Symbol("Range.commonAncestorContainer");
const endContainer = Symbol("Range.endContainer");
const endOffset = Symbol("Range.endOffset");
const startContainer = Symbol("Range.startContainer");
const startOffset = Symbol("Range.startOffset");
dart.setMethodSignature(html$.Range, () => ({
  __proto__: dart.getMethods(html$.Range.__proto__),
  [$cloneContents]: dart.fnType(html$.DocumentFragment, []),
  [$cloneRange]: dart.fnType(html$.Range, []),
  [$collapse]: dart.fnType(dart.void, [], [core.bool]),
  [$compareBoundaryPoints]: dart.fnType(core.int, [core.int, html$.Range]),
  [$comparePoint]: dart.fnType(core.int, [html$.Node, core.int]),
  [$createContextualFragment]: dart.fnType(html$.DocumentFragment, [core.String]),
  [$deleteContents]: dart.fnType(dart.void, []),
  [$detach]: dart.fnType(dart.void, []),
  [$expand]: dart.fnType(dart.void, [core.String]),
  [$extractContents]: dart.fnType(html$.DocumentFragment, []),
  [$getBoundingClientRect]: dart.fnType(math.Rectangle$(core.num), []),
  [_getClientRects]: dart.fnType(core.List$(math.Rectangle$(core.num)), []),
  [$insertNode]: dart.fnType(dart.void, [html$.Node]),
  [$isPointInRange]: dart.fnType(core.bool, [html$.Node, core.int]),
  [$selectNode]: dart.fnType(dart.void, [html$.Node]),
  [$selectNodeContents]: dart.fnType(dart.void, [html$.Node]),
  [$setEnd]: dart.fnType(dart.void, [html$.Node, core.int]),
  [$setEndAfter]: dart.fnType(dart.void, [html$.Node]),
  [$setEndBefore]: dart.fnType(dart.void, [html$.Node]),
  [$setStart]: dart.fnType(dart.void, [html$.Node, core.int]),
  [$setStartAfter]: dart.fnType(dart.void, [html$.Node]),
  [$setStartBefore]: dart.fnType(dart.void, [html$.Node]),
  [$surroundContents]: dart.fnType(dart.void, [html$.Node]),
  [$getClientRects]: dart.fnType(core.List$(math.Rectangle$(core.num)), [])
}));
dart.setLibraryUri(html$.Range, "dart:html");
dart.setFieldSignature(html$.Range, () => ({
  __proto__: dart.getFields(html$.Range.__proto__),
  [$collapsed]: dart.finalFieldType(core.bool),
  [$commonAncestorContainer]: dart.finalFieldType(html$.Node),
  [$endContainer]: dart.finalFieldType(html$.Node),
  [$endOffset]: dart.finalFieldType(core.int),
  [$startContainer]: dart.finalFieldType(html$.Node),
  [$startOffset]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.Range, {
  /*html$.Range.END_TO_END*/get END_TO_END() {
    return 2;
  },
  /*html$.Range.END_TO_START*/get END_TO_START() {
    return 3;
  },
  /*html$.Range.START_TO_END*/get START_TO_END() {
    return 1;
  },
  /*html$.Range.START_TO_START*/get START_TO_START() {
    return 0;
  }
});
dart.registerExtension("Range", html$.Range);
html$.RelatedApplication = class RelatedApplication extends _interceptors.Interceptor {
  get [$id]() {
    return this.id;
  }
  get [$platform]() {
    return this.platform;
  }
  get [$url]() {
    return this.url;
  }
};
dart.addTypeTests(html$.RelatedApplication);
const id$11 = Symbol("RelatedApplication.id");
const platform$0 = Symbol("RelatedApplication.platform");
const url$3 = Symbol("RelatedApplication.url");
dart.setLibraryUri(html$.RelatedApplication, "dart:html");
dart.setFieldSignature(html$.RelatedApplication, () => ({
  __proto__: dart.getFields(html$.RelatedApplication.__proto__),
  [$id]: dart.finalFieldType(core.String),
  [$platform]: dart.finalFieldType(core.String),
  [$url]: dart.finalFieldType(core.String)
}));
dart.registerExtension("RelatedApplication", html$.RelatedApplication);
html$.RelativeOrientationSensor = class RelativeOrientationSensor$ extends html$.OrientationSensor {
  static new(sensorOptions) {
    if (sensorOptions === void 0) sensorOptions = null;
    if (sensorOptions != null) {
      let sensorOptions_1 = html_common.convertDartToNative_Dictionary(sensorOptions);
      return html$.RelativeOrientationSensor._create_1(sensorOptions_1);
    }
    return html$.RelativeOrientationSensor._create_2();
  }
  static _create_1(sensorOptions) {
    return new RelativeOrientationSensor(sensorOptions);
  }
  static _create_2() {
    return new RelativeOrientationSensor();
  }
};
dart.addTypeTests(html$.RelativeOrientationSensor);
dart.setLibraryUri(html$.RelativeOrientationSensor, "dart:html");
dart.registerExtension("RelativeOrientationSensor", html$.RelativeOrientationSensor);
html$.RemotePlayback = class RemotePlayback extends html$.EventTarget {
  get [$state]() {
    return this.state;
  }
  [$cancelWatchAvailability](id) {
    if (id === void 0) id = null;
    return html$.promiseToFuture(dart.dynamic, this.cancelWatchAvailability(id));
  }
  [$prompt]() {
    return html$.promiseToFuture(dart.dynamic, this.prompt());
  }
  [$watchAvailability](callback) {
    return html$.promiseToFuture(core.int, this.watchAvailability(callback));
  }
};
dart.addTypeTests(html$.RemotePlayback);
const state$4 = Symbol("RemotePlayback.state");
dart.setMethodSignature(html$.RemotePlayback, () => ({
  __proto__: dart.getMethods(html$.RemotePlayback.__proto__),
  [$cancelWatchAvailability]: dart.fnType(async.Future, [], [core.int]),
  [$prompt]: dart.fnType(async.Future, []),
  [$watchAvailability]: dart.fnType(async.Future$(core.int), [dart.fnType(dart.void, [core.bool])])
}));
dart.setLibraryUri(html$.RemotePlayback, "dart:html");
dart.setFieldSignature(html$.RemotePlayback, () => ({
  __proto__: dart.getFields(html$.RemotePlayback.__proto__),
  [$state]: dart.finalFieldType(core.String)
}));
dart.registerExtension("RemotePlayback", html$.RemotePlayback);
html$.ReportingObserver = class ReportingObserver$ extends _interceptors.Interceptor {
  static new(callback) {
    let callback_1 = _js_helper.convertDartClosureToJS(ListAndReportingObserverTovoid(), callback, 2);
    return html$.ReportingObserver._create_1(callback_1);
  }
  static _create_1(callback) {
    return new ReportingObserver(callback);
  }
  [$disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [$observe](...args) {
    return this.observe.apply(this, args);
  }
};
dart.addTypeTests(html$.ReportingObserver);
dart.setMethodSignature(html$.ReportingObserver, () => ({
  __proto__: dart.getMethods(html$.ReportingObserver.__proto__),
  [$disconnect]: dart.fnType(dart.void, []),
  [$observe]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.ReportingObserver, "dart:html");
dart.registerExtension("ReportingObserver", html$.ReportingObserver);
html$.ResizeObserver = class ResizeObserver$ extends _interceptors.Interceptor {
  static new(callback) {
    let callback_1 = _js_helper.convertDartClosureToJS(ListOfResizeObserverEntryAndResizeObserverTovoid(), callback, 2);
    return html$.ResizeObserver._create_1(callback_1);
  }
  static _create_1(callback) {
    return new ResizeObserver(callback);
  }
  [$disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [$observe](...args) {
    return this.observe.apply(this, args);
  }
  [$unobserve](...args) {
    return this.unobserve.apply(this, args);
  }
};
dart.addTypeTests(html$.ResizeObserver);
dart.setMethodSignature(html$.ResizeObserver, () => ({
  __proto__: dart.getMethods(html$.ResizeObserver.__proto__),
  [$disconnect]: dart.fnType(dart.void, []),
  [$observe]: dart.fnType(dart.void, [html$.Element]),
  [$unobserve]: dart.fnType(dart.void, [html$.Element])
}));
dart.setLibraryUri(html$.ResizeObserver, "dart:html");
dart.registerExtension("ResizeObserver", html$.ResizeObserver);
html$.ResizeObserverEntry = class ResizeObserverEntry extends _interceptors.Interceptor {
  get [$contentRect]() {
    return this.contentRect;
  }
  get [$target]() {
    return this.target;
  }
};
dart.addTypeTests(html$.ResizeObserverEntry);
const contentRect = Symbol("ResizeObserverEntry.contentRect");
const target$6 = Symbol("ResizeObserverEntry.target");
dart.setLibraryUri(html$.ResizeObserverEntry, "dart:html");
dart.setFieldSignature(html$.ResizeObserverEntry, () => ({
  __proto__: dart.getFields(html$.ResizeObserverEntry.__proto__),
  [$contentRect]: dart.finalFieldType(html$.DomRectReadOnly),
  [$target]: dart.finalFieldType(html$.Element)
}));
dart.registerExtension("ResizeObserverEntry", html$.ResizeObserverEntry);
html$.RtcCertificate = class RtcCertificate extends _interceptors.Interceptor {
  get [$expires]() {
    return this.expires;
  }
  [$getFingerprints](...args) {
    return this.getFingerprints.apply(this, args);
  }
};
dart.addTypeTests(html$.RtcCertificate);
const expires = Symbol("RtcCertificate.expires");
dart.setMethodSignature(html$.RtcCertificate, () => ({
  __proto__: dart.getMethods(html$.RtcCertificate.__proto__),
  [$getFingerprints]: dart.fnType(core.List$(core.Map), [])
}));
dart.setLibraryUri(html$.RtcCertificate, "dart:html");
dart.setFieldSignature(html$.RtcCertificate, () => ({
  __proto__: dart.getFields(html$.RtcCertificate.__proto__),
  [$expires]: dart.finalFieldType(core.int)
}));
dart.registerExtension("RTCCertificate", html$.RtcCertificate);
html$.RtcDataChannel = class RtcDataChannel extends html$.EventTarget {
  get [$binaryType]() {
    return this.binaryType;
  }
  set [$binaryType](value) {
    this.binaryType = value;
  }
  get [$bufferedAmount]() {
    return this.bufferedAmount;
  }
  get [$bufferedAmountLowThreshold]() {
    return this.bufferedAmountLowThreshold;
  }
  set [$bufferedAmountLowThreshold](value) {
    this.bufferedAmountLowThreshold = value;
  }
  get [$id]() {
    return this.id;
  }
  get [$label]() {
    return this.label;
  }
  get [$maxRetransmitTime]() {
    return this.maxRetransmitTime;
  }
  get [$maxRetransmits]() {
    return this.maxRetransmits;
  }
  get [$negotiated]() {
    return this.negotiated;
  }
  get [$ordered]() {
    return this.ordered;
  }
  get [$protocol]() {
    return this.protocol;
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [$reliable]() {
    return this.reliable;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$send](...args) {
    return this.send.apply(this, args);
  }
  [$sendBlob](...args) {
    return this.send.apply(this, args);
  }
  [$sendByteBuffer](...args) {
    return this.send.apply(this, args);
  }
  [$sendString](...args) {
    return this.send.apply(this, args);
  }
  [$sendTypedData](...args) {
    return this.send.apply(this, args);
  }
  get [$onClose]() {
    return html$.RtcDataChannel.closeEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.RtcDataChannel.errorEvent.forTarget(this);
  }
  get [$onMessage]() {
    return html$.RtcDataChannel.messageEvent.forTarget(this);
  }
  get [$onOpen]() {
    return html$.RtcDataChannel.openEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.RtcDataChannel);
const binaryType$ = Symbol("RtcDataChannel.binaryType");
const bufferedAmount = Symbol("RtcDataChannel.bufferedAmount");
const bufferedAmountLowThreshold = Symbol("RtcDataChannel.bufferedAmountLowThreshold");
const id$12 = Symbol("RtcDataChannel.id");
const label$3 = Symbol("RtcDataChannel.label");
const maxRetransmitTime = Symbol("RtcDataChannel.maxRetransmitTime");
const maxRetransmits = Symbol("RtcDataChannel.maxRetransmits");
const negotiated = Symbol("RtcDataChannel.negotiated");
const ordered = Symbol("RtcDataChannel.ordered");
const protocol$3 = Symbol("RtcDataChannel.protocol");
const readyState$7 = Symbol("RtcDataChannel.readyState");
const reliable = Symbol("RtcDataChannel.reliable");
dart.setMethodSignature(html$.RtcDataChannel, () => ({
  __proto__: dart.getMethods(html$.RtcDataChannel.__proto__),
  [$close]: dart.fnType(dart.void, []),
  [$send]: dart.fnType(dart.void, [dart.dynamic]),
  [$sendBlob]: dart.fnType(dart.void, [html$.Blob]),
  [$sendByteBuffer]: dart.fnType(dart.void, [typed_data.ByteBuffer]),
  [$sendString]: dart.fnType(dart.void, [core.String]),
  [$sendTypedData]: dart.fnType(dart.void, [typed_data.TypedData])
}));
dart.setGetterSignature(html$.RtcDataChannel, () => ({
  __proto__: dart.getGetters(html$.RtcDataChannel.__proto__),
  [$onClose]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event),
  [$onMessage]: async.Stream$(html$.MessageEvent),
  [$onOpen]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.RtcDataChannel, "dart:html");
dart.setFieldSignature(html$.RtcDataChannel, () => ({
  __proto__: dart.getFields(html$.RtcDataChannel.__proto__),
  [$binaryType]: dart.fieldType(core.String),
  [$bufferedAmount]: dart.finalFieldType(core.int),
  [$bufferedAmountLowThreshold]: dart.fieldType(core.int),
  [$id]: dart.finalFieldType(core.int),
  [$label]: dart.finalFieldType(core.String),
  [$maxRetransmitTime]: dart.finalFieldType(core.int),
  [$maxRetransmits]: dart.finalFieldType(core.int),
  [$negotiated]: dart.finalFieldType(core.bool),
  [$ordered]: dart.finalFieldType(core.bool),
  [$protocol]: dart.finalFieldType(core.String),
  [$readyState]: dart.finalFieldType(core.String),
  [$reliable]: dart.finalFieldType(core.bool)
}));
dart.defineLazy(html$.RtcDataChannel, {
  /*html$.RtcDataChannel.closeEvent*/get closeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("close"));
  },
  /*html$.RtcDataChannel.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.RtcDataChannel.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  },
  /*html$.RtcDataChannel.openEvent*/get openEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("open"));
  }
});
dart.registerExtension("RTCDataChannel", html$.RtcDataChannel);
dart.registerExtension("DataChannel", html$.RtcDataChannel);
html$.RtcDataChannelEvent = class RtcDataChannelEvent extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.RtcDataChannelEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new RTCDataChannelEvent(type, eventInitDict);
  }
  get [$channel]() {
    return this.channel;
  }
};
dart.addTypeTests(html$.RtcDataChannelEvent);
const channel = Symbol("RtcDataChannelEvent.channel");
dart.setLibraryUri(html$.RtcDataChannelEvent, "dart:html");
dart.setFieldSignature(html$.RtcDataChannelEvent, () => ({
  __proto__: dart.getFields(html$.RtcDataChannelEvent.__proto__),
  [$channel]: dart.finalFieldType(html$.RtcDataChannel)
}));
dart.registerExtension("RTCDataChannelEvent", html$.RtcDataChannelEvent);
html$.RtcDtmfSender = class RtcDtmfSender extends html$.EventTarget {
  get [$canInsertDtmf]() {
    return this.canInsertDTMF;
  }
  get [$duration]() {
    return this.duration;
  }
  get [$interToneGap]() {
    return this.interToneGap;
  }
  get [$toneBuffer]() {
    return this.toneBuffer;
  }
  get [$track]() {
    return this.track;
  }
  [$insertDtmf](...args) {
    return this.insertDTMF.apply(this, args);
  }
  get [$onToneChange]() {
    return html$.RtcDtmfSender.toneChangeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.RtcDtmfSender);
const canInsertDtmf = Symbol("RtcDtmfSender.canInsertDtmf");
const duration$4 = Symbol("RtcDtmfSender.duration");
const interToneGap = Symbol("RtcDtmfSender.interToneGap");
const toneBuffer = Symbol("RtcDtmfSender.toneBuffer");
const track$0 = Symbol("RtcDtmfSender.track");
dart.setMethodSignature(html$.RtcDtmfSender, () => ({
  __proto__: dart.getMethods(html$.RtcDtmfSender.__proto__),
  [$insertDtmf]: dart.fnType(dart.void, [core.String], [core.int, core.int])
}));
dart.setGetterSignature(html$.RtcDtmfSender, () => ({
  __proto__: dart.getGetters(html$.RtcDtmfSender.__proto__),
  [$onToneChange]: async.Stream$(html$.RtcDtmfToneChangeEvent)
}));
dart.setLibraryUri(html$.RtcDtmfSender, "dart:html");
dart.setFieldSignature(html$.RtcDtmfSender, () => ({
  __proto__: dart.getFields(html$.RtcDtmfSender.__proto__),
  [$canInsertDtmf]: dart.finalFieldType(core.bool),
  [$duration]: dart.finalFieldType(core.int),
  [$interToneGap]: dart.finalFieldType(core.int),
  [$toneBuffer]: dart.finalFieldType(core.String),
  [$track]: dart.finalFieldType(html$.MediaStreamTrack)
}));
dart.defineLazy(html$.RtcDtmfSender, {
  /*html$.RtcDtmfSender.toneChangeEvent*/get toneChangeEvent() {
    return dart.const(new (EventStreamProviderOfRtcDtmfToneChangeEvent()).new("tonechange"));
  }
});
dart.registerExtension("RTCDTMFSender", html$.RtcDtmfSender);
html$.RtcDtmfToneChangeEvent = class RtcDtmfToneChangeEvent extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new RTCDTMFToneChangeEvent(type, eventInitDict);
  }
  get [$tone]() {
    return this.tone;
  }
};
dart.addTypeTests(html$.RtcDtmfToneChangeEvent);
const tone = Symbol("RtcDtmfToneChangeEvent.tone");
dart.setLibraryUri(html$.RtcDtmfToneChangeEvent, "dart:html");
dart.setFieldSignature(html$.RtcDtmfToneChangeEvent, () => ({
  __proto__: dart.getFields(html$.RtcDtmfToneChangeEvent.__proto__),
  [$tone]: dart.finalFieldType(core.String)
}));
dart.registerExtension("RTCDTMFToneChangeEvent", html$.RtcDtmfToneChangeEvent);
html$.RtcIceCandidate = class RtcIceCandidate extends _interceptors.Interceptor {
  static new(dictionary) {
    let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str(html_common.Device.propertyPrefix) + "RTCIceCandidate" : "RTCIceCandidate"];
    return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
  }
  get [$candidate]() {
    return this.candidate;
  }
  set [$candidate](value) {
    this.candidate = value;
  }
  get [$sdpMLineIndex]() {
    return this.sdpMLineIndex;
  }
  set [$sdpMLineIndex](value) {
    this.sdpMLineIndex = value;
  }
  get [$sdpMid]() {
    return this.sdpMid;
  }
  set [$sdpMid](value) {
    this.sdpMid = value;
  }
};
dart.addTypeTests(html$.RtcIceCandidate);
const candidate = Symbol("RtcIceCandidate.candidate");
const sdpMLineIndex = Symbol("RtcIceCandidate.sdpMLineIndex");
const sdpMid = Symbol("RtcIceCandidate.sdpMid");
dart.setLibraryUri(html$.RtcIceCandidate, "dart:html");
dart.setFieldSignature(html$.RtcIceCandidate, () => ({
  __proto__: dart.getFields(html$.RtcIceCandidate.__proto__),
  [$candidate]: dart.fieldType(core.String),
  [$sdpMLineIndex]: dart.fieldType(core.int),
  [$sdpMid]: dart.fieldType(core.String)
}));
dart.registerExtension("RTCIceCandidate", html$.RtcIceCandidate);
dart.registerExtension("mozRTCIceCandidate", html$.RtcIceCandidate);
const _get_timestamp = dart.privateName(html$, "_get_timestamp");
html$.RtcLegacyStatsReport = class RtcLegacyStatsReport extends _interceptors.Interceptor {
  get [$id]() {
    return this.id;
  }
  get [$timestamp]() {
    return html_common.convertNativeToDart_DateTime(this[_get_timestamp]);
  }
  get [_get_timestamp]() {
    return this.timestamp;
  }
  get [$type]() {
    return this.type;
  }
  [$names](...args) {
    return this.names.apply(this, args);
  }
  [$stat](...args) {
    return this.stat.apply(this, args);
  }
};
dart.addTypeTests(html$.RtcLegacyStatsReport);
const id$13 = Symbol("RtcLegacyStatsReport.id");
const type$26 = Symbol("RtcLegacyStatsReport.type");
dart.setMethodSignature(html$.RtcLegacyStatsReport, () => ({
  __proto__: dart.getMethods(html$.RtcLegacyStatsReport.__proto__),
  [$names]: dart.fnType(core.List$(core.String), []),
  [$stat]: dart.fnType(core.String, [core.String])
}));
dart.setGetterSignature(html$.RtcLegacyStatsReport, () => ({
  __proto__: dart.getGetters(html$.RtcLegacyStatsReport.__proto__),
  [$timestamp]: core.DateTime
}));
dart.setLibraryUri(html$.RtcLegacyStatsReport, "dart:html");
dart.setFieldSignature(html$.RtcLegacyStatsReport, () => ({
  __proto__: dart.getFields(html$.RtcLegacyStatsReport.__proto__),
  [$id]: dart.finalFieldType(core.String),
  [_get_timestamp]: dart.finalFieldType(dart.dynamic),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("RTCLegacyStatsReport", html$.RtcLegacyStatsReport);
const _getStats = dart.privateName(html$, "_getStats");
const _addStream_1 = dart.privateName(html$, "_addStream_1");
const _addStream_2 = dart.privateName(html$, "_addStream_2");
const _createDataChannel_1 = dart.privateName(html$, "_createDataChannel_1");
const _createDataChannel_2 = dart.privateName(html$, "_createDataChannel_2");
const _setConfiguration_1 = dart.privateName(html$, "_setConfiguration_1");
html$.RtcPeerConnection = class RtcPeerConnection extends html$.EventTarget {
  static new(rtcIceServers, mediaConstraints) {
    if (mediaConstraints === void 0) mediaConstraints = null;
    let constructorName = window[dart.str(html_common.Device.propertyPrefix) + "RTCPeerConnection"];
    if (mediaConstraints != null) {
      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers), html_common.convertDartToNative_SerializedScriptValue(mediaConstraints));
    } else {
      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers));
    }
  }
  static get supported() {
    try {
      html$.RtcPeerConnection.new(new _js_helper.LinkedMap.from(["iceServers", JSArrayOfMapOfString$String().of([new (IdentityMapOfString$String()).from(["url", "stun:localhost"])])]));
      return true;
    } catch (e) {
      let _ = dart.getThrown(e);
      return false;
    }
    return false;
  }
  [$getLegacyStats](selector) {
    if (selector === void 0) selector = null;
    let completer = CompleterOfRtcStatsResponse().new();
    this[_getStats](dart.fn(value => {
      completer.complete(value);
    }, RtcStatsResponseToNull()), selector);
    return completer.future;
  }
  [_getStats](...args) {
    return this.getStats.apply(this, args);
  }
  static generateCertificate(keygenAlgorithm) {
    return generateCertificate(keygenAlgorithm);
  }
  get [$iceConnectionState]() {
    return this.iceConnectionState;
  }
  get [$iceGatheringState]() {
    return this.iceGatheringState;
  }
  get [$localDescription]() {
    return this.localDescription;
  }
  get [$remoteDescription]() {
    return this.remoteDescription;
  }
  get [$signalingState]() {
    return this.signalingState;
  }
  [$addIceCandidate](candidate, successCallback, failureCallback) {
    if (successCallback === void 0) successCallback = null;
    if (failureCallback === void 0) failureCallback = null;
    return html$.promiseToFuture(dart.dynamic, this.addIceCandidate(candidate, successCallback, failureCallback));
  }
  [$addStream](stream, mediaConstraints) {
    if (mediaConstraints === void 0) mediaConstraints = null;
    if (mediaConstraints != null) {
      let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
      this[_addStream_1](stream, mediaConstraints_1);
      return;
    }
    this[_addStream_2](stream);
    return;
  }
  [_addStream_1](...args) {
    return this.addStream.apply(this, args);
  }
  [_addStream_2](...args) {
    return this.addStream.apply(this, args);
  }
  [$addTrack](...args) {
    return this.addTrack.apply(this, args);
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$createAnswer](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(html$.RtcSessionDescription, this.createAnswer(options_dict));
  }
  [$createDtmfSender](...args) {
    return this.createDTMFSender.apply(this, args);
  }
  [$createDataChannel](label, dataChannelDict) {
    if (dataChannelDict === void 0) dataChannelDict = null;
    if (dataChannelDict != null) {
      let dataChannelDict_1 = html_common.convertDartToNative_Dictionary(dataChannelDict);
      return this[_createDataChannel_1](label, dataChannelDict_1);
    }
    return this[_createDataChannel_2](label);
  }
  [_createDataChannel_1](...args) {
    return this.createDataChannel.apply(this, args);
  }
  [_createDataChannel_2](...args) {
    return this.createDataChannel.apply(this, args);
  }
  [$createOffer](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(html$.RtcSessionDescription, this.createOffer(options_dict));
  }
  [$getLocalStreams](...args) {
    return this.getLocalStreams.apply(this, args);
  }
  [$getReceivers](...args) {
    return this.getReceivers.apply(this, args);
  }
  [$getRemoteStreams](...args) {
    return this.getRemoteStreams.apply(this, args);
  }
  [$getSenders](...args) {
    return this.getSenders.apply(this, args);
  }
  [$getStats]() {
    return html$.promiseToFuture(html$.RtcStatsReport, this.getStats());
  }
  [$removeStream](...args) {
    return this.removeStream.apply(this, args);
  }
  [$removeTrack](...args) {
    return this.removeTrack.apply(this, args);
  }
  [$setConfiguration](configuration) {
    let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
    this[_setConfiguration_1](configuration_1);
    return;
  }
  [_setConfiguration_1](...args) {
    return this.setConfiguration.apply(this, args);
  }
  [$setLocalDescription](description) {
    let description_dict = html_common.convertDartToNative_Dictionary(description);
    return html$.promiseToFuture(dart.dynamic, this.setLocalDescription(description_dict));
  }
  [$setRemoteDescription](description) {
    let description_dict = html_common.convertDartToNative_Dictionary(description);
    return html$.promiseToFuture(dart.dynamic, this.setRemoteDescription(description_dict));
  }
  get [$onAddStream]() {
    return html$.RtcPeerConnection.addStreamEvent.forTarget(this);
  }
  get [$onDataChannel]() {
    return html$.RtcPeerConnection.dataChannelEvent.forTarget(this);
  }
  get [$onIceCandidate]() {
    return html$.RtcPeerConnection.iceCandidateEvent.forTarget(this);
  }
  get [$onIceConnectionStateChange]() {
    return html$.RtcPeerConnection.iceConnectionStateChangeEvent.forTarget(this);
  }
  get [$onNegotiationNeeded]() {
    return html$.RtcPeerConnection.negotiationNeededEvent.forTarget(this);
  }
  get [$onRemoveStream]() {
    return html$.RtcPeerConnection.removeStreamEvent.forTarget(this);
  }
  get [$onSignalingStateChange]() {
    return html$.RtcPeerConnection.signalingStateChangeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.RtcPeerConnection);
const iceConnectionState = Symbol("RtcPeerConnection.iceConnectionState");
const iceGatheringState = Symbol("RtcPeerConnection.iceGatheringState");
const localDescription = Symbol("RtcPeerConnection.localDescription");
const remoteDescription = Symbol("RtcPeerConnection.remoteDescription");
const signalingState = Symbol("RtcPeerConnection.signalingState");
dart.setMethodSignature(html$.RtcPeerConnection, () => ({
  __proto__: dart.getMethods(html$.RtcPeerConnection.__proto__),
  [$getLegacyStats]: dart.fnType(async.Future$(html$.RtcStatsResponse), [], [html$.MediaStreamTrack]),
  [_getStats]: dart.fnType(async.Future, [], [dart.fnType(dart.void, [html$.RtcStatsResponse]), html$.MediaStreamTrack]),
  [$addIceCandidate]: dart.fnType(async.Future, [core.Object], [dart.fnType(dart.void, []), dart.fnType(dart.void, [html$.DomException])]),
  [$addStream]: dart.fnType(dart.void, [html$.MediaStream], [core.Map]),
  [_addStream_1]: dart.fnType(dart.void, [html$.MediaStream, dart.dynamic]),
  [_addStream_2]: dart.fnType(dart.void, [html$.MediaStream]),
  [$addTrack]: dart.fnType(html$.RtcRtpSender, [html$.MediaStreamTrack, html$.MediaStream]),
  [$close]: dart.fnType(dart.void, []),
  [$createAnswer]: dart.fnType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
  [$createDtmfSender]: dart.fnType(html$.RtcDtmfSender, [html$.MediaStreamTrack]),
  [$createDataChannel]: dart.fnType(html$.RtcDataChannel, [core.String], [core.Map]),
  [_createDataChannel_1]: dart.fnType(html$.RtcDataChannel, [dart.dynamic, dart.dynamic]),
  [_createDataChannel_2]: dart.fnType(html$.RtcDataChannel, [dart.dynamic]),
  [$createOffer]: dart.fnType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
  [$getLocalStreams]: dart.fnType(core.List$(html$.MediaStream), []),
  [$getReceivers]: dart.fnType(core.List$(html$.RtcRtpReceiver), []),
  [$getRemoteStreams]: dart.fnType(core.List$(html$.MediaStream), []),
  [$getSenders]: dart.fnType(core.List$(html$.RtcRtpSender), []),
  [$getStats]: dart.fnType(async.Future$(html$.RtcStatsReport), []),
  [$removeStream]: dart.fnType(dart.void, [html$.MediaStream]),
  [$removeTrack]: dart.fnType(dart.void, [html$.RtcRtpSender]),
  [$setConfiguration]: dart.fnType(dart.void, [core.Map]),
  [_setConfiguration_1]: dart.fnType(dart.void, [dart.dynamic]),
  [$setLocalDescription]: dart.fnType(async.Future, [core.Map]),
  [$setRemoteDescription]: dart.fnType(async.Future, [core.Map])
}));
dart.setGetterSignature(html$.RtcPeerConnection, () => ({
  __proto__: dart.getGetters(html$.RtcPeerConnection.__proto__),
  [$onAddStream]: async.Stream$(html$.MediaStreamEvent),
  [$onDataChannel]: async.Stream$(html$.RtcDataChannelEvent),
  [$onIceCandidate]: async.Stream$(html$.RtcPeerConnectionIceEvent),
  [$onIceConnectionStateChange]: async.Stream$(html$.Event),
  [$onNegotiationNeeded]: async.Stream$(html$.Event),
  [$onRemoveStream]: async.Stream$(html$.MediaStreamEvent),
  [$onSignalingStateChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.RtcPeerConnection, "dart:html");
dart.setFieldSignature(html$.RtcPeerConnection, () => ({
  __proto__: dart.getFields(html$.RtcPeerConnection.__proto__),
  [$iceConnectionState]: dart.finalFieldType(core.String),
  [$iceGatheringState]: dart.finalFieldType(core.String),
  [$localDescription]: dart.finalFieldType(html$.RtcSessionDescription),
  [$remoteDescription]: dart.finalFieldType(html$.RtcSessionDescription),
  [$signalingState]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.RtcPeerConnection, {
  /*html$.RtcPeerConnection.addStreamEvent*/get addStreamEvent() {
    return dart.const(new (EventStreamProviderOfMediaStreamEvent()).new("addstream"));
  },
  /*html$.RtcPeerConnection.dataChannelEvent*/get dataChannelEvent() {
    return dart.const(new (EventStreamProviderOfRtcDataChannelEvent()).new("datachannel"));
  },
  /*html$.RtcPeerConnection.iceCandidateEvent*/get iceCandidateEvent() {
    return dart.const(new (EventStreamProviderOfRtcPeerConnectionIceEvent()).new("icecandidate"));
  },
  /*html$.RtcPeerConnection.iceConnectionStateChangeEvent*/get iceConnectionStateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("iceconnectionstatechange"));
  },
  /*html$.RtcPeerConnection.negotiationNeededEvent*/get negotiationNeededEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("negotiationneeded"));
  },
  /*html$.RtcPeerConnection.removeStreamEvent*/get removeStreamEvent() {
    return dart.const(new (EventStreamProviderOfMediaStreamEvent()).new("removestream"));
  },
  /*html$.RtcPeerConnection.signalingStateChangeEvent*/get signalingStateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("signalingstatechange"));
  }
});
dart.registerExtension("RTCPeerConnection", html$.RtcPeerConnection);
dart.registerExtension("webkitRTCPeerConnection", html$.RtcPeerConnection);
dart.registerExtension("mozRTCPeerConnection", html$.RtcPeerConnection);
html$.RtcPeerConnectionIceEvent = class RtcPeerConnectionIceEvent extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.RtcPeerConnectionIceEvent._create_1(type, eventInitDict_1);
    }
    return html$.RtcPeerConnectionIceEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new RTCPeerConnectionIceEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new RTCPeerConnectionIceEvent(type);
  }
  get [$candidate]() {
    return this.candidate;
  }
};
dart.addTypeTests(html$.RtcPeerConnectionIceEvent);
const candidate$ = Symbol("RtcPeerConnectionIceEvent.candidate");
dart.setLibraryUri(html$.RtcPeerConnectionIceEvent, "dart:html");
dart.setFieldSignature(html$.RtcPeerConnectionIceEvent, () => ({
  __proto__: dart.getFields(html$.RtcPeerConnectionIceEvent.__proto__),
  [$candidate]: dart.finalFieldType(html$.RtcIceCandidate)
}));
dart.registerExtension("RTCPeerConnectionIceEvent", html$.RtcPeerConnectionIceEvent);
html$.RtcRtpContributingSource = class RtcRtpContributingSource extends _interceptors.Interceptor {
  get [$source]() {
    return this.source;
  }
  get [$timestamp]() {
    return this.timestamp;
  }
};
dart.addTypeTests(html$.RtcRtpContributingSource);
const source$2 = Symbol("RtcRtpContributingSource.source");
const timestamp$2 = Symbol("RtcRtpContributingSource.timestamp");
dart.setLibraryUri(html$.RtcRtpContributingSource, "dart:html");
dart.setFieldSignature(html$.RtcRtpContributingSource, () => ({
  __proto__: dart.getFields(html$.RtcRtpContributingSource.__proto__),
  [$source]: dart.finalFieldType(core.int),
  [$timestamp]: dart.finalFieldType(core.num)
}));
dart.registerExtension("RTCRtpContributingSource", html$.RtcRtpContributingSource);
html$.RtcRtpReceiver = class RtcRtpReceiver extends _interceptors.Interceptor {
  get [$track]() {
    return this.track;
  }
  [$getContributingSources](...args) {
    return this.getContributingSources.apply(this, args);
  }
};
dart.addTypeTests(html$.RtcRtpReceiver);
const track$1 = Symbol("RtcRtpReceiver.track");
dart.setMethodSignature(html$.RtcRtpReceiver, () => ({
  __proto__: dart.getMethods(html$.RtcRtpReceiver.__proto__),
  [$getContributingSources]: dart.fnType(core.List$(html$.RtcRtpContributingSource), [])
}));
dart.setLibraryUri(html$.RtcRtpReceiver, "dart:html");
dart.setFieldSignature(html$.RtcRtpReceiver, () => ({
  __proto__: dart.getFields(html$.RtcRtpReceiver.__proto__),
  [$track]: dart.finalFieldType(html$.MediaStreamTrack)
}));
dart.registerExtension("RTCRtpReceiver", html$.RtcRtpReceiver);
html$.RtcRtpSender = class RtcRtpSender extends _interceptors.Interceptor {
  get [$track]() {
    return this.track;
  }
};
dart.addTypeTests(html$.RtcRtpSender);
const track$2 = Symbol("RtcRtpSender.track");
dart.setLibraryUri(html$.RtcRtpSender, "dart:html");
dart.setFieldSignature(html$.RtcRtpSender, () => ({
  __proto__: dart.getFields(html$.RtcRtpSender.__proto__),
  [$track]: dart.finalFieldType(html$.MediaStreamTrack)
}));
dart.registerExtension("RTCRtpSender", html$.RtcRtpSender);
html$.RtcSessionDescription = class RtcSessionDescription extends _interceptors.Interceptor {
  static new(dictionary) {
    let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str(html_common.Device.propertyPrefix) + "RTCSessionDescription" : "RTCSessionDescription"];
    return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
  }
  get [$sdp]() {
    return this.sdp;
  }
  set [$sdp](value) {
    this.sdp = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
};
dart.addTypeTests(html$.RtcSessionDescription);
const sdp = Symbol("RtcSessionDescription.sdp");
const type$27 = Symbol("RtcSessionDescription.type");
dart.setLibraryUri(html$.RtcSessionDescription, "dart:html");
dart.setFieldSignature(html$.RtcSessionDescription, () => ({
  __proto__: dart.getFields(html$.RtcSessionDescription.__proto__),
  [$sdp]: dart.fieldType(core.String),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("RTCSessionDescription", html$.RtcSessionDescription);
dart.registerExtension("mozRTCSessionDescription", html$.RtcSessionDescription);
const Interceptor_MapMixin$$0 = class Interceptor_MapMixin extends _interceptors.Interceptor {};
(Interceptor_MapMixin$$0.new = function() {
  Interceptor_MapMixin$$0.__proto__.new.call(this);
}).prototype = Interceptor_MapMixin$$0.prototype;
dart.applyMixin(Interceptor_MapMixin$$0, collection.MapMixin$(core.String, dart.dynamic));
html$.RtcStatsReport = class RtcStatsReport extends Interceptor_MapMixin$$0 {
  [_getItem](key) {
    return html_common.convertNativeToDart_Dictionary(this.get(key));
  }
  [$addAll](other) {
    MapOfString$dynamic()._check(other);
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$containsValue](value) {
    return this[$values][$any](dart.fn(e => dart.equals(e, value), MapTobool()));
  }
  [$containsKey](key) {
    return this[_getItem](core.String._check(key)) != null;
  }
  [$_get](key) {
    return this[_getItem](core.String._check(key));
  }
  [$forEach](f) {
    let entries = this.entries();
    while (true) {
      let entry = entries.next();
      if (entry.done) return;
      f(entry.value[0], html_common.convertNativeToDart_Dictionary(entry.value[1]));
    }
  }
  get [$keys]() {
    let keys = JSArrayOfString().of([]);
    this[$forEach](dart.fn((k, v) => keys[$add](k), StringAnddynamicTovoid()));
    return keys;
  }
  get [$values]() {
    let values = JSArrayOfMap().of([]);
    this[$forEach](dart.fn((k, v) => values[$add](core.Map._check(v)), StringAnddynamicTovoid()));
    return values;
  }
  get [$length]() {
    return this.size;
  }
  get [$isEmpty]() {
    return this[$length] === 0;
  }
  get [$isNotEmpty]() {
    return !dart.test(this[$isEmpty]);
  }
  [$_set](key, value) {
    core.String._check(key);
    dart.throw(new core.UnsupportedError.new("Not supported"));
    return value;
  }
  [$putIfAbsent](key, ifAbsent) {
    core.String._check(key);
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$remove](key) {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$clear]() {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
};
dart.addTypeTests(html$.RtcStatsReport);
dart.setMethodSignature(html$.RtcStatsReport, () => ({
  __proto__: dart.getMethods(html$.RtcStatsReport.__proto__),
  [_getItem]: dart.fnType(core.Map, [core.String]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [dart.dynamic]),
  [$containsKey]: dart.fnType(core.bool, [dart.dynamic]),
  [$_get]: dart.fnType(core.Map, [dart.dynamic]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, dart.dynamic])]),
  [$_set]: dart.fnType(dart.void, [core.Object, dart.dynamic]),
  [$putIfAbsent]: dart.fnType(dart.dynamic, [core.Object, dart.fnType(dart.dynamic, [])]),
  [$remove]: dart.fnType(core.String, [dart.dynamic]),
  [$clear]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.RtcStatsReport, () => ({
  __proto__: dart.getGetters(html$.RtcStatsReport.__proto__),
  [$keys]: core.Iterable$(core.String),
  [$values]: core.Iterable$(core.Map),
  [$length]: core.int,
  [$isEmpty]: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setLibraryUri(html$.RtcStatsReport, "dart:html");
dart.registerExtension("RTCStatsReport", html$.RtcStatsReport);
html$.RtcStatsResponse = class RtcStatsResponse extends _interceptors.Interceptor {
  [$namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
  [$result](...args) {
    return this.result.apply(this, args);
  }
};
dart.addTypeTests(html$.RtcStatsResponse);
dart.setMethodSignature(html$.RtcStatsResponse, () => ({
  __proto__: dart.getMethods(html$.RtcStatsResponse.__proto__),
  [$namedItem]: dart.fnType(html$.RtcLegacyStatsReport, [core.String]),
  [$result]: dart.fnType(core.List$(html$.RtcLegacyStatsReport), [])
}));
dart.setLibraryUri(html$.RtcStatsResponse, "dart:html");
dart.registerExtension("RTCStatsResponse", html$.RtcStatsResponse);
html$.RtcTrackEvent = class RtcTrackEvent extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.RtcTrackEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new RTCTrackEvent(type, eventInitDict);
  }
  get [$receiver]() {
    return this.receiver;
  }
  get [$streams]() {
    return this.streams;
  }
  get [$track]() {
    return this.track;
  }
};
dart.addTypeTests(html$.RtcTrackEvent);
const receiver$ = Symbol("RtcTrackEvent.receiver");
const streams = Symbol("RtcTrackEvent.streams");
const track$3 = Symbol("RtcTrackEvent.track");
dart.setLibraryUri(html$.RtcTrackEvent, "dart:html");
dart.setFieldSignature(html$.RtcTrackEvent, () => ({
  __proto__: dart.getFields(html$.RtcTrackEvent.__proto__),
  [$receiver]: dart.finalFieldType(html$.RtcRtpReceiver),
  [$streams]: dart.finalFieldType(ListOfMediaStream()),
  [$track]: dart.finalFieldType(html$.MediaStreamTrack)
}));
dart.registerExtension("RTCTrackEvent", html$.RtcTrackEvent);
const _availLeft = dart.privateName(html$, "_availLeft");
const _availTop = dart.privateName(html$, "_availTop");
const _availWidth = dart.privateName(html$, "_availWidth");
const _availHeight = dart.privateName(html$, "_availHeight");
html$.Screen = class Screen extends _interceptors.Interceptor {
  get [$available]() {
    return new (RectangleOfnum()).new(this[_availLeft], this[_availTop], this[_availWidth], this[_availHeight]);
  }
  get [_availHeight]() {
    return this.availHeight;
  }
  get [_availLeft]() {
    return this.availLeft;
  }
  get [_availTop]() {
    return this.availTop;
  }
  get [_availWidth]() {
    return this.availWidth;
  }
  get [$colorDepth]() {
    return this.colorDepth;
  }
  get [$height]() {
    return this.height;
  }
  get [$keepAwake]() {
    return this.keepAwake;
  }
  set [$keepAwake](value) {
    this.keepAwake = value;
  }
  get [$orientation]() {
    return this.orientation;
  }
  get [$pixelDepth]() {
    return this.pixelDepth;
  }
  get [$width]() {
    return this.width;
  }
};
dart.addTypeTests(html$.Screen);
const colorDepth = Symbol("Screen.colorDepth");
const height$10 = Symbol("Screen.height");
const keepAwake = Symbol("Screen.keepAwake");
const orientation$0 = Symbol("Screen.orientation");
const pixelDepth = Symbol("Screen.pixelDepth");
const width$10 = Symbol("Screen.width");
dart.setGetterSignature(html$.Screen, () => ({
  __proto__: dart.getGetters(html$.Screen.__proto__),
  [$available]: math.Rectangle$(core.num)
}));
dart.setLibraryUri(html$.Screen, "dart:html");
dart.setFieldSignature(html$.Screen, () => ({
  __proto__: dart.getFields(html$.Screen.__proto__),
  [_availHeight]: dart.finalFieldType(core.int),
  [_availLeft]: dart.finalFieldType(core.int),
  [_availTop]: dart.finalFieldType(core.int),
  [_availWidth]: dart.finalFieldType(core.int),
  [$colorDepth]: dart.finalFieldType(core.int),
  [$height]: dart.finalFieldType(core.int),
  [$keepAwake]: dart.fieldType(core.bool),
  [$orientation]: dart.finalFieldType(html$.ScreenOrientation),
  [$pixelDepth]: dart.finalFieldType(core.int),
  [$width]: dart.finalFieldType(core.int)
}));
dart.registerExtension("Screen", html$.Screen);
html$.ScreenOrientation = class ScreenOrientation extends html$.EventTarget {
  get [$angle]() {
    return this.angle;
  }
  get [$type]() {
    return this.type;
  }
  [$lock](orientation) {
    return html$.promiseToFuture(dart.dynamic, this.lock(orientation));
  }
  [$unlock](...args) {
    return this.unlock.apply(this, args);
  }
  get [$onChange]() {
    return html$.ScreenOrientation.changeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.ScreenOrientation);
const angle$ = Symbol("ScreenOrientation.angle");
const type$28 = Symbol("ScreenOrientation.type");
dart.setMethodSignature(html$.ScreenOrientation, () => ({
  __proto__: dart.getMethods(html$.ScreenOrientation.__proto__),
  [$lock]: dart.fnType(async.Future, [core.String]),
  [$unlock]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.ScreenOrientation, () => ({
  __proto__: dart.getGetters(html$.ScreenOrientation.__proto__),
  [$onChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.ScreenOrientation, "dart:html");
dart.setFieldSignature(html$.ScreenOrientation, () => ({
  __proto__: dart.getFields(html$.ScreenOrientation.__proto__),
  [$angle]: dart.finalFieldType(core.int),
  [$type]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.ScreenOrientation, {
  /*html$.ScreenOrientation.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  }
});
dart.registerExtension("ScreenOrientation", html$.ScreenOrientation);
html$.ScriptElement = class ScriptElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("script");
  }
  get [$async]() {
    return this.async;
  }
  set [$async](value) {
    this.async = value;
  }
  get [$charset]() {
    return this.charset;
  }
  set [$charset](value) {
    this.charset = value;
  }
  get [$crossOrigin]() {
    return this.crossOrigin;
  }
  set [$crossOrigin](value) {
    this.crossOrigin = value;
  }
  get [$defer]() {
    return this.defer;
  }
  set [$defer](value) {
    this.defer = value;
  }
  get [$integrity]() {
    return this.integrity;
  }
  set [$integrity](value) {
    this.integrity = value;
  }
  get [$noModule]() {
    return this.noModule;
  }
  set [$noModule](value) {
    this.noModule = value;
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
};
(html$.ScriptElement.created = function() {
  this[async$0] = null;
  this[charset] = null;
  this[crossOrigin$1] = null;
  this[defer] = null;
  this[integrity$] = null;
  this[noModule] = null;
  this[src$4] = null;
  this[type$29] = null;
  html$.ScriptElement.__proto__.created.call(this);
}).prototype = html$.ScriptElement.prototype;
dart.addTypeTests(html$.ScriptElement);
const async$0 = Symbol("ScriptElement.async");
const charset = Symbol("ScriptElement.charset");
const crossOrigin$1 = Symbol("ScriptElement.crossOrigin");
const defer = Symbol("ScriptElement.defer");
const integrity$ = Symbol("ScriptElement.integrity");
const noModule = Symbol("ScriptElement.noModule");
const src$4 = Symbol("ScriptElement.src");
const type$29 = Symbol("ScriptElement.type");
dart.setLibraryUri(html$.ScriptElement, "dart:html");
dart.setFieldSignature(html$.ScriptElement, () => ({
  __proto__: dart.getFields(html$.ScriptElement.__proto__),
  [$async]: dart.fieldType(core.bool),
  [$charset]: dart.fieldType(core.String),
  [$crossOrigin]: dart.fieldType(core.String),
  [$defer]: dart.fieldType(core.bool),
  [$integrity]: dart.fieldType(core.String),
  [$noModule]: dart.fieldType(core.bool),
  [$src]: dart.fieldType(core.String),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLScriptElement", html$.ScriptElement);
html$.ScrollState = class ScrollState$ extends _interceptors.Interceptor {
  static new(scrollStateInit) {
    if (scrollStateInit === void 0) scrollStateInit = null;
    if (scrollStateInit != null) {
      let scrollStateInit_1 = html_common.convertDartToNative_Dictionary(scrollStateInit);
      return html$.ScrollState._create_1(scrollStateInit_1);
    }
    return html$.ScrollState._create_2();
  }
  static _create_1(scrollStateInit) {
    return new ScrollState(scrollStateInit);
  }
  static _create_2() {
    return new ScrollState();
  }
  get [$deltaGranularity]() {
    return this.deltaGranularity;
  }
  get [$deltaX]() {
    return this.deltaX;
  }
  get [$deltaY]() {
    return this.deltaY;
  }
  get [$fromUserInput]() {
    return this.fromUserInput;
  }
  get [$inInertialPhase]() {
    return this.inInertialPhase;
  }
  get [$isBeginning]() {
    return this.isBeginning;
  }
  get [$isDirectManipulation]() {
    return this.isDirectManipulation;
  }
  get [$isEnding]() {
    return this.isEnding;
  }
  get [$positionX]() {
    return this.positionX;
  }
  get [$positionY]() {
    return this.positionY;
  }
  get [$velocityX]() {
    return this.velocityX;
  }
  get [$velocityY]() {
    return this.velocityY;
  }
  [$consumeDelta](...args) {
    return this.consumeDelta.apply(this, args);
  }
  [$distributeToScrollChainDescendant](...args) {
    return this.distributeToScrollChainDescendant.apply(this, args);
  }
};
dart.addTypeTests(html$.ScrollState);
const deltaGranularity = Symbol("ScrollState.deltaGranularity");
const deltaX = Symbol("ScrollState.deltaX");
const deltaY = Symbol("ScrollState.deltaY");
const fromUserInput = Symbol("ScrollState.fromUserInput");
const inInertialPhase = Symbol("ScrollState.inInertialPhase");
const isBeginning = Symbol("ScrollState.isBeginning");
const isDirectManipulation = Symbol("ScrollState.isDirectManipulation");
const isEnding = Symbol("ScrollState.isEnding");
const positionX = Symbol("ScrollState.positionX");
const positionY = Symbol("ScrollState.positionY");
const velocityX = Symbol("ScrollState.velocityX");
const velocityY = Symbol("ScrollState.velocityY");
dart.setMethodSignature(html$.ScrollState, () => ({
  __proto__: dart.getMethods(html$.ScrollState.__proto__),
  [$consumeDelta]: dart.fnType(dart.void, [core.num, core.num]),
  [$distributeToScrollChainDescendant]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.ScrollState, "dart:html");
dart.setFieldSignature(html$.ScrollState, () => ({
  __proto__: dart.getFields(html$.ScrollState.__proto__),
  [$deltaGranularity]: dart.finalFieldType(core.num),
  [$deltaX]: dart.finalFieldType(core.num),
  [$deltaY]: dart.finalFieldType(core.num),
  [$fromUserInput]: dart.finalFieldType(core.bool),
  [$inInertialPhase]: dart.finalFieldType(core.bool),
  [$isBeginning]: dart.finalFieldType(core.bool),
  [$isDirectManipulation]: dart.finalFieldType(core.bool),
  [$isEnding]: dart.finalFieldType(core.bool),
  [$positionX]: dart.finalFieldType(core.int),
  [$positionY]: dart.finalFieldType(core.int),
  [$velocityX]: dart.finalFieldType(core.num),
  [$velocityY]: dart.finalFieldType(core.num)
}));
dart.registerExtension("ScrollState", html$.ScrollState);
html$.ScrollTimeline = class ScrollTimeline$ extends html$.AnimationTimeline {
  static new(options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return html$.ScrollTimeline._create_1(options_1);
    }
    return html$.ScrollTimeline._create_2();
  }
  static _create_1(options) {
    return new ScrollTimeline(options);
  }
  static _create_2() {
    return new ScrollTimeline();
  }
  get [$orientation]() {
    return this.orientation;
  }
  get [$scrollSource]() {
    return this.scrollSource;
  }
  get [$timeRange]() {
    return this.timeRange;
  }
};
dart.addTypeTests(html$.ScrollTimeline);
const orientation$1 = Symbol("ScrollTimeline.orientation");
const scrollSource = Symbol("ScrollTimeline.scrollSource");
const timeRange = Symbol("ScrollTimeline.timeRange");
dart.setLibraryUri(html$.ScrollTimeline, "dart:html");
dart.setFieldSignature(html$.ScrollTimeline, () => ({
  __proto__: dart.getFields(html$.ScrollTimeline.__proto__),
  [$orientation]: dart.finalFieldType(core.String),
  [$scrollSource]: dart.finalFieldType(html$.Element),
  [$timeRange]: dart.finalFieldType(core.Object)
}));
dart.registerExtension("ScrollTimeline", html$.ScrollTimeline);
html$.SecurityPolicyViolationEvent = class SecurityPolicyViolationEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
    }
    return html$.SecurityPolicyViolationEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new SecurityPolicyViolationEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new SecurityPolicyViolationEvent(type);
  }
  get [$blockedUri]() {
    return this.blockedURI;
  }
  get [$columnNumber]() {
    return this.columnNumber;
  }
  get [$disposition]() {
    return this.disposition;
  }
  get [$documentUri]() {
    return this.documentURI;
  }
  get [$effectiveDirective]() {
    return this.effectiveDirective;
  }
  get [$lineNumber]() {
    return this.lineNumber;
  }
  get [$originalPolicy]() {
    return this.originalPolicy;
  }
  get [$referrer]() {
    return this.referrer;
  }
  get [$sample]() {
    return this.sample;
  }
  get [$sourceFile]() {
    return this.sourceFile;
  }
  get [$statusCode]() {
    return this.statusCode;
  }
  get [$violatedDirective]() {
    return this.violatedDirective;
  }
};
dart.addTypeTests(html$.SecurityPolicyViolationEvent);
const blockedUri = Symbol("SecurityPolicyViolationEvent.blockedUri");
const columnNumber = Symbol("SecurityPolicyViolationEvent.columnNumber");
const disposition = Symbol("SecurityPolicyViolationEvent.disposition");
const documentUri = Symbol("SecurityPolicyViolationEvent.documentUri");
const effectiveDirective = Symbol("SecurityPolicyViolationEvent.effectiveDirective");
const lineNumber$0 = Symbol("SecurityPolicyViolationEvent.lineNumber");
const originalPolicy = Symbol("SecurityPolicyViolationEvent.originalPolicy");
const referrer = Symbol("SecurityPolicyViolationEvent.referrer");
const sample = Symbol("SecurityPolicyViolationEvent.sample");
const sourceFile$0 = Symbol("SecurityPolicyViolationEvent.sourceFile");
const statusCode = Symbol("SecurityPolicyViolationEvent.statusCode");
const violatedDirective = Symbol("SecurityPolicyViolationEvent.violatedDirective");
dart.setLibraryUri(html$.SecurityPolicyViolationEvent, "dart:html");
dart.setFieldSignature(html$.SecurityPolicyViolationEvent, () => ({
  __proto__: dart.getFields(html$.SecurityPolicyViolationEvent.__proto__),
  [$blockedUri]: dart.finalFieldType(core.String),
  [$columnNumber]: dart.finalFieldType(core.int),
  [$disposition]: dart.finalFieldType(core.String),
  [$documentUri]: dart.finalFieldType(core.String),
  [$effectiveDirective]: dart.finalFieldType(core.String),
  [$lineNumber]: dart.finalFieldType(core.int),
  [$originalPolicy]: dart.finalFieldType(core.String),
  [$referrer]: dart.finalFieldType(core.String),
  [$sample]: dart.finalFieldType(core.String),
  [$sourceFile]: dart.finalFieldType(core.String),
  [$statusCode]: dart.finalFieldType(core.int),
  [$violatedDirective]: dart.finalFieldType(core.String)
}));
dart.registerExtension("SecurityPolicyViolationEvent", html$.SecurityPolicyViolationEvent);
html$.SelectElement = class SelectElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("select");
  }
  get [$autofocus]() {
    return this.autofocus;
  }
  set [$autofocus](value) {
    this.autofocus = value;
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$form]() {
    return this.form;
  }
  get [$labels]() {
    return this.labels;
  }
  get [$length]() {
    return this.length;
  }
  set [$length](value) {
    this.length = value;
  }
  get [$multiple]() {
    return this.multiple;
  }
  set [$multiple](value) {
    this.multiple = value;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$required]() {
    return this.required;
  }
  set [$required](value) {
    this.required = value;
  }
  get [$selectedIndex]() {
    return this.selectedIndex;
  }
  set [$selectedIndex](value) {
    this.selectedIndex = value;
  }
  get [$size]() {
    return this.size;
  }
  set [$size](value) {
    this.size = value;
  }
  get [$type]() {
    return this.type;
  }
  get [$validationMessage]() {
    return this.validationMessage;
  }
  get [$validity]() {
    return this.validity;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  get [$willValidate]() {
    return this.willValidate;
  }
  [__setter__](...args) {
    return this.__setter__.apply(this, args);
  }
  [$add](...args) {
    return this.add.apply(this, args);
  }
  [$checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$namedItem](...args) {
    return this.namedItem.apply(this, args);
  }
  [$reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [$setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
  get [$options]() {
    let options = this[$querySelectorAll](html$.OptionElement, "option");
    return new (UnmodifiableListViewOfOptionElement()).new(IterableOfOptionElement()._check(dart.dsend(options, 'toList', [])));
  }
  get [$selectedOptions]() {
    if (dart.test(this.multiple)) {
      let options = this[$options][$where](dart.fn(o => o.selected, OptionElementTobool()))[$toList]();
      return new (UnmodifiableListViewOfOptionElement()).new(options);
    } else {
      return JSArrayOfOptionElement().of([this[$options][$_get](this.selectedIndex)]);
    }
  }
};
(html$.SelectElement.created = function() {
  this[autofocus$2] = null;
  this[disabled$7] = null;
  this[form$6] = null;
  this[labels$3] = null;
  this[length$12] = null;
  this[multiple$1] = null;
  this[name$33] = null;
  this[required$11] = null;
  this[selectedIndex] = null;
  this[size$5] = null;
  this[type$30] = null;
  this[validationMessage$3] = null;
  this[validity$3] = null;
  this[value$16] = null;
  this[willValidate$3] = null;
  html$.SelectElement.__proto__.created.call(this);
}).prototype = html$.SelectElement.prototype;
dart.addTypeTests(html$.SelectElement);
const autofocus$2 = Symbol("SelectElement.autofocus");
const disabled$7 = Symbol("SelectElement.disabled");
const form$6 = Symbol("SelectElement.form");
const labels$3 = Symbol("SelectElement.labels");
const length$12 = Symbol("SelectElement.length");
const multiple$1 = Symbol("SelectElement.multiple");
const name$33 = Symbol("SelectElement.name");
const required$11 = Symbol("SelectElement.required");
const selectedIndex = Symbol("SelectElement.selectedIndex");
const size$5 = Symbol("SelectElement.size");
const type$30 = Symbol("SelectElement.type");
const validationMessage$3 = Symbol("SelectElement.validationMessage");
const validity$3 = Symbol("SelectElement.validity");
const value$16 = Symbol("SelectElement.value");
const willValidate$3 = Symbol("SelectElement.willValidate");
dart.setMethodSignature(html$.SelectElement, () => ({
  __proto__: dart.getMethods(html$.SelectElement.__proto__),
  [__setter__]: dart.fnType(dart.void, [core.int, html$.OptionElement]),
  [$add]: dart.fnType(dart.void, [core.Object, core.Object]),
  [$checkValidity]: dart.fnType(core.bool, []),
  [$item]: dart.fnType(html$.Element, [core.int]),
  [$namedItem]: dart.fnType(html$.OptionElement, [core.String]),
  [$reportValidity]: dart.fnType(core.bool, []),
  [$setCustomValidity]: dart.fnType(dart.void, [core.String])
}));
dart.setGetterSignature(html$.SelectElement, () => ({
  __proto__: dart.getGetters(html$.SelectElement.__proto__),
  [$options]: core.List$(html$.OptionElement),
  [$selectedOptions]: core.List$(html$.OptionElement)
}));
dart.setLibraryUri(html$.SelectElement, "dart:html");
dart.setFieldSignature(html$.SelectElement, () => ({
  __proto__: dart.getFields(html$.SelectElement.__proto__),
  [$autofocus]: dart.fieldType(core.bool),
  [$disabled]: dart.fieldType(core.bool),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$labels]: dart.finalFieldType(ListOfNode()),
  [$length]: dart.fieldType(core.int),
  [$multiple]: dart.fieldType(core.bool),
  [$name]: dart.fieldType(core.String),
  [$required]: dart.fieldType(core.bool),
  [$selectedIndex]: dart.fieldType(core.int),
  [$size]: dart.fieldType(core.int),
  [$type]: dart.finalFieldType(core.String),
  [$validationMessage]: dart.finalFieldType(core.String),
  [$validity]: dart.finalFieldType(html$.ValidityState),
  [$value]: dart.fieldType(core.String),
  [$willValidate]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("HTMLSelectElement", html$.SelectElement);
html$.Selection = class Selection extends _interceptors.Interceptor {
  get [$anchorNode]() {
    return this.anchorNode;
  }
  get [$anchorOffset]() {
    return this.anchorOffset;
  }
  get [$baseNode]() {
    return this.baseNode;
  }
  get [$baseOffset]() {
    return this.baseOffset;
  }
  get [$extentNode]() {
    return this.extentNode;
  }
  get [$extentOffset]() {
    return this.extentOffset;
  }
  get [$focusNode]() {
    return this.focusNode;
  }
  get [$focusOffset]() {
    return this.focusOffset;
  }
  get [$isCollapsed]() {
    return this.isCollapsed;
  }
  get [$rangeCount]() {
    return this.rangeCount;
  }
  get [$type]() {
    return this.type;
  }
  [$addRange](...args) {
    return this.addRange.apply(this, args);
  }
  [$collapse](...args) {
    return this.collapse.apply(this, args);
  }
  [$collapseToEnd](...args) {
    return this.collapseToEnd.apply(this, args);
  }
  [$collapseToStart](...args) {
    return this.collapseToStart.apply(this, args);
  }
  [$containsNode](...args) {
    return this.containsNode.apply(this, args);
  }
  [$deleteFromDocument](...args) {
    return this.deleteFromDocument.apply(this, args);
  }
  [$empty](...args) {
    return this.empty.apply(this, args);
  }
  [$extend](...args) {
    return this.extend.apply(this, args);
  }
  [$getRangeAt](...args) {
    return this.getRangeAt.apply(this, args);
  }
  [$modify](...args) {
    return this.modify.apply(this, args);
  }
  [$removeAllRanges](...args) {
    return this.removeAllRanges.apply(this, args);
  }
  [$removeRange](...args) {
    return this.removeRange.apply(this, args);
  }
  [$selectAllChildren](...args) {
    return this.selectAllChildren.apply(this, args);
  }
  [$setBaseAndExtent](...args) {
    return this.setBaseAndExtent.apply(this, args);
  }
  [$setPosition](...args) {
    return this.setPosition.apply(this, args);
  }
};
dart.addTypeTests(html$.Selection);
const anchorNode = Symbol("Selection.anchorNode");
const anchorOffset = Symbol("Selection.anchorOffset");
const baseNode = Symbol("Selection.baseNode");
const baseOffset = Symbol("Selection.baseOffset");
const extentNode = Symbol("Selection.extentNode");
const extentOffset = Symbol("Selection.extentOffset");
const focusNode = Symbol("Selection.focusNode");
const focusOffset = Symbol("Selection.focusOffset");
const isCollapsed = Symbol("Selection.isCollapsed");
const rangeCount = Symbol("Selection.rangeCount");
const type$31 = Symbol("Selection.type");
dart.setMethodSignature(html$.Selection, () => ({
  __proto__: dart.getMethods(html$.Selection.__proto__),
  [$addRange]: dart.fnType(dart.void, [html$.Range]),
  [$collapse]: dart.fnType(dart.void, [html$.Node], [core.int]),
  [$collapseToEnd]: dart.fnType(dart.void, []),
  [$collapseToStart]: dart.fnType(dart.void, []),
  [$containsNode]: dart.fnType(core.bool, [html$.Node], [core.bool]),
  [$deleteFromDocument]: dart.fnType(dart.void, []),
  [$empty]: dart.fnType(dart.void, []),
  [$extend]: dart.fnType(dart.void, [html$.Node], [core.int]),
  [$getRangeAt]: dart.fnType(html$.Range, [core.int]),
  [$modify]: dart.fnType(dart.void, [core.String, core.String, core.String]),
  [$removeAllRanges]: dart.fnType(dart.void, []),
  [$removeRange]: dart.fnType(dart.void, [html$.Range]),
  [$selectAllChildren]: dart.fnType(dart.void, [html$.Node]),
  [$setBaseAndExtent]: dart.fnType(dart.void, [html$.Node, core.int, html$.Node, core.int]),
  [$setPosition]: dart.fnType(dart.void, [html$.Node], [core.int])
}));
dart.setLibraryUri(html$.Selection, "dart:html");
dart.setFieldSignature(html$.Selection, () => ({
  __proto__: dart.getFields(html$.Selection.__proto__),
  [$anchorNode]: dart.finalFieldType(html$.Node),
  [$anchorOffset]: dart.finalFieldType(core.int),
  [$baseNode]: dart.finalFieldType(html$.Node),
  [$baseOffset]: dart.finalFieldType(core.int),
  [$extentNode]: dart.finalFieldType(html$.Node),
  [$extentOffset]: dart.finalFieldType(core.int),
  [$focusNode]: dart.finalFieldType(html$.Node),
  [$focusOffset]: dart.finalFieldType(core.int),
  [$isCollapsed]: dart.finalFieldType(core.bool),
  [$rangeCount]: dart.finalFieldType(core.int),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Selection", html$.Selection);
html$.SensorErrorEvent = class SensorErrorEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.SensorErrorEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new SensorErrorEvent(type, eventInitDict);
  }
  get [$error]() {
    return this.error;
  }
};
dart.addTypeTests(html$.SensorErrorEvent);
const error$5 = Symbol("SensorErrorEvent.error");
dart.setLibraryUri(html$.SensorErrorEvent, "dart:html");
dart.setFieldSignature(html$.SensorErrorEvent, () => ({
  __proto__: dart.getFields(html$.SensorErrorEvent.__proto__),
  [$error]: dart.finalFieldType(html$.DomException)
}));
dart.registerExtension("SensorErrorEvent", html$.SensorErrorEvent);
html$.ServiceWorker = class ServiceWorker extends html$.EventTarget {
  get [$scriptUrl]() {
    return this.scriptURL;
  }
  get [$state]() {
    return this.state;
  }
  [$postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  get [$onError]() {
    return html$.ServiceWorker.errorEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.ServiceWorker);
const scriptUrl = Symbol("ServiceWorker.scriptUrl");
const state$5 = Symbol("ServiceWorker.state");
html$.ServiceWorker[dart.implements] = () => [html$.AbstractWorker];
dart.setMethodSignature(html$.ServiceWorker, () => ({
  __proto__: dart.getMethods(html$.ServiceWorker.__proto__),
  [$postMessage]: dart.fnType(dart.void, [dart.dynamic], [core.List$(core.Object)]),
  [_postMessage_1]: dart.fnType(dart.void, [dart.dynamic, core.List$(core.Object)]),
  [_postMessage_2]: dart.fnType(dart.void, [dart.dynamic])
}));
dart.setGetterSignature(html$.ServiceWorker, () => ({
  __proto__: dart.getGetters(html$.ServiceWorker.__proto__),
  [$onError]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.ServiceWorker, "dart:html");
dart.setFieldSignature(html$.ServiceWorker, () => ({
  __proto__: dart.getFields(html$.ServiceWorker.__proto__),
  [$scriptUrl]: dart.finalFieldType(core.String),
  [$state]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.ServiceWorker, {
  /*html$.ServiceWorker.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  }
});
dart.registerExtension("ServiceWorker", html$.ServiceWorker);
html$.ServiceWorkerContainer = class ServiceWorkerContainer extends html$.EventTarget {
  get [$controller]() {
    return this.controller;
  }
  get [$ready]() {
    return html$.promiseToFuture(html$.ServiceWorkerRegistration, this.ready);
  }
  [$getRegistration](documentURL) {
    if (documentURL === void 0) documentURL = null;
    return html$.promiseToFuture(html$.ServiceWorkerRegistration, this.getRegistration(documentURL));
  }
  [$getRegistrations]() {
    return html$.promiseToFuture(ListOfServiceWorkerRegistration(), this.getRegistrations());
  }
  [$register](url, options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(html$.ServiceWorkerRegistration, this.register(url, options_dict));
  }
  get [$onMessage]() {
    return html$.ServiceWorkerContainer.messageEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.ServiceWorkerContainer);
const controller = Symbol("ServiceWorkerContainer.controller");
dart.setMethodSignature(html$.ServiceWorkerContainer, () => ({
  __proto__: dart.getMethods(html$.ServiceWorkerContainer.__proto__),
  [$getRegistration]: dart.fnType(async.Future$(html$.ServiceWorkerRegistration), [], [core.String]),
  [$getRegistrations]: dart.fnType(async.Future$(core.List$(html$.ServiceWorkerRegistration)), []),
  [$register]: dart.fnType(async.Future$(html$.ServiceWorkerRegistration), [core.String], [core.Map])
}));
dart.setGetterSignature(html$.ServiceWorkerContainer, () => ({
  __proto__: dart.getGetters(html$.ServiceWorkerContainer.__proto__),
  [$ready]: async.Future$(html$.ServiceWorkerRegistration),
  [$onMessage]: async.Stream$(html$.MessageEvent)
}));
dart.setLibraryUri(html$.ServiceWorkerContainer, "dart:html");
dart.setFieldSignature(html$.ServiceWorkerContainer, () => ({
  __proto__: dart.getFields(html$.ServiceWorkerContainer.__proto__),
  [$controller]: dart.finalFieldType(html$.ServiceWorker)
}));
dart.defineLazy(html$.ServiceWorkerContainer, {
  /*html$.ServiceWorkerContainer.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  }
});
dart.registerExtension("ServiceWorkerContainer", html$.ServiceWorkerContainer);
html$.ServiceWorkerGlobalScope = class ServiceWorkerGlobalScope extends html$.WorkerGlobalScope {
  get [$clients]() {
    return this.clients;
  }
  get [$registration]() {
    return this.registration;
  }
  [$skipWaiting]() {
    return html$.promiseToFuture(dart.dynamic, this.skipWaiting());
  }
  get [$onActivate]() {
    return html$.ServiceWorkerGlobalScope.activateEvent.forTarget(this);
  }
  get [$onFetch]() {
    return html$.ServiceWorkerGlobalScope.fetchEvent.forTarget(this);
  }
  get [$onForeignfetch]() {
    return html$.ServiceWorkerGlobalScope.foreignfetchEvent.forTarget(this);
  }
  get [$onInstall]() {
    return html$.ServiceWorkerGlobalScope.installEvent.forTarget(this);
  }
  get [$onMessage]() {
    return html$.ServiceWorkerGlobalScope.messageEvent.forTarget(this);
  }
  static get instance() {
    return html$.ServiceWorkerGlobalScope.as(html$._workerSelf);
  }
};
dart.addTypeTests(html$.ServiceWorkerGlobalScope);
const clients = Symbol("ServiceWorkerGlobalScope.clients");
const registration = Symbol("ServiceWorkerGlobalScope.registration");
dart.setMethodSignature(html$.ServiceWorkerGlobalScope, () => ({
  __proto__: dart.getMethods(html$.ServiceWorkerGlobalScope.__proto__),
  [$skipWaiting]: dart.fnType(async.Future, [])
}));
dart.setGetterSignature(html$.ServiceWorkerGlobalScope, () => ({
  __proto__: dart.getGetters(html$.ServiceWorkerGlobalScope.__proto__),
  [$onActivate]: async.Stream$(html$.Event),
  [$onFetch]: async.Stream$(html$.Event),
  [$onForeignfetch]: async.Stream$(html$.ForeignFetchEvent),
  [$onInstall]: async.Stream$(html$.Event),
  [$onMessage]: async.Stream$(html$.MessageEvent)
}));
dart.setLibraryUri(html$.ServiceWorkerGlobalScope, "dart:html");
dart.setFieldSignature(html$.ServiceWorkerGlobalScope, () => ({
  __proto__: dart.getFields(html$.ServiceWorkerGlobalScope.__proto__),
  [$clients]: dart.finalFieldType(html$.Clients),
  [$registration]: dart.finalFieldType(html$.ServiceWorkerRegistration)
}));
dart.defineLazy(html$.ServiceWorkerGlobalScope, {
  /*html$.ServiceWorkerGlobalScope.activateEvent*/get activateEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("activate"));
  },
  /*html$.ServiceWorkerGlobalScope.fetchEvent*/get fetchEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("fetch"));
  },
  /*html$.ServiceWorkerGlobalScope.foreignfetchEvent*/get foreignfetchEvent() {
    return dart.const(new (EventStreamProviderOfForeignFetchEvent()).new("foreignfetch"));
  },
  /*html$.ServiceWorkerGlobalScope.installEvent*/get installEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("install"));
  },
  /*html$.ServiceWorkerGlobalScope.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  }
});
dart.registerExtension("ServiceWorkerGlobalScope", html$.ServiceWorkerGlobalScope);
html$.ServiceWorkerRegistration = class ServiceWorkerRegistration extends html$.EventTarget {
  get [$active]() {
    return this.active;
  }
  get [$backgroundFetch]() {
    return this.backgroundFetch;
  }
  get [$installing]() {
    return this.installing;
  }
  get [$navigationPreload]() {
    return this.navigationPreload;
  }
  get [$paymentManager]() {
    return this.paymentManager;
  }
  get [$pushManager]() {
    return this.pushManager;
  }
  get [$scope]() {
    return this.scope;
  }
  get [$sync]() {
    return this.sync;
  }
  get [$waiting]() {
    return this.waiting;
  }
  [$getNotifications](filter) {
    if (filter === void 0) filter = null;
    let filter_dict = null;
    if (filter != null) {
      filter_dict = html_common.convertDartToNative_Dictionary(filter);
    }
    return html$.promiseToFuture(ListOfNotification(), this.getNotifications(filter_dict));
  }
  [$showNotification](title, options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.showNotification(title, options_dict));
  }
  [$unregister]() {
    return html$.promiseToFuture(core.bool, this.unregister());
  }
  [$update]() {
    return html$.promiseToFuture(dart.dynamic, this.update());
  }
};
dart.addTypeTests(html$.ServiceWorkerRegistration);
const active$ = Symbol("ServiceWorkerRegistration.active");
const backgroundFetch = Symbol("ServiceWorkerRegistration.backgroundFetch");
const installing = Symbol("ServiceWorkerRegistration.installing");
const navigationPreload = Symbol("ServiceWorkerRegistration.navigationPreload");
const paymentManager = Symbol("ServiceWorkerRegistration.paymentManager");
const pushManager = Symbol("ServiceWorkerRegistration.pushManager");
const scope$ = Symbol("ServiceWorkerRegistration.scope");
const sync = Symbol("ServiceWorkerRegistration.sync");
const waiting = Symbol("ServiceWorkerRegistration.waiting");
dart.setMethodSignature(html$.ServiceWorkerRegistration, () => ({
  __proto__: dart.getMethods(html$.ServiceWorkerRegistration.__proto__),
  [$getNotifications]: dart.fnType(async.Future$(core.List$(html$.Notification)), [], [core.Map]),
  [$showNotification]: dart.fnType(async.Future, [core.String], [core.Map]),
  [$unregister]: dart.fnType(async.Future$(core.bool), []),
  [$update]: dart.fnType(async.Future, [])
}));
dart.setLibraryUri(html$.ServiceWorkerRegistration, "dart:html");
dart.setFieldSignature(html$.ServiceWorkerRegistration, () => ({
  __proto__: dart.getFields(html$.ServiceWorkerRegistration.__proto__),
  [$active]: dart.finalFieldType(html$.ServiceWorker),
  [$backgroundFetch]: dart.finalFieldType(html$.BackgroundFetchManager),
  [$installing]: dart.finalFieldType(html$.ServiceWorker),
  [$navigationPreload]: dart.finalFieldType(html$.NavigationPreloadManager),
  [$paymentManager]: dart.finalFieldType(html$.PaymentManager),
  [$pushManager]: dart.finalFieldType(html$.PushManager),
  [$scope]: dart.finalFieldType(core.String),
  [$sync]: dart.finalFieldType(html$.SyncManager),
  [$waiting]: dart.finalFieldType(html$.ServiceWorker)
}));
dart.registerExtension("ServiceWorkerRegistration", html$.ServiceWorkerRegistration);
html$.ShadowElement = class ShadowElement extends html$.HtmlElement {
  static new() {
    return html$.ShadowElement._check(html$.document[$createElement]("shadow"));
  }
  static get supported() {
    return html$.Element.isTagSupported("shadow");
  }
  [$getDistributedNodes](...args) {
    return this.getDistributedNodes.apply(this, args);
  }
};
(html$.ShadowElement.created = function() {
  html$.ShadowElement.__proto__.created.call(this);
}).prototype = html$.ShadowElement.prototype;
dart.addTypeTests(html$.ShadowElement);
dart.setMethodSignature(html$.ShadowElement, () => ({
  __proto__: dart.getMethods(html$.ShadowElement.__proto__),
  [$getDistributedNodes]: dart.fnType(core.List$(html$.Node), [])
}));
dart.setLibraryUri(html$.ShadowElement, "dart:html");
dart.registerExtension("HTMLShadowElement", html$.ShadowElement);
html$.ShadowRoot = class ShadowRoot extends html$.DocumentFragment {
  get [$delegatesFocus]() {
    return this.delegatesFocus;
  }
  get [$host]() {
    return this.host;
  }
  get [$innerHtml]() {
    return this.innerHTML;
  }
  set [$innerHtml](value) {
    this.innerHTML = value;
  }
  get [$mode]() {
    return this.mode;
  }
  get [$olderShadowRoot]() {
    return this.olderShadowRoot;
  }
  get [$activeElement]() {
    return this.activeElement;
  }
  get [$fullscreenElement]() {
    return this.fullscreenElement;
  }
  get [$pointerLockElement]() {
    return this.pointerLockElement;
  }
  get [$styleSheets]() {
    return this.styleSheets;
  }
  [$elementFromPoint](...args) {
    return this.elementFromPoint.apply(this, args);
  }
  [$elementsFromPoint](...args) {
    return this.elementsFromPoint.apply(this, args);
  }
  [$getSelection](...args) {
    return this.getSelection.apply(this, args);
  }
  static get supported() {
    return !!(Element.prototype.createShadowRoot || Element.prototype.webkitCreateShadowRoot);
  }
  static _shadowRootDeprecationReport() {
    if (!dart.test(html$.ShadowRoot._shadowRootDeprecationReported)) {
      html$.window[$console].warn("ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.\nPlease remove them from your code.\n");
      html$.ShadowRoot._shadowRootDeprecationReported = true;
    }
  }
  get [$resetStyleInheritance]() {
    html$.ShadowRoot._shadowRootDeprecationReport();
    return false;
  }
  set [$resetStyleInheritance](value) {
    html$.ShadowRoot._shadowRootDeprecationReport();
  }
  get [$applyAuthorStyles]() {
    html$.ShadowRoot._shadowRootDeprecationReport();
    return false;
  }
  set [$applyAuthorStyles](value) {
    html$.ShadowRoot._shadowRootDeprecationReport();
  }
};
dart.addTypeTests(html$.ShadowRoot);
const delegatesFocus = Symbol("ShadowRoot.delegatesFocus");
const host$2 = Symbol("ShadowRoot.host");
const innerHtml = Symbol("ShadowRoot.innerHtml");
const mode$1 = Symbol("ShadowRoot.mode");
const olderShadowRoot = Symbol("ShadowRoot.olderShadowRoot");
const activeElement$0 = Symbol("ShadowRoot.activeElement");
const fullscreenElement$0 = Symbol("ShadowRoot.fullscreenElement");
const pointerLockElement$0 = Symbol("ShadowRoot.pointerLockElement");
const styleSheets$ = Symbol("ShadowRoot.styleSheets");
html$.ShadowRoot[dart.implements] = () => [html$.DocumentOrShadowRoot];
dart.setMethodSignature(html$.ShadowRoot, () => ({
  __proto__: dart.getMethods(html$.ShadowRoot.__proto__),
  [$elementFromPoint]: dart.fnType(html$.Element, [core.int, core.int]),
  [$elementsFromPoint]: dart.fnType(core.List$(html$.Element), [core.int, core.int]),
  [$getSelection]: dart.fnType(html$.Selection, [])
}));
dart.setGetterSignature(html$.ShadowRoot, () => ({
  __proto__: dart.getGetters(html$.ShadowRoot.__proto__),
  [$resetStyleInheritance]: core.bool,
  [$applyAuthorStyles]: core.bool
}));
dart.setSetterSignature(html$.ShadowRoot, () => ({
  __proto__: dart.getSetters(html$.ShadowRoot.__proto__),
  [$resetStyleInheritance]: core.bool,
  [$applyAuthorStyles]: core.bool
}));
dart.setLibraryUri(html$.ShadowRoot, "dart:html");
dart.setFieldSignature(html$.ShadowRoot, () => ({
  __proto__: dart.getFields(html$.ShadowRoot.__proto__),
  [$delegatesFocus]: dart.finalFieldType(core.bool),
  [$host]: dart.finalFieldType(html$.Element),
  [$innerHtml]: dart.fieldType(core.String),
  [$mode]: dart.finalFieldType(core.String),
  [$olderShadowRoot]: dart.finalFieldType(html$.ShadowRoot),
  [$activeElement]: dart.finalFieldType(html$.Element),
  [$fullscreenElement]: dart.finalFieldType(html$.Element),
  [$pointerLockElement]: dart.finalFieldType(html$.Element),
  [$styleSheets]: dart.finalFieldType(ListOfStyleSheet())
}));
dart.defineLazy(html$.ShadowRoot, {
  /*html$.ShadowRoot._shadowRootDeprecationReported*/get _shadowRootDeprecationReported() {
    return false;
  },
  set _shadowRootDeprecationReported(_) {}
});
dart.registerExtension("ShadowRoot", html$.ShadowRoot);
html$.SharedArrayBuffer = class SharedArrayBuffer extends _interceptors.Interceptor {
  get [$byteLength]() {
    return this.byteLength;
  }
};
dart.addTypeTests(html$.SharedArrayBuffer);
const byteLength = Symbol("SharedArrayBuffer.byteLength");
dart.setLibraryUri(html$.SharedArrayBuffer, "dart:html");
dart.setFieldSignature(html$.SharedArrayBuffer, () => ({
  __proto__: dart.getFields(html$.SharedArrayBuffer.__proto__),
  [$byteLength]: dart.finalFieldType(core.int)
}));
dart.registerExtension("SharedArrayBuffer", html$.SharedArrayBuffer);
html$.SharedWorker = class SharedWorker$ extends html$.EventTarget {
  static new(scriptURL, name) {
    if (name === void 0) name = null;
    if (name != null) {
      return html$.SharedWorker._create_1(scriptURL, name);
    }
    return html$.SharedWorker._create_2(scriptURL);
  }
  static _create_1(scriptURL, name) {
    return new SharedWorker(scriptURL, name);
  }
  static _create_2(scriptURL) {
    return new SharedWorker(scriptURL);
  }
  get [$port]() {
    return this.port;
  }
  get [$onError]() {
    return html$.SharedWorker.errorEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.SharedWorker);
const port$5 = Symbol("SharedWorker.port");
html$.SharedWorker[dart.implements] = () => [html$.AbstractWorker];
dart.setGetterSignature(html$.SharedWorker, () => ({
  __proto__: dart.getGetters(html$.SharedWorker.__proto__),
  [$onError]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.SharedWorker, "dart:html");
dart.setFieldSignature(html$.SharedWorker, () => ({
  __proto__: dart.getFields(html$.SharedWorker.__proto__),
  [$port]: dart.finalFieldType(html$.MessagePort)
}));
dart.defineLazy(html$.SharedWorker, {
  /*html$.SharedWorker.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  }
});
dart.registerExtension("SharedWorker", html$.SharedWorker);
html$.SharedWorkerGlobalScope = class SharedWorkerGlobalScope extends html$.WorkerGlobalScope {
  get [$name]() {
    return this.name;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [_webkitRequestFileSystem](...args) {
    return this.webkitRequestFileSystem.apply(this, args);
  }
  [$requestFileSystemSync](...args) {
    return this.webkitRequestFileSystemSync.apply(this, args);
  }
  [$resolveLocalFileSystemSyncUrl](...args) {
    return this.webkitResolveLocalFileSystemSyncURL.apply(this, args);
  }
  [_webkitResolveLocalFileSystemUrl](...args) {
    return this.webkitResolveLocalFileSystemURL.apply(this, args);
  }
  get [$onConnect]() {
    return html$.SharedWorkerGlobalScope.connectEvent.forTarget(this);
  }
  static get instance() {
    return html$.SharedWorkerGlobalScope.as(html$._workerSelf);
  }
};
dart.addTypeTests(html$.SharedWorkerGlobalScope);
const name$34 = Symbol("SharedWorkerGlobalScope.name");
dart.setMethodSignature(html$.SharedWorkerGlobalScope, () => ({
  __proto__: dart.getMethods(html$.SharedWorkerGlobalScope.__proto__),
  [$close]: dart.fnType(dart.void, []),
  [_webkitRequestFileSystem]: dart.fnType(dart.void, [core.int, core.int], [dart.fnType(dart.void, [html$.FileSystem]), dart.fnType(dart.void, [html$.DomException])]),
  [$requestFileSystemSync]: dart.fnType(html$._DOMFileSystemSync, [core.int, core.int]),
  [$resolveLocalFileSystemSyncUrl]: dart.fnType(html$._EntrySync, [core.String]),
  [_webkitResolveLocalFileSystemUrl]: dart.fnType(dart.void, [core.String, dart.fnType(dart.void, [html$.Entry])], [dart.fnType(dart.void, [html$.DomException])])
}));
dart.setGetterSignature(html$.SharedWorkerGlobalScope, () => ({
  __proto__: dart.getGetters(html$.SharedWorkerGlobalScope.__proto__),
  [$onConnect]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.SharedWorkerGlobalScope, "dart:html");
dart.setFieldSignature(html$.SharedWorkerGlobalScope, () => ({
  __proto__: dart.getFields(html$.SharedWorkerGlobalScope.__proto__),
  [$name]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.SharedWorkerGlobalScope, {
  /*html$.SharedWorkerGlobalScope.connectEvent*/get connectEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("connect"));
  },
  /*html$.SharedWorkerGlobalScope.PERSISTENT*/get PERSISTENT() {
    return 1;
  },
  /*html$.SharedWorkerGlobalScope.TEMPORARY*/get TEMPORARY() {
    return 0;
  }
});
dart.registerExtension("SharedWorkerGlobalScope", html$.SharedWorkerGlobalScope);
const _assignedNodes_1 = dart.privateName(html$, "_assignedNodes_1");
const _assignedNodes_2 = dart.privateName(html$, "_assignedNodes_2");
html$.SlotElement = class SlotElement extends html$.HtmlElement {
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  [$assignedNodes](options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_assignedNodes_1](options_1);
    }
    return this[_assignedNodes_2]();
  }
  [_assignedNodes_1](...args) {
    return this.assignedNodes.apply(this, args);
  }
  [_assignedNodes_2](...args) {
    return this.assignedNodes.apply(this, args);
  }
};
(html$.SlotElement.created = function() {
  this[name$35] = null;
  html$.SlotElement.__proto__.created.call(this);
}).prototype = html$.SlotElement.prototype;
dart.addTypeTests(html$.SlotElement);
const name$35 = Symbol("SlotElement.name");
dart.setMethodSignature(html$.SlotElement, () => ({
  __proto__: dart.getMethods(html$.SlotElement.__proto__),
  [$assignedNodes]: dart.fnType(core.List$(html$.Node), [], [core.Map]),
  [_assignedNodes_1]: dart.fnType(core.List$(html$.Node), [dart.dynamic]),
  [_assignedNodes_2]: dart.fnType(core.List$(html$.Node), [])
}));
dart.setLibraryUri(html$.SlotElement, "dart:html");
dart.setFieldSignature(html$.SlotElement, () => ({
  __proto__: dart.getFields(html$.SlotElement.__proto__),
  [$name]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLSlotElement", html$.SlotElement);
html$.SourceBuffer = class SourceBuffer extends html$.EventTarget {
  get [$appendWindowEnd]() {
    return this.appendWindowEnd;
  }
  set [$appendWindowEnd](value) {
    this.appendWindowEnd = value;
  }
  get [$appendWindowStart]() {
    return this.appendWindowStart;
  }
  set [$appendWindowStart](value) {
    this.appendWindowStart = value;
  }
  get [$audioTracks]() {
    return this.audioTracks;
  }
  get [$buffered]() {
    return this.buffered;
  }
  get [$mode]() {
    return this.mode;
  }
  set [$mode](value) {
    this.mode = value;
  }
  get [$timestampOffset]() {
    return this.timestampOffset;
  }
  set [$timestampOffset](value) {
    this.timestampOffset = value;
  }
  get [$trackDefaults]() {
    return this.trackDefaults;
  }
  set [$trackDefaults](value) {
    this.trackDefaults = value;
  }
  get [$updating]() {
    return this.updating;
  }
  get [$videoTracks]() {
    return this.videoTracks;
  }
  [$abort](...args) {
    return this.abort.apply(this, args);
  }
  [$appendBuffer](...args) {
    return this.appendBuffer.apply(this, args);
  }
  [$appendTypedData](...args) {
    return this.appendBuffer.apply(this, args);
  }
  [$remove](...args) {
    return this.remove.apply(this, args);
  }
  get [$onAbort]() {
    return html$.SourceBuffer.abortEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.SourceBuffer.errorEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.SourceBuffer);
const appendWindowEnd = Symbol("SourceBuffer.appendWindowEnd");
const appendWindowStart = Symbol("SourceBuffer.appendWindowStart");
const audioTracks$ = Symbol("SourceBuffer.audioTracks");
const buffered$ = Symbol("SourceBuffer.buffered");
const mode$2 = Symbol("SourceBuffer.mode");
const timestampOffset = Symbol("SourceBuffer.timestampOffset");
const trackDefaults = Symbol("SourceBuffer.trackDefaults");
const updating = Symbol("SourceBuffer.updating");
const videoTracks$ = Symbol("SourceBuffer.videoTracks");
dart.setMethodSignature(html$.SourceBuffer, () => ({
  __proto__: dart.getMethods(html$.SourceBuffer.__proto__),
  [$abort]: dart.fnType(dart.void, []),
  [$appendBuffer]: dart.fnType(dart.void, [typed_data.ByteBuffer]),
  [$appendTypedData]: dart.fnType(dart.void, [typed_data.TypedData]),
  [$remove]: dart.fnType(dart.void, [core.num, core.num])
}));
dart.setGetterSignature(html$.SourceBuffer, () => ({
  __proto__: dart.getGetters(html$.SourceBuffer.__proto__),
  [$onAbort]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.SourceBuffer, "dart:html");
dart.setFieldSignature(html$.SourceBuffer, () => ({
  __proto__: dart.getFields(html$.SourceBuffer.__proto__),
  [$appendWindowEnd]: dart.fieldType(core.num),
  [$appendWindowStart]: dart.fieldType(core.num),
  [$audioTracks]: dart.finalFieldType(web_audio.AudioTrackList),
  [$buffered]: dart.finalFieldType(html$.TimeRanges),
  [$mode]: dart.fieldType(core.String),
  [$timestampOffset]: dart.fieldType(core.num),
  [$trackDefaults]: dart.fieldType(html$.TrackDefaultList),
  [$updating]: dart.finalFieldType(core.bool),
  [$videoTracks]: dart.finalFieldType(html$.VideoTrackList)
}));
dart.defineLazy(html$.SourceBuffer, {
  /*html$.SourceBuffer.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("abort"));
  },
  /*html$.SourceBuffer.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  }
});
dart.registerExtension("SourceBuffer", html$.SourceBuffer);
const EventTarget_ListMixin$ = class EventTarget_ListMixin extends html$.EventTarget {};
(EventTarget_ListMixin$._created = function() {
  EventTarget_ListMixin$.__proto__._created.call(this);
}).prototype = EventTarget_ListMixin$.prototype;
(EventTarget_ListMixin$.__ = function() {
  EventTarget_ListMixin$.__proto__.__.call(this);
}).prototype = EventTarget_ListMixin$.prototype;
dart.applyMixin(EventTarget_ListMixin$, collection.ListMixin$(html$.SourceBuffer));
const EventTarget_ImmutableListMixin$ = class EventTarget_ImmutableListMixin extends EventTarget_ListMixin$ {};
(EventTarget_ImmutableListMixin$._created = function() {
  EventTarget_ImmutableListMixin$.__proto__._created.call(this);
}).prototype = EventTarget_ImmutableListMixin$.prototype;
(EventTarget_ImmutableListMixin$.__ = function() {
  EventTarget_ImmutableListMixin$.__proto__.__.call(this);
}).prototype = EventTarget_ImmutableListMixin$.prototype;
dart.applyMixin(EventTarget_ImmutableListMixin$, html$.ImmutableListMixin$(html$.SourceBuffer));
html$.SourceBufferList = class SourceBufferList extends EventTarget_ImmutableListMixin$ {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.SourceBuffer._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$.SourceBufferList.prototype[dart.isList] = true;
dart.addTypeTests(html$.SourceBufferList);
html$.SourceBufferList[dart.implements] = () => [JavaScriptIndexingBehaviorOfSourceBuffer(), ListOfSourceBuffer()];
dart.setMethodSignature(html$.SourceBufferList, () => ({
  __proto__: dart.getMethods(html$.SourceBufferList.__proto__),
  [$_get]: dart.fnType(html$.SourceBuffer, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.SourceBuffer, [core.int]),
  [$item]: dart.fnType(html$.SourceBuffer, [core.int])
}));
dart.setGetterSignature(html$.SourceBufferList, () => ({
  __proto__: dart.getGetters(html$.SourceBufferList.__proto__),
  [$length]: core.int,
  [$first]: html$.SourceBuffer,
  [$last]: html$.SourceBuffer,
  [$single]: html$.SourceBuffer
}));
dart.setSetterSignature(html$.SourceBufferList, () => ({
  __proto__: dart.getSetters(html$.SourceBufferList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.SourceBufferList, "dart:html");
dart.registerExtension("SourceBufferList", html$.SourceBufferList);
html$.SourceElement = class SourceElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("source");
  }
  get [$media]() {
    return this.media;
  }
  set [$media](value) {
    this.media = value;
  }
  get [$sizes]() {
    return this.sizes;
  }
  set [$sizes](value) {
    this.sizes = value;
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$srcset]() {
    return this.srcset;
  }
  set [$srcset](value) {
    this.srcset = value;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
};
(html$.SourceElement.created = function() {
  this[media$4] = null;
  this[sizes$0] = null;
  this[src$5] = null;
  this[srcset$] = null;
  this[type$32] = null;
  html$.SourceElement.__proto__.created.call(this);
}).prototype = html$.SourceElement.prototype;
dart.addTypeTests(html$.SourceElement);
const media$4 = Symbol("SourceElement.media");
const sizes$0 = Symbol("SourceElement.sizes");
const src$5 = Symbol("SourceElement.src");
const srcset$ = Symbol("SourceElement.srcset");
const type$32 = Symbol("SourceElement.type");
dart.setLibraryUri(html$.SourceElement, "dart:html");
dart.setFieldSignature(html$.SourceElement, () => ({
  __proto__: dart.getFields(html$.SourceElement.__proto__),
  [$media]: dart.fieldType(core.String),
  [$sizes]: dart.fieldType(core.String),
  [$src]: dart.fieldType(core.String),
  [$srcset]: dart.fieldType(core.String),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLSourceElement", html$.SourceElement);
html$.SpanElement = class SpanElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("span");
  }
};
(html$.SpanElement.created = function() {
  html$.SpanElement.__proto__.created.call(this);
}).prototype = html$.SpanElement.prototype;
dart.addTypeTests(html$.SpanElement);
dart.setLibraryUri(html$.SpanElement, "dart:html");
dart.registerExtension("HTMLSpanElement", html$.SpanElement);
html$.SpeechGrammar = class SpeechGrammar$ extends _interceptors.Interceptor {
  static new() {
    return html$.SpeechGrammar._create_1();
  }
  static _create_1() {
    return new SpeechGrammar();
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$weight]() {
    return this.weight;
  }
  set [$weight](value) {
    this.weight = value;
  }
};
dart.addTypeTests(html$.SpeechGrammar);
const src$6 = Symbol("SpeechGrammar.src");
const weight$ = Symbol("SpeechGrammar.weight");
dart.setLibraryUri(html$.SpeechGrammar, "dart:html");
dart.setFieldSignature(html$.SpeechGrammar, () => ({
  __proto__: dart.getFields(html$.SpeechGrammar.__proto__),
  [$src]: dart.fieldType(core.String),
  [$weight]: dart.fieldType(core.num)
}));
dart.registerExtension("SpeechGrammar", html$.SpeechGrammar);
const Interceptor_ListMixin$$5 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$5.new = function() {
  Interceptor_ListMixin$$5.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$5.prototype;
dart.applyMixin(Interceptor_ListMixin$$5, collection.ListMixin$(html$.SpeechGrammar));
const Interceptor_ImmutableListMixin$$5 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$5 {};
(Interceptor_ImmutableListMixin$$5.new = function() {
  Interceptor_ImmutableListMixin$$5.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$5.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$5, html$.ImmutableListMixin$(html$.SpeechGrammar));
html$.SpeechGrammarList = class SpeechGrammarList$ extends Interceptor_ImmutableListMixin$$5 {
  static new() {
    return html$.SpeechGrammarList._create_1();
  }
  static _create_1() {
    return new SpeechGrammarList();
  }
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.SpeechGrammar._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$addFromString](...args) {
    return this.addFromString.apply(this, args);
  }
  [$addFromUri](...args) {
    return this.addFromUri.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$.SpeechGrammarList.prototype[dart.isList] = true;
dart.addTypeTests(html$.SpeechGrammarList);
html$.SpeechGrammarList[dart.implements] = () => [JavaScriptIndexingBehaviorOfSpeechGrammar(), ListOfSpeechGrammar()];
dart.setMethodSignature(html$.SpeechGrammarList, () => ({
  __proto__: dart.getMethods(html$.SpeechGrammarList.__proto__),
  [$_get]: dart.fnType(html$.SpeechGrammar, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.SpeechGrammar, [core.int]),
  [$addFromString]: dart.fnType(dart.void, [core.String], [core.num]),
  [$addFromUri]: dart.fnType(dart.void, [core.String], [core.num]),
  [$item]: dart.fnType(html$.SpeechGrammar, [core.int])
}));
dart.setGetterSignature(html$.SpeechGrammarList, () => ({
  __proto__: dart.getGetters(html$.SpeechGrammarList.__proto__),
  [$length]: core.int,
  [$first]: html$.SpeechGrammar,
  [$last]: html$.SpeechGrammar,
  [$single]: html$.SpeechGrammar
}));
dart.setSetterSignature(html$.SpeechGrammarList, () => ({
  __proto__: dart.getSetters(html$.SpeechGrammarList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.SpeechGrammarList, "dart:html");
dart.registerExtension("SpeechGrammarList", html$.SpeechGrammarList);
html$.SpeechRecognition = class SpeechRecognition extends html$.EventTarget {
  static get supported() {
    return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
  }
  get [$audioTrack]() {
    return this.audioTrack;
  }
  set [$audioTrack](value) {
    this.audioTrack = value;
  }
  get [$continuous]() {
    return this.continuous;
  }
  set [$continuous](value) {
    this.continuous = value;
  }
  get [$grammars]() {
    return this.grammars;
  }
  set [$grammars](value) {
    this.grammars = value;
  }
  get [$interimResults]() {
    return this.interimResults;
  }
  set [$interimResults](value) {
    this.interimResults = value;
  }
  get [$lang]() {
    return this.lang;
  }
  set [$lang](value) {
    this.lang = value;
  }
  get [$maxAlternatives]() {
    return this.maxAlternatives;
  }
  set [$maxAlternatives](value) {
    this.maxAlternatives = value;
  }
  [$abort](...args) {
    return this.abort.apply(this, args);
  }
  [$start](...args) {
    return this.start.apply(this, args);
  }
  [$stop](...args) {
    return this.stop.apply(this, args);
  }
  get [$onAudioEnd]() {
    return html$.SpeechRecognition.audioEndEvent.forTarget(this);
  }
  get [$onAudioStart]() {
    return html$.SpeechRecognition.audioStartEvent.forTarget(this);
  }
  get [$onEnd]() {
    return html$.SpeechRecognition.endEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.SpeechRecognition.errorEvent.forTarget(this);
  }
  get [$onNoMatch]() {
    return html$.SpeechRecognition.noMatchEvent.forTarget(this);
  }
  get [$onResult]() {
    return html$.SpeechRecognition.resultEvent.forTarget(this);
  }
  get [$onSoundEnd]() {
    return html$.SpeechRecognition.soundEndEvent.forTarget(this);
  }
  get [$onSoundStart]() {
    return html$.SpeechRecognition.soundStartEvent.forTarget(this);
  }
  get [$onSpeechEnd]() {
    return html$.SpeechRecognition.speechEndEvent.forTarget(this);
  }
  get [$onSpeechStart]() {
    return html$.SpeechRecognition.speechStartEvent.forTarget(this);
  }
  get [$onStart]() {
    return html$.SpeechRecognition.startEvent.forTarget(this);
  }
  static new() {
    return new (window.SpeechRecognition || window.webkitSpeechRecognition)();
  }
};
dart.addTypeTests(html$.SpeechRecognition);
const audioTrack = Symbol("SpeechRecognition.audioTrack");
const continuous = Symbol("SpeechRecognition.continuous");
const grammars = Symbol("SpeechRecognition.grammars");
const interimResults = Symbol("SpeechRecognition.interimResults");
const lang$0 = Symbol("SpeechRecognition.lang");
const maxAlternatives = Symbol("SpeechRecognition.maxAlternatives");
dart.setMethodSignature(html$.SpeechRecognition, () => ({
  __proto__: dart.getMethods(html$.SpeechRecognition.__proto__),
  [$abort]: dart.fnType(dart.void, []),
  [$start]: dart.fnType(dart.void, []),
  [$stop]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.SpeechRecognition, () => ({
  __proto__: dart.getGetters(html$.SpeechRecognition.__proto__),
  [$onAudioEnd]: async.Stream$(html$.Event),
  [$onAudioStart]: async.Stream$(html$.Event),
  [$onEnd]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.SpeechRecognitionError),
  [$onNoMatch]: async.Stream$(html$.SpeechRecognitionEvent),
  [$onResult]: async.Stream$(html$.SpeechRecognitionEvent),
  [$onSoundEnd]: async.Stream$(html$.Event),
  [$onSoundStart]: async.Stream$(html$.Event),
  [$onSpeechEnd]: async.Stream$(html$.Event),
  [$onSpeechStart]: async.Stream$(html$.Event),
  [$onStart]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.SpeechRecognition, "dart:html");
dart.setFieldSignature(html$.SpeechRecognition, () => ({
  __proto__: dart.getFields(html$.SpeechRecognition.__proto__),
  [$audioTrack]: dart.fieldType(html$.MediaStreamTrack),
  [$continuous]: dart.fieldType(core.bool),
  [$grammars]: dart.fieldType(html$.SpeechGrammarList),
  [$interimResults]: dart.fieldType(core.bool),
  [$lang]: dart.fieldType(core.String),
  [$maxAlternatives]: dart.fieldType(core.int)
}));
dart.defineLazy(html$.SpeechRecognition, {
  /*html$.SpeechRecognition.audioEndEvent*/get audioEndEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("audioend"));
  },
  /*html$.SpeechRecognition.audioStartEvent*/get audioStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("audiostart"));
  },
  /*html$.SpeechRecognition.endEvent*/get endEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("end"));
  },
  /*html$.SpeechRecognition.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfSpeechRecognitionError()).new("error"));
  },
  /*html$.SpeechRecognition.noMatchEvent*/get noMatchEvent() {
    return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent()).new("nomatch"));
  },
  /*html$.SpeechRecognition.resultEvent*/get resultEvent() {
    return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent()).new("result"));
  },
  /*html$.SpeechRecognition.soundEndEvent*/get soundEndEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("soundend"));
  },
  /*html$.SpeechRecognition.soundStartEvent*/get soundStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("soundstart"));
  },
  /*html$.SpeechRecognition.speechEndEvent*/get speechEndEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("speechend"));
  },
  /*html$.SpeechRecognition.speechStartEvent*/get speechStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("speechstart"));
  },
  /*html$.SpeechRecognition.startEvent*/get startEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("start"));
  }
});
dart.registerExtension("SpeechRecognition", html$.SpeechRecognition);
html$.SpeechRecognitionAlternative = class SpeechRecognitionAlternative extends _interceptors.Interceptor {
  get [$confidence]() {
    return this.confidence;
  }
  get [$transcript]() {
    return this.transcript;
  }
};
dart.addTypeTests(html$.SpeechRecognitionAlternative);
const confidence = Symbol("SpeechRecognitionAlternative.confidence");
const transcript = Symbol("SpeechRecognitionAlternative.transcript");
dart.setLibraryUri(html$.SpeechRecognitionAlternative, "dart:html");
dart.setFieldSignature(html$.SpeechRecognitionAlternative, () => ({
  __proto__: dart.getFields(html$.SpeechRecognitionAlternative.__proto__),
  [$confidence]: dart.finalFieldType(core.num),
  [$transcript]: dart.finalFieldType(core.String)
}));
dart.registerExtension("SpeechRecognitionAlternative", html$.SpeechRecognitionAlternative);
html$.SpeechRecognitionError = class SpeechRecognitionError$ extends html$.Event {
  static new(type, initDict) {
    if (initDict === void 0) initDict = null;
    if (initDict != null) {
      let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
      return html$.SpeechRecognitionError._create_1(type, initDict_1);
    }
    return html$.SpeechRecognitionError._create_2(type);
  }
  static _create_1(type, initDict) {
    return new SpeechRecognitionError(type, initDict);
  }
  static _create_2(type) {
    return new SpeechRecognitionError(type);
  }
  get [$error]() {
    return this.error;
  }
  get [$message]() {
    return this.message;
  }
};
dart.addTypeTests(html$.SpeechRecognitionError);
const error$6 = Symbol("SpeechRecognitionError.error");
const message$27 = Symbol("SpeechRecognitionError.message");
dart.setLibraryUri(html$.SpeechRecognitionError, "dart:html");
dart.setFieldSignature(html$.SpeechRecognitionError, () => ({
  __proto__: dart.getFields(html$.SpeechRecognitionError.__proto__),
  [$error]: dart.finalFieldType(core.String),
  [$message]: dart.finalFieldType(core.String)
}));
dart.registerExtension("SpeechRecognitionError", html$.SpeechRecognitionError);
html$.SpeechRecognitionEvent = class SpeechRecognitionEvent$ extends html$.Event {
  static new(type, initDict) {
    if (initDict === void 0) initDict = null;
    if (initDict != null) {
      let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
      return html$.SpeechRecognitionEvent._create_1(type, initDict_1);
    }
    return html$.SpeechRecognitionEvent._create_2(type);
  }
  static _create_1(type, initDict) {
    return new SpeechRecognitionEvent(type, initDict);
  }
  static _create_2(type) {
    return new SpeechRecognitionEvent(type);
  }
  get [$emma]() {
    return this.emma;
  }
  get [$interpretation]() {
    return this.interpretation;
  }
  get [$resultIndex]() {
    return this.resultIndex;
  }
  get [$results]() {
    return this.results;
  }
};
dart.addTypeTests(html$.SpeechRecognitionEvent);
const emma = Symbol("SpeechRecognitionEvent.emma");
const interpretation = Symbol("SpeechRecognitionEvent.interpretation");
const resultIndex = Symbol("SpeechRecognitionEvent.resultIndex");
const results = Symbol("SpeechRecognitionEvent.results");
dart.setLibraryUri(html$.SpeechRecognitionEvent, "dart:html");
dart.setFieldSignature(html$.SpeechRecognitionEvent, () => ({
  __proto__: dart.getFields(html$.SpeechRecognitionEvent.__proto__),
  [$emma]: dart.finalFieldType(html$.Document),
  [$interpretation]: dart.finalFieldType(html$.Document),
  [$resultIndex]: dart.finalFieldType(core.int),
  [$results]: dart.finalFieldType(ListOfSpeechRecognitionResult())
}));
dart.registerExtension("SpeechRecognitionEvent", html$.SpeechRecognitionEvent);
html$.SpeechRecognitionResult = class SpeechRecognitionResult extends _interceptors.Interceptor {
  get [$isFinal]() {
    return this.isFinal;
  }
  get [$length]() {
    return this.length;
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
dart.addTypeTests(html$.SpeechRecognitionResult);
const isFinal = Symbol("SpeechRecognitionResult.isFinal");
const length$13 = Symbol("SpeechRecognitionResult.length");
dart.setMethodSignature(html$.SpeechRecognitionResult, () => ({
  __proto__: dart.getMethods(html$.SpeechRecognitionResult.__proto__),
  [$item]: dart.fnType(html$.SpeechRecognitionAlternative, [core.int])
}));
dart.setLibraryUri(html$.SpeechRecognitionResult, "dart:html");
dart.setFieldSignature(html$.SpeechRecognitionResult, () => ({
  __proto__: dart.getFields(html$.SpeechRecognitionResult.__proto__),
  [$isFinal]: dart.finalFieldType(core.bool),
  [$length]: dart.finalFieldType(core.int)
}));
dart.registerExtension("SpeechRecognitionResult", html$.SpeechRecognitionResult);
const _getVoices = dart.privateName(html$, "_getVoices");
html$.SpeechSynthesis = class SpeechSynthesis extends html$.EventTarget {
  [$getVoices]() {
    let voices = this[_getVoices]();
    if (dart.notNull(voices[$length]) > 0) _js_helper.applyExtension("SpeechSynthesisVoice", voices[$_get](0));
    return voices;
  }
  get [$paused]() {
    return this.paused;
  }
  get [$pending]() {
    return this.pending;
  }
  get [$speaking]() {
    return this.speaking;
  }
  [$cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [_getVoices](...args) {
    return this.getVoices.apply(this, args);
  }
  [$pause](...args) {
    return this.pause.apply(this, args);
  }
  [$resume](...args) {
    return this.resume.apply(this, args);
  }
  [$speak](...args) {
    return this.speak.apply(this, args);
  }
};
dart.addTypeTests(html$.SpeechSynthesis);
const paused$ = Symbol("SpeechSynthesis.paused");
const pending = Symbol("SpeechSynthesis.pending");
const speaking = Symbol("SpeechSynthesis.speaking");
dart.setMethodSignature(html$.SpeechSynthesis, () => ({
  __proto__: dart.getMethods(html$.SpeechSynthesis.__proto__),
  [$getVoices]: dart.fnType(core.List$(html$.SpeechSynthesisVoice), []),
  [$cancel]: dart.fnType(dart.void, []),
  [_getVoices]: dart.fnType(core.List$(html$.SpeechSynthesisVoice), []),
  [$pause]: dart.fnType(dart.void, []),
  [$resume]: dart.fnType(dart.void, []),
  [$speak]: dart.fnType(dart.void, [html$.SpeechSynthesisUtterance])
}));
dart.setLibraryUri(html$.SpeechSynthesis, "dart:html");
dart.setFieldSignature(html$.SpeechSynthesis, () => ({
  __proto__: dart.getFields(html$.SpeechSynthesis.__proto__),
  [$paused]: dart.finalFieldType(core.bool),
  [$pending]: dart.finalFieldType(core.bool),
  [$speaking]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("SpeechSynthesis", html$.SpeechSynthesis);
html$.SpeechSynthesisEvent = class SpeechSynthesisEvent extends html$.Event {
  get [$charIndex]() {
    return this.charIndex;
  }
  get [$elapsedTime]() {
    return this.elapsedTime;
  }
  get [$name]() {
    return this.name;
  }
  get [$utterance]() {
    return this.utterance;
  }
};
dart.addTypeTests(html$.SpeechSynthesisEvent);
const charIndex = Symbol("SpeechSynthesisEvent.charIndex");
const elapsedTime$ = Symbol("SpeechSynthesisEvent.elapsedTime");
const name$36 = Symbol("SpeechSynthesisEvent.name");
const utterance = Symbol("SpeechSynthesisEvent.utterance");
dart.setLibraryUri(html$.SpeechSynthesisEvent, "dart:html");
dart.setFieldSignature(html$.SpeechSynthesisEvent, () => ({
  __proto__: dart.getFields(html$.SpeechSynthesisEvent.__proto__),
  [$charIndex]: dart.finalFieldType(core.int),
  [$elapsedTime]: dart.finalFieldType(core.num),
  [$name]: dart.finalFieldType(core.String),
  [$utterance]: dart.finalFieldType(html$.SpeechSynthesisUtterance)
}));
dart.registerExtension("SpeechSynthesisEvent", html$.SpeechSynthesisEvent);
html$.SpeechSynthesisUtterance = class SpeechSynthesisUtterance$ extends html$.EventTarget {
  static new(text) {
    if (text === void 0) text = null;
    if (text != null) {
      return html$.SpeechSynthesisUtterance._create_1(text);
    }
    return html$.SpeechSynthesisUtterance._create_2();
  }
  static _create_1(text) {
    return new SpeechSynthesisUtterance(text);
  }
  static _create_2() {
    return new SpeechSynthesisUtterance();
  }
  get [$lang]() {
    return this.lang;
  }
  set [$lang](value) {
    this.lang = value;
  }
  get [$pitch]() {
    return this.pitch;
  }
  set [$pitch](value) {
    this.pitch = value;
  }
  get [$rate]() {
    return this.rate;
  }
  set [$rate](value) {
    this.rate = value;
  }
  get [$text]() {
    return this.text;
  }
  set [$text](value) {
    this.text = value;
  }
  get [$voice]() {
    return this.voice;
  }
  set [$voice](value) {
    this.voice = value;
  }
  get [$volume]() {
    return this.volume;
  }
  set [$volume](value) {
    this.volume = value;
  }
  get [$onBoundary]() {
    return html$.SpeechSynthesisUtterance.boundaryEvent.forTarget(this);
  }
  get [$onEnd]() {
    return html$.SpeechSynthesisUtterance.endEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.SpeechSynthesisUtterance.errorEvent.forTarget(this);
  }
  get [$onMark]() {
    return html$.SpeechSynthesisUtterance.markEvent.forTarget(this);
  }
  get [$onPause]() {
    return html$.SpeechSynthesisUtterance.pauseEvent.forTarget(this);
  }
  get [$onResume]() {
    return html$.SpeechSynthesisUtterance.resumeEvent.forTarget(this);
  }
  get [$onStart]() {
    return html$.SpeechSynthesisUtterance.startEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.SpeechSynthesisUtterance);
const lang$1 = Symbol("SpeechSynthesisUtterance.lang");
const pitch = Symbol("SpeechSynthesisUtterance.pitch");
const rate = Symbol("SpeechSynthesisUtterance.rate");
const text$0 = Symbol("SpeechSynthesisUtterance.text");
const voice = Symbol("SpeechSynthesisUtterance.voice");
const volume$ = Symbol("SpeechSynthesisUtterance.volume");
dart.setGetterSignature(html$.SpeechSynthesisUtterance, () => ({
  __proto__: dart.getGetters(html$.SpeechSynthesisUtterance.__proto__),
  [$onBoundary]: async.Stream$(html$.SpeechSynthesisEvent),
  [$onEnd]: async.Stream$(html$.SpeechSynthesisEvent),
  [$onError]: async.Stream$(html$.Event),
  [$onMark]: async.Stream$(html$.SpeechSynthesisEvent),
  [$onPause]: async.Stream$(html$.Event),
  [$onResume]: async.Stream$(html$.SpeechSynthesisEvent),
  [$onStart]: async.Stream$(html$.SpeechSynthesisEvent)
}));
dart.setLibraryUri(html$.SpeechSynthesisUtterance, "dart:html");
dart.setFieldSignature(html$.SpeechSynthesisUtterance, () => ({
  __proto__: dart.getFields(html$.SpeechSynthesisUtterance.__proto__),
  [$lang]: dart.fieldType(core.String),
  [$pitch]: dart.fieldType(core.num),
  [$rate]: dart.fieldType(core.num),
  [$text]: dart.fieldType(core.String),
  [$voice]: dart.fieldType(html$.SpeechSynthesisVoice),
  [$volume]: dart.fieldType(core.num)
}));
dart.defineLazy(html$.SpeechSynthesisUtterance, {
  /*html$.SpeechSynthesisUtterance.boundaryEvent*/get boundaryEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent()).new("boundary"));
  },
  /*html$.SpeechSynthesisUtterance.endEvent*/get endEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent()).new("end"));
  },
  /*html$.SpeechSynthesisUtterance.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.SpeechSynthesisUtterance.markEvent*/get markEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent()).new("mark"));
  },
  /*html$.SpeechSynthesisUtterance.pauseEvent*/get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pause"));
  },
  /*html$.SpeechSynthesisUtterance.resumeEvent*/get resumeEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent()).new("resume"));
  },
  /*html$.SpeechSynthesisUtterance.startEvent*/get startEvent() {
    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent()).new("start"));
  }
});
dart.registerExtension("SpeechSynthesisUtterance", html$.SpeechSynthesisUtterance);
html$.SpeechSynthesisVoice = class SpeechSynthesisVoice extends _interceptors.Interceptor {
  get [$defaultValue]() {
    return this.default;
  }
  get [$lang]() {
    return this.lang;
  }
  get [$localService]() {
    return this.localService;
  }
  get [$name]() {
    return this.name;
  }
  get [$voiceUri]() {
    return this.voiceURI;
  }
};
dart.addTypeTests(html$.SpeechSynthesisVoice);
const defaultValue$0 = Symbol("SpeechSynthesisVoice.defaultValue");
const lang$2 = Symbol("SpeechSynthesisVoice.lang");
const localService = Symbol("SpeechSynthesisVoice.localService");
const name$37 = Symbol("SpeechSynthesisVoice.name");
const voiceUri = Symbol("SpeechSynthesisVoice.voiceUri");
dart.setLibraryUri(html$.SpeechSynthesisVoice, "dart:html");
dart.setFieldSignature(html$.SpeechSynthesisVoice, () => ({
  __proto__: dart.getFields(html$.SpeechSynthesisVoice.__proto__),
  [$defaultValue]: dart.finalFieldType(core.bool),
  [$lang]: dart.finalFieldType(core.String),
  [$localService]: dart.finalFieldType(core.bool),
  [$name]: dart.finalFieldType(core.String),
  [$voiceUri]: dart.finalFieldType(core.String)
}));
dart.registerExtension("SpeechSynthesisVoice", html$.SpeechSynthesisVoice);
html$.StaticRange = class StaticRange extends _interceptors.Interceptor {
  get [$collapsed]() {
    return this.collapsed;
  }
  get [$endContainer]() {
    return this.endContainer;
  }
  get [$endOffset]() {
    return this.endOffset;
  }
  get [$startContainer]() {
    return this.startContainer;
  }
  get [$startOffset]() {
    return this.startOffset;
  }
};
dart.addTypeTests(html$.StaticRange);
const collapsed$ = Symbol("StaticRange.collapsed");
const endContainer$ = Symbol("StaticRange.endContainer");
const endOffset$ = Symbol("StaticRange.endOffset");
const startContainer$ = Symbol("StaticRange.startContainer");
const startOffset$ = Symbol("StaticRange.startOffset");
dart.setLibraryUri(html$.StaticRange, "dart:html");
dart.setFieldSignature(html$.StaticRange, () => ({
  __proto__: dart.getFields(html$.StaticRange.__proto__),
  [$collapsed]: dart.finalFieldType(core.bool),
  [$endContainer]: dart.finalFieldType(html$.Node),
  [$endOffset]: dart.finalFieldType(core.int),
  [$startContainer]: dart.finalFieldType(html$.Node),
  [$startOffset]: dart.finalFieldType(core.int)
}));
dart.registerExtension("StaticRange", html$.StaticRange);
const _setItem = dart.privateName(html$, "_setItem");
const _removeItem = dart.privateName(html$, "_removeItem");
const _key = dart.privateName(html$, "_key");
const _length$2 = dart.privateName(html$, "_length");
const Interceptor_MapMixin$$1 = class Interceptor_MapMixin extends _interceptors.Interceptor {};
(Interceptor_MapMixin$$1.new = function() {
  Interceptor_MapMixin$$1.__proto__.new.call(this);
}).prototype = Interceptor_MapMixin$$1.prototype;
dart.applyMixin(Interceptor_MapMixin$$1, collection.MapMixin$(core.String, core.String));
html$.Storage = class Storage extends Interceptor_MapMixin$$1 {
  [$addAll](other) {
    MapOfString$String()._check(other);
    other[$forEach](dart.fn((k, v) => {
      this[$_set](k, v);
    }, StringAndStringToNull()));
  }
  [$containsValue](value) {
    return this[$values][$any](dart.fn(e => core.identical(e, value), StringTobool()));
  }
  [$containsKey](key) {
    return this[_getItem](core.String._check(key)) != null;
  }
  [$_get](key) {
    return this[_getItem](core.String._check(key));
  }
  [$_set](key, value) {
    core.String._check(key);
    core.String._check(value);
    this[_setItem](key, value);
    return value;
  }
  [$putIfAbsent](key, ifAbsent) {
    core.String._check(key);
    VoidToString()._check(ifAbsent);
    if (!dart.test(this[$containsKey](key))) this[$_set](key, ifAbsent());
    return this[$_get](key);
  }
  [$remove](key) {
    let value = this[$_get](key);
    this[_removeItem](core.String._check(key));
    return value;
  }
  [$clear]() {
    return this[_clear$0]();
  }
  [$forEach](f) {
    for (let i = 0; true; i++) {
      let key = this[_key](i);
      if (key == null) return;
      f(key, this[$_get](key));
    }
  }
  get [$keys]() {
    let keys = JSArrayOfString().of([]);
    this[$forEach](dart.fn((k, v) => keys[$add](k), StringAndStringTovoid()));
    return keys;
  }
  get [$values]() {
    let values = JSArrayOfString().of([]);
    this[$forEach](dart.fn((k, v) => values[$add](v), StringAndStringTovoid()));
    return values;
  }
  get [$length]() {
    return this[_length$2];
  }
  get [$isEmpty]() {
    return this[_key](0) == null;
  }
  get [$isNotEmpty]() {
    return !dart.test(this[$isEmpty]);
  }
  get [_length$2]() {
    return this.length;
  }
  [_clear$0](...args) {
    return this.clear.apply(this, args);
  }
  [_getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [_key](...args) {
    return this.key.apply(this, args);
  }
  [_removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [_setItem](...args) {
    return this.setItem.apply(this, args);
  }
};
dart.addTypeTests(html$.Storage);
dart.setMethodSignature(html$.Storage, () => ({
  __proto__: dart.getMethods(html$.Storage.__proto__),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [core.Object]),
  [$containsKey]: dart.fnType(core.bool, [core.Object]),
  [$_get]: dart.fnType(core.String, [core.Object]),
  [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
  [$putIfAbsent]: dart.fnType(core.String, [core.Object, core.Object]),
  [$remove]: dart.fnType(core.String, [core.Object]),
  [$clear]: dart.fnType(dart.void, []),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, core.String])]),
  [_clear$0]: dart.fnType(dart.void, []),
  [_getItem]: dart.fnType(core.String, [core.String]),
  [_key]: dart.fnType(core.String, [core.int]),
  [_removeItem]: dart.fnType(dart.void, [core.String]),
  [_setItem]: dart.fnType(dart.void, [core.String, core.String])
}));
dart.setGetterSignature(html$.Storage, () => ({
  __proto__: dart.getGetters(html$.Storage.__proto__),
  [$keys]: core.Iterable$(core.String),
  [$values]: core.Iterable$(core.String),
  [$length]: core.int,
  [$isEmpty]: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setLibraryUri(html$.Storage, "dart:html");
dart.setFieldSignature(html$.Storage, () => ({
  __proto__: dart.getFields(html$.Storage.__proto__),
  [_length$2]: dart.finalFieldType(core.int)
}));
dart.registerExtension("Storage", html$.Storage);
const _initStorageEvent = dart.privateName(html$, "_initStorageEvent");
html$.StorageEvent = class StorageEvent$ extends html$.Event {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
    let key = opts && 'key' in opts ? opts.key : null;
    let oldValue = opts && 'oldValue' in opts ? opts.oldValue : null;
    let newValue = opts && 'newValue' in opts ? opts.newValue : null;
    let url = opts && 'url' in opts ? opts.url : null;
    let storageArea = opts && 'storageArea' in opts ? opts.storageArea : null;
    let e = html$.StorageEvent._check(html$.document[_createEvent]("StorageEvent"));
    e[_initStorageEvent](type, canBubble, cancelable, key, oldValue, newValue, url, storageArea);
    return e;
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.StorageEvent._create_1(type, eventInitDict_1);
    }
    return html$.StorageEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new StorageEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new StorageEvent(type);
  }
  get [$key]() {
    return this.key;
  }
  get [$newValue]() {
    return this.newValue;
  }
  get [$oldValue]() {
    return this.oldValue;
  }
  get [$storageArea]() {
    return this.storageArea;
  }
  get [$url]() {
    return this.url;
  }
  [_initStorageEvent](...args) {
    return this.initStorageEvent.apply(this, args);
  }
};
dart.addTypeTests(html$.StorageEvent);
const key$1 = Symbol("StorageEvent.key");
const newValue$ = Symbol("StorageEvent.newValue");
const oldValue$ = Symbol("StorageEvent.oldValue");
const storageArea = Symbol("StorageEvent.storageArea");
const url$4 = Symbol("StorageEvent.url");
dart.setMethodSignature(html$.StorageEvent, () => ({
  __proto__: dart.getMethods(html$.StorageEvent.__proto__),
  [_initStorageEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, core.String, core.String, core.String, core.String, html$.Storage])
}));
dart.setLibraryUri(html$.StorageEvent, "dart:html");
dart.setFieldSignature(html$.StorageEvent, () => ({
  __proto__: dart.getFields(html$.StorageEvent.__proto__),
  [$key]: dart.finalFieldType(core.String),
  [$newValue]: dart.finalFieldType(core.String),
  [$oldValue]: dart.finalFieldType(core.String),
  [$storageArea]: dart.finalFieldType(html$.Storage),
  [$url]: dart.finalFieldType(core.String)
}));
dart.registerExtension("StorageEvent", html$.StorageEvent);
html$.StorageManager = class StorageManager extends _interceptors.Interceptor {
  [$estimate]() {
    return html$.promiseToFutureAsMap(this.estimate());
  }
  [$persist]() {
    return html$.promiseToFuture(core.bool, this.persist());
  }
  [$persisted]() {
    return html$.promiseToFuture(core.bool, this.persisted());
  }
};
dart.addTypeTests(html$.StorageManager);
dart.setMethodSignature(html$.StorageManager, () => ({
  __proto__: dart.getMethods(html$.StorageManager.__proto__),
  [$estimate]: dart.fnType(async.Future$(core.Map$(core.String, dart.dynamic)), []),
  [$persist]: dart.fnType(async.Future$(core.bool), []),
  [$persisted]: dart.fnType(async.Future$(core.bool), [])
}));
dart.setLibraryUri(html$.StorageManager, "dart:html");
dart.registerExtension("StorageManager", html$.StorageManager);
html$.StyleElement = class StyleElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("style");
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$media]() {
    return this.media;
  }
  set [$media](value) {
    this.media = value;
  }
  get [$sheet]() {
    return this.sheet;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
};
(html$.StyleElement.created = function() {
  this[disabled$8] = null;
  this[media$5] = null;
  this[sheet$0] = null;
  this[type$33] = null;
  html$.StyleElement.__proto__.created.call(this);
}).prototype = html$.StyleElement.prototype;
dart.addTypeTests(html$.StyleElement);
const disabled$8 = Symbol("StyleElement.disabled");
const media$5 = Symbol("StyleElement.media");
const sheet$0 = Symbol("StyleElement.sheet");
const type$33 = Symbol("StyleElement.type");
dart.setLibraryUri(html$.StyleElement, "dart:html");
dart.setFieldSignature(html$.StyleElement, () => ({
  __proto__: dart.getFields(html$.StyleElement.__proto__),
  [$disabled]: dart.fieldType(core.bool),
  [$media]: dart.fieldType(core.String),
  [$sheet]: dart.finalFieldType(html$.StyleSheet),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLStyleElement", html$.StyleElement);
html$.StyleMedia = class StyleMedia extends _interceptors.Interceptor {
  get [$type]() {
    return this.type;
  }
  [$matchMedium](...args) {
    return this.matchMedium.apply(this, args);
  }
};
dart.addTypeTests(html$.StyleMedia);
const type$34 = Symbol("StyleMedia.type");
dart.setMethodSignature(html$.StyleMedia, () => ({
  __proto__: dart.getMethods(html$.StyleMedia.__proto__),
  [$matchMedium]: dart.fnType(core.bool, [core.String])
}));
dart.setLibraryUri(html$.StyleMedia, "dart:html");
dart.setFieldSignature(html$.StyleMedia, () => ({
  __proto__: dart.getFields(html$.StyleMedia.__proto__),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("StyleMedia", html$.StyleMedia);
html$.StylePropertyMapReadonly = class StylePropertyMapReadonly extends _interceptors.Interceptor {
  [$get](...args) {
    return this.get.apply(this, args);
  }
  [$getAll](...args) {
    return this.getAll.apply(this, args);
  }
  [$getProperties](...args) {
    return this.getProperties.apply(this, args);
  }
  [$has](...args) {
    return this.has.apply(this, args);
  }
};
dart.addTypeTests(html$.StylePropertyMapReadonly);
dart.setMethodSignature(html$.StylePropertyMapReadonly, () => ({
  __proto__: dart.getMethods(html$.StylePropertyMapReadonly.__proto__),
  [$get]: dart.fnType(html$.CssStyleValue, [core.String]),
  [$getAll]: dart.fnType(core.List$(html$.CssStyleValue), [core.String]),
  [$getProperties]: dart.fnType(core.List$(core.String), []),
  [$has]: dart.fnType(core.bool, [core.String])
}));
dart.setLibraryUri(html$.StylePropertyMapReadonly, "dart:html");
dart.registerExtension("StylePropertyMapReadonly", html$.StylePropertyMapReadonly);
html$.StylePropertyMap = class StylePropertyMap extends html$.StylePropertyMapReadonly {
  [$append](...args) {
    return this.append.apply(this, args);
  }
  [$delete](...args) {
    return this.delete.apply(this, args);
  }
  [$set](...args) {
    return this.set.apply(this, args);
  }
};
dart.addTypeTests(html$.StylePropertyMap);
dart.setMethodSignature(html$.StylePropertyMap, () => ({
  __proto__: dart.getMethods(html$.StylePropertyMap.__proto__),
  [$append]: dart.fnType(dart.void, [core.String, core.Object]),
  [$delete]: dart.fnType(dart.void, [core.String]),
  [$set]: dart.fnType(dart.void, [core.String, core.Object])
}));
dart.setLibraryUri(html$.StylePropertyMap, "dart:html");
dart.registerExtension("StylePropertyMap", html$.StylePropertyMap);
html$.SyncEvent = class SyncEvent$ extends html$.ExtendableEvent {
  static new(type, init) {
    let init_1 = html_common.convertDartToNative_Dictionary(init);
    return html$.SyncEvent._create_1(type, init_1);
  }
  static _create_1(type, init) {
    return new SyncEvent(type, init);
  }
  get [$lastChance]() {
    return this.lastChance;
  }
  get [$tag]() {
    return this.tag;
  }
};
dart.addTypeTests(html$.SyncEvent);
const lastChance = Symbol("SyncEvent.lastChance");
const tag$ = Symbol("SyncEvent.tag");
dart.setLibraryUri(html$.SyncEvent, "dart:html");
dart.setFieldSignature(html$.SyncEvent, () => ({
  __proto__: dart.getFields(html$.SyncEvent.__proto__),
  [$lastChance]: dart.finalFieldType(core.bool),
  [$tag]: dart.finalFieldType(core.String)
}));
dart.registerExtension("SyncEvent", html$.SyncEvent);
html$.SyncManager = class SyncManager extends _interceptors.Interceptor {
  [$getTags]() {
    return html$.promiseToFuture(ListOfString(), this.getTags());
  }
  [$register](tag) {
    return html$.promiseToFuture(dart.dynamic, this.register(tag));
  }
};
dart.addTypeTests(html$.SyncManager);
dart.setMethodSignature(html$.SyncManager, () => ({
  __proto__: dart.getMethods(html$.SyncManager.__proto__),
  [$getTags]: dart.fnType(async.Future$(core.List$(core.String)), []),
  [$register]: dart.fnType(async.Future, [core.String])
}));
dart.setLibraryUri(html$.SyncManager, "dart:html");
dart.registerExtension("SyncManager", html$.SyncManager);
html$.TableCaptionElement = class TableCaptionElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("caption");
  }
};
(html$.TableCaptionElement.created = function() {
  html$.TableCaptionElement.__proto__.created.call(this);
}).prototype = html$.TableCaptionElement.prototype;
dart.addTypeTests(html$.TableCaptionElement);
dart.setLibraryUri(html$.TableCaptionElement, "dart:html");
dart.registerExtension("HTMLTableCaptionElement", html$.TableCaptionElement);
html$.TableCellElement = class TableCellElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("td");
  }
  get [$cellIndex]() {
    return this.cellIndex;
  }
  get [$colSpan]() {
    return this.colSpan;
  }
  set [$colSpan](value) {
    this.colSpan = value;
  }
  get [$headers]() {
    return this.headers;
  }
  set [$headers](value) {
    this.headers = value;
  }
  get [$rowSpan]() {
    return this.rowSpan;
  }
  set [$rowSpan](value) {
    this.rowSpan = value;
  }
};
(html$.TableCellElement.created = function() {
  this[cellIndex] = null;
  this[colSpan$] = null;
  this[headers] = null;
  this[rowSpan$] = null;
  html$.TableCellElement.__proto__.created.call(this);
}).prototype = html$.TableCellElement.prototype;
dart.addTypeTests(html$.TableCellElement);
const cellIndex = Symbol("TableCellElement.cellIndex");
const colSpan$ = Symbol("TableCellElement.colSpan");
const headers = Symbol("TableCellElement.headers");
const rowSpan$ = Symbol("TableCellElement.rowSpan");
dart.setLibraryUri(html$.TableCellElement, "dart:html");
dart.setFieldSignature(html$.TableCellElement, () => ({
  __proto__: dart.getFields(html$.TableCellElement.__proto__),
  [$cellIndex]: dart.finalFieldType(core.int),
  [$colSpan]: dart.fieldType(core.int),
  [$headers]: dart.fieldType(core.String),
  [$rowSpan]: dart.fieldType(core.int)
}));
dart.registerExtension("HTMLTableCellElement", html$.TableCellElement);
dart.registerExtension("HTMLTableDataCellElement", html$.TableCellElement);
dart.registerExtension("HTMLTableHeaderCellElement", html$.TableCellElement);
html$.TableColElement = class TableColElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("col");
  }
  get [$span]() {
    return this.span;
  }
  set [$span](value) {
    this.span = value;
  }
};
(html$.TableColElement.created = function() {
  this[span] = null;
  html$.TableColElement.__proto__.created.call(this);
}).prototype = html$.TableColElement.prototype;
dart.addTypeTests(html$.TableColElement);
const span = Symbol("TableColElement.span");
dart.setLibraryUri(html$.TableColElement, "dart:html");
dart.setFieldSignature(html$.TableColElement, () => ({
  __proto__: dart.getFields(html$.TableColElement.__proto__),
  [$span]: dart.fieldType(core.int)
}));
dart.registerExtension("HTMLTableColElement", html$.TableColElement);
const _rows = dart.privateName(html$, "_rows");
const _tBodies = dart.privateName(html$, "_tBodies");
const _createCaption = dart.privateName(html$, "_createCaption");
const _createTBody = dart.privateName(html$, "_createTBody");
const _createTFoot = dart.privateName(html$, "_createTFoot");
const _createTHead = dart.privateName(html$, "_createTHead");
const _insertRow = dart.privateName(html$, "_insertRow");
const _nativeCreateTBody = dart.privateName(html$, "_nativeCreateTBody");
html$.TableElement = class TableElement extends html$.HtmlElement {
  get [$tBodies]() {
    return new (_WrappedListOfTableSectionElement()).new(this[_tBodies]);
  }
  get [$rows]() {
    return new (_WrappedListOfTableRowElement()).new(this[_rows]);
  }
  [$addRow]() {
    return this[$insertRow](-1);
  }
  [$createCaption]() {
    return this[_createCaption]();
  }
  [$createTBody]() {
    return this[_createTBody]();
  }
  [$createTFoot]() {
    return this[_createTFoot]();
  }
  [$createTHead]() {
    return this[_createTHead]();
  }
  [$insertRow](index) {
    return this[_insertRow](index);
  }
  [_createTBody]() {
    if (!!this.createTBody) {
      return this[_nativeCreateTBody]();
    }
    let tbody = html$.Element.tag("tbody");
    this[$children][$add](tbody);
    return html$.TableSectionElement._check(tbody);
  }
  [_nativeCreateTBody](...args) {
    return this.createTBody.apply(this, args);
  }
  [$createFragment](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
      return super[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    }
    let contextualHtml = "<table>" + dart.str(html) + "</table>";
    let table = html$.Element.html(contextualHtml, {validator: validator, treeSanitizer: treeSanitizer});
    let fragment = html$.DocumentFragment.new();
    fragment[$nodes][$addAll](table[$nodes]);
    return fragment;
  }
  static new() {
    return html$.document.createElement("table");
  }
  get [$caption]() {
    return this.caption;
  }
  set [$caption](value) {
    this.caption = value;
  }
  get [_rows]() {
    return this.rows;
  }
  get [_tBodies]() {
    return this.tBodies;
  }
  get [$tFoot]() {
    return this.tFoot;
  }
  set [$tFoot](value) {
    this.tFoot = value;
  }
  get [$tHead]() {
    return this.tHead;
  }
  set [$tHead](value) {
    this.tHead = value;
  }
  [_createCaption](...args) {
    return this.createCaption.apply(this, args);
  }
  [_createTFoot](...args) {
    return this.createTFoot.apply(this, args);
  }
  [_createTHead](...args) {
    return this.createTHead.apply(this, args);
  }
  [$deleteCaption](...args) {
    return this.deleteCaption.apply(this, args);
  }
  [$deleteRow](...args) {
    return this.deleteRow.apply(this, args);
  }
  [$deleteTFoot](...args) {
    return this.deleteTFoot.apply(this, args);
  }
  [$deleteTHead](...args) {
    return this.deleteTHead.apply(this, args);
  }
  [_insertRow](...args) {
    return this.insertRow.apply(this, args);
  }
};
(html$.TableElement.created = function() {
  this[caption] = null;
  this[_rows] = null;
  this[_tBodies] = null;
  this[tFoot] = null;
  this[tHead] = null;
  html$.TableElement.__proto__.created.call(this);
}).prototype = html$.TableElement.prototype;
dart.addTypeTests(html$.TableElement);
const caption = Symbol("TableElement.caption");
const tFoot = Symbol("TableElement.tFoot");
const tHead = Symbol("TableElement.tHead");
dart.setMethodSignature(html$.TableElement, () => ({
  __proto__: dart.getMethods(html$.TableElement.__proto__),
  [$addRow]: dart.fnType(html$.TableRowElement, []),
  [$createCaption]: dart.fnType(html$.TableCaptionElement, []),
  [$createTBody]: dart.fnType(html$.TableSectionElement, []),
  [$createTFoot]: dart.fnType(html$.TableSectionElement, []),
  [$createTHead]: dart.fnType(html$.TableSectionElement, []),
  [$insertRow]: dart.fnType(html$.TableRowElement, [core.int]),
  [_createTBody]: dart.fnType(html$.TableSectionElement, []),
  [_nativeCreateTBody]: dart.fnType(html$.TableSectionElement, []),
  [_createCaption]: dart.fnType(html$.TableCaptionElement, []),
  [_createTFoot]: dart.fnType(html$.TableSectionElement, []),
  [_createTHead]: dart.fnType(html$.TableSectionElement, []),
  [$deleteCaption]: dart.fnType(dart.void, []),
  [$deleteRow]: dart.fnType(dart.void, [core.int]),
  [$deleteTFoot]: dart.fnType(dart.void, []),
  [$deleteTHead]: dart.fnType(dart.void, []),
  [_insertRow]: dart.fnType(html$.TableRowElement, [], [core.int])
}));
dart.setGetterSignature(html$.TableElement, () => ({
  __proto__: dart.getGetters(html$.TableElement.__proto__),
  [$tBodies]: core.List$(html$.TableSectionElement),
  [$rows]: core.List$(html$.TableRowElement)
}));
dart.setLibraryUri(html$.TableElement, "dart:html");
dart.setFieldSignature(html$.TableElement, () => ({
  __proto__: dart.getFields(html$.TableElement.__proto__),
  [$caption]: dart.fieldType(html$.TableCaptionElement),
  [_rows]: dart.finalFieldType(ListOfNode()),
  [_tBodies]: dart.finalFieldType(ListOfNode()),
  [$tFoot]: dart.fieldType(html$.TableSectionElement),
  [$tHead]: dart.fieldType(html$.TableSectionElement)
}));
dart.registerExtension("HTMLTableElement", html$.TableElement);
const _cells = dart.privateName(html$, "_cells");
const _insertCell = dart.privateName(html$, "_insertCell");
html$.TableRowElement = class TableRowElement extends html$.HtmlElement {
  get [$cells]() {
    return new (_WrappedListOfTableCellElement()).new(this[_cells]);
  }
  [$addCell]() {
    return this[$insertCell](-1);
  }
  [$insertCell](index) {
    return html$.TableCellElement._check(this[_insertCell](index));
  }
  [$createFragment](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
      return super[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    }
    let fragment = html$.DocumentFragment.new();
    let section = html$.TableElement.new()[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[$nodes][$single];
    let row = section[$nodes][$single];
    fragment[$nodes][$addAll](row[$nodes]);
    return fragment;
  }
  static new() {
    return html$.document.createElement("tr");
  }
  get [_cells]() {
    return this.cells;
  }
  get [$rowIndex]() {
    return this.rowIndex;
  }
  get [$sectionRowIndex]() {
    return this.sectionRowIndex;
  }
  [$deleteCell](...args) {
    return this.deleteCell.apply(this, args);
  }
  [_insertCell](...args) {
    return this.insertCell.apply(this, args);
  }
};
(html$.TableRowElement.created = function() {
  this[_cells] = null;
  this[rowIndex$] = null;
  this[sectionRowIndex] = null;
  html$.TableRowElement.__proto__.created.call(this);
}).prototype = html$.TableRowElement.prototype;
dart.addTypeTests(html$.TableRowElement);
const rowIndex$ = Symbol("TableRowElement.rowIndex");
const sectionRowIndex = Symbol("TableRowElement.sectionRowIndex");
dart.setMethodSignature(html$.TableRowElement, () => ({
  __proto__: dart.getMethods(html$.TableRowElement.__proto__),
  [$addCell]: dart.fnType(html$.TableCellElement, []),
  [$insertCell]: dart.fnType(html$.TableCellElement, [core.int]),
  [$deleteCell]: dart.fnType(dart.void, [core.int]),
  [_insertCell]: dart.fnType(html$.HtmlElement, [], [core.int])
}));
dart.setGetterSignature(html$.TableRowElement, () => ({
  __proto__: dart.getGetters(html$.TableRowElement.__proto__),
  [$cells]: core.List$(html$.TableCellElement)
}));
dart.setLibraryUri(html$.TableRowElement, "dart:html");
dart.setFieldSignature(html$.TableRowElement, () => ({
  __proto__: dart.getFields(html$.TableRowElement.__proto__),
  [_cells]: dart.finalFieldType(ListOfNode()),
  [$rowIndex]: dart.finalFieldType(core.int),
  [$sectionRowIndex]: dart.finalFieldType(core.int)
}));
dart.registerExtension("HTMLTableRowElement", html$.TableRowElement);
html$.TableSectionElement = class TableSectionElement extends html$.HtmlElement {
  get [$rows]() {
    return new (_WrappedListOfTableRowElement()).new(this[_rows]);
  }
  [$addRow]() {
    return this[$insertRow](-1);
  }
  [$insertRow](index) {
    return html$.TableRowElement._check(this[_insertRow](index));
  }
  [$createFragment](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
      return super[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    }
    let fragment = html$.DocumentFragment.new();
    let section = html$.TableElement.new()[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[$nodes][$single];
    fragment[$nodes][$addAll](section[$nodes]);
    return fragment;
  }
  get [_rows]() {
    return this.rows;
  }
  [$deleteRow](...args) {
    return this.deleteRow.apply(this, args);
  }
  [_insertRow](...args) {
    return this.insertRow.apply(this, args);
  }
};
(html$.TableSectionElement.created = function() {
  this[_rows] = null;
  html$.TableSectionElement.__proto__.created.call(this);
}).prototype = html$.TableSectionElement.prototype;
dart.addTypeTests(html$.TableSectionElement);
dart.setMethodSignature(html$.TableSectionElement, () => ({
  __proto__: dart.getMethods(html$.TableSectionElement.__proto__),
  [$addRow]: dart.fnType(html$.TableRowElement, []),
  [$insertRow]: dart.fnType(html$.TableRowElement, [core.int]),
  [$deleteRow]: dart.fnType(dart.void, [core.int]),
  [_insertRow]: dart.fnType(html$.HtmlElement, [], [core.int])
}));
dart.setGetterSignature(html$.TableSectionElement, () => ({
  __proto__: dart.getGetters(html$.TableSectionElement.__proto__),
  [$rows]: core.List$(html$.TableRowElement)
}));
dart.setLibraryUri(html$.TableSectionElement, "dart:html");
dart.setFieldSignature(html$.TableSectionElement, () => ({
  __proto__: dart.getFields(html$.TableSectionElement.__proto__),
  [_rows]: dart.finalFieldType(ListOfNode())
}));
dart.registerExtension("HTMLTableSectionElement", html$.TableSectionElement);
html$.TaskAttributionTiming = class TaskAttributionTiming extends html$.PerformanceEntry {
  get [$containerId]() {
    return this.containerId;
  }
  get [$containerName]() {
    return this.containerName;
  }
  get [$containerSrc]() {
    return this.containerSrc;
  }
  get [$containerType]() {
    return this.containerType;
  }
  get [$scriptUrl]() {
    return this.scriptURL;
  }
};
dart.addTypeTests(html$.TaskAttributionTiming);
const containerId = Symbol("TaskAttributionTiming.containerId");
const containerName = Symbol("TaskAttributionTiming.containerName");
const containerSrc = Symbol("TaskAttributionTiming.containerSrc");
const containerType = Symbol("TaskAttributionTiming.containerType");
const scriptUrl$ = Symbol("TaskAttributionTiming.scriptUrl");
dart.setLibraryUri(html$.TaskAttributionTiming, "dart:html");
dart.setFieldSignature(html$.TaskAttributionTiming, () => ({
  __proto__: dart.getFields(html$.TaskAttributionTiming.__proto__),
  [$containerId]: dart.finalFieldType(core.String),
  [$containerName]: dart.finalFieldType(core.String),
  [$containerSrc]: dart.finalFieldType(core.String),
  [$containerType]: dart.finalFieldType(core.String),
  [$scriptUrl]: dart.finalFieldType(core.String)
}));
dart.registerExtension("TaskAttributionTiming", html$.TaskAttributionTiming);
html$.TemplateElement = class TemplateElement extends html$.HtmlElement {
  static new() {
    return html$.TemplateElement._check(html$.document[$createElement]("template"));
  }
  static get supported() {
    return html$.Element.isTagSupported("template");
  }
  get [$content]() {
    return this.content;
  }
  [$setInnerHtml](html, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    this[$text] = null;
    let fragment = this[$createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    this.content[$append](fragment);
  }
};
(html$.TemplateElement.created = function() {
  this[content$] = null;
  html$.TemplateElement.__proto__.created.call(this);
}).prototype = html$.TemplateElement.prototype;
dart.addTypeTests(html$.TemplateElement);
const content$ = Symbol("TemplateElement.content");
dart.setLibraryUri(html$.TemplateElement, "dart:html");
dart.setFieldSignature(html$.TemplateElement, () => ({
  __proto__: dart.getFields(html$.TemplateElement.__proto__),
  [$content]: dart.finalFieldType(html$.DocumentFragment)
}));
dart.registerExtension("HTMLTemplateElement", html$.TemplateElement);
html$.TextAreaElement = class TextAreaElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("textarea");
  }
  get [$autocapitalize]() {
    return this.autocapitalize;
  }
  set [$autocapitalize](value) {
    this.autocapitalize = value;
  }
  get [$autofocus]() {
    return this.autofocus;
  }
  set [$autofocus](value) {
    this.autofocus = value;
  }
  get [$cols]() {
    return this.cols;
  }
  set [$cols](value) {
    this.cols = value;
  }
  get [$defaultValue]() {
    return this.defaultValue;
  }
  set [$defaultValue](value) {
    this.defaultValue = value;
  }
  get [$dirName]() {
    return this.dirName;
  }
  set [$dirName](value) {
    this.dirName = value;
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$form]() {
    return this.form;
  }
  get [$labels]() {
    return this.labels;
  }
  get [$maxLength]() {
    return this.maxLength;
  }
  set [$maxLength](value) {
    this.maxLength = value;
  }
  get [$minLength]() {
    return this.minLength;
  }
  set [$minLength](value) {
    this.minLength = value;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$placeholder]() {
    return this.placeholder;
  }
  set [$placeholder](value) {
    this.placeholder = value;
  }
  get [$readOnly]() {
    return this.readOnly;
  }
  set [$readOnly](value) {
    this.readOnly = value;
  }
  get [$required]() {
    return this.required;
  }
  set [$required](value) {
    this.required = value;
  }
  get [$rows]() {
    return this.rows;
  }
  set [$rows](value) {
    this.rows = value;
  }
  get [$selectionDirection]() {
    return this.selectionDirection;
  }
  set [$selectionDirection](value) {
    this.selectionDirection = value;
  }
  get [$selectionEnd]() {
    return this.selectionEnd;
  }
  set [$selectionEnd](value) {
    this.selectionEnd = value;
  }
  get [$selectionStart]() {
    return this.selectionStart;
  }
  set [$selectionStart](value) {
    this.selectionStart = value;
  }
  get [$textLength]() {
    return this.textLength;
  }
  get [$type]() {
    return this.type;
  }
  get [$validationMessage]() {
    return this.validationMessage;
  }
  get [$validity]() {
    return this.validity;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  get [$willValidate]() {
    return this.willValidate;
  }
  get [$wrap]() {
    return this.wrap;
  }
  set [$wrap](value) {
    this.wrap = value;
  }
  [$checkValidity](...args) {
    return this.checkValidity.apply(this, args);
  }
  [$reportValidity](...args) {
    return this.reportValidity.apply(this, args);
  }
  [$select](...args) {
    return this.select.apply(this, args);
  }
  [$setCustomValidity](...args) {
    return this.setCustomValidity.apply(this, args);
  }
  [$setRangeText](...args) {
    return this.setRangeText.apply(this, args);
  }
  [$setSelectionRange](...args) {
    return this.setSelectionRange.apply(this, args);
  }
};
(html$.TextAreaElement.created = function() {
  this[autocapitalize$] = null;
  this[autofocus$3] = null;
  this[cols] = null;
  this[defaultValue$1] = null;
  this[dirName$1] = null;
  this[disabled$9] = null;
  this[form$7] = null;
  this[labels$4] = null;
  this[maxLength$1] = null;
  this[minLength$] = null;
  this[name$38] = null;
  this[placeholder$3] = null;
  this[readOnly$8] = null;
  this[required$12] = null;
  this[rows] = null;
  this[selectionDirection$0] = null;
  this[selectionEnd$0] = null;
  this[selectionStart$0] = null;
  this[textLength] = null;
  this[type$35] = null;
  this[validationMessage$4] = null;
  this[validity$4] = null;
  this[value$17] = null;
  this[willValidate$4] = null;
  this[wrap] = null;
  html$.TextAreaElement.__proto__.created.call(this);
}).prototype = html$.TextAreaElement.prototype;
dart.addTypeTests(html$.TextAreaElement);
const autocapitalize$ = Symbol("TextAreaElement.autocapitalize");
const autofocus$3 = Symbol("TextAreaElement.autofocus");
const cols = Symbol("TextAreaElement.cols");
const defaultValue$1 = Symbol("TextAreaElement.defaultValue");
const dirName$1 = Symbol("TextAreaElement.dirName");
const disabled$9 = Symbol("TextAreaElement.disabled");
const form$7 = Symbol("TextAreaElement.form");
const labels$4 = Symbol("TextAreaElement.labels");
const maxLength$1 = Symbol("TextAreaElement.maxLength");
const minLength$ = Symbol("TextAreaElement.minLength");
const name$38 = Symbol("TextAreaElement.name");
const placeholder$3 = Symbol("TextAreaElement.placeholder");
const readOnly$8 = Symbol("TextAreaElement.readOnly");
const required$12 = Symbol("TextAreaElement.required");
const rows = Symbol("TextAreaElement.rows");
const selectionDirection$0 = Symbol("TextAreaElement.selectionDirection");
const selectionEnd$0 = Symbol("TextAreaElement.selectionEnd");
const selectionStart$0 = Symbol("TextAreaElement.selectionStart");
const textLength = Symbol("TextAreaElement.textLength");
const type$35 = Symbol("TextAreaElement.type");
const validationMessage$4 = Symbol("TextAreaElement.validationMessage");
const validity$4 = Symbol("TextAreaElement.validity");
const value$17 = Symbol("TextAreaElement.value");
const willValidate$4 = Symbol("TextAreaElement.willValidate");
const wrap = Symbol("TextAreaElement.wrap");
dart.setMethodSignature(html$.TextAreaElement, () => ({
  __proto__: dart.getMethods(html$.TextAreaElement.__proto__),
  [$checkValidity]: dart.fnType(core.bool, []),
  [$reportValidity]: dart.fnType(core.bool, []),
  [$select]: dart.fnType(dart.void, []),
  [$setCustomValidity]: dart.fnType(dart.void, [core.String]),
  [$setRangeText]: dart.fnType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
  [$setSelectionRange]: dart.fnType(dart.void, [core.int, core.int], [core.String])
}));
dart.setLibraryUri(html$.TextAreaElement, "dart:html");
dart.setFieldSignature(html$.TextAreaElement, () => ({
  __proto__: dart.getFields(html$.TextAreaElement.__proto__),
  [$autocapitalize]: dart.fieldType(core.String),
  [$autofocus]: dart.fieldType(core.bool),
  [$cols]: dart.fieldType(core.int),
  [$defaultValue]: dart.fieldType(core.String),
  [$dirName]: dart.fieldType(core.String),
  [$disabled]: dart.fieldType(core.bool),
  [$form]: dart.finalFieldType(html$.FormElement),
  [$labels]: dart.finalFieldType(ListOfNode()),
  [$maxLength]: dart.fieldType(core.int),
  [$minLength]: dart.fieldType(core.int),
  [$name]: dart.fieldType(core.String),
  [$placeholder]: dart.fieldType(core.String),
  [$readOnly]: dart.fieldType(core.bool),
  [$required]: dart.fieldType(core.bool),
  [$rows]: dart.fieldType(core.int),
  [$selectionDirection]: dart.fieldType(core.String),
  [$selectionEnd]: dart.fieldType(core.int),
  [$selectionStart]: dart.fieldType(core.int),
  [$textLength]: dart.finalFieldType(core.int),
  [$type]: dart.finalFieldType(core.String),
  [$validationMessage]: dart.finalFieldType(core.String),
  [$validity]: dart.finalFieldType(html$.ValidityState),
  [$value]: dart.fieldType(core.String),
  [$willValidate]: dart.finalFieldType(core.bool),
  [$wrap]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLTextAreaElement", html$.TextAreaElement);
html$.TextDetector = class TextDetector$ extends _interceptors.Interceptor {
  static new() {
    return html$.TextDetector._create_1();
  }
  static _create_1() {
    return new TextDetector();
  }
  [$detect](image) {
    return html$.promiseToFuture(ListOfDetectedText(), this.detect(image));
  }
};
dart.addTypeTests(html$.TextDetector);
dart.setMethodSignature(html$.TextDetector, () => ({
  __proto__: dart.getMethods(html$.TextDetector.__proto__),
  [$detect]: dart.fnType(async.Future$(core.List$(html$.DetectedText)), [dart.dynamic])
}));
dart.setLibraryUri(html$.TextDetector, "dart:html");
dart.registerExtension("TextDetector", html$.TextDetector);
const _initTextEvent = dart.privateName(html$, "_initTextEvent");
html$.TextEvent = class TextEvent extends html$.UIEvent {
  static new(type, opts) {
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
    let view = opts && 'view' in opts ? opts.view : null;
    let data = opts && 'data' in opts ? opts.data : null;
    if (view == null) {
      view = html$.window;
    }
    let e = html$.TextEvent._check(html$.document[_createEvent]("TextEvent"));
    e[_initTextEvent](type, canBubble, cancelable, view, data);
    return e;
  }
  get [$data]() {
    return this.data;
  }
  [_initTextEvent](...args) {
    return this.initTextEvent.apply(this, args);
  }
};
dart.addTypeTests(html$.TextEvent);
const data$8 = Symbol("TextEvent.data");
dart.setMethodSignature(html$.TextEvent, () => ({
  __proto__: dart.getMethods(html$.TextEvent.__proto__),
  [_initTextEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])
}));
dart.setLibraryUri(html$.TextEvent, "dart:html");
dart.setFieldSignature(html$.TextEvent, () => ({
  __proto__: dart.getFields(html$.TextEvent.__proto__),
  [$data]: dart.finalFieldType(core.String)
}));
dart.registerExtension("TextEvent", html$.TextEvent);
html$.TextMetrics = class TextMetrics extends _interceptors.Interceptor {
  get [$actualBoundingBoxAscent]() {
    return this.actualBoundingBoxAscent;
  }
  get [$actualBoundingBoxDescent]() {
    return this.actualBoundingBoxDescent;
  }
  get [$actualBoundingBoxLeft]() {
    return this.actualBoundingBoxLeft;
  }
  get [$actualBoundingBoxRight]() {
    return this.actualBoundingBoxRight;
  }
  get [$alphabeticBaseline]() {
    return this.alphabeticBaseline;
  }
  get [$emHeightAscent]() {
    return this.emHeightAscent;
  }
  get [$emHeightDescent]() {
    return this.emHeightDescent;
  }
  get [$fontBoundingBoxAscent]() {
    return this.fontBoundingBoxAscent;
  }
  get [$fontBoundingBoxDescent]() {
    return this.fontBoundingBoxDescent;
  }
  get [$hangingBaseline]() {
    return this.hangingBaseline;
  }
  get [$ideographicBaseline]() {
    return this.ideographicBaseline;
  }
  get [$width]() {
    return this.width;
  }
};
dart.addTypeTests(html$.TextMetrics);
const actualBoundingBoxAscent = Symbol("TextMetrics.actualBoundingBoxAscent");
const actualBoundingBoxDescent = Symbol("TextMetrics.actualBoundingBoxDescent");
const actualBoundingBoxLeft = Symbol("TextMetrics.actualBoundingBoxLeft");
const actualBoundingBoxRight = Symbol("TextMetrics.actualBoundingBoxRight");
const alphabeticBaseline = Symbol("TextMetrics.alphabeticBaseline");
const emHeightAscent = Symbol("TextMetrics.emHeightAscent");
const emHeightDescent = Symbol("TextMetrics.emHeightDescent");
const fontBoundingBoxAscent = Symbol("TextMetrics.fontBoundingBoxAscent");
const fontBoundingBoxDescent = Symbol("TextMetrics.fontBoundingBoxDescent");
const hangingBaseline = Symbol("TextMetrics.hangingBaseline");
const ideographicBaseline = Symbol("TextMetrics.ideographicBaseline");
const width$11 = Symbol("TextMetrics.width");
dart.setLibraryUri(html$.TextMetrics, "dart:html");
dart.setFieldSignature(html$.TextMetrics, () => ({
  __proto__: dart.getFields(html$.TextMetrics.__proto__),
  [$actualBoundingBoxAscent]: dart.finalFieldType(core.num),
  [$actualBoundingBoxDescent]: dart.finalFieldType(core.num),
  [$actualBoundingBoxLeft]: dart.finalFieldType(core.num),
  [$actualBoundingBoxRight]: dart.finalFieldType(core.num),
  [$alphabeticBaseline]: dart.finalFieldType(core.num),
  [$emHeightAscent]: dart.finalFieldType(core.num),
  [$emHeightDescent]: dart.finalFieldType(core.num),
  [$fontBoundingBoxAscent]: dart.finalFieldType(core.num),
  [$fontBoundingBoxDescent]: dart.finalFieldType(core.num),
  [$hangingBaseline]: dart.finalFieldType(core.num),
  [$ideographicBaseline]: dart.finalFieldType(core.num),
  [$width]: dart.finalFieldType(core.num)
}));
dart.registerExtension("TextMetrics", html$.TextMetrics);
html$.TextTrack = class TextTrack extends html$.EventTarget {
  get [$activeCues]() {
    return this.activeCues;
  }
  get [$cues]() {
    return this.cues;
  }
  get [$id]() {
    return this.id;
  }
  get [$kind]() {
    return this.kind;
  }
  get [$label]() {
    return this.label;
  }
  get [$language]() {
    return this.language;
  }
  get [$mode]() {
    return this.mode;
  }
  set [$mode](value) {
    this.mode = value;
  }
  [$addCue](...args) {
    return this.addCue.apply(this, args);
  }
  [$removeCue](...args) {
    return this.removeCue.apply(this, args);
  }
  get [$onCueChange]() {
    return html$.TextTrack.cueChangeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.TextTrack);
const activeCues = Symbol("TextTrack.activeCues");
const cues = Symbol("TextTrack.cues");
const id$14 = Symbol("TextTrack.id");
const kind$1 = Symbol("TextTrack.kind");
const label$4 = Symbol("TextTrack.label");
const language$ = Symbol("TextTrack.language");
const mode$3 = Symbol("TextTrack.mode");
dart.setMethodSignature(html$.TextTrack, () => ({
  __proto__: dart.getMethods(html$.TextTrack.__proto__),
  [$addCue]: dart.fnType(dart.void, [html$.TextTrackCue]),
  [$removeCue]: dart.fnType(dart.void, [html$.TextTrackCue])
}));
dart.setGetterSignature(html$.TextTrack, () => ({
  __proto__: dart.getGetters(html$.TextTrack.__proto__),
  [$onCueChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.TextTrack, "dart:html");
dart.setFieldSignature(html$.TextTrack, () => ({
  __proto__: dart.getFields(html$.TextTrack.__proto__),
  [$activeCues]: dart.finalFieldType(html$.TextTrackCueList),
  [$cues]: dart.finalFieldType(html$.TextTrackCueList),
  [$id]: dart.finalFieldType(core.String),
  [$kind]: dart.finalFieldType(core.String),
  [$label]: dart.finalFieldType(core.String),
  [$language]: dart.finalFieldType(core.String),
  [$mode]: dart.fieldType(core.String)
}));
dart.defineLazy(html$.TextTrack, {
  /*html$.TextTrack.cueChangeEvent*/get cueChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("cuechange"));
  }
});
dart.registerExtension("TextTrack", html$.TextTrack);
html$.TextTrackCue = class TextTrackCue extends html$.EventTarget {
  get [$endTime]() {
    return this.endTime;
  }
  set [$endTime](value) {
    this.endTime = value;
  }
  get [$id]() {
    return this.id;
  }
  set [$id](value) {
    this.id = value;
  }
  get [$pauseOnExit]() {
    return this.pauseOnExit;
  }
  set [$pauseOnExit](value) {
    this.pauseOnExit = value;
  }
  get [$startTime]() {
    return this.startTime;
  }
  set [$startTime](value) {
    this.startTime = value;
  }
  get [$track]() {
    return this.track;
  }
  get [$onEnter]() {
    return html$.TextTrackCue.enterEvent.forTarget(this);
  }
  get [$onExit]() {
    return html$.TextTrackCue.exitEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.TextTrackCue);
const endTime = Symbol("TextTrackCue.endTime");
const id$15 = Symbol("TextTrackCue.id");
const pauseOnExit = Symbol("TextTrackCue.pauseOnExit");
const startTime$0 = Symbol("TextTrackCue.startTime");
const track$4 = Symbol("TextTrackCue.track");
dart.setGetterSignature(html$.TextTrackCue, () => ({
  __proto__: dart.getGetters(html$.TextTrackCue.__proto__),
  [$onEnter]: async.Stream$(html$.Event),
  [$onExit]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.TextTrackCue, "dart:html");
dart.setFieldSignature(html$.TextTrackCue, () => ({
  __proto__: dart.getFields(html$.TextTrackCue.__proto__),
  [$endTime]: dart.fieldType(core.num),
  [$id]: dart.fieldType(core.String),
  [$pauseOnExit]: dart.fieldType(core.bool),
  [$startTime]: dart.fieldType(core.num),
  [$track]: dart.finalFieldType(html$.TextTrack)
}));
dart.defineLazy(html$.TextTrackCue, {
  /*html$.TextTrackCue.enterEvent*/get enterEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("enter"));
  },
  /*html$.TextTrackCue.exitEvent*/get exitEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("exit"));
  }
});
dart.registerExtension("TextTrackCue", html$.TextTrackCue);
const Interceptor_ListMixin$$6 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$6.new = function() {
  Interceptor_ListMixin$$6.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$6.prototype;
dart.applyMixin(Interceptor_ListMixin$$6, collection.ListMixin$(html$.TextTrackCue));
const Interceptor_ImmutableListMixin$$6 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$6 {};
(Interceptor_ImmutableListMixin$$6.new = function() {
  Interceptor_ImmutableListMixin$$6.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$6.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$6, html$.ImmutableListMixin$(html$.TextTrackCue));
html$.TextTrackCueList = class TextTrackCueList extends Interceptor_ImmutableListMixin$$6 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.TextTrackCue._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [$getCueById](...args) {
    return this.getCueById.apply(this, args);
  }
};
html$.TextTrackCueList.prototype[dart.isList] = true;
dart.addTypeTests(html$.TextTrackCueList);
html$.TextTrackCueList[dart.implements] = () => [ListOfTextTrackCue(), JavaScriptIndexingBehaviorOfTextTrackCue()];
dart.setMethodSignature(html$.TextTrackCueList, () => ({
  __proto__: dart.getMethods(html$.TextTrackCueList.__proto__),
  [$_get]: dart.fnType(html$.TextTrackCue, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.TextTrackCue, [core.int]),
  [__getter__]: dart.fnType(html$.TextTrackCue, [core.int]),
  [$getCueById]: dart.fnType(html$.TextTrackCue, [core.String])
}));
dart.setGetterSignature(html$.TextTrackCueList, () => ({
  __proto__: dart.getGetters(html$.TextTrackCueList.__proto__),
  [$length]: core.int,
  [$first]: html$.TextTrackCue,
  [$last]: html$.TextTrackCue,
  [$single]: html$.TextTrackCue
}));
dart.setSetterSignature(html$.TextTrackCueList, () => ({
  __proto__: dart.getSetters(html$.TextTrackCueList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.TextTrackCueList, "dart:html");
dart.registerExtension("TextTrackCueList", html$.TextTrackCueList);
const EventTarget_ListMixin$$ = class EventTarget_ListMixin extends html$.EventTarget {};
(EventTarget_ListMixin$$._created = function() {
  EventTarget_ListMixin$$.__proto__._created.call(this);
}).prototype = EventTarget_ListMixin$$.prototype;
(EventTarget_ListMixin$$.__ = function() {
  EventTarget_ListMixin$$.__proto__.__.call(this);
}).prototype = EventTarget_ListMixin$$.prototype;
dart.applyMixin(EventTarget_ListMixin$$, collection.ListMixin$(html$.TextTrack));
const EventTarget_ImmutableListMixin$$ = class EventTarget_ImmutableListMixin extends EventTarget_ListMixin$$ {};
(EventTarget_ImmutableListMixin$$._created = function() {
  EventTarget_ImmutableListMixin$$.__proto__._created.call(this);
}).prototype = EventTarget_ImmutableListMixin$$.prototype;
(EventTarget_ImmutableListMixin$$.__ = function() {
  EventTarget_ImmutableListMixin$$.__proto__.__.call(this);
}).prototype = EventTarget_ImmutableListMixin$$.prototype;
dart.applyMixin(EventTarget_ImmutableListMixin$$, html$.ImmutableListMixin$(html$.TextTrack));
html$.TextTrackList = class TextTrackList extends EventTarget_ImmutableListMixin$$ {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.TextTrack._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [$getTrackById](...args) {
    return this.getTrackById.apply(this, args);
  }
  get [$onAddTrack]() {
    return html$.TextTrackList.addTrackEvent.forTarget(this);
  }
  get [$onChange]() {
    return html$.TextTrackList.changeEvent.forTarget(this);
  }
};
html$.TextTrackList.prototype[dart.isList] = true;
dart.addTypeTests(html$.TextTrackList);
html$.TextTrackList[dart.implements] = () => [ListOfTextTrack(), JavaScriptIndexingBehaviorOfTextTrack()];
dart.setMethodSignature(html$.TextTrackList, () => ({
  __proto__: dart.getMethods(html$.TextTrackList.__proto__),
  [$_get]: dart.fnType(html$.TextTrack, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.TextTrack, [core.int]),
  [__getter__]: dart.fnType(html$.TextTrack, [core.int]),
  [$getTrackById]: dart.fnType(html$.TextTrack, [core.String])
}));
dart.setGetterSignature(html$.TextTrackList, () => ({
  __proto__: dart.getGetters(html$.TextTrackList.__proto__),
  [$length]: core.int,
  [$first]: html$.TextTrack,
  [$last]: html$.TextTrack,
  [$single]: html$.TextTrack,
  [$onAddTrack]: async.Stream$(html$.TrackEvent),
  [$onChange]: async.Stream$(html$.Event)
}));
dart.setSetterSignature(html$.TextTrackList, () => ({
  __proto__: dart.getSetters(html$.TextTrackList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.TextTrackList, "dart:html");
dart.defineLazy(html$.TextTrackList, {
  /*html$.TextTrackList.addTrackEvent*/get addTrackEvent() {
    return dart.const(new (EventStreamProviderOfTrackEvent()).new("addtrack"));
  },
  /*html$.TextTrackList.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  }
});
dart.registerExtension("TextTrackList", html$.TextTrackList);
html$.TimeElement = class TimeElement extends html$.HtmlElement {
  get [$dateTime]() {
    return this.dateTime;
  }
  set [$dateTime](value) {
    this.dateTime = value;
  }
};
(html$.TimeElement.created = function() {
  this[dateTime$] = null;
  html$.TimeElement.__proto__.created.call(this);
}).prototype = html$.TimeElement.prototype;
dart.addTypeTests(html$.TimeElement);
const dateTime$ = Symbol("TimeElement.dateTime");
dart.setLibraryUri(html$.TimeElement, "dart:html");
dart.setFieldSignature(html$.TimeElement, () => ({
  __proto__: dart.getFields(html$.TimeElement.__proto__),
  [$dateTime]: dart.fieldType(core.String)
}));
dart.registerExtension("HTMLTimeElement", html$.TimeElement);
html$.TimeRanges = class TimeRanges extends _interceptors.Interceptor {
  get [$length]() {
    return this.length;
  }
  [$end](...args) {
    return this.end.apply(this, args);
  }
  [$start](...args) {
    return this.start.apply(this, args);
  }
};
dart.addTypeTests(html$.TimeRanges);
const length$14 = Symbol("TimeRanges.length");
dart.setMethodSignature(html$.TimeRanges, () => ({
  __proto__: dart.getMethods(html$.TimeRanges.__proto__),
  [$end]: dart.fnType(core.double, [core.int]),
  [$start]: dart.fnType(core.double, [core.int])
}));
dart.setLibraryUri(html$.TimeRanges, "dart:html");
dart.setFieldSignature(html$.TimeRanges, () => ({
  __proto__: dart.getFields(html$.TimeRanges.__proto__),
  [$length]: dart.finalFieldType(core.int)
}));
dart.registerExtension("TimeRanges", html$.TimeRanges);
html$.TitleElement = class TitleElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("title");
  }
};
(html$.TitleElement.created = function() {
  html$.TitleElement.__proto__.created.call(this);
}).prototype = html$.TitleElement.prototype;
dart.addTypeTests(html$.TitleElement);
dart.setLibraryUri(html$.TitleElement, "dart:html");
dart.registerExtension("HTMLTitleElement", html$.TitleElement);
const _radiusX = dart.privateName(html$, "_radiusX");
const _radiusY = dart.privateName(html$, "_radiusY");
const __clientX = dart.privateName(html$, "__clientX");
const __clientY = dart.privateName(html$, "__clientY");
const __screenX = dart.privateName(html$, "__screenX");
const __screenY = dart.privateName(html$, "__screenY");
const __pageX = dart.privateName(html$, "__pageX");
const __pageY = dart.privateName(html$, "__pageY");
const __radiusX = dart.privateName(html$, "__radiusX");
const __radiusY = dart.privateName(html$, "__radiusY");
html$.Touch = class Touch$ extends _interceptors.Interceptor {
  static new(initDict) {
    let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
    return html$.Touch._create_1(initDict_1);
  }
  static _create_1(initDict) {
    return new Touch(initDict);
  }
  get [_clientX]() {
    return this.clientX;
  }
  get [_clientY]() {
    return this.clientY;
  }
  get [$force]() {
    return this.force;
  }
  get [$identifier]() {
    return this.identifier;
  }
  get [_pageX]() {
    return this.pageX;
  }
  get [_pageY]() {
    return this.pageY;
  }
  get [_radiusX]() {
    return this.radiusX;
  }
  get [_radiusY]() {
    return this.radiusY;
  }
  get [$region]() {
    return this.region;
  }
  get [$rotationAngle]() {
    return this.rotationAngle;
  }
  get [_screenX]() {
    return this.screenX;
  }
  get [_screenY]() {
    return this.screenY;
  }
  get [$target]() {
    return html$._convertNativeToDart_EventTarget(this[_get_target]);
  }
  get [_get_target]() {
    return this.target;
  }
  get [__clientX]() {
    return this.clientX[$round]();
  }
  get [__clientY]() {
    return this.clientY[$round]();
  }
  get [__screenX]() {
    return this.screenX[$round]();
  }
  get [__screenY]() {
    return this.screenY[$round]();
  }
  get [__pageX]() {
    return this.pageX[$round]();
  }
  get [__pageY]() {
    return this.pageY[$round]();
  }
  get [__radiusX]() {
    return this.radiusX[$round]();
  }
  get [__radiusY]() {
    return this.radiusY[$round]();
  }
  get [$client]() {
    return new (PointOfnum()).new(this[__clientX], this[__clientY]);
  }
  get [$page]() {
    return new (PointOfnum()).new(this[__pageX], this[__pageY]);
  }
  get [$screen]() {
    return new (PointOfnum()).new(this[__screenX], this[__screenY]);
  }
  get [$radiusX]() {
    return this[__radiusX];
  }
  get [$radiusY]() {
    return this[__radiusY];
  }
};
dart.addTypeTests(html$.Touch);
const force = Symbol("Touch.force");
const identifier = Symbol("Touch.identifier");
const region$0 = Symbol("Touch.region");
const rotationAngle = Symbol("Touch.rotationAngle");
dart.setGetterSignature(html$.Touch, () => ({
  __proto__: dart.getGetters(html$.Touch.__proto__),
  [$target]: html$.EventTarget,
  [__clientX]: core.int,
  [__clientY]: core.int,
  [__screenX]: core.int,
  [__screenY]: core.int,
  [__pageX]: core.int,
  [__pageY]: core.int,
  [__radiusX]: core.int,
  [__radiusY]: core.int,
  [$client]: math.Point$(core.num),
  [$page]: math.Point$(core.num),
  [$screen]: math.Point$(core.num),
  [$radiusX]: core.int,
  [$radiusY]: core.int
}));
dart.setLibraryUri(html$.Touch, "dart:html");
dart.setFieldSignature(html$.Touch, () => ({
  __proto__: dart.getFields(html$.Touch.__proto__),
  [_clientX]: dart.finalFieldType(core.num),
  [_clientY]: dart.finalFieldType(core.num),
  [$force]: dart.finalFieldType(core.num),
  [$identifier]: dart.finalFieldType(core.int),
  [_pageX]: dart.finalFieldType(core.num),
  [_pageY]: dart.finalFieldType(core.num),
  [_radiusX]: dart.finalFieldType(core.num),
  [_radiusY]: dart.finalFieldType(core.num),
  [$region]: dart.finalFieldType(core.String),
  [$rotationAngle]: dart.finalFieldType(core.num),
  [_screenX]: dart.finalFieldType(core.num),
  [_screenY]: dart.finalFieldType(core.num),
  [_get_target]: dart.finalFieldType(dart.dynamic)
}));
dart.registerExtension("Touch", html$.Touch);
html$.TouchEvent = class TouchEvent$ extends html$.UIEvent {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.TouchEvent._create_1(type, eventInitDict_1);
    }
    return html$.TouchEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new TouchEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new TouchEvent(type);
  }
  get [$altKey]() {
    return this.altKey;
  }
  get [$changedTouches]() {
    return this.changedTouches;
  }
  get [$ctrlKey]() {
    return this.ctrlKey;
  }
  get [$metaKey]() {
    return this.metaKey;
  }
  get [$shiftKey]() {
    return this.shiftKey;
  }
  get [$targetTouches]() {
    return this.targetTouches;
  }
  get [$touches]() {
    return this.touches;
  }
  static get supported() {
    return html_common.Device.isEventTypeSupported("TouchEvent");
  }
};
dart.addTypeTests(html$.TouchEvent);
const altKey$0 = Symbol("TouchEvent.altKey");
const changedTouches = Symbol("TouchEvent.changedTouches");
const ctrlKey$0 = Symbol("TouchEvent.ctrlKey");
const metaKey$0 = Symbol("TouchEvent.metaKey");
const shiftKey$0 = Symbol("TouchEvent.shiftKey");
const targetTouches = Symbol("TouchEvent.targetTouches");
const touches = Symbol("TouchEvent.touches");
dart.setLibraryUri(html$.TouchEvent, "dart:html");
dart.setFieldSignature(html$.TouchEvent, () => ({
  __proto__: dart.getFields(html$.TouchEvent.__proto__),
  [$altKey]: dart.finalFieldType(core.bool),
  [$changedTouches]: dart.finalFieldType(html$.TouchList),
  [$ctrlKey]: dart.finalFieldType(core.bool),
  [$metaKey]: dart.finalFieldType(core.bool),
  [$shiftKey]: dart.finalFieldType(core.bool),
  [$targetTouches]: dart.finalFieldType(html$.TouchList),
  [$touches]: dart.finalFieldType(html$.TouchList)
}));
dart.registerExtension("TouchEvent", html$.TouchEvent);
const Interceptor_ListMixin$$7 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$7.new = function() {
  Interceptor_ListMixin$$7.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$7.prototype;
dart.applyMixin(Interceptor_ListMixin$$7, collection.ListMixin$(html$.Touch));
const Interceptor_ImmutableListMixin$$7 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$7 {};
(Interceptor_ImmutableListMixin$$7.new = function() {
  Interceptor_ImmutableListMixin$$7.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$7.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$7, html$.ImmutableListMixin$(html$.Touch));
html$.TouchList = class TouchList extends Interceptor_ImmutableListMixin$$7 {
  static new() {
    return null;
  }
  static get supported() {
    return !!document.createTouchList;
  }
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.Touch._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$.TouchList.prototype[dart.isList] = true;
dart.addTypeTests(html$.TouchList);
html$.TouchList[dart.implements] = () => [JavaScriptIndexingBehaviorOfTouch(), ListOfTouch()];
dart.setMethodSignature(html$.TouchList, () => ({
  __proto__: dart.getMethods(html$.TouchList.__proto__),
  [$_get]: dart.fnType(html$.Touch, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.Touch, [core.int]),
  [$item]: dart.fnType(html$.Touch, [core.int])
}));
dart.setGetterSignature(html$.TouchList, () => ({
  __proto__: dart.getGetters(html$.TouchList.__proto__),
  [$length]: core.int,
  [$first]: html$.Touch,
  [$last]: html$.Touch,
  [$single]: html$.Touch
}));
dart.setSetterSignature(html$.TouchList, () => ({
  __proto__: dart.getSetters(html$.TouchList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$.TouchList, "dart:html");
dart.registerExtension("TouchList", html$.TouchList);
html$.TrackDefault = class TrackDefault$ extends _interceptors.Interceptor {
  static new(type, language, label, kinds, byteStreamTrackID) {
    if (byteStreamTrackID === void 0) byteStreamTrackID = null;
    if (byteStreamTrackID != null) {
      let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
      return html$.TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
    }
    let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
    return html$.TrackDefault._create_2(type, language, label, kinds_1);
  }
  static _create_1(type, language, label, kinds, byteStreamTrackID) {
    return new TrackDefault(type, language, label, kinds, byteStreamTrackID);
  }
  static _create_2(type, language, label, kinds) {
    return new TrackDefault(type, language, label, kinds);
  }
  get [$byteStreamTrackID]() {
    return this.byteStreamTrackID;
  }
  get [$kinds]() {
    return this.kinds;
  }
  get [$label]() {
    return this.label;
  }
  get [$language]() {
    return this.language;
  }
  get [$type]() {
    return this.type;
  }
};
dart.addTypeTests(html$.TrackDefault);
const byteStreamTrackID = Symbol("TrackDefault.byteStreamTrackID");
const kinds = Symbol("TrackDefault.kinds");
const label$5 = Symbol("TrackDefault.label");
const language$0 = Symbol("TrackDefault.language");
const type$36 = Symbol("TrackDefault.type");
dart.setLibraryUri(html$.TrackDefault, "dart:html");
dart.setFieldSignature(html$.TrackDefault, () => ({
  __proto__: dart.getFields(html$.TrackDefault.__proto__),
  [$byteStreamTrackID]: dart.finalFieldType(core.String),
  [$kinds]: dart.finalFieldType(core.Object),
  [$label]: dart.finalFieldType(core.String),
  [$language]: dart.finalFieldType(core.String),
  [$type]: dart.finalFieldType(core.String)
}));
dart.registerExtension("TrackDefault", html$.TrackDefault);
html$.TrackDefaultList = class TrackDefaultList$ extends _interceptors.Interceptor {
  static new(trackDefaults) {
    if (trackDefaults === void 0) trackDefaults = null;
    if (trackDefaults != null) {
      return html$.TrackDefaultList._create_1(trackDefaults);
    }
    return html$.TrackDefaultList._create_2();
  }
  static _create_1(trackDefaults) {
    return new TrackDefaultList(trackDefaults);
  }
  static _create_2() {
    return new TrackDefaultList();
  }
  get [$length]() {
    return this.length;
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
dart.addTypeTests(html$.TrackDefaultList);
const length$15 = Symbol("TrackDefaultList.length");
dart.setMethodSignature(html$.TrackDefaultList, () => ({
  __proto__: dart.getMethods(html$.TrackDefaultList.__proto__),
  [$item]: dart.fnType(html$.TrackDefault, [core.int])
}));
dart.setLibraryUri(html$.TrackDefaultList, "dart:html");
dart.setFieldSignature(html$.TrackDefaultList, () => ({
  __proto__: dart.getFields(html$.TrackDefaultList.__proto__),
  [$length]: dart.finalFieldType(core.int)
}));
dart.registerExtension("TrackDefaultList", html$.TrackDefaultList);
html$.TrackElement = class TrackElement extends html$.HtmlElement {
  static new() {
    return html$.TrackElement._check(html$.document[$createElement]("track"));
  }
  static get supported() {
    return html$.Element.isTagSupported("track");
  }
  get [$defaultValue]() {
    return this.default;
  }
  set [$defaultValue](value) {
    this.default = value;
  }
  get [$kind]() {
    return this.kind;
  }
  set [$kind](value) {
    this.kind = value;
  }
  get [$label]() {
    return this.label;
  }
  set [$label](value) {
    this.label = value;
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [$src]() {
    return this.src;
  }
  set [$src](value) {
    this.src = value;
  }
  get [$srclang]() {
    return this.srclang;
  }
  set [$srclang](value) {
    this.srclang = value;
  }
  get [$track]() {
    return this.track;
  }
};
(html$.TrackElement.created = function() {
  this[defaultValue$2] = null;
  this[kind$2] = null;
  this[label$6] = null;
  this[readyState$8] = null;
  this[src$7] = null;
  this[srclang] = null;
  this[track$5] = null;
  html$.TrackElement.__proto__.created.call(this);
}).prototype = html$.TrackElement.prototype;
dart.addTypeTests(html$.TrackElement);
const defaultValue$2 = Symbol("TrackElement.defaultValue");
const kind$2 = Symbol("TrackElement.kind");
const label$6 = Symbol("TrackElement.label");
const readyState$8 = Symbol("TrackElement.readyState");
const src$7 = Symbol("TrackElement.src");
const srclang = Symbol("TrackElement.srclang");
const track$5 = Symbol("TrackElement.track");
dart.setLibraryUri(html$.TrackElement, "dart:html");
dart.setFieldSignature(html$.TrackElement, () => ({
  __proto__: dart.getFields(html$.TrackElement.__proto__),
  [$defaultValue]: dart.fieldType(core.bool),
  [$kind]: dart.fieldType(core.String),
  [$label]: dart.fieldType(core.String),
  [$readyState]: dart.finalFieldType(core.int),
  [$src]: dart.fieldType(core.String),
  [$srclang]: dart.fieldType(core.String),
  [$track]: dart.finalFieldType(html$.TextTrack)
}));
dart.defineLazy(html$.TrackElement, {
  /*html$.TrackElement.ERROR*/get ERROR() {
    return 3;
  },
  /*html$.TrackElement.LOADED*/get LOADED() {
    return 2;
  },
  /*html$.TrackElement.LOADING*/get LOADING() {
    return 1;
  },
  /*html$.TrackElement.NONE*/get NONE() {
    return 0;
  }
});
dart.registerExtension("HTMLTrackElement", html$.TrackElement);
html$.TrackEvent = class TrackEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.TrackEvent._create_1(type, eventInitDict_1);
    }
    return html$.TrackEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new TrackEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new TrackEvent(type);
  }
  get [$track]() {
    return this.track;
  }
};
dart.addTypeTests(html$.TrackEvent);
const track$6 = Symbol("TrackEvent.track");
dart.setLibraryUri(html$.TrackEvent, "dart:html");
dart.setFieldSignature(html$.TrackEvent, () => ({
  __proto__: dart.getFields(html$.TrackEvent.__proto__),
  [$track]: dart.finalFieldType(core.Object)
}));
dart.registerExtension("TrackEvent", html$.TrackEvent);
html$.TransitionEvent = class TransitionEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.TransitionEvent._create_1(type, eventInitDict_1);
    }
    return html$.TransitionEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new TransitionEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new TransitionEvent(type);
  }
  get [$elapsedTime]() {
    return this.elapsedTime;
  }
  get [$propertyName]() {
    return this.propertyName;
  }
  get [$pseudoElement]() {
    return this.pseudoElement;
  }
};
dart.addTypeTests(html$.TransitionEvent);
const elapsedTime$0 = Symbol("TransitionEvent.elapsedTime");
const propertyName = Symbol("TransitionEvent.propertyName");
const pseudoElement = Symbol("TransitionEvent.pseudoElement");
dart.setLibraryUri(html$.TransitionEvent, "dart:html");
dart.setFieldSignature(html$.TransitionEvent, () => ({
  __proto__: dart.getFields(html$.TransitionEvent.__proto__),
  [$elapsedTime]: dart.finalFieldType(core.num),
  [$propertyName]: dart.finalFieldType(core.String),
  [$pseudoElement]: dart.finalFieldType(core.String)
}));
dart.registerExtension("TransitionEvent", html$.TransitionEvent);
dart.registerExtension("WebKitTransitionEvent", html$.TransitionEvent);
html$.TreeWalker = class TreeWalker extends _interceptors.Interceptor {
  static new(root, whatToShow) {
    return html$.document[_createTreeWalker](root, whatToShow, null);
  }
  get [$currentNode]() {
    return this.currentNode;
  }
  set [$currentNode](value) {
    this.currentNode = value;
  }
  get [$filter]() {
    return this.filter;
  }
  get [$root]() {
    return this.root;
  }
  get [$whatToShow]() {
    return this.whatToShow;
  }
  [$firstChild](...args) {
    return this.firstChild.apply(this, args);
  }
  [$lastChild](...args) {
    return this.lastChild.apply(this, args);
  }
  [$nextNode](...args) {
    return this.nextNode.apply(this, args);
  }
  [$nextSibling](...args) {
    return this.nextSibling.apply(this, args);
  }
  [$parentNode](...args) {
    return this.parentNode.apply(this, args);
  }
  [$previousNode](...args) {
    return this.previousNode.apply(this, args);
  }
  [$previousSibling](...args) {
    return this.previousSibling.apply(this, args);
  }
};
dart.addTypeTests(html$.TreeWalker);
const currentNode = Symbol("TreeWalker.currentNode");
const filter$1 = Symbol("TreeWalker.filter");
const root$1 = Symbol("TreeWalker.root");
const whatToShow$ = Symbol("TreeWalker.whatToShow");
dart.setMethodSignature(html$.TreeWalker, () => ({
  __proto__: dart.getMethods(html$.TreeWalker.__proto__),
  [$firstChild]: dart.fnType(html$.Node, []),
  [$lastChild]: dart.fnType(html$.Node, []),
  [$nextNode]: dart.fnType(html$.Node, []),
  [$nextSibling]: dart.fnType(html$.Node, []),
  [$parentNode]: dart.fnType(html$.Node, []),
  [$previousNode]: dart.fnType(html$.Node, []),
  [$previousSibling]: dart.fnType(html$.Node, [])
}));
dart.setLibraryUri(html$.TreeWalker, "dart:html");
dart.setFieldSignature(html$.TreeWalker, () => ({
  __proto__: dart.getFields(html$.TreeWalker.__proto__),
  [$currentNode]: dart.fieldType(html$.Node),
  [$filter]: dart.finalFieldType(html$.NodeFilter),
  [$root]: dart.finalFieldType(html$.Node),
  [$whatToShow]: dart.finalFieldType(core.int)
}));
dart.registerExtension("TreeWalker", html$.TreeWalker);
html$.TrustedHtml = class TrustedHtml extends _interceptors.Interceptor {};
dart.addTypeTests(html$.TrustedHtml);
dart.setLibraryUri(html$.TrustedHtml, "dart:html");
dart.registerExtension("TrustedHTML", html$.TrustedHtml);
html$.TrustedScriptUrl = class TrustedScriptUrl extends _interceptors.Interceptor {};
dart.addTypeTests(html$.TrustedScriptUrl);
dart.setLibraryUri(html$.TrustedScriptUrl, "dart:html");
dart.registerExtension("TrustedScriptURL", html$.TrustedScriptUrl);
html$.TrustedUrl = class TrustedUrl extends _interceptors.Interceptor {};
dart.addTypeTests(html$.TrustedUrl);
dart.setLibraryUri(html$.TrustedUrl, "dart:html");
dart.registerExtension("TrustedURL", html$.TrustedUrl);
html$.UListElement = class UListElement extends html$.HtmlElement {
  static new() {
    return html$.document.createElement("ul");
  }
};
(html$.UListElement.created = function() {
  html$.UListElement.__proto__.created.call(this);
}).prototype = html$.UListElement.prototype;
dart.addTypeTests(html$.UListElement);
dart.setLibraryUri(html$.UListElement, "dart:html");
dart.registerExtension("HTMLUListElement", html$.UListElement);
html$.UnderlyingSourceBase = class UnderlyingSourceBase extends _interceptors.Interceptor {
  [$cancel](reason) {
    return html$.promiseToFuture(dart.dynamic, this.cancel(reason));
  }
  [$notifyLockAcquired](...args) {
    return this.notifyLockAcquired.apply(this, args);
  }
  [$notifyLockReleased](...args) {
    return this.notifyLockReleased.apply(this, args);
  }
  [$pull]() {
    return html$.promiseToFuture(dart.dynamic, this.pull());
  }
  [$start](stream) {
    return html$.promiseToFuture(dart.dynamic, this.start(stream));
  }
};
dart.addTypeTests(html$.UnderlyingSourceBase);
dart.setMethodSignature(html$.UnderlyingSourceBase, () => ({
  __proto__: dart.getMethods(html$.UnderlyingSourceBase.__proto__),
  [$cancel]: dart.fnType(async.Future, [core.Object]),
  [$notifyLockAcquired]: dart.fnType(dart.void, []),
  [$notifyLockReleased]: dart.fnType(dart.void, []),
  [$pull]: dart.fnType(async.Future, []),
  [$start]: dart.fnType(async.Future, [core.Object])
}));
dart.setLibraryUri(html$.UnderlyingSourceBase, "dart:html");
dart.registerExtension("UnderlyingSourceBase", html$.UnderlyingSourceBase);
html$.UnknownElement = class UnknownElement extends html$.HtmlElement {};
(html$.UnknownElement.created = function() {
  html$.UnknownElement.__proto__.created.call(this);
}).prototype = html$.UnknownElement.prototype;
dart.addTypeTests(html$.UnknownElement);
dart.setLibraryUri(html$.UnknownElement, "dart:html");
dart.registerExtension("HTMLUnknownElement", html$.UnknownElement);
html$.Url = class Url extends _interceptors.Interceptor {
  static createObjectUrl(blob_OR_source_OR_stream) {
    return (self.URL || self.webkitURL).createObjectURL(blob_OR_source_OR_stream);
  }
  static createObjectUrlFromSource(source) {
    return (self.URL || self.webkitURL).createObjectURL(source);
  }
  static createObjectUrlFromStream(stream) {
    return (self.URL || self.webkitURL).createObjectURL(stream);
  }
  static createObjectUrlFromBlob(blob) {
    return (self.URL || self.webkitURL).createObjectURL(blob);
  }
  static revokeObjectUrl(url) {
    return (self.URL || self.webkitURL).revokeObjectURL(url);
  }
  [$toString]() {
    return String(this);
  }
  get [$hash]() {
    return this.hash;
  }
  set [$hash](value) {
    this.hash = value;
  }
  get [$host]() {
    return this.host;
  }
  set [$host](value) {
    this.host = value;
  }
  get [$hostname]() {
    return this.hostname;
  }
  set [$hostname](value) {
    this.hostname = value;
  }
  get [$href]() {
    return this.href;
  }
  set [$href](value) {
    this.href = value;
  }
  get [$origin]() {
    return this.origin;
  }
  get [$password]() {
    return this.password;
  }
  set [$password](value) {
    this.password = value;
  }
  get [$pathname]() {
    return this.pathname;
  }
  set [$pathname](value) {
    this.pathname = value;
  }
  get [$port]() {
    return this.port;
  }
  set [$port](value) {
    this.port = value;
  }
  get [$protocol]() {
    return this.protocol;
  }
  set [$protocol](value) {
    this.protocol = value;
  }
  get [$search]() {
    return this.search;
  }
  set [$search](value) {
    this.search = value;
  }
  get [$searchParams]() {
    return this.searchParams;
  }
  get [$username]() {
    return this.username;
  }
  set [$username](value) {
    this.username = value;
  }
};
dart.addTypeTests(html$.Url);
const hash$2 = Symbol("Url.hash");
const host$3 = Symbol("Url.host");
const hostname$2 = Symbol("Url.hostname");
const href$6 = Symbol("Url.href");
const origin$6 = Symbol("Url.origin");
const password$2 = Symbol("Url.password");
const pathname$2 = Symbol("Url.pathname");
const port$6 = Symbol("Url.port");
const protocol$4 = Symbol("Url.protocol");
const search$2 = Symbol("Url.search");
const searchParams = Symbol("Url.searchParams");
const username$1 = Symbol("Url.username");
dart.setLibraryUri(html$.Url, "dart:html");
dart.setFieldSignature(html$.Url, () => ({
  __proto__: dart.getFields(html$.Url.__proto__),
  [$hash]: dart.fieldType(core.String),
  [$host]: dart.fieldType(core.String),
  [$hostname]: dart.fieldType(core.String),
  [$href]: dart.fieldType(core.String),
  [$origin]: dart.finalFieldType(core.String),
  [$password]: dart.fieldType(core.String),
  [$pathname]: dart.fieldType(core.String),
  [$port]: dart.fieldType(core.String),
  [$protocol]: dart.fieldType(core.String),
  [$search]: dart.fieldType(core.String),
  [$searchParams]: dart.finalFieldType(html$.UrlSearchParams),
  [$username]: dart.fieldType(core.String)
}));
dart.registerExtension("URL", html$.Url);
html$.UrlSearchParams = class UrlSearchParams extends _interceptors.Interceptor {
  static new(init) {
    if (init === void 0) init = null;
    if (init != null) {
      return html$.UrlSearchParams._create_1(init);
    }
    return html$.UrlSearchParams._create_2();
  }
  static _create_1(init) {
    return new URLSearchParams(init);
  }
  static _create_2() {
    return new URLSearchParams();
  }
  [$append](...args) {
    return this.append.apply(this, args);
  }
  [$delete](...args) {
    return this.delete.apply(this, args);
  }
  [$get](...args) {
    return this.get.apply(this, args);
  }
  [$getAll](...args) {
    return this.getAll.apply(this, args);
  }
  [$has](...args) {
    return this.has.apply(this, args);
  }
  [$set](...args) {
    return this.set.apply(this, args);
  }
  [$sort](...args) {
    return this.sort.apply(this, args);
  }
};
dart.addTypeTests(html$.UrlSearchParams);
dart.setMethodSignature(html$.UrlSearchParams, () => ({
  __proto__: dart.getMethods(html$.UrlSearchParams.__proto__),
  [$append]: dart.fnType(dart.void, [core.String, core.String]),
  [$delete]: dart.fnType(dart.void, [core.String]),
  [$get]: dart.fnType(core.String, [core.String]),
  [$getAll]: dart.fnType(core.List$(core.String), [core.String]),
  [$has]: dart.fnType(core.bool, [core.String]),
  [$set]: dart.fnType(dart.void, [core.String, core.String]),
  [$sort]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.UrlSearchParams, "dart:html");
dart.registerExtension("URLSearchParams", html$.UrlSearchParams);
html$.UrlUtilsReadOnly = class UrlUtilsReadOnly extends _interceptors.Interceptor {
  get hash() {
    return this[hash$3];
  }
  set hash(value) {
    super.hash = value;
  }
  get host() {
    return this[host$4];
  }
  set host(value) {
    super.host = value;
  }
  get hostname() {
    return this[hostname$3];
  }
  set hostname(value) {
    super.hostname = value;
  }
  get href() {
    return this[href$7];
  }
  set href(value) {
    super.href = value;
  }
  get origin() {
    return this[origin$7];
  }
  set origin(value) {
    super.origin = value;
  }
  get pathname() {
    return this[pathname$3];
  }
  set pathname(value) {
    super.pathname = value;
  }
  get port() {
    return this[port$7];
  }
  set port(value) {
    super.port = value;
  }
  get protocol() {
    return this[protocol$5];
  }
  set protocol(value) {
    super.protocol = value;
  }
  get search() {
    return this[search$3];
  }
  set search(value) {
    super.search = value;
  }
};
dart.addTypeTests(html$.UrlUtilsReadOnly);
const hash$3 = Symbol("UrlUtilsReadOnly.hash");
const host$4 = Symbol("UrlUtilsReadOnly.host");
const hostname$3 = Symbol("UrlUtilsReadOnly.hostname");
const href$7 = Symbol("UrlUtilsReadOnly.href");
const origin$7 = Symbol("UrlUtilsReadOnly.origin");
const pathname$3 = Symbol("UrlUtilsReadOnly.pathname");
const port$7 = Symbol("UrlUtilsReadOnly.port");
const protocol$5 = Symbol("UrlUtilsReadOnly.protocol");
const search$3 = Symbol("UrlUtilsReadOnly.search");
dart.setLibraryUri(html$.UrlUtilsReadOnly, "dart:html");
dart.setFieldSignature(html$.UrlUtilsReadOnly, () => ({
  __proto__: dart.getFields(html$.UrlUtilsReadOnly.__proto__),
  hash: dart.finalFieldType(core.String),
  host: dart.finalFieldType(core.String),
  hostname: dart.finalFieldType(core.String),
  href: dart.finalFieldType(core.String),
  origin: dart.finalFieldType(core.String),
  pathname: dart.finalFieldType(core.String),
  port: dart.finalFieldType(core.String),
  protocol: dart.finalFieldType(core.String),
  search: dart.finalFieldType(core.String)
}));
dart.defineExtensionAccessors(html$.UrlUtilsReadOnly, [
  'hash',
  'host',
  'hostname',
  'href',
  'origin',
  'pathname',
  'port',
  'protocol',
  'search'
]);
html$.VR = class VR extends html$.EventTarget {
  [$getDevices]() {
    return html$.promiseToFuture(dart.dynamic, this.getDevices());
  }
};
dart.addTypeTests(html$.VR);
dart.setMethodSignature(html$.VR, () => ({
  __proto__: dart.getMethods(html$.VR.__proto__),
  [$getDevices]: dart.fnType(async.Future, [])
}));
dart.setLibraryUri(html$.VR, "dart:html");
dart.registerExtension("VR", html$.VR);
html$.VRCoordinateSystem = class VRCoordinateSystem extends _interceptors.Interceptor {
  [$getTransformTo](...args) {
    return this.getTransformTo.apply(this, args);
  }
};
dart.addTypeTests(html$.VRCoordinateSystem);
dart.setMethodSignature(html$.VRCoordinateSystem, () => ({
  __proto__: dart.getMethods(html$.VRCoordinateSystem.__proto__),
  [$getTransformTo]: dart.fnType(typed_data.Float32List, [html$.VRCoordinateSystem])
}));
dart.setLibraryUri(html$.VRCoordinateSystem, "dart:html");
dart.registerExtension("VRCoordinateSystem", html$.VRCoordinateSystem);
html$.VRDevice = class VRDevice extends html$.EventTarget {
  get [$deviceName]() {
    return this.deviceName;
  }
  get [$isExternal]() {
    return this.isExternal;
  }
  [$requestSession](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.requestSession(options_dict));
  }
  [$supportsSession](options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.supportsSession(options_dict));
  }
};
dart.addTypeTests(html$.VRDevice);
const deviceName = Symbol("VRDevice.deviceName");
const isExternal = Symbol("VRDevice.isExternal");
dart.setMethodSignature(html$.VRDevice, () => ({
  __proto__: dart.getMethods(html$.VRDevice.__proto__),
  [$requestSession]: dart.fnType(async.Future, [], [core.Map]),
  [$supportsSession]: dart.fnType(async.Future, [], [core.Map])
}));
dart.setLibraryUri(html$.VRDevice, "dart:html");
dart.setFieldSignature(html$.VRDevice, () => ({
  __proto__: dart.getFields(html$.VRDevice.__proto__),
  [$deviceName]: dart.finalFieldType(core.String),
  [$isExternal]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("VRDevice", html$.VRDevice);
html$.VRDeviceEvent = class VRDeviceEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.VRDeviceEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new VRDeviceEvent(type, eventInitDict);
  }
  get [$device]() {
    return this.device;
  }
};
dart.addTypeTests(html$.VRDeviceEvent);
const device = Symbol("VRDeviceEvent.device");
dart.setLibraryUri(html$.VRDeviceEvent, "dart:html");
dart.setFieldSignature(html$.VRDeviceEvent, () => ({
  __proto__: dart.getFields(html$.VRDeviceEvent.__proto__),
  [$device]: dart.finalFieldType(html$.VRDevice)
}));
dart.registerExtension("VRDeviceEvent", html$.VRDeviceEvent);
html$.VRDisplay = class VRDisplay extends html$.EventTarget {
  get [$capabilities]() {
    return this.capabilities;
  }
  get [$depthFar]() {
    return this.depthFar;
  }
  set [$depthFar](value) {
    this.depthFar = value;
  }
  get [$depthNear]() {
    return this.depthNear;
  }
  set [$depthNear](value) {
    this.depthNear = value;
  }
  get [$displayId]() {
    return this.displayId;
  }
  get [$displayName]() {
    return this.displayName;
  }
  get [$isPresenting]() {
    return this.isPresenting;
  }
  get [$stageParameters]() {
    return this.stageParameters;
  }
  [$cancelAnimationFrame](...args) {
    return this.cancelAnimationFrame.apply(this, args);
  }
  [$exitPresent]() {
    return html$.promiseToFuture(dart.dynamic, this.exitPresent());
  }
  [$getEyeParameters](...args) {
    return this.getEyeParameters.apply(this, args);
  }
  [$getFrameData](...args) {
    return this.getFrameData.apply(this, args);
  }
  [$getLayers](...args) {
    return this.getLayers.apply(this, args);
  }
  [$requestAnimationFrame](...args) {
    return this.requestAnimationFrame.apply(this, args);
  }
  [$requestPresent](layers) {
    return html$.promiseToFuture(dart.dynamic, this.requestPresent(layers));
  }
  [$submitFrame](...args) {
    return this.submitFrame.apply(this, args);
  }
};
dart.addTypeTests(html$.VRDisplay);
const capabilities = Symbol("VRDisplay.capabilities");
const depthFar = Symbol("VRDisplay.depthFar");
const depthNear = Symbol("VRDisplay.depthNear");
const displayId$ = Symbol("VRDisplay.displayId");
const displayName = Symbol("VRDisplay.displayName");
const isPresenting = Symbol("VRDisplay.isPresenting");
const stageParameters = Symbol("VRDisplay.stageParameters");
dart.setMethodSignature(html$.VRDisplay, () => ({
  __proto__: dart.getMethods(html$.VRDisplay.__proto__),
  [$cancelAnimationFrame]: dart.fnType(dart.void, [core.int]),
  [$exitPresent]: dart.fnType(async.Future, []),
  [$getEyeParameters]: dart.fnType(html$.VREyeParameters, [core.String]),
  [$getFrameData]: dart.fnType(core.bool, [html$.VRFrameData]),
  [$getLayers]: dart.fnType(core.List$(core.Map), []),
  [$requestAnimationFrame]: dart.fnType(core.int, [dart.fnType(dart.void, [core.num])]),
  [$requestPresent]: dart.fnType(async.Future, [core.List$(core.Map)]),
  [$submitFrame]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.VRDisplay, "dart:html");
dart.setFieldSignature(html$.VRDisplay, () => ({
  __proto__: dart.getFields(html$.VRDisplay.__proto__),
  [$capabilities]: dart.finalFieldType(html$.VRDisplayCapabilities),
  [$depthFar]: dart.fieldType(core.num),
  [$depthNear]: dart.fieldType(core.num),
  [$displayId]: dart.finalFieldType(core.int),
  [$displayName]: dart.finalFieldType(core.String),
  [$isPresenting]: dart.finalFieldType(core.bool),
  [$stageParameters]: dart.finalFieldType(html$.VRStageParameters)
}));
dart.registerExtension("VRDisplay", html$.VRDisplay);
html$.VRDisplayCapabilities = class VRDisplayCapabilities extends _interceptors.Interceptor {
  get [$canPresent]() {
    return this.canPresent;
  }
  get [$hasExternalDisplay]() {
    return this.hasExternalDisplay;
  }
  get [$hasPosition]() {
    return this.hasPosition;
  }
  get [$maxLayers]() {
    return this.maxLayers;
  }
};
dart.addTypeTests(html$.VRDisplayCapabilities);
const canPresent = Symbol("VRDisplayCapabilities.canPresent");
const hasExternalDisplay = Symbol("VRDisplayCapabilities.hasExternalDisplay");
const hasPosition$ = Symbol("VRDisplayCapabilities.hasPosition");
const maxLayers = Symbol("VRDisplayCapabilities.maxLayers");
dart.setLibraryUri(html$.VRDisplayCapabilities, "dart:html");
dart.setFieldSignature(html$.VRDisplayCapabilities, () => ({
  __proto__: dart.getFields(html$.VRDisplayCapabilities.__proto__),
  [$canPresent]: dart.finalFieldType(core.bool),
  [$hasExternalDisplay]: dart.finalFieldType(core.bool),
  [$hasPosition]: dart.finalFieldType(core.bool),
  [$maxLayers]: dart.finalFieldType(core.int)
}));
dart.registerExtension("VRDisplayCapabilities", html$.VRDisplayCapabilities);
html$.VRDisplayEvent = class VRDisplayEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.VRDisplayEvent._create_1(type, eventInitDict_1);
    }
    return html$.VRDisplayEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new VRDisplayEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new VRDisplayEvent(type);
  }
  get [$display]() {
    return this.display;
  }
  get [$reason]() {
    return this.reason;
  }
};
dart.addTypeTests(html$.VRDisplayEvent);
const display$ = Symbol("VRDisplayEvent.display");
const reason$2 = Symbol("VRDisplayEvent.reason");
dart.setLibraryUri(html$.VRDisplayEvent, "dart:html");
dart.setFieldSignature(html$.VRDisplayEvent, () => ({
  __proto__: dart.getFields(html$.VRDisplayEvent.__proto__),
  [$display]: dart.finalFieldType(html$.VRDisplay),
  [$reason]: dart.finalFieldType(core.String)
}));
dart.registerExtension("VRDisplayEvent", html$.VRDisplayEvent);
html$.VREyeParameters = class VREyeParameters extends _interceptors.Interceptor {
  get [$offset]() {
    return this.offset;
  }
  get [$renderHeight]() {
    return this.renderHeight;
  }
  get [$renderWidth]() {
    return this.renderWidth;
  }
};
dart.addTypeTests(html$.VREyeParameters);
const offset = Symbol("VREyeParameters.offset");
const renderHeight = Symbol("VREyeParameters.renderHeight");
const renderWidth = Symbol("VREyeParameters.renderWidth");
dart.setLibraryUri(html$.VREyeParameters, "dart:html");
dart.setFieldSignature(html$.VREyeParameters, () => ({
  __proto__: dart.getFields(html$.VREyeParameters.__proto__),
  [$offset]: dart.finalFieldType(typed_data.Float32List),
  [$renderHeight]: dart.finalFieldType(core.int),
  [$renderWidth]: dart.finalFieldType(core.int)
}));
dart.registerExtension("VREyeParameters", html$.VREyeParameters);
html$.VRFrameData = class VRFrameData$ extends _interceptors.Interceptor {
  static new() {
    return html$.VRFrameData._create_1();
  }
  static _create_1() {
    return new VRFrameData();
  }
  get [$leftProjectionMatrix]() {
    return this.leftProjectionMatrix;
  }
  get [$leftViewMatrix]() {
    return this.leftViewMatrix;
  }
  get [$pose]() {
    return this.pose;
  }
  get [$rightProjectionMatrix]() {
    return this.rightProjectionMatrix;
  }
  get [$rightViewMatrix]() {
    return this.rightViewMatrix;
  }
};
dart.addTypeTests(html$.VRFrameData);
const leftProjectionMatrix = Symbol("VRFrameData.leftProjectionMatrix");
const leftViewMatrix = Symbol("VRFrameData.leftViewMatrix");
const pose$ = Symbol("VRFrameData.pose");
const rightProjectionMatrix = Symbol("VRFrameData.rightProjectionMatrix");
const rightViewMatrix = Symbol("VRFrameData.rightViewMatrix");
dart.setLibraryUri(html$.VRFrameData, "dart:html");
dart.setFieldSignature(html$.VRFrameData, () => ({
  __proto__: dart.getFields(html$.VRFrameData.__proto__),
  [$leftProjectionMatrix]: dart.finalFieldType(typed_data.Float32List),
  [$leftViewMatrix]: dart.finalFieldType(typed_data.Float32List),
  [$pose]: dart.finalFieldType(html$.VRPose),
  [$rightProjectionMatrix]: dart.finalFieldType(typed_data.Float32List),
  [$rightViewMatrix]: dart.finalFieldType(typed_data.Float32List)
}));
dart.registerExtension("VRFrameData", html$.VRFrameData);
html$.VRFrameOfReference = class VRFrameOfReference extends html$.VRCoordinateSystem {
  get [$bounds]() {
    return this.bounds;
  }
  get [$emulatedHeight]() {
    return this.emulatedHeight;
  }
};
dart.addTypeTests(html$.VRFrameOfReference);
const bounds = Symbol("VRFrameOfReference.bounds");
const emulatedHeight = Symbol("VRFrameOfReference.emulatedHeight");
dart.setLibraryUri(html$.VRFrameOfReference, "dart:html");
dart.setFieldSignature(html$.VRFrameOfReference, () => ({
  __proto__: dart.getFields(html$.VRFrameOfReference.__proto__),
  [$bounds]: dart.finalFieldType(html$.VRStageBounds),
  [$emulatedHeight]: dart.finalFieldType(core.num)
}));
dart.registerExtension("VRFrameOfReference", html$.VRFrameOfReference);
html$.VRPose = class VRPose extends _interceptors.Interceptor {
  get [$angularAcceleration]() {
    return this.angularAcceleration;
  }
  get [$angularVelocity]() {
    return this.angularVelocity;
  }
  get [$linearAcceleration]() {
    return this.linearAcceleration;
  }
  get [$linearVelocity]() {
    return this.linearVelocity;
  }
  get [$orientation]() {
    return this.orientation;
  }
  get [$position]() {
    return this.position;
  }
};
dart.addTypeTests(html$.VRPose);
const angularAcceleration$ = Symbol("VRPose.angularAcceleration");
const angularVelocity$ = Symbol("VRPose.angularVelocity");
const linearAcceleration$ = Symbol("VRPose.linearAcceleration");
const linearVelocity$ = Symbol("VRPose.linearVelocity");
const orientation$2 = Symbol("VRPose.orientation");
const position$1 = Symbol("VRPose.position");
dart.setLibraryUri(html$.VRPose, "dart:html");
dart.setFieldSignature(html$.VRPose, () => ({
  __proto__: dart.getFields(html$.VRPose.__proto__),
  [$angularAcceleration]: dart.finalFieldType(typed_data.Float32List),
  [$angularVelocity]: dart.finalFieldType(typed_data.Float32List),
  [$linearAcceleration]: dart.finalFieldType(typed_data.Float32List),
  [$linearVelocity]: dart.finalFieldType(typed_data.Float32List),
  [$orientation]: dart.finalFieldType(typed_data.Float32List),
  [$position]: dart.finalFieldType(typed_data.Float32List)
}));
dart.registerExtension("VRPose", html$.VRPose);
html$.VRSession = class VRSession extends html$.EventTarget {
  get [$depthFar]() {
    return this.depthFar;
  }
  set [$depthFar](value) {
    this.depthFar = value;
  }
  get [$depthNear]() {
    return this.depthNear;
  }
  set [$depthNear](value) {
    this.depthNear = value;
  }
  get [$device]() {
    return this.device;
  }
  get [$exclusive]() {
    return this.exclusive;
  }
  [$end]() {
    return html$.promiseToFuture(dart.dynamic, this.end());
  }
  [$requestFrameOfReference](type, options) {
    if (options === void 0) options = null;
    let options_dict = null;
    if (options != null) {
      options_dict = html_common.convertDartToNative_Dictionary(options);
    }
    return html$.promiseToFuture(dart.dynamic, this.requestFrameOfReference(type, options_dict));
  }
  get [$onBlur]() {
    return html$.VRSession.blurEvent.forTarget(this);
  }
  get [$onFocus]() {
    return html$.VRSession.focusEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.VRSession);
const depthFar$ = Symbol("VRSession.depthFar");
const depthNear$ = Symbol("VRSession.depthNear");
const device$ = Symbol("VRSession.device");
const exclusive = Symbol("VRSession.exclusive");
dart.setMethodSignature(html$.VRSession, () => ({
  __proto__: dart.getMethods(html$.VRSession.__proto__),
  [$end]: dart.fnType(async.Future, []),
  [$requestFrameOfReference]: dart.fnType(async.Future, [core.String], [core.Map])
}));
dart.setGetterSignature(html$.VRSession, () => ({
  __proto__: dart.getGetters(html$.VRSession.__proto__),
  [$onBlur]: async.Stream$(html$.Event),
  [$onFocus]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.VRSession, "dart:html");
dart.setFieldSignature(html$.VRSession, () => ({
  __proto__: dart.getFields(html$.VRSession.__proto__),
  [$depthFar]: dart.fieldType(core.num),
  [$depthNear]: dart.fieldType(core.num),
  [$device]: dart.finalFieldType(html$.VRDevice),
  [$exclusive]: dart.finalFieldType(core.bool)
}));
dart.defineLazy(html$.VRSession, {
  /*html$.VRSession.blurEvent*/get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("blur"));
  },
  /*html$.VRSession.focusEvent*/get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("focus"));
  }
});
dart.registerExtension("VRSession", html$.VRSession);
html$.VRSessionEvent = class VRSessionEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$.VRSessionEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new VRSessionEvent(type, eventInitDict);
  }
  get [$session]() {
    return this.session;
  }
};
dart.addTypeTests(html$.VRSessionEvent);
const session = Symbol("VRSessionEvent.session");
dart.setLibraryUri(html$.VRSessionEvent, "dart:html");
dart.setFieldSignature(html$.VRSessionEvent, () => ({
  __proto__: dart.getFields(html$.VRSessionEvent.__proto__),
  [$session]: dart.finalFieldType(html$.VRSession)
}));
dart.registerExtension("VRSessionEvent", html$.VRSessionEvent);
html$.VRStageBounds = class VRStageBounds extends _interceptors.Interceptor {
  get [$geometry]() {
    return this.geometry;
  }
};
dart.addTypeTests(html$.VRStageBounds);
const geometry = Symbol("VRStageBounds.geometry");
dart.setLibraryUri(html$.VRStageBounds, "dart:html");
dart.setFieldSignature(html$.VRStageBounds, () => ({
  __proto__: dart.getFields(html$.VRStageBounds.__proto__),
  [$geometry]: dart.finalFieldType(ListOfVRStageBoundsPoint())
}));
dart.registerExtension("VRStageBounds", html$.VRStageBounds);
html$.VRStageBoundsPoint = class VRStageBoundsPoint extends _interceptors.Interceptor {
  get [$x]() {
    return this.x;
  }
  get [$z]() {
    return this.z;
  }
};
dart.addTypeTests(html$.VRStageBoundsPoint);
const x$6 = Symbol("VRStageBoundsPoint.x");
const z$5 = Symbol("VRStageBoundsPoint.z");
dart.setLibraryUri(html$.VRStageBoundsPoint, "dart:html");
dart.setFieldSignature(html$.VRStageBoundsPoint, () => ({
  __proto__: dart.getFields(html$.VRStageBoundsPoint.__proto__),
  [$x]: dart.finalFieldType(core.num),
  [$z]: dart.finalFieldType(core.num)
}));
dart.registerExtension("VRStageBoundsPoint", html$.VRStageBoundsPoint);
html$.VRStageParameters = class VRStageParameters extends _interceptors.Interceptor {
  get [$sittingToStandingTransform]() {
    return this.sittingToStandingTransform;
  }
  get [$sizeX]() {
    return this.sizeX;
  }
  get [$sizeZ]() {
    return this.sizeZ;
  }
};
dart.addTypeTests(html$.VRStageParameters);
const sittingToStandingTransform = Symbol("VRStageParameters.sittingToStandingTransform");
const sizeX = Symbol("VRStageParameters.sizeX");
const sizeZ = Symbol("VRStageParameters.sizeZ");
dart.setLibraryUri(html$.VRStageParameters, "dart:html");
dart.setFieldSignature(html$.VRStageParameters, () => ({
  __proto__: dart.getFields(html$.VRStageParameters.__proto__),
  [$sittingToStandingTransform]: dart.finalFieldType(typed_data.Float32List),
  [$sizeX]: dart.finalFieldType(core.num),
  [$sizeZ]: dart.finalFieldType(core.num)
}));
dart.registerExtension("VRStageParameters", html$.VRStageParameters);
html$.ValidityState = class ValidityState extends _interceptors.Interceptor {
  get [$badInput]() {
    return this.badInput;
  }
  get [$customError]() {
    return this.customError;
  }
  get [$patternMismatch]() {
    return this.patternMismatch;
  }
  get [$rangeOverflow]() {
    return this.rangeOverflow;
  }
  get [$rangeUnderflow]() {
    return this.rangeUnderflow;
  }
  get [$stepMismatch]() {
    return this.stepMismatch;
  }
  get [$tooLong]() {
    return this.tooLong;
  }
  get [$tooShort]() {
    return this.tooShort;
  }
  get [$typeMismatch]() {
    return this.typeMismatch;
  }
  get [$valid]() {
    return this.valid;
  }
  get [$valueMissing]() {
    return this.valueMissing;
  }
};
dart.addTypeTests(html$.ValidityState);
const badInput = Symbol("ValidityState.badInput");
const customError = Symbol("ValidityState.customError");
const patternMismatch = Symbol("ValidityState.patternMismatch");
const rangeOverflow = Symbol("ValidityState.rangeOverflow");
const rangeUnderflow = Symbol("ValidityState.rangeUnderflow");
const stepMismatch = Symbol("ValidityState.stepMismatch");
const tooLong = Symbol("ValidityState.tooLong");
const tooShort = Symbol("ValidityState.tooShort");
const typeMismatch = Symbol("ValidityState.typeMismatch");
const valid = Symbol("ValidityState.valid");
const valueMissing = Symbol("ValidityState.valueMissing");
dart.setLibraryUri(html$.ValidityState, "dart:html");
dart.setFieldSignature(html$.ValidityState, () => ({
  __proto__: dart.getFields(html$.ValidityState.__proto__),
  [$badInput]: dart.finalFieldType(core.bool),
  [$customError]: dart.finalFieldType(core.bool),
  [$patternMismatch]: dart.finalFieldType(core.bool),
  [$rangeOverflow]: dart.finalFieldType(core.bool),
  [$rangeUnderflow]: dart.finalFieldType(core.bool),
  [$stepMismatch]: dart.finalFieldType(core.bool),
  [$tooLong]: dart.finalFieldType(core.bool),
  [$tooShort]: dart.finalFieldType(core.bool),
  [$typeMismatch]: dart.finalFieldType(core.bool),
  [$valid]: dart.finalFieldType(core.bool),
  [$valueMissing]: dart.finalFieldType(core.bool)
}));
dart.registerExtension("ValidityState", html$.ValidityState);
html$.VideoElement = class VideoElement extends html$.MediaElement {
  static new() {
    return html$.document.createElement("video");
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$poster]() {
    return this.poster;
  }
  set [$poster](value) {
    this.poster = value;
  }
  get [$videoHeight]() {
    return this.videoHeight;
  }
  get [$videoWidth]() {
    return this.videoWidth;
  }
  get [$decodedFrameCount]() {
    return this.webkitDecodedFrameCount;
  }
  get [$droppedFrameCount]() {
    return this.webkitDroppedFrameCount;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  [$getVideoPlaybackQuality](...args) {
    return this.getVideoPlaybackQuality.apply(this, args);
  }
  [$enterFullscreen](...args) {
    return this.webkitEnterFullscreen.apply(this, args);
  }
  [$exitFullscreen](...args) {
    return this.webkitExitFullscreen.apply(this, args);
  }
};
(html$.VideoElement.created = function() {
  this[height$11] = null;
  this[poster] = null;
  this[videoHeight] = null;
  this[videoWidth] = null;
  this[decodedFrameCount] = null;
  this[droppedFrameCount] = null;
  this[width$12] = null;
  html$.VideoElement.__proto__.created.call(this);
}).prototype = html$.VideoElement.prototype;
dart.addTypeTests(html$.VideoElement);
const height$11 = Symbol("VideoElement.height");
const poster = Symbol("VideoElement.poster");
const videoHeight = Symbol("VideoElement.videoHeight");
const videoWidth = Symbol("VideoElement.videoWidth");
const decodedFrameCount = Symbol("VideoElement.decodedFrameCount");
const droppedFrameCount = Symbol("VideoElement.droppedFrameCount");
const width$12 = Symbol("VideoElement.width");
html$.VideoElement[dart.implements] = () => [html$.CanvasImageSource];
dart.setMethodSignature(html$.VideoElement, () => ({
  __proto__: dart.getMethods(html$.VideoElement.__proto__),
  [$getVideoPlaybackQuality]: dart.fnType(html$.VideoPlaybackQuality, []),
  [$enterFullscreen]: dart.fnType(dart.void, []),
  [$exitFullscreen]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.VideoElement, "dart:html");
dart.setFieldSignature(html$.VideoElement, () => ({
  __proto__: dart.getFields(html$.VideoElement.__proto__),
  [$height]: dart.fieldType(core.int),
  [$poster]: dart.fieldType(core.String),
  [$videoHeight]: dart.finalFieldType(core.int),
  [$videoWidth]: dart.finalFieldType(core.int),
  [$decodedFrameCount]: dart.finalFieldType(core.int),
  [$droppedFrameCount]: dart.finalFieldType(core.int),
  [$width]: dart.fieldType(core.int)
}));
dart.registerExtension("HTMLVideoElement", html$.VideoElement);
html$.VideoPlaybackQuality = class VideoPlaybackQuality extends _interceptors.Interceptor {
  get [$corruptedVideoFrames]() {
    return this.corruptedVideoFrames;
  }
  get [$creationTime]() {
    return this.creationTime;
  }
  get [$droppedVideoFrames]() {
    return this.droppedVideoFrames;
  }
  get [$totalVideoFrames]() {
    return this.totalVideoFrames;
  }
};
dart.addTypeTests(html$.VideoPlaybackQuality);
const corruptedVideoFrames = Symbol("VideoPlaybackQuality.corruptedVideoFrames");
const creationTime = Symbol("VideoPlaybackQuality.creationTime");
const droppedVideoFrames = Symbol("VideoPlaybackQuality.droppedVideoFrames");
const totalVideoFrames = Symbol("VideoPlaybackQuality.totalVideoFrames");
dart.setLibraryUri(html$.VideoPlaybackQuality, "dart:html");
dart.setFieldSignature(html$.VideoPlaybackQuality, () => ({
  __proto__: dart.getFields(html$.VideoPlaybackQuality.__proto__),
  [$corruptedVideoFrames]: dart.finalFieldType(core.int),
  [$creationTime]: dart.finalFieldType(core.num),
  [$droppedVideoFrames]: dart.finalFieldType(core.int),
  [$totalVideoFrames]: dart.finalFieldType(core.int)
}));
dart.registerExtension("VideoPlaybackQuality", html$.VideoPlaybackQuality);
html$.VideoTrack = class VideoTrack extends _interceptors.Interceptor {
  get [$id]() {
    return this.id;
  }
  get [$kind]() {
    return this.kind;
  }
  get [$label]() {
    return this.label;
  }
  get [$language]() {
    return this.language;
  }
  get [$selected]() {
    return this.selected;
  }
  set [$selected](value) {
    this.selected = value;
  }
  get [$sourceBuffer]() {
    return this.sourceBuffer;
  }
};
dart.addTypeTests(html$.VideoTrack);
const id$16 = Symbol("VideoTrack.id");
const kind$3 = Symbol("VideoTrack.kind");
const label$7 = Symbol("VideoTrack.label");
const language$1 = Symbol("VideoTrack.language");
const selected$0 = Symbol("VideoTrack.selected");
const sourceBuffer = Symbol("VideoTrack.sourceBuffer");
dart.setLibraryUri(html$.VideoTrack, "dart:html");
dart.setFieldSignature(html$.VideoTrack, () => ({
  __proto__: dart.getFields(html$.VideoTrack.__proto__),
  [$id]: dart.finalFieldType(core.String),
  [$kind]: dart.finalFieldType(core.String),
  [$label]: dart.finalFieldType(core.String),
  [$language]: dart.finalFieldType(core.String),
  [$selected]: dart.fieldType(core.bool),
  [$sourceBuffer]: dart.finalFieldType(html$.SourceBuffer)
}));
dart.registerExtension("VideoTrack", html$.VideoTrack);
html$.VideoTrackList = class VideoTrackList extends html$.EventTarget {
  get [$length]() {
    return this.length;
  }
  get [$selectedIndex]() {
    return this.selectedIndex;
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [$getTrackById](...args) {
    return this.getTrackById.apply(this, args);
  }
  get [$onChange]() {
    return html$.VideoTrackList.changeEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.VideoTrackList);
const length$16 = Symbol("VideoTrackList.length");
const selectedIndex$ = Symbol("VideoTrackList.selectedIndex");
dart.setMethodSignature(html$.VideoTrackList, () => ({
  __proto__: dart.getMethods(html$.VideoTrackList.__proto__),
  [__getter__]: dart.fnType(html$.VideoTrack, [core.int]),
  [$getTrackById]: dart.fnType(html$.VideoTrack, [core.String])
}));
dart.setGetterSignature(html$.VideoTrackList, () => ({
  __proto__: dart.getGetters(html$.VideoTrackList.__proto__),
  [$onChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.VideoTrackList, "dart:html");
dart.setFieldSignature(html$.VideoTrackList, () => ({
  __proto__: dart.getFields(html$.VideoTrackList.__proto__),
  [$length]: dart.finalFieldType(core.int),
  [$selectedIndex]: dart.finalFieldType(core.int)
}));
dart.defineLazy(html$.VideoTrackList, {
  /*html$.VideoTrackList.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  }
});
dart.registerExtension("VideoTrackList", html$.VideoTrackList);
html$.VisualViewport = class VisualViewport extends html$.EventTarget {
  get [$height]() {
    return this.height;
  }
  get [$offsetLeft]() {
    return this.offsetLeft;
  }
  get [$offsetTop]() {
    return this.offsetTop;
  }
  get [$pageLeft]() {
    return this.pageLeft;
  }
  get [$pageTop]() {
    return this.pageTop;
  }
  get [$scale]() {
    return this.scale;
  }
  get [$width]() {
    return this.width;
  }
  get [$onResize]() {
    return html$.VisualViewport.resizeEvent.forTarget(this);
  }
  get [$onScroll]() {
    return html$.VisualViewport.scrollEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.VisualViewport);
const height$12 = Symbol("VisualViewport.height");
const offsetLeft = Symbol("VisualViewport.offsetLeft");
const offsetTop = Symbol("VisualViewport.offsetTop");
const pageLeft = Symbol("VisualViewport.pageLeft");
const pageTop = Symbol("VisualViewport.pageTop");
const scale = Symbol("VisualViewport.scale");
const width$13 = Symbol("VisualViewport.width");
dart.setGetterSignature(html$.VisualViewport, () => ({
  __proto__: dart.getGetters(html$.VisualViewport.__proto__),
  [$onResize]: async.Stream$(html$.Event),
  [$onScroll]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.VisualViewport, "dart:html");
dart.setFieldSignature(html$.VisualViewport, () => ({
  __proto__: dart.getFields(html$.VisualViewport.__proto__),
  [$height]: dart.finalFieldType(core.num),
  [$offsetLeft]: dart.finalFieldType(core.num),
  [$offsetTop]: dart.finalFieldType(core.num),
  [$pageLeft]: dart.finalFieldType(core.num),
  [$pageTop]: dart.finalFieldType(core.num),
  [$scale]: dart.finalFieldType(core.num),
  [$width]: dart.finalFieldType(core.num)
}));
dart.defineLazy(html$.VisualViewport, {
  /*html$.VisualViewport.resizeEvent*/get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("resize"));
  },
  /*html$.VisualViewport.scrollEvent*/get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("scroll"));
  }
});
dart.registerExtension("VisualViewport", html$.VisualViewport);
html$.VttCue = class VttCue extends html$.TextTrackCue {
  static new(startTime, endTime, text) {
    return html$.VttCue._create_1(startTime, endTime, text);
  }
  static _create_1(startTime, endTime, text) {
    return new VTTCue(startTime, endTime, text);
  }
  get [$align]() {
    return this.align;
  }
  set [$align](value) {
    this.align = value;
  }
  get [$line]() {
    return this.line;
  }
  set [$line](value) {
    this.line = value;
  }
  get [$position]() {
    return this.position;
  }
  set [$position](value) {
    this.position = value;
  }
  get [$region]() {
    return this.region;
  }
  set [$region](value) {
    this.region = value;
  }
  get [$size]() {
    return this.size;
  }
  set [$size](value) {
    this.size = value;
  }
  get [$snapToLines]() {
    return this.snapToLines;
  }
  set [$snapToLines](value) {
    this.snapToLines = value;
  }
  get [$text]() {
    return this.text;
  }
  set [$text](value) {
    this.text = value;
  }
  get [$vertical]() {
    return this.vertical;
  }
  set [$vertical](value) {
    this.vertical = value;
  }
  [$getCueAsHtml](...args) {
    return this.getCueAsHTML.apply(this, args);
  }
};
dart.addTypeTests(html$.VttCue);
const align = Symbol("VttCue.align");
const line = Symbol("VttCue.line");
const position$2 = Symbol("VttCue.position");
const region$1 = Symbol("VttCue.region");
const size$6 = Symbol("VttCue.size");
const snapToLines = Symbol("VttCue.snapToLines");
const text$1 = Symbol("VttCue.text");
const vertical = Symbol("VttCue.vertical");
dart.setMethodSignature(html$.VttCue, () => ({
  __proto__: dart.getMethods(html$.VttCue.__proto__),
  [$getCueAsHtml]: dart.fnType(html$.DocumentFragment, [])
}));
dart.setLibraryUri(html$.VttCue, "dart:html");
dart.setFieldSignature(html$.VttCue, () => ({
  __proto__: dart.getFields(html$.VttCue.__proto__),
  [$align]: dart.fieldType(core.String),
  [$line]: dart.fieldType(core.Object),
  [$position]: dart.fieldType(core.Object),
  [$region]: dart.fieldType(html$.VttRegion),
  [$size]: dart.fieldType(core.num),
  [$snapToLines]: dart.fieldType(core.bool),
  [$text]: dart.fieldType(core.String),
  [$vertical]: dart.fieldType(core.String)
}));
dart.registerExtension("VTTCue", html$.VttCue);
html$.VttRegion = class VttRegion extends _interceptors.Interceptor {
  static new() {
    return html$.VttRegion._create_1();
  }
  static _create_1() {
    return new VTTRegion();
  }
  get [$id]() {
    return this.id;
  }
  set [$id](value) {
    this.id = value;
  }
  get [$lines]() {
    return this.lines;
  }
  set [$lines](value) {
    this.lines = value;
  }
  get [$regionAnchorX]() {
    return this.regionAnchorX;
  }
  set [$regionAnchorX](value) {
    this.regionAnchorX = value;
  }
  get [$regionAnchorY]() {
    return this.regionAnchorY;
  }
  set [$regionAnchorY](value) {
    this.regionAnchorY = value;
  }
  get [$scroll]() {
    return this.scroll;
  }
  set [$scroll](value) {
    this.scroll = value;
  }
  get [$viewportAnchorX]() {
    return this.viewportAnchorX;
  }
  set [$viewportAnchorX](value) {
    this.viewportAnchorX = value;
  }
  get [$viewportAnchorY]() {
    return this.viewportAnchorY;
  }
  set [$viewportAnchorY](value) {
    this.viewportAnchorY = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
};
dart.addTypeTests(html$.VttRegion);
const id$17 = Symbol("VttRegion.id");
const lines = Symbol("VttRegion.lines");
const regionAnchorX = Symbol("VttRegion.regionAnchorX");
const regionAnchorY = Symbol("VttRegion.regionAnchorY");
const scroll = Symbol("VttRegion.scroll");
const viewportAnchorX = Symbol("VttRegion.viewportAnchorX");
const viewportAnchorY = Symbol("VttRegion.viewportAnchorY");
const width$14 = Symbol("VttRegion.width");
dart.setLibraryUri(html$.VttRegion, "dart:html");
dart.setFieldSignature(html$.VttRegion, () => ({
  __proto__: dart.getFields(html$.VttRegion.__proto__),
  [$id]: dart.fieldType(core.String),
  [$lines]: dart.fieldType(core.int),
  [$regionAnchorX]: dart.fieldType(core.num),
  [$regionAnchorY]: dart.fieldType(core.num),
  [$scroll]: dart.fieldType(core.String),
  [$viewportAnchorX]: dart.fieldType(core.num),
  [$viewportAnchorY]: dart.fieldType(core.num),
  [$width]: dart.fieldType(core.num)
}));
dart.registerExtension("VTTRegion", html$.VttRegion);
html$.WebSocket = class WebSocket$ extends html$.EventTarget {
  static new(url, protocols) {
    if (protocols === void 0) protocols = null;
    if (protocols != null) {
      return html$.WebSocket._create_1(url, protocols);
    }
    return html$.WebSocket._create_2(url);
  }
  static _create_1(url, protocols) {
    return new WebSocket(url, protocols);
  }
  static _create_2(url) {
    return new WebSocket(url);
  }
  static get supported() {
    return typeof window.WebSocket != "undefined";
  }
  get [$binaryType]() {
    return this.binaryType;
  }
  set [$binaryType](value) {
    this.binaryType = value;
  }
  get [$bufferedAmount]() {
    return this.bufferedAmount;
  }
  get [$extensions]() {
    return this.extensions;
  }
  get [$protocol]() {
    return this.protocol;
  }
  get [$readyState]() {
    return this.readyState;
  }
  get [$url]() {
    return this.url;
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$send](...args) {
    return this.send.apply(this, args);
  }
  [$sendBlob](...args) {
    return this.send.apply(this, args);
  }
  [$sendByteBuffer](...args) {
    return this.send.apply(this, args);
  }
  [$sendString](...args) {
    return this.send.apply(this, args);
  }
  [$sendTypedData](...args) {
    return this.send.apply(this, args);
  }
  get [$onClose]() {
    return html$.WebSocket.closeEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.WebSocket.errorEvent.forTarget(this);
  }
  get [$onMessage]() {
    return html$.WebSocket.messageEvent.forTarget(this);
  }
  get [$onOpen]() {
    return html$.WebSocket.openEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.WebSocket);
const binaryType$0 = Symbol("WebSocket.binaryType");
const bufferedAmount$ = Symbol("WebSocket.bufferedAmount");
const extensions = Symbol("WebSocket.extensions");
const protocol$6 = Symbol("WebSocket.protocol");
const readyState$9 = Symbol("WebSocket.readyState");
const url$5 = Symbol("WebSocket.url");
dart.setMethodSignature(html$.WebSocket, () => ({
  __proto__: dart.getMethods(html$.WebSocket.__proto__),
  [$close]: dart.fnType(dart.void, [], [core.int, core.String]),
  [$send]: dart.fnType(dart.void, [dart.dynamic]),
  [$sendBlob]: dart.fnType(dart.void, [html$.Blob]),
  [$sendByteBuffer]: dart.fnType(dart.void, [typed_data.ByteBuffer]),
  [$sendString]: dart.fnType(dart.void, [core.String]),
  [$sendTypedData]: dart.fnType(dart.void, [typed_data.TypedData])
}));
dart.setGetterSignature(html$.WebSocket, () => ({
  __proto__: dart.getGetters(html$.WebSocket.__proto__),
  [$onClose]: async.Stream$(html$.CloseEvent),
  [$onError]: async.Stream$(html$.Event),
  [$onMessage]: async.Stream$(html$.MessageEvent),
  [$onOpen]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.WebSocket, "dart:html");
dart.setFieldSignature(html$.WebSocket, () => ({
  __proto__: dart.getFields(html$.WebSocket.__proto__),
  [$binaryType]: dart.fieldType(core.String),
  [$bufferedAmount]: dart.finalFieldType(core.int),
  [$extensions]: dart.finalFieldType(core.String),
  [$protocol]: dart.finalFieldType(core.String),
  [$readyState]: dart.finalFieldType(core.int),
  [$url]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.WebSocket, {
  /*html$.WebSocket.closeEvent*/get closeEvent() {
    return dart.const(new (EventStreamProviderOfCloseEvent()).new("close"));
  },
  /*html$.WebSocket.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.WebSocket.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  },
  /*html$.WebSocket.openEvent*/get openEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("open"));
  },
  /*html$.WebSocket.CLOSED*/get CLOSED() {
    return 3;
  },
  /*html$.WebSocket.CLOSING*/get CLOSING() {
    return 2;
  },
  /*html$.WebSocket.CONNECTING*/get CONNECTING() {
    return 0;
  },
  /*html$.WebSocket.OPEN*/get OPEN() {
    return 1;
  }
});
dart.registerExtension("WebSocket", html$.WebSocket);
const _deltaX = dart.privateName(html$, "_deltaX");
const _deltaY = dart.privateName(html$, "_deltaY");
const _wheelDelta = dart.privateName(html$, "_wheelDelta");
const _wheelDeltaX = dart.privateName(html$, "_wheelDeltaX");
const _hasInitMouseScrollEvent = dart.privateName(html$, "_hasInitMouseScrollEvent");
const _initMouseScrollEvent = dart.privateName(html$, "_initMouseScrollEvent");
const _hasInitWheelEvent = dart.privateName(html$, "_hasInitWheelEvent");
const _initWheelEvent = dart.privateName(html$, "_initWheelEvent");
html$.WheelEvent = class WheelEvent$ extends html$.MouseEvent {
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let deltaX = opts && 'deltaX' in opts ? opts.deltaX : 0;
    let deltaY = opts && 'deltaY' in opts ? opts.deltaY : 0;
    let deltaZ = opts && 'deltaZ' in opts ? opts.deltaZ : 0;
    let deltaMode = opts && 'deltaMode' in opts ? opts.deltaMode : 0;
    let detail = opts && 'detail' in opts ? opts.detail : 0;
    let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
    let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
    let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
    let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
    let button = opts && 'button' in opts ? opts.button : 0;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
    let options = new (IdentityMapOfString$Object()).from(["view", view, "deltaMode", deltaMode, "deltaX", deltaX, "deltaY", deltaY, "deltaZ", deltaZ, "detail", detail, "screenX", screenX, "screenY", screenY, "clientX", clientX, "clientY", clientY, "button", button, "bubbles", canBubble, "cancelable", cancelable, "ctrlKey", ctrlKey, "altKey", altKey, "shiftKey", shiftKey, "metaKey", metaKey, "relatedTarget", relatedTarget]);
    if (view == null) {
      view = html$.window;
    }
    return new WheelEvent(type, html_common.convertDartToNative_Dictionary(options));
  }
  static __(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.WheelEvent._create_1(type, eventInitDict_1);
    }
    return html$.WheelEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new WheelEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new WheelEvent(type);
  }
  get [_deltaX]() {
    return this.deltaX;
  }
  get [_deltaY]() {
    return this.deltaY;
  }
  get [$deltaZ]() {
    return this.deltaZ;
  }
  get [$deltaY]() {
    if (this.deltaY !== undefined) {
      return this[_deltaY];
    }
    dart.throw(new core.UnsupportedError.new("deltaY is not supported"));
  }
  get [$deltaX]() {
    if (this.deltaX !== undefined) {
      return this[_deltaX];
    }
    dart.throw(new core.UnsupportedError.new("deltaX is not supported"));
  }
  get [$deltaMode]() {
    if (!!this.deltaMode) {
      return this.deltaMode;
    }
    return 0;
  }
  get [_wheelDelta]() {
    return this.wheelDelta;
  }
  get [_wheelDeltaX]() {
    return this.wheelDeltaX;
  }
  get [_detail]() {
    return this.detail;
  }
  get [_hasInitMouseScrollEvent]() {
    return !!this.initMouseScrollEvent;
  }
  [_initMouseScrollEvent](...args) {
    return this.initMouseScrollEvent.apply(this, args);
  }
  get [_hasInitWheelEvent]() {
    return !!this.initWheelEvent;
  }
  [_initWheelEvent](...args) {
    return this.initWheelEvent.apply(this, args);
  }
};
dart.addTypeTests(html$.WheelEvent);
const deltaZ = Symbol("WheelEvent.deltaZ");
dart.setMethodSignature(html$.WheelEvent, () => ({
  __proto__: dart.getMethods(html$.WheelEvent.__proto__),
  [_initMouseScrollEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget, core.int]),
  [_initWheelEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.int, html$.EventTarget, core.String, core.int, core.int, core.int, core.int])
}));
dart.setGetterSignature(html$.WheelEvent, () => ({
  __proto__: dart.getGetters(html$.WheelEvent.__proto__),
  [$deltaY]: core.num,
  [$deltaX]: core.num,
  [$deltaMode]: core.int,
  [_wheelDelta]: core.num,
  [_wheelDeltaX]: core.num,
  [_detail]: core.num,
  [_hasInitMouseScrollEvent]: core.bool,
  [_hasInitWheelEvent]: core.bool
}));
dart.setLibraryUri(html$.WheelEvent, "dart:html");
dart.setFieldSignature(html$.WheelEvent, () => ({
  __proto__: dart.getFields(html$.WheelEvent.__proto__),
  [_deltaX]: dart.finalFieldType(core.num),
  [_deltaY]: dart.finalFieldType(core.num),
  [$deltaZ]: dart.finalFieldType(core.num)
}));
dart.defineLazy(html$.WheelEvent, {
  /*html$.WheelEvent.DOM_DELTA_LINE*/get DOM_DELTA_LINE() {
    return 1;
  },
  /*html$.WheelEvent.DOM_DELTA_PAGE*/get DOM_DELTA_PAGE() {
    return 2;
  },
  /*html$.WheelEvent.DOM_DELTA_PIXEL*/get DOM_DELTA_PIXEL() {
    return 0;
  }
});
dart.registerExtension("WheelEvent", html$.WheelEvent);
const _open2 = dart.privateName(html$, "_open2");
const _open3 = dart.privateName(html$, "_open3");
const _location = dart.privateName(html$, "_location");
const _ensureRequestAnimationFrame = dart.privateName(html$, "_ensureRequestAnimationFrame");
const _requestAnimationFrame = dart.privateName(html$, "_requestAnimationFrame");
const _cancelAnimationFrame = dart.privateName(html$, "_cancelAnimationFrame");
const _requestFileSystem = dart.privateName(html$, "_requestFileSystem");
const _get_opener = dart.privateName(html$, "_get_opener");
const _pageXOffset = dart.privateName(html$, "_pageXOffset");
const _pageYOffset = dart.privateName(html$, "_pageYOffset");
const _get_parent = dart.privateName(html$, "_get_parent");
const _get_self = dart.privateName(html$, "_get_self");
const _get_top = dart.privateName(html$, "_get_top");
const __getter___1 = dart.privateName(html$, "__getter___1");
const __getter___2 = dart.privateName(html$, "__getter___2");
const _openDatabase = dart.privateName(html$, "_openDatabase");
const _requestIdleCallback_1 = dart.privateName(html$, "_requestIdleCallback_1");
const _requestIdleCallback_2 = dart.privateName(html$, "_requestIdleCallback_2");
const _scroll_4 = dart.privateName(html$, "_scroll_4");
const _scroll_5 = dart.privateName(html$, "_scroll_5");
const _scrollBy_4 = dart.privateName(html$, "_scrollBy_4");
const _scrollBy_5 = dart.privateName(html$, "_scrollBy_5");
const _scrollTo_4 = dart.privateName(html$, "_scrollTo_4");
const _scrollTo_5 = dart.privateName(html$, "_scrollTo_5");
const __requestFileSystem = dart.privateName(html$, "__requestFileSystem");
const _resolveLocalFileSystemUrl = dart.privateName(html$, "_resolveLocalFileSystemUrl");
html$.Window = class Window extends html$.EventTarget {
  get [$animationFrame]() {
    let completer = CompleterOfnum().sync();
    this[$requestAnimationFrame](dart.fn(time => {
      completer.complete(time);
    }, numToNull()));
    return completer.future;
  }
  get [$document]() {
    return this.document;
  }
  [_open2](url, name) {
    return this.open(url, name);
  }
  [_open3](url, name, options) {
    return this.open(url, name, options);
  }
  [$open](url, name, options) {
    if (options === void 0) options = null;
    if (options == null) {
      return html$._DOMWindowCrossFrame._createSafe(this[_open2](url, name));
    } else {
      return html$._DOMWindowCrossFrame._createSafe(this[_open3](url, name, options));
    }
  }
  get [$location]() {
    return html$.Location._check(this[_location]);
  }
  set [$location](value) {
    this[_location] = value;
  }
  get [_location]() {
    return this.location;
  }
  set [_location](value) {
    this.location = value;
  }
  [$requestAnimationFrame](callback) {
    this[_ensureRequestAnimationFrame]();
    return this[_requestAnimationFrame](html$._wrapZone(core.num, callback));
  }
  [$cancelAnimationFrame](id) {
    this[_ensureRequestAnimationFrame]();
    this[_cancelAnimationFrame](id);
  }
  [_requestAnimationFrame](...args) {
    return this.requestAnimationFrame.apply(this, args);
  }
  [_cancelAnimationFrame](...args) {
    return this.cancelAnimationFrame.apply(this, args);
  }
  [_ensureRequestAnimationFrame]() {
    if (!!(this.requestAnimationFrame && this.cancelAnimationFrame)) return;
    (function($this) {
      var vendors = ['ms', 'moz', 'webkit', 'o'];
      for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
        $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
        $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
      }
      if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
      $this.requestAnimationFrame = function(callback) {
        return window.setTimeout(function() {
          callback(Date.now());
        }, 16);
      };
      $this.cancelAnimationFrame = function(id) {
        clearTimeout(id);
      };
    })(this);
  }
  get [$indexedDB]() {
    return this.indexedDB || this.webkitIndexedDB || this.mozIndexedDB;
  }
  get [$console]() {
    return html$.Console._safeConsole;
  }
  [$requestFileSystem](size, opts) {
    let persistent = opts && 'persistent' in opts ? opts.persistent : false;
    return this[_requestFileSystem](dart.test(persistent) ? 1 : 0, size);
  }
  static get supportsPointConversions() {
    return html$.DomPoint.supported;
  }
  get [$animationWorklet]() {
    return this.animationWorklet;
  }
  get [$applicationCache]() {
    return this.applicationCache;
  }
  get [$audioWorklet]() {
    return this.audioWorklet;
  }
  get [$caches]() {
    return this.caches;
  }
  get [$closed]() {
    return this.closed;
  }
  get [$cookieStore]() {
    return this.cookieStore;
  }
  get [$crypto]() {
    return this.crypto;
  }
  get [$customElements]() {
    return this.customElements;
  }
  get [$defaultStatus]() {
    return this.defaultStatus;
  }
  set [$defaultStatus](value) {
    this.defaultStatus = value;
  }
  get [$defaultstatus]() {
    return this.defaultstatus;
  }
  set [$defaultstatus](value) {
    this.defaultstatus = value;
  }
  get [$devicePixelRatio]() {
    return this.devicePixelRatio;
  }
  get [$external]() {
    return this.external;
  }
  get [$history]() {
    return this.history;
  }
  get [$innerHeight]() {
    return this.innerHeight;
  }
  get [$innerWidth]() {
    return this.innerWidth;
  }
  get [$isSecureContext]() {
    return this.isSecureContext;
  }
  get [$localStorage]() {
    return this.localStorage;
  }
  get [$locationbar]() {
    return this.locationbar;
  }
  get [$menubar]() {
    return this.menubar;
  }
  get [$name]() {
    return this.name;
  }
  set [$name](value) {
    this.name = value;
  }
  get [$navigator]() {
    return this.navigator;
  }
  get [$offscreenBuffering]() {
    return this.offscreenBuffering;
  }
  get [$opener]() {
    return html$._convertNativeToDart_Window(this[_get_opener]);
  }
  get [_get_opener]() {
    return this.opener;
  }
  set [$opener](value) {
    this.opener = value;
  }
  get [$orientation]() {
    return this.orientation;
  }
  get [$origin]() {
    return this.origin;
  }
  get [$outerHeight]() {
    return this.outerHeight;
  }
  get [$outerWidth]() {
    return this.outerWidth;
  }
  get [_pageXOffset]() {
    return this.pageXOffset;
  }
  get [_pageYOffset]() {
    return this.pageYOffset;
  }
  get [$parent]() {
    return html$._convertNativeToDart_Window(this[_get_parent]);
  }
  get [_get_parent]() {
    return this.parent;
  }
  get [$performance]() {
    return this.performance;
  }
  get [$screen]() {
    return this.screen;
  }
  get [$screenLeft]() {
    return this.screenLeft;
  }
  get [$screenTop]() {
    return this.screenTop;
  }
  get [$screenX]() {
    return this.screenX;
  }
  get [$screenY]() {
    return this.screenY;
  }
  get [$scrollbars]() {
    return this.scrollbars;
  }
  get [$self]() {
    return html$._convertNativeToDart_Window(this[_get_self]);
  }
  get [_get_self]() {
    return this.self;
  }
  get [$sessionStorage]() {
    return this.sessionStorage;
  }
  get [$speechSynthesis]() {
    return this.speechSynthesis;
  }
  get [$status]() {
    return this.status;
  }
  set [$status](value) {
    this.status = value;
  }
  get [$statusbar]() {
    return this.statusbar;
  }
  get [$styleMedia]() {
    return this.styleMedia;
  }
  get [$toolbar]() {
    return this.toolbar;
  }
  get [$top]() {
    return html$._convertNativeToDart_Window(this[_get_top]);
  }
  get [_get_top]() {
    return this.top;
  }
  get [$visualViewport]() {
    return this.visualViewport;
  }
  get [$window]() {
    return html$._convertNativeToDart_Window(this[_get_window]);
  }
  get [_get_window]() {
    return this.window;
  }
  [__getter__](index_OR_name) {
    if (core.int.is(index_OR_name)) {
      return html$._convertNativeToDart_Window(this[__getter___1](index_OR_name));
    }
    if (typeof index_OR_name == 'string') {
      return html$._convertNativeToDart_Window(this[__getter___2](index_OR_name));
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [__getter___1](...args) {
    return this.__getter__.apply(this, args);
  }
  [__getter___2](...args) {
    return this.__getter__.apply(this, args);
  }
  [$alert](...args) {
    return this.alert.apply(this, args);
  }
  [$cancelIdleCallback](...args) {
    return this.cancelIdleCallback.apply(this, args);
  }
  [$close](...args) {
    return this.close.apply(this, args);
  }
  [$confirm](...args) {
    return this.confirm.apply(this, args);
  }
  [$fetch](input, init) {
    if (init === void 0) init = null;
    let init_dict = null;
    if (init != null) {
      init_dict = html_common.convertDartToNative_Dictionary(init);
    }
    return html$.promiseToFuture(dart.dynamic, this.fetch(input, init_dict));
  }
  [$find](...args) {
    return this.find.apply(this, args);
  }
  [_getComputedStyle](...args) {
    return this.getComputedStyle.apply(this, args);
  }
  [$getComputedStyleMap](...args) {
    return this.getComputedStyleMap.apply(this, args);
  }
  [$getMatchedCssRules](...args) {
    return this.getMatchedCSSRules.apply(this, args);
  }
  [$getSelection](...args) {
    return this.getSelection.apply(this, args);
  }
  [$matchMedia](...args) {
    return this.matchMedia.apply(this, args);
  }
  [$moveBy](...args) {
    return this.moveBy.apply(this, args);
  }
  [_moveTo](...args) {
    return this.moveTo.apply(this, args);
  }
  [_openDatabase](...args) {
    return this.openDatabase.apply(this, args);
  }
  [$postMessage](message, targetOrigin, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, targetOrigin, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1, targetOrigin);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [$print](...args) {
    return this.print.apply(this, args);
  }
  [$requestIdleCallback](callback, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let callback_1 = _js_helper.convertDartClosureToJS(IdleDeadlineTovoid(), callback, 1);
      let options_2 = html_common.convertDartToNative_Dictionary(options);
      return this[_requestIdleCallback_1](callback_1, options_2);
    }
    let callback_1 = _js_helper.convertDartClosureToJS(IdleDeadlineTovoid(), callback, 1);
    return this[_requestIdleCallback_2](callback_1);
  }
  [_requestIdleCallback_1](...args) {
    return this.requestIdleCallback.apply(this, args);
  }
  [_requestIdleCallback_2](...args) {
    return this.requestIdleCallback.apply(this, args);
  }
  [$resizeBy](...args) {
    return this.resizeBy.apply(this, args);
  }
  [$resizeTo](...args) {
    return this.resizeTo.apply(this, args);
  }
  [$scroll](options_OR_x, y, scrollOptions) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (scrollOptions === void 0) scrollOptions = null;
    if (options_OR_x == null && y == null && scrollOptions == null) {
      this[_scroll_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scroll_2](options_1);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scroll_3](options_OR_x, y);
      return;
    }
    if (core.int.is(y) && core.int.is(options_OR_x) && scrollOptions == null) {
      this[_scroll_4](options_OR_x, y);
      return;
    }
    if (scrollOptions != null && core.int.is(y) && core.int.is(options_OR_x)) {
      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
      this[_scroll_5](options_OR_x, y, scrollOptions_1);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_scroll_1](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_2](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_3](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_4](...args) {
    return this.scroll.apply(this, args);
  }
  [_scroll_5](...args) {
    return this.scroll.apply(this, args);
  }
  [$scrollBy](options_OR_x, y, scrollOptions) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (scrollOptions === void 0) scrollOptions = null;
    if (options_OR_x == null && y == null && scrollOptions == null) {
      this[_scrollBy_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scrollBy_2](options_1);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scrollBy_3](options_OR_x, y);
      return;
    }
    if (core.int.is(y) && core.int.is(options_OR_x) && scrollOptions == null) {
      this[_scrollBy_4](options_OR_x, y);
      return;
    }
    if (scrollOptions != null && core.int.is(y) && core.int.is(options_OR_x)) {
      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
      this[_scrollBy_5](options_OR_x, y, scrollOptions_1);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_scrollBy_1](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_2](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_3](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_4](...args) {
    return this.scrollBy.apply(this, args);
  }
  [_scrollBy_5](...args) {
    return this.scrollBy.apply(this, args);
  }
  [$scrollTo](options_OR_x, y, scrollOptions) {
    if (options_OR_x === void 0) options_OR_x = null;
    if (y === void 0) y = null;
    if (scrollOptions === void 0) scrollOptions = null;
    if (options_OR_x == null && y == null && scrollOptions == null) {
      this[_scrollTo_1]();
      return;
    }
    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
      this[_scrollTo_2](options_1);
      return;
    }
    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
      this[_scrollTo_3](options_OR_x, y);
      return;
    }
    if (core.int.is(y) && core.int.is(options_OR_x) && scrollOptions == null) {
      this[_scrollTo_4](options_OR_x, y);
      return;
    }
    if (scrollOptions != null && core.int.is(y) && core.int.is(options_OR_x)) {
      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
      this[_scrollTo_5](options_OR_x, y, scrollOptions_1);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_scrollTo_1](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_2](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_3](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_4](...args) {
    return this.scrollTo.apply(this, args);
  }
  [_scrollTo_5](...args) {
    return this.scrollTo.apply(this, args);
  }
  [$stop](...args) {
    return this.stop.apply(this, args);
  }
  [__requestFileSystem](...args) {
    return this.webkitRequestFileSystem.apply(this, args);
  }
  [_requestFileSystem](type, size) {
    let completer = CompleterOfFileSystem().new();
    this[__requestFileSystem](type, size, dart.fn(value => {
      _js_helper.applyExtension("DOMFileSystem", value);
      _js_helper.applyExtension("DirectoryEntry", value.root);
      completer.complete(value);
    }, FileSystemToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [_resolveLocalFileSystemUrl](...args) {
    return this.webkitResolveLocalFileSystemURL.apply(this, args);
  }
  [$resolveLocalFileSystemUrl](url) {
    let completer = CompleterOfEntry().new();
    this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
      completer.complete(value);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, DomExceptionToNull()));
    return completer.future;
  }
  [$atob](...args) {
    return this.atob.apply(this, args);
  }
  [$btoa](...args) {
    return this.btoa.apply(this, args);
  }
  [_setInterval_String](...args) {
    return this.setInterval.apply(this, args);
  }
  [_setTimeout_String](...args) {
    return this.setTimeout.apply(this, args);
  }
  [_clearInterval](...args) {
    return this.clearInterval.apply(this, args);
  }
  [_clearTimeout](...args) {
    return this.clearTimeout.apply(this, args);
  }
  [_setInterval](...args) {
    return this.setInterval.apply(this, args);
  }
  [_setTimeout](...args) {
    return this.setTimeout.apply(this, args);
  }
  get [$onContentLoaded]() {
    return html$.Window.contentLoadedEvent.forTarget(this);
  }
  get [$onAbort]() {
    return html$.Element.abortEvent.forTarget(this);
  }
  get [$onBlur]() {
    return html$.Element.blurEvent.forTarget(this);
  }
  get [$onCanPlay]() {
    return html$.Element.canPlayEvent.forTarget(this);
  }
  get [$onCanPlayThrough]() {
    return html$.Element.canPlayThroughEvent.forTarget(this);
  }
  get [$onChange]() {
    return html$.Element.changeEvent.forTarget(this);
  }
  get [$onClick]() {
    return html$.Element.clickEvent.forTarget(this);
  }
  get [$onContextMenu]() {
    return html$.Element.contextMenuEvent.forTarget(this);
  }
  get [$onDoubleClick]() {
    return html$.Element.doubleClickEvent.forTarget(this);
  }
  get [$onDeviceMotion]() {
    return html$.Window.deviceMotionEvent.forTarget(this);
  }
  get [$onDeviceOrientation]() {
    return html$.Window.deviceOrientationEvent.forTarget(this);
  }
  get [$onDrag]() {
    return html$.Element.dragEvent.forTarget(this);
  }
  get [$onDragEnd]() {
    return html$.Element.dragEndEvent.forTarget(this);
  }
  get [$onDragEnter]() {
    return html$.Element.dragEnterEvent.forTarget(this);
  }
  get [$onDragLeave]() {
    return html$.Element.dragLeaveEvent.forTarget(this);
  }
  get [$onDragOver]() {
    return html$.Element.dragOverEvent.forTarget(this);
  }
  get [$onDragStart]() {
    return html$.Element.dragStartEvent.forTarget(this);
  }
  get [$onDrop]() {
    return html$.Element.dropEvent.forTarget(this);
  }
  get [$onDurationChange]() {
    return html$.Element.durationChangeEvent.forTarget(this);
  }
  get [$onEmptied]() {
    return html$.Element.emptiedEvent.forTarget(this);
  }
  get [$onEnded]() {
    return html$.Element.endedEvent.forTarget(this);
  }
  get [$onError]() {
    return html$.Element.errorEvent.forTarget(this);
  }
  get [$onFocus]() {
    return html$.Element.focusEvent.forTarget(this);
  }
  get [$onHashChange]() {
    return html$.Window.hashChangeEvent.forTarget(this);
  }
  get [$onInput]() {
    return html$.Element.inputEvent.forTarget(this);
  }
  get [$onInvalid]() {
    return html$.Element.invalidEvent.forTarget(this);
  }
  get [$onKeyDown]() {
    return html$.Element.keyDownEvent.forTarget(this);
  }
  get [$onKeyPress]() {
    return html$.Element.keyPressEvent.forTarget(this);
  }
  get [$onKeyUp]() {
    return html$.Element.keyUpEvent.forTarget(this);
  }
  get [$onLoad]() {
    return html$.Element.loadEvent.forTarget(this);
  }
  get [$onLoadedData]() {
    return html$.Element.loadedDataEvent.forTarget(this);
  }
  get [$onLoadedMetadata]() {
    return html$.Element.loadedMetadataEvent.forTarget(this);
  }
  get [$onLoadStart]() {
    return html$.Window.loadStartEvent.forTarget(this);
  }
  get [$onMessage]() {
    return html$.Window.messageEvent.forTarget(this);
  }
  get [$onMouseDown]() {
    return html$.Element.mouseDownEvent.forTarget(this);
  }
  get [$onMouseEnter]() {
    return html$.Element.mouseEnterEvent.forTarget(this);
  }
  get [$onMouseLeave]() {
    return html$.Element.mouseLeaveEvent.forTarget(this);
  }
  get [$onMouseMove]() {
    return html$.Element.mouseMoveEvent.forTarget(this);
  }
  get [$onMouseOut]() {
    return html$.Element.mouseOutEvent.forTarget(this);
  }
  get [$onMouseOver]() {
    return html$.Element.mouseOverEvent.forTarget(this);
  }
  get [$onMouseUp]() {
    return html$.Element.mouseUpEvent.forTarget(this);
  }
  get [$onMouseWheel]() {
    return html$.Element.mouseWheelEvent.forTarget(this);
  }
  get [$onOffline]() {
    return html$.Window.offlineEvent.forTarget(this);
  }
  get [$onOnline]() {
    return html$.Window.onlineEvent.forTarget(this);
  }
  get [$onPageHide]() {
    return html$.Window.pageHideEvent.forTarget(this);
  }
  get [$onPageShow]() {
    return html$.Window.pageShowEvent.forTarget(this);
  }
  get [$onPause]() {
    return html$.Element.pauseEvent.forTarget(this);
  }
  get [$onPlay]() {
    return html$.Element.playEvent.forTarget(this);
  }
  get [$onPlaying]() {
    return html$.Element.playingEvent.forTarget(this);
  }
  get [$onPopState]() {
    return html$.Window.popStateEvent.forTarget(this);
  }
  get [$onProgress]() {
    return html$.Window.progressEvent.forTarget(this);
  }
  get [$onRateChange]() {
    return html$.Element.rateChangeEvent.forTarget(this);
  }
  get [$onReset]() {
    return html$.Element.resetEvent.forTarget(this);
  }
  get [$onResize]() {
    return html$.Element.resizeEvent.forTarget(this);
  }
  get [$onScroll]() {
    return html$.Element.scrollEvent.forTarget(this);
  }
  get [$onSearch]() {
    return html$.Element.searchEvent.forTarget(this);
  }
  get [$onSeeked]() {
    return html$.Element.seekedEvent.forTarget(this);
  }
  get [$onSeeking]() {
    return html$.Element.seekingEvent.forTarget(this);
  }
  get [$onSelect]() {
    return html$.Element.selectEvent.forTarget(this);
  }
  get [$onStalled]() {
    return html$.Element.stalledEvent.forTarget(this);
  }
  get [$onStorage]() {
    return html$.Window.storageEvent.forTarget(this);
  }
  get [$onSubmit]() {
    return html$.Element.submitEvent.forTarget(this);
  }
  get [$onSuspend]() {
    return html$.Element.suspendEvent.forTarget(this);
  }
  get [$onTimeUpdate]() {
    return html$.Element.timeUpdateEvent.forTarget(this);
  }
  get [$onTouchCancel]() {
    return html$.Element.touchCancelEvent.forTarget(this);
  }
  get [$onTouchEnd]() {
    return html$.Element.touchEndEvent.forTarget(this);
  }
  get [$onTouchMove]() {
    return html$.Element.touchMoveEvent.forTarget(this);
  }
  get [$onTouchStart]() {
    return html$.Element.touchStartEvent.forTarget(this);
  }
  get [$onTransitionEnd]() {
    return html$.Element.transitionEndEvent.forTarget(this);
  }
  get [$onUnload]() {
    return html$.Window.unloadEvent.forTarget(this);
  }
  get [$onVolumeChange]() {
    return html$.Element.volumeChangeEvent.forTarget(this);
  }
  get [$onWaiting]() {
    return html$.Element.waitingEvent.forTarget(this);
  }
  get [$onAnimationEnd]() {
    return html$.Window.animationEndEvent.forTarget(this);
  }
  get [$onAnimationIteration]() {
    return html$.Window.animationIterationEvent.forTarget(this);
  }
  get [$onAnimationStart]() {
    return html$.Window.animationStartEvent.forTarget(this);
  }
  get [$onBeforeUnload]() {
    return html$.Window.beforeUnloadEvent.forTarget(this);
  }
  get [$onWheel]() {
    return html$.Element.wheelEvent.forTarget(this);
  }
  [$moveTo](p) {
    this[_moveTo](dart.asInt(p.x), dart.asInt(p.y));
  }
  [$openDatabase](name, version, displayName, estimatedSize, creationCallback) {
    if (creationCallback === void 0) creationCallback = null;
    let db = null;
    if (creationCallback == null)
      db = this[_openDatabase](name, version, displayName, estimatedSize);
    else
      db = this[_openDatabase](name, version, displayName, estimatedSize, creationCallback);
    _js_helper.applyExtension("Database", db);
    return web_sql.SqlDatabase._check(db);
  }
  get [$pageXOffset]() {
    return this.pageXOffset[$round]();
  }
  get [$pageYOffset]() {
    return this.pageYOffset[$round]();
  }
  get [$scrollX]() {
    return "scrollX" in this ? this.scrollX[$round]() : this[$document].documentElement[$scrollLeft];
  }
  get [$scrollY]() {
    return "scrollY" in this ? this.scrollY[$round]() : this[$document].documentElement[$scrollTop];
  }
};
dart.addTypeTests(html$.Window);
const animationWorklet = Symbol("Window.animationWorklet");
const applicationCache = Symbol("Window.applicationCache");
const audioWorklet = Symbol("Window.audioWorklet");
const caches$ = Symbol("Window.caches");
const closed = Symbol("Window.closed");
const cookieStore = Symbol("Window.cookieStore");
const crypto$0 = Symbol("Window.crypto");
const customElements = Symbol("Window.customElements");
const defaultStatus = Symbol("Window.defaultStatus");
const defaultstatus = Symbol("Window.defaultstatus");
const devicePixelRatio$ = Symbol("Window.devicePixelRatio");
const external = Symbol("Window.external");
const history = Symbol("Window.history");
const innerHeight = Symbol("Window.innerHeight");
const innerWidth = Symbol("Window.innerWidth");
const isSecureContext$ = Symbol("Window.isSecureContext");
const localStorage = Symbol("Window.localStorage");
const locationbar = Symbol("Window.locationbar");
const menubar = Symbol("Window.menubar");
const name$39 = Symbol("Window.name");
const navigator$ = Symbol("Window.navigator");
const offscreenBuffering = Symbol("Window.offscreenBuffering");
const orientation$3 = Symbol("Window.orientation");
const origin$8 = Symbol("Window.origin");
const outerHeight = Symbol("Window.outerHeight");
const outerWidth = Symbol("Window.outerWidth");
const performance$ = Symbol("Window.performance");
const screen = Symbol("Window.screen");
const screenLeft = Symbol("Window.screenLeft");
const screenTop = Symbol("Window.screenTop");
const screenX = Symbol("Window.screenX");
const screenY = Symbol("Window.screenY");
const scrollbars = Symbol("Window.scrollbars");
const sessionStorage = Symbol("Window.sessionStorage");
const speechSynthesis = Symbol("Window.speechSynthesis");
const status$3 = Symbol("Window.status");
const statusbar = Symbol("Window.statusbar");
const styleMedia = Symbol("Window.styleMedia");
const toolbar = Symbol("Window.toolbar");
const visualViewport = Symbol("Window.visualViewport");
html$.Window[dart.implements] = () => [html$.WindowEventHandlers, html$.WindowBase, html$.GlobalEventHandlers, html$._WindowTimers, html$.WindowBase64];
dart.setMethodSignature(html$.Window, () => ({
  __proto__: dart.getMethods(html$.Window.__proto__),
  [_open2]: dart.fnType(html$.WindowBase, [dart.dynamic, dart.dynamic]),
  [_open3]: dart.fnType(html$.WindowBase, [dart.dynamic, dart.dynamic, dart.dynamic]),
  [$open]: dart.fnType(html$.WindowBase, [core.String, core.String], [core.String]),
  [$requestAnimationFrame]: dart.fnType(core.int, [dart.fnType(dart.void, [core.num])]),
  [$cancelAnimationFrame]: dart.fnType(dart.void, [core.int]),
  [_requestAnimationFrame]: dart.fnType(core.int, [dart.fnType(dart.void, [core.num])]),
  [_cancelAnimationFrame]: dart.fnType(dart.void, [core.int]),
  [_ensureRequestAnimationFrame]: dart.fnType(dart.dynamic, []),
  [$requestFileSystem]: dart.fnType(async.Future$(html$.FileSystem), [core.int], {persistent: core.bool}),
  [__getter__]: dart.fnType(html$.WindowBase, [dart.dynamic]),
  [__getter___1]: dart.fnType(dart.dynamic, [core.int]),
  [__getter___2]: dart.fnType(dart.dynamic, [core.String]),
  [$alert]: dart.fnType(dart.void, [], [core.String]),
  [$cancelIdleCallback]: dart.fnType(dart.void, [core.int]),
  [$close]: dart.fnType(dart.void, []),
  [$confirm]: dart.fnType(core.bool, [], [core.String]),
  [$fetch]: dart.fnType(async.Future, [dart.dynamic], [core.Map]),
  [$find]: dart.fnType(core.bool, [core.String, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool]),
  [_getComputedStyle]: dart.fnType(html$.CssStyleDeclaration, [html$.Element], [core.String]),
  [$getComputedStyleMap]: dart.fnType(html$.StylePropertyMapReadonly, [html$.Element, core.String]),
  [$getMatchedCssRules]: dart.fnType(core.List$(html$.CssRule), [html$.Element, core.String]),
  [$getSelection]: dart.fnType(html$.Selection, []),
  [$matchMedia]: dart.fnType(html$.MediaQueryList, [core.String]),
  [$moveBy]: dart.fnType(dart.void, [core.int, core.int]),
  [_moveTo]: dart.fnType(dart.void, [core.int, core.int]),
  [_openDatabase]: dart.fnType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [dart.fnType(dart.void, [web_sql.SqlDatabase])]),
  [$postMessage]: dart.fnType(dart.void, [dart.dynamic, core.String], [core.List$(core.Object)]),
  [_postMessage_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, core.List$(core.Object)]),
  [_postMessage_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic]),
  [$print]: dart.fnType(dart.void, []),
  [$requestIdleCallback]: dart.fnType(core.int, [dart.fnType(dart.void, [html$.IdleDeadline])], [core.Map]),
  [_requestIdleCallback_1]: dart.fnType(core.int, [dart.dynamic, dart.dynamic]),
  [_requestIdleCallback_2]: dart.fnType(core.int, [dart.dynamic]),
  [$resizeBy]: dart.fnType(dart.void, [core.int, core.int]),
  [$resizeTo]: dart.fnType(dart.void, [core.int, core.int]),
  [$scroll]: dart.fnType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
  [_scroll_1]: dart.fnType(dart.void, []),
  [_scroll_2]: dart.fnType(dart.void, [dart.dynamic]),
  [_scroll_3]: dart.fnType(dart.void, [core.num, core.num]),
  [_scroll_4]: dart.fnType(dart.void, [core.int, core.int]),
  [_scroll_5]: dart.fnType(dart.void, [core.int, core.int, dart.dynamic]),
  [$scrollBy]: dart.fnType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
  [_scrollBy_1]: dart.fnType(dart.void, []),
  [_scrollBy_2]: dart.fnType(dart.void, [dart.dynamic]),
  [_scrollBy_3]: dart.fnType(dart.void, [core.num, core.num]),
  [_scrollBy_4]: dart.fnType(dart.void, [core.int, core.int]),
  [_scrollBy_5]: dart.fnType(dart.void, [core.int, core.int, dart.dynamic]),
  [$scrollTo]: dart.fnType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
  [_scrollTo_1]: dart.fnType(dart.void, []),
  [_scrollTo_2]: dart.fnType(dart.void, [dart.dynamic]),
  [_scrollTo_3]: dart.fnType(dart.void, [core.num, core.num]),
  [_scrollTo_4]: dart.fnType(dart.void, [core.int, core.int]),
  [_scrollTo_5]: dart.fnType(dart.void, [core.int, core.int, dart.dynamic]),
  [$stop]: dart.fnType(dart.void, []),
  [__requestFileSystem]: dart.fnType(dart.void, [core.int, core.int, dart.fnType(dart.void, [html$.FileSystem])], [dart.fnType(dart.void, [html$.DomException])]),
  [_requestFileSystem]: dart.fnType(async.Future$(html$.FileSystem), [core.int, core.int]),
  [_resolveLocalFileSystemUrl]: dart.fnType(dart.void, [core.String, dart.fnType(dart.void, [html$.Entry])], [dart.fnType(dart.void, [html$.DomException])]),
  [$resolveLocalFileSystemUrl]: dart.fnType(async.Future$(html$.Entry), [core.String]),
  [$atob]: dart.fnType(core.String, [core.String]),
  [$btoa]: dart.fnType(core.String, [core.String]),
  [_setInterval_String]: dart.fnType(core.int, [core.String], [core.int, core.Object]),
  [_setTimeout_String]: dart.fnType(core.int, [core.String], [core.int, core.Object]),
  [_clearInterval]: dart.fnType(dart.void, [], [core.int]),
  [_clearTimeout]: dart.fnType(dart.void, [], [core.int]),
  [_setInterval]: dart.fnType(core.int, [core.Object], [core.int]),
  [_setTimeout]: dart.fnType(core.int, [core.Object], [core.int]),
  [$moveTo]: dart.fnType(dart.void, [math.Point$(core.num)]),
  [$openDatabase]: dart.fnType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [dart.fnType(dart.void, [web_sql.SqlDatabase])])
}));
dart.setGetterSignature(html$.Window, () => ({
  __proto__: dart.getGetters(html$.Window.__proto__),
  [$animationFrame]: async.Future$(core.num),
  [$document]: html$.Document,
  [$location]: html$.Location,
  [_location]: dart.dynamic,
  [$indexedDB]: indexed_db.IdbFactory,
  [$console]: html$.Console,
  [$opener]: html$.WindowBase,
  [$parent]: html$.WindowBase,
  [$self]: html$.WindowBase,
  [$top]: html$.WindowBase,
  [$window]: html$.WindowBase,
  [$onContentLoaded]: async.Stream$(html$.Event),
  [$onAbort]: async.Stream$(html$.Event),
  [$onBlur]: async.Stream$(html$.Event),
  [$onCanPlay]: async.Stream$(html$.Event),
  [$onCanPlayThrough]: async.Stream$(html$.Event),
  [$onChange]: async.Stream$(html$.Event),
  [$onClick]: async.Stream$(html$.MouseEvent),
  [$onContextMenu]: async.Stream$(html$.MouseEvent),
  [$onDoubleClick]: async.Stream$(html$.Event),
  [$onDeviceMotion]: async.Stream$(html$.DeviceMotionEvent),
  [$onDeviceOrientation]: async.Stream$(html$.DeviceOrientationEvent),
  [$onDrag]: async.Stream$(html$.MouseEvent),
  [$onDragEnd]: async.Stream$(html$.MouseEvent),
  [$onDragEnter]: async.Stream$(html$.MouseEvent),
  [$onDragLeave]: async.Stream$(html$.MouseEvent),
  [$onDragOver]: async.Stream$(html$.MouseEvent),
  [$onDragStart]: async.Stream$(html$.MouseEvent),
  [$onDrop]: async.Stream$(html$.MouseEvent),
  [$onDurationChange]: async.Stream$(html$.Event),
  [$onEmptied]: async.Stream$(html$.Event),
  [$onEnded]: async.Stream$(html$.Event),
  [$onError]: async.Stream$(html$.Event),
  [$onFocus]: async.Stream$(html$.Event),
  [$onHashChange]: async.Stream$(html$.Event),
  [$onInput]: async.Stream$(html$.Event),
  [$onInvalid]: async.Stream$(html$.Event),
  [$onKeyDown]: async.Stream$(html$.KeyboardEvent),
  [$onKeyPress]: async.Stream$(html$.KeyboardEvent),
  [$onKeyUp]: async.Stream$(html$.KeyboardEvent),
  [$onLoad]: async.Stream$(html$.Event),
  [$onLoadedData]: async.Stream$(html$.Event),
  [$onLoadedMetadata]: async.Stream$(html$.Event),
  [$onLoadStart]: async.Stream$(html$.Event),
  [$onMessage]: async.Stream$(html$.MessageEvent),
  [$onMouseDown]: async.Stream$(html$.MouseEvent),
  [$onMouseEnter]: async.Stream$(html$.MouseEvent),
  [$onMouseLeave]: async.Stream$(html$.MouseEvent),
  [$onMouseMove]: async.Stream$(html$.MouseEvent),
  [$onMouseOut]: async.Stream$(html$.MouseEvent),
  [$onMouseOver]: async.Stream$(html$.MouseEvent),
  [$onMouseUp]: async.Stream$(html$.MouseEvent),
  [$onMouseWheel]: async.Stream$(html$.WheelEvent),
  [$onOffline]: async.Stream$(html$.Event),
  [$onOnline]: async.Stream$(html$.Event),
  [$onPageHide]: async.Stream$(html$.Event),
  [$onPageShow]: async.Stream$(html$.Event),
  [$onPause]: async.Stream$(html$.Event),
  [$onPlay]: async.Stream$(html$.Event),
  [$onPlaying]: async.Stream$(html$.Event),
  [$onPopState]: async.Stream$(html$.PopStateEvent),
  [$onProgress]: async.Stream$(html$.Event),
  [$onRateChange]: async.Stream$(html$.Event),
  [$onReset]: async.Stream$(html$.Event),
  [$onResize]: async.Stream$(html$.Event),
  [$onScroll]: async.Stream$(html$.Event),
  [$onSearch]: async.Stream$(html$.Event),
  [$onSeeked]: async.Stream$(html$.Event),
  [$onSeeking]: async.Stream$(html$.Event),
  [$onSelect]: async.Stream$(html$.Event),
  [$onStalled]: async.Stream$(html$.Event),
  [$onStorage]: async.Stream$(html$.StorageEvent),
  [$onSubmit]: async.Stream$(html$.Event),
  [$onSuspend]: async.Stream$(html$.Event),
  [$onTimeUpdate]: async.Stream$(html$.Event),
  [$onTouchCancel]: async.Stream$(html$.TouchEvent),
  [$onTouchEnd]: async.Stream$(html$.TouchEvent),
  [$onTouchMove]: async.Stream$(html$.TouchEvent),
  [$onTouchStart]: async.Stream$(html$.TouchEvent),
  [$onTransitionEnd]: async.Stream$(html$.TransitionEvent),
  [$onUnload]: async.Stream$(html$.Event),
  [$onVolumeChange]: async.Stream$(html$.Event),
  [$onWaiting]: async.Stream$(html$.Event),
  [$onAnimationEnd]: async.Stream$(html$.AnimationEvent),
  [$onAnimationIteration]: async.Stream$(html$.AnimationEvent),
  [$onAnimationStart]: async.Stream$(html$.AnimationEvent),
  [$onBeforeUnload]: async.Stream$(html$.Event),
  [$onWheel]: async.Stream$(html$.WheelEvent),
  [$pageXOffset]: core.int,
  [$pageYOffset]: core.int,
  [$scrollX]: core.int,
  [$scrollY]: core.int
}));
dart.setSetterSignature(html$.Window, () => ({
  __proto__: dart.getSetters(html$.Window.__proto__),
  [$location]: html$.LocationBase,
  [_location]: dart.dynamic,
  [$opener]: html$.Window
}));
dart.setLibraryUri(html$.Window, "dart:html");
dart.setFieldSignature(html$.Window, () => ({
  __proto__: dart.getFields(html$.Window.__proto__),
  [$animationWorklet]: dart.finalFieldType(html$._Worklet),
  [$applicationCache]: dart.finalFieldType(html$.ApplicationCache),
  [$audioWorklet]: dart.finalFieldType(html$._Worklet),
  [$caches]: dart.finalFieldType(html$.CacheStorage),
  [$closed]: dart.finalFieldType(core.bool),
  [$cookieStore]: dart.finalFieldType(html$.CookieStore),
  [$crypto]: dart.finalFieldType(html$.Crypto),
  [$customElements]: dart.finalFieldType(html$.CustomElementRegistry),
  [$defaultStatus]: dart.fieldType(core.String),
  [$defaultstatus]: dart.fieldType(core.String),
  [$devicePixelRatio]: dart.finalFieldType(core.num),
  [$external]: dart.finalFieldType(html$.External),
  [$history]: dart.finalFieldType(html$.History),
  [$innerHeight]: dart.finalFieldType(core.int),
  [$innerWidth]: dart.finalFieldType(core.int),
  [$isSecureContext]: dart.finalFieldType(core.bool),
  [$localStorage]: dart.finalFieldType(html$.Storage),
  [$locationbar]: dart.finalFieldType(html$.BarProp),
  [$menubar]: dart.finalFieldType(html$.BarProp),
  [$name]: dart.fieldType(core.String),
  [$navigator]: dart.finalFieldType(html$.Navigator),
  [$offscreenBuffering]: dart.finalFieldType(core.bool),
  [_get_opener]: dart.finalFieldType(dart.dynamic),
  [$orientation]: dart.finalFieldType(core.int),
  [$origin]: dart.finalFieldType(core.String),
  [$outerHeight]: dart.finalFieldType(core.int),
  [$outerWidth]: dart.finalFieldType(core.int),
  [_pageXOffset]: dart.finalFieldType(core.num),
  [_pageYOffset]: dart.finalFieldType(core.num),
  [_get_parent]: dart.finalFieldType(dart.dynamic),
  [$performance]: dart.finalFieldType(html$.Performance),
  [$screen]: dart.finalFieldType(html$.Screen),
  [$screenLeft]: dart.finalFieldType(core.int),
  [$screenTop]: dart.finalFieldType(core.int),
  [$screenX]: dart.finalFieldType(core.int),
  [$screenY]: dart.finalFieldType(core.int),
  [$scrollbars]: dart.finalFieldType(html$.BarProp),
  [_get_self]: dart.finalFieldType(dart.dynamic),
  [$sessionStorage]: dart.finalFieldType(html$.Storage),
  [$speechSynthesis]: dart.finalFieldType(html$.SpeechSynthesis),
  [$status]: dart.fieldType(core.String),
  [$statusbar]: dart.finalFieldType(html$.BarProp),
  [$styleMedia]: dart.finalFieldType(html$.StyleMedia),
  [$toolbar]: dart.finalFieldType(html$.BarProp),
  [_get_top]: dart.finalFieldType(dart.dynamic),
  [$visualViewport]: dart.finalFieldType(html$.VisualViewport),
  [_get_window]: dart.finalFieldType(dart.dynamic)
}));
dart.defineLazy(html$.Window, {
  /*html$.Window.contentLoadedEvent*/get contentLoadedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("DOMContentLoaded"));
  },
  /*html$.Window.deviceMotionEvent*/get deviceMotionEvent() {
    return dart.const(new (EventStreamProviderOfDeviceMotionEvent()).new("devicemotion"));
  },
  /*html$.Window.deviceOrientationEvent*/get deviceOrientationEvent() {
    return dart.const(new (EventStreamProviderOfDeviceOrientationEvent()).new("deviceorientation"));
  },
  /*html$.Window.hashChangeEvent*/get hashChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("hashchange"));
  },
  /*html$.Window.loadStartEvent*/get loadStartEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("loadstart"));
  },
  /*html$.Window.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  },
  /*html$.Window.offlineEvent*/get offlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("offline"));
  },
  /*html$.Window.onlineEvent*/get onlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("online"));
  },
  /*html$.Window.pageHideEvent*/get pageHideEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pagehide"));
  },
  /*html$.Window.pageShowEvent*/get pageShowEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pageshow"));
  },
  /*html$.Window.popStateEvent*/get popStateEvent() {
    return dart.const(new (EventStreamProviderOfPopStateEvent()).new("popstate"));
  },
  /*html$.Window.progressEvent*/get progressEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("progress"));
  },
  /*html$.Window.storageEvent*/get storageEvent() {
    return dart.const(new (EventStreamProviderOfStorageEvent()).new("storage"));
  },
  /*html$.Window.unloadEvent*/get unloadEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("unload"));
  },
  /*html$.Window.animationEndEvent*/get animationEndEvent() {
    return dart.const(new (EventStreamProviderOfAnimationEvent()).new("webkitAnimationEnd"));
  },
  /*html$.Window.animationIterationEvent*/get animationIterationEvent() {
    return dart.const(new (EventStreamProviderOfAnimationEvent()).new("webkitAnimationIteration"));
  },
  /*html$.Window.animationStartEvent*/get animationStartEvent() {
    return dart.const(new (EventStreamProviderOfAnimationEvent()).new("webkitAnimationStart"));
  },
  /*html$.Window.PERSISTENT*/get PERSISTENT() {
    return 1;
  },
  /*html$.Window.TEMPORARY*/get TEMPORARY() {
    return 0;
  },
  /*html$.Window.beforeUnloadEvent*/get beforeUnloadEvent() {
    return dart.const(new html$._BeforeUnloadEventStreamProvider.new("beforeunload"));
  }
});
dart.registerExtension("Window", html$.Window);
dart.registerExtension("DOMWindow", html$.Window);
const _returnValue = dart.privateName(html$, "_returnValue");
html$._WrappedEvent = class _WrappedEvent extends core.Object {
  get wrapped() {
    return this[wrapped$];
  }
  set wrapped(value) {
    super.wrapped = value;
  }
  get bubbles() {
    return this.wrapped.bubbles;
  }
  get cancelable() {
    return this.wrapped.cancelable;
  }
  get composed() {
    return this.wrapped.composed;
  }
  get currentTarget() {
    return this.wrapped[$currentTarget];
  }
  get defaultPrevented() {
    return this.wrapped.defaultPrevented;
  }
  get eventPhase() {
    return this.wrapped.eventPhase;
  }
  get isTrusted() {
    return this.wrapped.isTrusted;
  }
  get target() {
    return this.wrapped[$target];
  }
  get timeStamp() {
    return this.wrapped.timeStamp;
  }
  get type() {
    return this.wrapped.type;
  }
  [_initEvent](type, bubbles, cancelable) {
    if (bubbles === void 0) bubbles = null;
    if (cancelable === void 0) cancelable = null;
    dart.throw(new core.UnsupportedError.new("Cannot initialize this Event."));
  }
  preventDefault() {
    this.wrapped.preventDefault();
  }
  stopImmediatePropagation() {
    this.wrapped.stopImmediatePropagation();
  }
  stopPropagation() {
    this.wrapped.stopPropagation();
  }
  composedPath() {
    return this.wrapped.composedPath();
  }
  get matchingTarget() {
    if (this[_selector] == null) {
      dart.throw(new core.UnsupportedError.new("Cannot call matchingTarget if this Event did" + " not arise as a result of event delegation."));
    }
    let currentTarget = html$.Element._check(this.currentTarget);
    let target = html$.Element._check(this.target);
    let matchedTarget = null;
    do {
      if (dart.test(target[$matches](this[_selector]))) return target;
      target = target[$parent];
    } while (target != null && !dart.equals(target, currentTarget[$parent]));
    dart.throw(new core.StateError.new("No selector matched for populating matchedTarget."));
  }
  get path() {
    return ListOfNode()._check(this.wrapped[$path]);
  }
  get [_get_currentTarget]() {
    return this.wrapped[_get_currentTarget];
  }
  get [_get_target]() {
    return this.wrapped[_get_target];
  }
};
(html$._WrappedEvent.new = function(wrapped) {
  this[_selector] = null;
  this[wrapped$] = wrapped;
}).prototype = html$._WrappedEvent.prototype;
dart.addTypeTests(html$._WrappedEvent);
const wrapped$ = Symbol("_WrappedEvent.wrapped");
html$._WrappedEvent[dart.implements] = () => [html$.Event];
dart.setMethodSignature(html$._WrappedEvent, () => ({
  __proto__: dart.getMethods(html$._WrappedEvent.__proto__),
  [_initEvent]: dart.fnType(dart.void, [core.String], [core.bool, core.bool]),
  preventDefault: dart.fnType(dart.void, []),
  [$preventDefault]: dart.fnType(dart.void, []),
  stopImmediatePropagation: dart.fnType(dart.void, []),
  [$stopImmediatePropagation]: dart.fnType(dart.void, []),
  stopPropagation: dart.fnType(dart.void, []),
  [$stopPropagation]: dart.fnType(dart.void, []),
  composedPath: dart.fnType(core.List$(html$.EventTarget), []),
  [$composedPath]: dart.fnType(core.List$(html$.EventTarget), [])
}));
dart.setGetterSignature(html$._WrappedEvent, () => ({
  __proto__: dart.getGetters(html$._WrappedEvent.__proto__),
  bubbles: core.bool,
  [$bubbles]: core.bool,
  cancelable: core.bool,
  [$cancelable]: core.bool,
  composed: core.bool,
  [$composed]: core.bool,
  currentTarget: html$.EventTarget,
  [$currentTarget]: html$.EventTarget,
  defaultPrevented: core.bool,
  [$defaultPrevented]: core.bool,
  eventPhase: core.int,
  [$eventPhase]: core.int,
  isTrusted: core.bool,
  [$isTrusted]: core.bool,
  target: html$.EventTarget,
  [$target]: html$.EventTarget,
  timeStamp: core.double,
  [$timeStamp]: core.double,
  type: core.String,
  [$type]: core.String,
  matchingTarget: html$.Element,
  [$matchingTarget]: html$.Element,
  path: core.List$(html$.Node),
  [$path]: core.List$(html$.Node),
  [_get_currentTarget]: dart.dynamic,
  [_get_target]: dart.dynamic
}));
dart.setLibraryUri(html$._WrappedEvent, "dart:html");
dart.setFieldSignature(html$._WrappedEvent, () => ({
  __proto__: dart.getFields(html$._WrappedEvent.__proto__),
  wrapped: dart.finalFieldType(html$.Event),
  [_selector]: dart.fieldType(core.String)
}));
dart.defineExtensionMethods(html$._WrappedEvent, ['preventDefault', 'stopImmediatePropagation', 'stopPropagation', 'composedPath']);
dart.defineExtensionAccessors(html$._WrappedEvent, [
  'bubbles',
  'cancelable',
  'composed',
  'currentTarget',
  'defaultPrevented',
  'eventPhase',
  'isTrusted',
  'target',
  'timeStamp',
  'type',
  'matchingTarget',
  'path'
]);
html$._BeforeUnloadEvent = class _BeforeUnloadEvent extends html$._WrappedEvent {
  get returnValue() {
    return this[_returnValue];
  }
  set returnValue(value) {
    this[_returnValue] = value;
    if ("returnValue" in this.wrapped) {
      this.wrapped.returnValue = value;
    }
  }
};
(html$._BeforeUnloadEvent.new = function(base) {
  this[_returnValue] = null;
  html$._BeforeUnloadEvent.__proto__.new.call(this, base);
}).prototype = html$._BeforeUnloadEvent.prototype;
dart.addTypeTests(html$._BeforeUnloadEvent);
html$._BeforeUnloadEvent[dart.implements] = () => [html$.BeforeUnloadEvent];
dart.setGetterSignature(html$._BeforeUnloadEvent, () => ({
  __proto__: dart.getGetters(html$._BeforeUnloadEvent.__proto__),
  returnValue: core.String,
  [$returnValue]: core.String
}));
dart.setSetterSignature(html$._BeforeUnloadEvent, () => ({
  __proto__: dart.getSetters(html$._BeforeUnloadEvent.__proto__),
  returnValue: core.String,
  [$returnValue]: core.String
}));
dart.setLibraryUri(html$._BeforeUnloadEvent, "dart:html");
dart.setFieldSignature(html$._BeforeUnloadEvent, () => ({
  __proto__: dart.getFields(html$._BeforeUnloadEvent.__proto__),
  [_returnValue]: dart.fieldType(core.String)
}));
dart.defineExtensionAccessors(html$._BeforeUnloadEvent, ['returnValue']);
const _eventType = dart.privateName(html$, "_eventType");
html$._BeforeUnloadEventStreamProvider = class _BeforeUnloadEventStreamProvider extends core.Object {
  forTarget(e, opts) {
    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
    let stream = new (_EventStreamOfBeforeUnloadEvent()).new(e, this[_eventType], useCapture);
    let controller = StreamControllerOfBeforeUnloadEvent().new({sync: true});
    stream.listen(dart.fn(event => {
      let wrapped = new html$._BeforeUnloadEvent.new(event);
      controller.add(wrapped);
    }, BeforeUnloadEventToNull()));
    return controller.stream;
  }
  getEventType(target) {
    return this[_eventType];
  }
  forElement(e, opts) {
    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
    return new (_ElementEventStreamImplOfBeforeUnloadEvent()).new(e, this[_eventType], useCapture);
  }
  [_forElementList](e, opts) {
    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
    return new (_ElementListEventStreamImplOfBeforeUnloadEvent()).new(e, this[_eventType], useCapture);
  }
};
(html$._BeforeUnloadEventStreamProvider.new = function(eventType) {
  this[_eventType] = eventType;
}).prototype = html$._BeforeUnloadEventStreamProvider.prototype;
dart.addTypeTests(html$._BeforeUnloadEventStreamProvider);
html$._BeforeUnloadEventStreamProvider[dart.implements] = () => [EventStreamProviderOfBeforeUnloadEvent()];
dart.setMethodSignature(html$._BeforeUnloadEventStreamProvider, () => ({
  __proto__: dart.getMethods(html$._BeforeUnloadEventStreamProvider.__proto__),
  forTarget: dart.fnType(async.Stream$(html$.BeforeUnloadEvent), [html$.EventTarget], {useCapture: core.bool}),
  getEventType: dart.fnType(core.String, [html$.EventTarget]),
  forElement: dart.fnType(html$.ElementStream$(html$.BeforeUnloadEvent), [html$.Element], {useCapture: core.bool}),
  [_forElementList]: dart.fnType(html$.ElementStream$(html$.BeforeUnloadEvent), [html$.ElementList$(html$.Element)], {useCapture: core.bool})
}));
dart.setLibraryUri(html$._BeforeUnloadEventStreamProvider, "dart:html");
dart.setFieldSignature(html$._BeforeUnloadEventStreamProvider, () => ({
  __proto__: dart.getFields(html$._BeforeUnloadEventStreamProvider.__proto__),
  [_eventType]: dart.finalFieldType(core.String)
}));
html$.WindowBase64 = class WindowBase64 extends _interceptors.Interceptor {};
dart.addTypeTests(html$.WindowBase64);
dart.setLibraryUri(html$.WindowBase64, "dart:html");
html$.WindowClient = class WindowClient extends html$.Client {
  get [$focused]() {
    return this.focused;
  }
  get [$visibilityState]() {
    return this.visibilityState;
  }
  [$focus]() {
    return html$.promiseToFuture(html$.WindowClient, this.focus());
  }
  [$navigate](url) {
    return html$.promiseToFuture(html$.WindowClient, this.navigate(url));
  }
};
dart.addTypeTests(html$.WindowClient);
const focused = Symbol("WindowClient.focused");
const visibilityState = Symbol("WindowClient.visibilityState");
dart.setMethodSignature(html$.WindowClient, () => ({
  __proto__: dart.getMethods(html$.WindowClient.__proto__),
  [$focus]: dart.fnType(async.Future$(html$.WindowClient), []),
  [$navigate]: dart.fnType(async.Future$(html$.WindowClient), [core.String])
}));
dart.setLibraryUri(html$.WindowClient, "dart:html");
dart.setFieldSignature(html$.WindowClient, () => ({
  __proto__: dart.getFields(html$.WindowClient.__proto__),
  [$focused]: dart.finalFieldType(core.bool),
  [$visibilityState]: dart.finalFieldType(core.String)
}));
dart.registerExtension("WindowClient", html$.WindowClient);
html$.WindowEventHandlers = class WindowEventHandlers extends html$.EventTarget {
  get onHashChange() {
    return html$.WindowEventHandlers.hashChangeEvent.forTarget(this);
  }
  get onMessage() {
    return html$.WindowEventHandlers.messageEvent.forTarget(this);
  }
  get onOffline() {
    return html$.WindowEventHandlers.offlineEvent.forTarget(this);
  }
  get onOnline() {
    return html$.WindowEventHandlers.onlineEvent.forTarget(this);
  }
  get onPopState() {
    return html$.WindowEventHandlers.popStateEvent.forTarget(this);
  }
  get onStorage() {
    return html$.WindowEventHandlers.storageEvent.forTarget(this);
  }
  get onUnload() {
    return html$.WindowEventHandlers.unloadEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.WindowEventHandlers);
dart.setGetterSignature(html$.WindowEventHandlers, () => ({
  __proto__: dart.getGetters(html$.WindowEventHandlers.__proto__),
  onHashChange: async.Stream$(html$.Event),
  [$onHashChange]: async.Stream$(html$.Event),
  onMessage: async.Stream$(html$.MessageEvent),
  [$onMessage]: async.Stream$(html$.MessageEvent),
  onOffline: async.Stream$(html$.Event),
  [$onOffline]: async.Stream$(html$.Event),
  onOnline: async.Stream$(html$.Event),
  [$onOnline]: async.Stream$(html$.Event),
  onPopState: async.Stream$(html$.PopStateEvent),
  [$onPopState]: async.Stream$(html$.PopStateEvent),
  onStorage: async.Stream$(html$.StorageEvent),
  [$onStorage]: async.Stream$(html$.StorageEvent),
  onUnload: async.Stream$(html$.Event),
  [$onUnload]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(html$.WindowEventHandlers, "dart:html");
dart.defineExtensionAccessors(html$.WindowEventHandlers, [
  'onHashChange',
  'onMessage',
  'onOffline',
  'onOnline',
  'onPopState',
  'onStorage',
  'onUnload'
]);
dart.defineLazy(html$.WindowEventHandlers, {
  /*html$.WindowEventHandlers.hashChangeEvent*/get hashChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("hashchange"));
  },
  /*html$.WindowEventHandlers.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  },
  /*html$.WindowEventHandlers.offlineEvent*/get offlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("offline"));
  },
  /*html$.WindowEventHandlers.onlineEvent*/get onlineEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("online"));
  },
  /*html$.WindowEventHandlers.popStateEvent*/get popStateEvent() {
    return dart.const(new (EventStreamProviderOfPopStateEvent()).new("popstate"));
  },
  /*html$.WindowEventHandlers.storageEvent*/get storageEvent() {
    return dart.const(new (EventStreamProviderOfStorageEvent()).new("storage"));
  },
  /*html$.WindowEventHandlers.unloadEvent*/get unloadEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("unload"));
  }
});
html$.Worker = class Worker$ extends html$.EventTarget {
  static new(scriptUrl) {
    return html$.Worker._create_1(scriptUrl);
  }
  static _create_1(scriptUrl) {
    return new Worker(scriptUrl);
  }
  static get supported() {
    return typeof window.Worker != "undefined";
  }
  [$postMessage](message, transfer) {
    if (transfer === void 0) transfer = null;
    if (transfer != null) {
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_1](message_1, transfer);
      return;
    }
    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
    this[_postMessage_2](message_1);
    return;
  }
  [_postMessage_1](...args) {
    return this.postMessage.apply(this, args);
  }
  [_postMessage_2](...args) {
    return this.postMessage.apply(this, args);
  }
  [$terminate](...args) {
    return this.terminate.apply(this, args);
  }
  get [$onError]() {
    return html$.Worker.errorEvent.forTarget(this);
  }
  get [$onMessage]() {
    return html$.Worker.messageEvent.forTarget(this);
  }
};
dart.addTypeTests(html$.Worker);
html$.Worker[dart.implements] = () => [html$.AbstractWorker];
dart.setMethodSignature(html$.Worker, () => ({
  __proto__: dart.getMethods(html$.Worker.__proto__),
  [$postMessage]: dart.fnType(dart.void, [dart.dynamic], [core.List$(core.Object)]),
  [_postMessage_1]: dart.fnType(dart.void, [dart.dynamic, core.List$(core.Object)]),
  [_postMessage_2]: dart.fnType(dart.void, [dart.dynamic]),
  [$terminate]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(html$.Worker, () => ({
  __proto__: dart.getGetters(html$.Worker.__proto__),
  [$onError]: async.Stream$(html$.Event),
  [$onMessage]: async.Stream$(html$.MessageEvent)
}));
dart.setLibraryUri(html$.Worker, "dart:html");
dart.defineLazy(html$.Worker, {
  /*html$.Worker.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*html$.Worker.messageEvent*/get messageEvent() {
    return dart.const(new (EventStreamProviderOfMessageEvent()).new("message"));
  }
});
dart.registerExtension("Worker", html$.Worker);
html$.WorkerPerformance = class WorkerPerformance extends html$.EventTarget {
  get [$memory]() {
    return this.memory;
  }
  get [$timeOrigin]() {
    return this.timeOrigin;
  }
  [$clearMarks](...args) {
    return this.clearMarks.apply(this, args);
  }
  [$clearMeasures](...args) {
    return this.clearMeasures.apply(this, args);
  }
  [$clearResourceTimings](...args) {
    return this.clearResourceTimings.apply(this, args);
  }
  [$getEntries](...args) {
    return this.getEntries.apply(this, args);
  }
  [$getEntriesByName](...args) {
    return this.getEntriesByName.apply(this, args);
  }
  [$getEntriesByType](...args) {
    return this.getEntriesByType.apply(this, args);
  }
  [$mark](...args) {
    return this.mark.apply(this, args);
  }
  [$measure](...args) {
    return this.measure.apply(this, args);
  }
  [$now](...args) {
    return this.now.apply(this, args);
  }
  [$setResourceTimingBufferSize](...args) {
    return this.setResourceTimingBufferSize.apply(this, args);
  }
};
dart.addTypeTests(html$.WorkerPerformance);
const memory$ = Symbol("WorkerPerformance.memory");
const timeOrigin$ = Symbol("WorkerPerformance.timeOrigin");
dart.setMethodSignature(html$.WorkerPerformance, () => ({
  __proto__: dart.getMethods(html$.WorkerPerformance.__proto__),
  [$clearMarks]: dart.fnType(dart.void, [core.String]),
  [$clearMeasures]: dart.fnType(dart.void, [core.String]),
  [$clearResourceTimings]: dart.fnType(dart.void, []),
  [$getEntries]: dart.fnType(core.List$(html$.PerformanceEntry), []),
  [$getEntriesByName]: dart.fnType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
  [$getEntriesByType]: dart.fnType(core.List$(html$.PerformanceEntry), [core.String]),
  [$mark]: dart.fnType(dart.void, [core.String]),
  [$measure]: dart.fnType(dart.void, [core.String, core.String, core.String]),
  [$now]: dart.fnType(core.double, []),
  [$setResourceTimingBufferSize]: dart.fnType(dart.void, [core.int])
}));
dart.setLibraryUri(html$.WorkerPerformance, "dart:html");
dart.setFieldSignature(html$.WorkerPerformance, () => ({
  __proto__: dart.getFields(html$.WorkerPerformance.__proto__),
  [$memory]: dart.finalFieldType(html$.MemoryInfo),
  [$timeOrigin]: dart.finalFieldType(core.num)
}));
dart.registerExtension("WorkerPerformance", html$.WorkerPerformance);
html$.WorkletAnimation = class WorkletAnimation$ extends _interceptors.Interceptor {
  static new(animatorName, effects, timelines, options) {
    let options_1 = html_common.convertDartToNative_SerializedScriptValue(options);
    return html$.WorkletAnimation._create_1(animatorName, effects, timelines, options_1);
  }
  static _create_1(animatorName, effects, timelines, options) {
    return new WorkletAnimation(animatorName, effects, timelines, options);
  }
  get [$playState]() {
    return this.playState;
  }
  [$cancel](...args) {
    return this.cancel.apply(this, args);
  }
  [$play](...args) {
    return this.play.apply(this, args);
  }
};
dart.addTypeTests(html$.WorkletAnimation);
const playState$ = Symbol("WorkletAnimation.playState");
dart.setMethodSignature(html$.WorkletAnimation, () => ({
  __proto__: dart.getMethods(html$.WorkletAnimation.__proto__),
  [$cancel]: dart.fnType(dart.void, []),
  [$play]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(html$.WorkletAnimation, "dart:html");
dart.setFieldSignature(html$.WorkletAnimation, () => ({
  __proto__: dart.getFields(html$.WorkletAnimation.__proto__),
  [$playState]: dart.finalFieldType(core.String)
}));
dart.registerExtension("WorkletAnimation", html$.WorkletAnimation);
html$.XPathEvaluator = class XPathEvaluator$ extends _interceptors.Interceptor {
  static new() {
    return html$.XPathEvaluator._create_1();
  }
  static _create_1() {
    return new XPathEvaluator();
  }
  [$createExpression](...args) {
    return this.createExpression.apply(this, args);
  }
  [$createNSResolver](...args) {
    return this.createNSResolver.apply(this, args);
  }
  [$evaluate](...args) {
    return this.evaluate.apply(this, args);
  }
};
dart.addTypeTests(html$.XPathEvaluator);
dart.setMethodSignature(html$.XPathEvaluator, () => ({
  __proto__: dart.getMethods(html$.XPathEvaluator.__proto__),
  [$createExpression]: dart.fnType(html$.XPathExpression, [core.String, html$.XPathNSResolver]),
  [$createNSResolver]: dart.fnType(html$.XPathNSResolver, [html$.Node]),
  [$evaluate]: dart.fnType(html$.XPathResult, [core.String, html$.Node, html$.XPathNSResolver], [core.int, core.Object])
}));
dart.setLibraryUri(html$.XPathEvaluator, "dart:html");
dart.registerExtension("XPathEvaluator", html$.XPathEvaluator);
html$.XPathExpression = class XPathExpression extends _interceptors.Interceptor {
  [$evaluate](...args) {
    return this.evaluate.apply(this, args);
  }
};
dart.addTypeTests(html$.XPathExpression);
dart.setMethodSignature(html$.XPathExpression, () => ({
  __proto__: dart.getMethods(html$.XPathExpression.__proto__),
  [$evaluate]: dart.fnType(html$.XPathResult, [html$.Node], [core.int, core.Object])
}));
dart.setLibraryUri(html$.XPathExpression, "dart:html");
dart.registerExtension("XPathExpression", html$.XPathExpression);
html$.XPathNSResolver = class XPathNSResolver extends _interceptors.Interceptor {
  [$lookupNamespaceUri](...args) {
    return this.lookupNamespaceURI.apply(this, args);
  }
};
dart.addTypeTests(html$.XPathNSResolver);
dart.setMethodSignature(html$.XPathNSResolver, () => ({
  __proto__: dart.getMethods(html$.XPathNSResolver.__proto__),
  [$lookupNamespaceUri]: dart.fnType(core.String, [core.String])
}));
dart.setLibraryUri(html$.XPathNSResolver, "dart:html");
dart.registerExtension("XPathNSResolver", html$.XPathNSResolver);
html$.XPathResult = class XPathResult extends _interceptors.Interceptor {
  get [$booleanValue]() {
    return this.booleanValue;
  }
  get [$invalidIteratorState]() {
    return this.invalidIteratorState;
  }
  get [$numberValue]() {
    return this.numberValue;
  }
  get [$resultType]() {
    return this.resultType;
  }
  get [$singleNodeValue]() {
    return this.singleNodeValue;
  }
  get [$snapshotLength]() {
    return this.snapshotLength;
  }
  get [$stringValue]() {
    return this.stringValue;
  }
  [$iterateNext](...args) {
    return this.iterateNext.apply(this, args);
  }
  [$snapshotItem](...args) {
    return this.snapshotItem.apply(this, args);
  }
};
dart.addTypeTests(html$.XPathResult);
const booleanValue = Symbol("XPathResult.booleanValue");
const invalidIteratorState = Symbol("XPathResult.invalidIteratorState");
const numberValue = Symbol("XPathResult.numberValue");
const resultType = Symbol("XPathResult.resultType");
const singleNodeValue = Symbol("XPathResult.singleNodeValue");
const snapshotLength = Symbol("XPathResult.snapshotLength");
const stringValue = Symbol("XPathResult.stringValue");
dart.setMethodSignature(html$.XPathResult, () => ({
  __proto__: dart.getMethods(html$.XPathResult.__proto__),
  [$iterateNext]: dart.fnType(html$.Node, []),
  [$snapshotItem]: dart.fnType(html$.Node, [core.int])
}));
dart.setLibraryUri(html$.XPathResult, "dart:html");
dart.setFieldSignature(html$.XPathResult, () => ({
  __proto__: dart.getFields(html$.XPathResult.__proto__),
  [$booleanValue]: dart.finalFieldType(core.bool),
  [$invalidIteratorState]: dart.finalFieldType(core.bool),
  [$numberValue]: dart.finalFieldType(core.num),
  [$resultType]: dart.finalFieldType(core.int),
  [$singleNodeValue]: dart.finalFieldType(html$.Node),
  [$snapshotLength]: dart.finalFieldType(core.int),
  [$stringValue]: dart.finalFieldType(core.String)
}));
dart.defineLazy(html$.XPathResult, {
  /*html$.XPathResult.ANY_TYPE*/get ANY_TYPE() {
    return 0;
  },
  /*html$.XPathResult.ANY_UNORDERED_NODE_TYPE*/get ANY_UNORDERED_NODE_TYPE() {
    return 8;
  },
  /*html$.XPathResult.BOOLEAN_TYPE*/get BOOLEAN_TYPE() {
    return 3;
  },
  /*html$.XPathResult.FIRST_ORDERED_NODE_TYPE*/get FIRST_ORDERED_NODE_TYPE() {
    return 9;
  },
  /*html$.XPathResult.NUMBER_TYPE*/get NUMBER_TYPE() {
    return 1;
  },
  /*html$.XPathResult.ORDERED_NODE_ITERATOR_TYPE*/get ORDERED_NODE_ITERATOR_TYPE() {
    return 5;
  },
  /*html$.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE*/get ORDERED_NODE_SNAPSHOT_TYPE() {
    return 7;
  },
  /*html$.XPathResult.STRING_TYPE*/get STRING_TYPE() {
    return 2;
  },
  /*html$.XPathResult.UNORDERED_NODE_ITERATOR_TYPE*/get UNORDERED_NODE_ITERATOR_TYPE() {
    return 4;
  },
  /*html$.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE*/get UNORDERED_NODE_SNAPSHOT_TYPE() {
    return 6;
  }
});
dart.registerExtension("XPathResult", html$.XPathResult);
html$.XmlDocument = class XmlDocument extends html$.Document {};
dart.addTypeTests(html$.XmlDocument);
dart.setLibraryUri(html$.XmlDocument, "dart:html");
dart.registerExtension("XMLDocument", html$.XmlDocument);
html$.XmlSerializer = class XmlSerializer extends _interceptors.Interceptor {
  static new() {
    return html$.XmlSerializer._create_1();
  }
  static _create_1() {
    return new XMLSerializer();
  }
  [$serializeToString](...args) {
    return this.serializeToString.apply(this, args);
  }
};
dart.addTypeTests(html$.XmlSerializer);
dart.setMethodSignature(html$.XmlSerializer, () => ({
  __proto__: dart.getMethods(html$.XmlSerializer.__proto__),
  [$serializeToString]: dart.fnType(core.String, [html$.Node])
}));
dart.setLibraryUri(html$.XmlSerializer, "dart:html");
dart.registerExtension("XMLSerializer", html$.XmlSerializer);
html$.XsltProcessor = class XsltProcessor extends _interceptors.Interceptor {
  static new() {
    return html$.XsltProcessor._create_1();
  }
  static _create_1() {
    return new XSLTProcessor();
  }
  static get supported() {
    return !!window.XSLTProcessor;
  }
  [$clearParameters](...args) {
    return this.clearParameters.apply(this, args);
  }
  [$getParameter](...args) {
    return this.getParameter.apply(this, args);
  }
  [$importStylesheet](...args) {
    return this.importStylesheet.apply(this, args);
  }
  [$removeParameter](...args) {
    return this.removeParameter.apply(this, args);
  }
  [$reset](...args) {
    return this.reset.apply(this, args);
  }
  [$setParameter](...args) {
    return this.setParameter.apply(this, args);
  }
  [$transformToDocument](...args) {
    return this.transformToDocument.apply(this, args);
  }
  [$transformToFragment](...args) {
    return this.transformToFragment.apply(this, args);
  }
};
dart.addTypeTests(html$.XsltProcessor);
dart.setMethodSignature(html$.XsltProcessor, () => ({
  __proto__: dart.getMethods(html$.XsltProcessor.__proto__),
  [$clearParameters]: dart.fnType(dart.void, []),
  [$getParameter]: dart.fnType(core.String, [core.String, core.String]),
  [$importStylesheet]: dart.fnType(dart.void, [html$.Node]),
  [$removeParameter]: dart.fnType(dart.void, [core.String, core.String]),
  [$reset]: dart.fnType(dart.void, []),
  [$setParameter]: dart.fnType(dart.void, [core.String, core.String, core.String]),
  [$transformToDocument]: dart.fnType(html$.Document, [html$.Node]),
  [$transformToFragment]: dart.fnType(html$.DocumentFragment, [html$.Node, html$.Document])
}));
dart.setLibraryUri(html$.XsltProcessor, "dart:html");
dart.registerExtension("XSLTProcessor", html$.XsltProcessor);
html$._Attr = class _Attr extends html$.Node {
  get [_localName]() {
    return this.localName;
  }
  get [$name]() {
    return this.name;
  }
  get [_namespaceUri]() {
    return this.namespaceURI;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
dart.addTypeTests(html$._Attr);
dart.setLibraryUri(html$._Attr, "dart:html");
dart.setFieldSignature(html$._Attr, () => ({
  __proto__: dart.getFields(html$._Attr.__proto__),
  [_localName]: dart.finalFieldType(core.String),
  [$name]: dart.finalFieldType(core.String),
  [_namespaceUri]: dart.finalFieldType(core.String),
  [$value]: dart.fieldType(core.String)
}));
dart.registerExtension("Attr", html$._Attr);
html$._Bluetooth = class _Bluetooth extends _interceptors.Interceptor {};
dart.addTypeTests(html$._Bluetooth);
dart.setLibraryUri(html$._Bluetooth, "dart:html");
dart.registerExtension("Bluetooth", html$._Bluetooth);
html$._BluetoothCharacteristicProperties = class _BluetoothCharacteristicProperties extends _interceptors.Interceptor {};
dart.addTypeTests(html$._BluetoothCharacteristicProperties);
dart.setLibraryUri(html$._BluetoothCharacteristicProperties, "dart:html");
dart.registerExtension("BluetoothCharacteristicProperties", html$._BluetoothCharacteristicProperties);
html$._BluetoothDevice = class _BluetoothDevice extends html$.EventTarget {};
dart.addTypeTests(html$._BluetoothDevice);
dart.setLibraryUri(html$._BluetoothDevice, "dart:html");
dart.registerExtension("BluetoothDevice", html$._BluetoothDevice);
html$._BluetoothRemoteGATTCharacteristic = class _BluetoothRemoteGATTCharacteristic extends html$.EventTarget {};
dart.addTypeTests(html$._BluetoothRemoteGATTCharacteristic);
dart.setLibraryUri(html$._BluetoothRemoteGATTCharacteristic, "dart:html");
dart.registerExtension("BluetoothRemoteGATTCharacteristic", html$._BluetoothRemoteGATTCharacteristic);
html$._BluetoothRemoteGATTServer = class _BluetoothRemoteGATTServer extends _interceptors.Interceptor {};
dart.addTypeTests(html$._BluetoothRemoteGATTServer);
dart.setLibraryUri(html$._BluetoothRemoteGATTServer, "dart:html");
dart.registerExtension("BluetoothRemoteGATTServer", html$._BluetoothRemoteGATTServer);
html$._BluetoothRemoteGATTService = class _BluetoothRemoteGATTService extends _interceptors.Interceptor {};
dart.addTypeTests(html$._BluetoothRemoteGATTService);
dart.setLibraryUri(html$._BluetoothRemoteGATTService, "dart:html");
dart.registerExtension("BluetoothRemoteGATTService", html$._BluetoothRemoteGATTService);
html$._BluetoothUUID = class _BluetoothUUID extends _interceptors.Interceptor {};
dart.addTypeTests(html$._BluetoothUUID);
dart.setLibraryUri(html$._BluetoothUUID, "dart:html");
dart.registerExtension("BluetoothUUID", html$._BluetoothUUID);
html$._BudgetService = class _BudgetService extends _interceptors.Interceptor {
  [$getBudget]() {
    return html$.promiseToFuture(html$.BudgetState, this.getBudget());
  }
  [$getCost](operation) {
    return html$.promiseToFuture(core.double, this.getCost(operation));
  }
  [$reserve](operation) {
    return html$.promiseToFuture(core.bool, this.reserve(operation));
  }
};
dart.addTypeTests(html$._BudgetService);
dart.setMethodSignature(html$._BudgetService, () => ({
  __proto__: dart.getMethods(html$._BudgetService.__proto__),
  [$getBudget]: dart.fnType(async.Future$(html$.BudgetState), []),
  [$getCost]: dart.fnType(async.Future$(core.double), [core.String]),
  [$reserve]: dart.fnType(async.Future$(core.bool), [core.String])
}));
dart.setLibraryUri(html$._BudgetService, "dart:html");
dart.registerExtension("BudgetService", html$._BudgetService);
html$._Cache = class _Cache extends _interceptors.Interceptor {};
dart.addTypeTests(html$._Cache);
dart.setLibraryUri(html$._Cache, "dart:html");
dart.registerExtension("Cache", html$._Cache);
html$._CanvasPath = class _CanvasPath extends _interceptors.Interceptor {};
dart.addTypeTests(html$._CanvasPath);
dart.setLibraryUri(html$._CanvasPath, "dart:html");
html$._Clipboard = class _Clipboard extends html$.EventTarget {
  [$read]() {
    return html$.promiseToFuture(html$.DataTransfer, this.read());
  }
  [$readText]() {
    return html$.promiseToFuture(core.String, this.readText());
  }
  [$write](data) {
    return html$.promiseToFuture(dart.dynamic, this.write(data));
  }
  [$writeText](data) {
    return html$.promiseToFuture(dart.dynamic, this.writeText(data));
  }
};
dart.addTypeTests(html$._Clipboard);
dart.setMethodSignature(html$._Clipboard, () => ({
  __proto__: dart.getMethods(html$._Clipboard.__proto__),
  [$read]: dart.fnType(async.Future$(html$.DataTransfer), []),
  [$readText]: dart.fnType(async.Future$(core.String), []),
  [$write]: dart.fnType(async.Future, [html$.DataTransfer]),
  [$writeText]: dart.fnType(async.Future, [core.String])
}));
dart.setLibraryUri(html$._Clipboard, "dart:html");
dart.registerExtension("Clipboard", html$._Clipboard);
const Interceptor_ListMixin$$8 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$8.new = function() {
  Interceptor_ListMixin$$8.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$8.prototype;
dart.applyMixin(Interceptor_ListMixin$$8, collection.ListMixin$(html$.CssRule));
const Interceptor_ImmutableListMixin$$8 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$8 {};
(Interceptor_ImmutableListMixin$$8.new = function() {
  Interceptor_ImmutableListMixin$$8.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$8.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$8, html$.ImmutableListMixin$(html$.CssRule));
html$._CssRuleList = class _CssRuleList extends Interceptor_ImmutableListMixin$$8 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.CssRule._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$._CssRuleList.prototype[dart.isList] = true;
dart.addTypeTests(html$._CssRuleList);
html$._CssRuleList[dart.implements] = () => [JavaScriptIndexingBehaviorOfCssRule(), ListOfCssRule()];
dart.setMethodSignature(html$._CssRuleList, () => ({
  __proto__: dart.getMethods(html$._CssRuleList.__proto__),
  [$_get]: dart.fnType(html$.CssRule, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.CssRule, [core.int]),
  [$item]: dart.fnType(html$.CssRule, [core.int])
}));
dart.setGetterSignature(html$._CssRuleList, () => ({
  __proto__: dart.getGetters(html$._CssRuleList.__proto__),
  [$length]: core.int,
  [$first]: html$.CssRule,
  [$last]: html$.CssRule,
  [$single]: html$.CssRule
}));
dart.setSetterSignature(html$._CssRuleList, () => ({
  __proto__: dart.getSetters(html$._CssRuleList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$._CssRuleList, "dart:html");
dart.registerExtension("CSSRuleList", html$._CssRuleList);
html$._DOMFileSystemSync = class _DOMFileSystemSync extends _interceptors.Interceptor {};
dart.addTypeTests(html$._DOMFileSystemSync);
dart.setLibraryUri(html$._DOMFileSystemSync, "dart:html");
dart.registerExtension("DOMFileSystemSync", html$._DOMFileSystemSync);
html$._EntrySync = class _EntrySync extends _interceptors.Interceptor {};
dart.addTypeTests(html$._EntrySync);
dart.setLibraryUri(html$._EntrySync, "dart:html");
dart.registerExtension("EntrySync", html$._EntrySync);
html$._DirectoryEntrySync = class _DirectoryEntrySync extends html$._EntrySync {};
dart.addTypeTests(html$._DirectoryEntrySync);
dart.setLibraryUri(html$._DirectoryEntrySync, "dart:html");
dart.registerExtension("DirectoryEntrySync", html$._DirectoryEntrySync);
html$._DirectoryReaderSync = class _DirectoryReaderSync extends _interceptors.Interceptor {};
dart.addTypeTests(html$._DirectoryReaderSync);
dart.setLibraryUri(html$._DirectoryReaderSync, "dart:html");
dart.registerExtension("DirectoryReaderSync", html$._DirectoryReaderSync);
html$._DocumentType = class _DocumentType extends html$.Node {};
dart.addTypeTests(html$._DocumentType);
html$._DocumentType[dart.implements] = () => [html$.ChildNode];
dart.setLibraryUri(html$._DocumentType, "dart:html");
dart.registerExtension("DocumentType", html$._DocumentType);
html$._DomRect = class _DomRect extends html$.DomRectReadOnly {
  [$toString]() {
    return "Rectangle (" + dart.str(this[$left]) + ", " + dart.str(this[$top]) + ") " + dart.str(this[$width]) + " x " + dart.str(this[$height]);
  }
  [$_equals](other) {
    if (!RectangleOfnum().is(other)) return false;
    return core.identical(this[$left], dart.dload(other, 'left')) && core.identical(this[$top], dart.dload(other, 'top')) && core.identical(this[$width], dart.dload(other, 'width')) && core.identical(this[$height], dart.dload(other, 'height'));
  }
  get [$hashCode]() {
    return html$._JenkinsSmiHash.hash4(dart.hashCode(this[$left]), dart.hashCode(this[$top]), dart.hashCode(this[$width]), dart.hashCode(this[$height]));
  }
  [$intersection](other) {
    let x0 = math.max(core.num, this[$left], other[$left]);
    let x1 = math.min(core.num, dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(other[$left]) + dart.notNull(other[$width]));
    if (x0 <= x1) {
      let y0 = math.max(core.num, this[$top], other[$top]);
      let y1 = math.min(core.num, dart.notNull(this[$top]) + dart.notNull(this[$height]), dart.notNull(other[$top]) + dart.notNull(other[$height]));
      if (y0 <= y1) {
        return new (RectangleOfnum()).new(x0, y0, x1 - x0, y1 - y0);
      }
    }
    return null;
  }
  [$intersects](other) {
    return dart.notNull(this[$left]) <= dart.notNull(other[$left]) + dart.notNull(other[$width]) && dart.notNull(other[$left]) <= dart.notNull(this[$left]) + dart.notNull(this[$width]) && dart.notNull(this[$top]) <= dart.notNull(other[$top]) + dart.notNull(other[$height]) && dart.notNull(other[$top]) <= dart.notNull(this[$top]) + dart.notNull(this[$height]);
  }
  [$boundingBox](other) {
    let right = math.max(core.num, dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(other[$left]) + dart.notNull(other[$width]));
    let bottom = math.max(core.num, dart.notNull(this[$top]) + dart.notNull(this[$height]), dart.notNull(other[$top]) + dart.notNull(other[$height]));
    let left = math.min(core.num, this[$left], other[$left]);
    let top = math.min(core.num, this[$top], other[$top]);
    return new (RectangleOfnum()).new(left, top, right - left, bottom - top);
  }
  [$containsRectangle](another) {
    return dart.notNull(this[$left]) <= dart.notNull(another[$left]) && dart.notNull(this[$left]) + dart.notNull(this[$width]) >= dart.notNull(another[$left]) + dart.notNull(another[$width]) && dart.notNull(this[$top]) <= dart.notNull(another[$top]) && dart.notNull(this[$top]) + dart.notNull(this[$height]) >= dart.notNull(another[$top]) + dart.notNull(another[$height]);
  }
  [$containsPoint](another) {
    return dart.notNull(another.x) >= dart.notNull(this[$left]) && dart.notNull(another.x) <= dart.notNull(this[$left]) + dart.notNull(this[$width]) && dart.notNull(another.y) >= dart.notNull(this[$top]) && dart.notNull(another.y) <= dart.notNull(this[$top]) + dart.notNull(this[$height]);
  }
  get [$topLeft]() {
    return new (PointOfnum()).new(this[$left], this[$top]);
  }
  get [$topRight]() {
    return new (PointOfnum()).new(dart.notNull(this[$left]) + dart.notNull(this[$width]), this[$top]);
  }
  get [$bottomRight]() {
    return new (PointOfnum()).new(dart.notNull(this[$left]) + dart.notNull(this[$width]), dart.notNull(this[$top]) + dart.notNull(this[$height]));
  }
  get [$bottomLeft]() {
    return new (PointOfnum()).new(this[$left], dart.notNull(this[$top]) + dart.notNull(this[$height]));
  }
  static new(x, y, width, height) {
    if (x === void 0) x = null;
    if (y === void 0) y = null;
    if (width === void 0) width = null;
    if (height === void 0) height = null;
    if (height != null) {
      return html$._DomRect._create_1(x, y, width, height);
    }
    if (width != null) {
      return html$._DomRect._create_2(x, y, width);
    }
    if (y != null) {
      return html$._DomRect._create_3(x, y);
    }
    if (x != null) {
      return html$._DomRect._create_4(x);
    }
    return html$._DomRect._create_5();
  }
  static _create_1(x, y, width, height) {
    return new DOMRect(x, y, width, height);
  }
  static _create_2(x, y, width) {
    return new DOMRect(x, y, width);
  }
  static _create_3(x, y) {
    return new DOMRect(x, y);
  }
  static _create_4(x) {
    return new DOMRect(x);
  }
  static _create_5() {
    return new DOMRect();
  }
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  get [$x]() {
    return this.x;
  }
  set [$x](value) {
    this.x = value;
  }
  get [$y]() {
    return this.y;
  }
  set [$y](value) {
    this.y = value;
  }
};
dart.addTypeTests(html$._DomRect);
html$._DomRect[dart.implements] = () => [RectangleOfnum()];
dart.setSetterSignature(html$._DomRect, () => ({
  __proto__: dart.getSetters(html$._DomRect.__proto__),
  [$height]: core.num,
  [$width]: core.num,
  [$x]: core.num,
  [$y]: core.num
}));
dart.setLibraryUri(html$._DomRect, "dart:html");
dart.registerExtension("ClientRect", html$._DomRect);
dart.registerExtension("DOMRect", html$._DomRect);
html$._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
  static combine(hash, value) {
    hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
    hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
    return (dart.notNull(hash) ^ hash[$rightShift](6)) >>> 0;
  }
  static finish(hash) {
    hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
    hash = (dart.notNull(hash) ^ hash[$rightShift](11)) >>> 0;
    return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
  }
  static hash2(a, b) {
    return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
  }
  static hash4(a, b, c, d) {
    return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
  }
};
(html$._JenkinsSmiHash.new = function() {
}).prototype = html$._JenkinsSmiHash.prototype;
dart.addTypeTests(html$._JenkinsSmiHash);
dart.setLibraryUri(html$._JenkinsSmiHash, "dart:html");
html$._FileEntrySync = class _FileEntrySync extends html$._EntrySync {};
dart.addTypeTests(html$._FileEntrySync);
dart.setLibraryUri(html$._FileEntrySync, "dart:html");
dart.registerExtension("FileEntrySync", html$._FileEntrySync);
html$._FileReaderSync = class _FileReaderSync extends _interceptors.Interceptor {
  static new() {
    return html$._FileReaderSync._create_1();
  }
  static _create_1() {
    return new FileReaderSync();
  }
};
dart.addTypeTests(html$._FileReaderSync);
dart.setLibraryUri(html$._FileReaderSync, "dart:html");
dart.registerExtension("FileReaderSync", html$._FileReaderSync);
html$._FileWriterSync = class _FileWriterSync extends _interceptors.Interceptor {};
dart.addTypeTests(html$._FileWriterSync);
dart.setLibraryUri(html$._FileWriterSync, "dart:html");
dart.registerExtension("FileWriterSync", html$._FileWriterSync);
const Interceptor_ListMixin$$9 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$9.new = function() {
  Interceptor_ListMixin$$9.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$9.prototype;
dart.applyMixin(Interceptor_ListMixin$$9, collection.ListMixin$(html$.Gamepad));
const Interceptor_ImmutableListMixin$$9 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$9 {};
(Interceptor_ImmutableListMixin$$9.new = function() {
  Interceptor_ImmutableListMixin$$9.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$9.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$9, html$.ImmutableListMixin$(html$.Gamepad));
html$._GamepadList = class _GamepadList extends Interceptor_ImmutableListMixin$$9 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.Gamepad._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$._GamepadList.prototype[dart.isList] = true;
dart.addTypeTests(html$._GamepadList);
html$._GamepadList[dart.implements] = () => [ListOfGamepad(), JavaScriptIndexingBehaviorOfGamepad()];
dart.setMethodSignature(html$._GamepadList, () => ({
  __proto__: dart.getMethods(html$._GamepadList.__proto__),
  [$_get]: dart.fnType(html$.Gamepad, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.Gamepad, [core.int]),
  [$item]: dart.fnType(html$.Gamepad, [core.int])
}));
dart.setGetterSignature(html$._GamepadList, () => ({
  __proto__: dart.getGetters(html$._GamepadList.__proto__),
  [$length]: core.int,
  [$first]: html$.Gamepad,
  [$last]: html$.Gamepad,
  [$single]: html$.Gamepad
}));
dart.setSetterSignature(html$._GamepadList, () => ({
  __proto__: dart.getSetters(html$._GamepadList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$._GamepadList, "dart:html");
dart.registerExtension("GamepadList", html$._GamepadList);
html$._HTMLAllCollection = class _HTMLAllCollection extends _interceptors.Interceptor {
  [_item](...args) {
    return this.item.apply(this, args);
  }
};
dart.addTypeTests(html$._HTMLAllCollection);
dart.setMethodSignature(html$._HTMLAllCollection, () => ({
  __proto__: dart.getMethods(html$._HTMLAllCollection.__proto__),
  [_item]: dart.fnType(html$.Element, [core.int])
}));
dart.setLibraryUri(html$._HTMLAllCollection, "dart:html");
dart.registerExtension("HTMLAllCollection", html$._HTMLAllCollection);
html$._HTMLDirectoryElement = class _HTMLDirectoryElement extends html$.HtmlElement {};
(html$._HTMLDirectoryElement.created = function() {
  html$._HTMLDirectoryElement.__proto__.created.call(this);
}).prototype = html$._HTMLDirectoryElement.prototype;
dart.addTypeTests(html$._HTMLDirectoryElement);
dart.setLibraryUri(html$._HTMLDirectoryElement, "dart:html");
dart.registerExtension("HTMLDirectoryElement", html$._HTMLDirectoryElement);
html$._HTMLFontElement = class _HTMLFontElement extends html$.HtmlElement {};
(html$._HTMLFontElement.created = function() {
  html$._HTMLFontElement.__proto__.created.call(this);
}).prototype = html$._HTMLFontElement.prototype;
dart.addTypeTests(html$._HTMLFontElement);
dart.setLibraryUri(html$._HTMLFontElement, "dart:html");
dart.registerExtension("HTMLFontElement", html$._HTMLFontElement);
html$._HTMLFrameElement = class _HTMLFrameElement extends html$.HtmlElement {};
(html$._HTMLFrameElement.created = function() {
  html$._HTMLFrameElement.__proto__.created.call(this);
}).prototype = html$._HTMLFrameElement.prototype;
dart.addTypeTests(html$._HTMLFrameElement);
dart.setLibraryUri(html$._HTMLFrameElement, "dart:html");
dart.registerExtension("HTMLFrameElement", html$._HTMLFrameElement);
html$._HTMLFrameSetElement = class _HTMLFrameSetElement extends html$.HtmlElement {};
(html$._HTMLFrameSetElement.created = function() {
  html$._HTMLFrameSetElement.__proto__.created.call(this);
}).prototype = html$._HTMLFrameSetElement.prototype;
dart.addTypeTests(html$._HTMLFrameSetElement);
html$._HTMLFrameSetElement[dart.implements] = () => [html$.WindowEventHandlers];
dart.setLibraryUri(html$._HTMLFrameSetElement, "dart:html");
dart.registerExtension("HTMLFrameSetElement", html$._HTMLFrameSetElement);
html$._HTMLMarqueeElement = class _HTMLMarqueeElement extends html$.HtmlElement {};
(html$._HTMLMarqueeElement.created = function() {
  html$._HTMLMarqueeElement.__proto__.created.call(this);
}).prototype = html$._HTMLMarqueeElement.prototype;
dart.addTypeTests(html$._HTMLMarqueeElement);
dart.setLibraryUri(html$._HTMLMarqueeElement, "dart:html");
dart.registerExtension("HTMLMarqueeElement", html$._HTMLMarqueeElement);
html$._Mojo = class _Mojo extends _interceptors.Interceptor {};
dart.addTypeTests(html$._Mojo);
dart.setLibraryUri(html$._Mojo, "dart:html");
dart.registerExtension("Mojo", html$._Mojo);
html$._MojoHandle = class _MojoHandle extends _interceptors.Interceptor {};
dart.addTypeTests(html$._MojoHandle);
dart.setLibraryUri(html$._MojoHandle, "dart:html");
dart.registerExtension("MojoHandle", html$._MojoHandle);
html$._MojoInterfaceInterceptor = class _MojoInterfaceInterceptor extends html$.EventTarget {
  static new(interfaceName, scope) {
    if (scope === void 0) scope = null;
    if (scope != null) {
      return html$._MojoInterfaceInterceptor._create_1(interfaceName, scope);
    }
    return html$._MojoInterfaceInterceptor._create_2(interfaceName);
  }
  static _create_1(interfaceName, scope) {
    return new MojoInterfaceInterceptor(interfaceName, scope);
  }
  static _create_2(interfaceName) {
    return new MojoInterfaceInterceptor(interfaceName);
  }
};
dart.addTypeTests(html$._MojoInterfaceInterceptor);
dart.setLibraryUri(html$._MojoInterfaceInterceptor, "dart:html");
dart.registerExtension("MojoInterfaceInterceptor", html$._MojoInterfaceInterceptor);
html$._MojoInterfaceRequestEvent = class _MojoInterfaceRequestEvent extends html$.Event {
  static new(type, eventInitDict) {
    if (eventInitDict === void 0) eventInitDict = null;
    if (eventInitDict != null) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$._MojoInterfaceRequestEvent._create_1(type, eventInitDict_1);
    }
    return html$._MojoInterfaceRequestEvent._create_2(type);
  }
  static _create_1(type, eventInitDict) {
    return new MojoInterfaceRequestEvent(type, eventInitDict);
  }
  static _create_2(type) {
    return new MojoInterfaceRequestEvent(type);
  }
};
dart.addTypeTests(html$._MojoInterfaceRequestEvent);
dart.setLibraryUri(html$._MojoInterfaceRequestEvent, "dart:html");
dart.registerExtension("MojoInterfaceRequestEvent", html$._MojoInterfaceRequestEvent);
html$._MojoWatcher = class _MojoWatcher extends _interceptors.Interceptor {};
dart.addTypeTests(html$._MojoWatcher);
dart.setLibraryUri(html$._MojoWatcher, "dart:html");
dart.registerExtension("MojoWatcher", html$._MojoWatcher);
html$._NFC = class _NFC extends _interceptors.Interceptor {};
dart.addTypeTests(html$._NFC);
dart.setLibraryUri(html$._NFC, "dart:html");
dart.registerExtension("NFC", html$._NFC);
const Interceptor_ListMixin$$10 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$10.new = function() {
  Interceptor_ListMixin$$10.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$10.prototype;
dart.applyMixin(Interceptor_ListMixin$$10, collection.ListMixin$(html$.Node));
const Interceptor_ImmutableListMixin$$10 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$10 {};
(Interceptor_ImmutableListMixin$$10.new = function() {
  Interceptor_ImmutableListMixin$$10.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$10.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$10, html$.ImmutableListMixin$(html$.Node));
html$._NamedNodeMap = class _NamedNodeMap extends Interceptor_ImmutableListMixin$$10 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.Node._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$getNamedItem](...args) {
    return this.getNamedItem.apply(this, args);
  }
  [$getNamedItemNS](...args) {
    return this.getNamedItemNS.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
  [$removeNamedItem](...args) {
    return this.removeNamedItem.apply(this, args);
  }
  [$removeNamedItemNS](...args) {
    return this.removeNamedItemNS.apply(this, args);
  }
  [$setNamedItem](...args) {
    return this.setNamedItem.apply(this, args);
  }
  [$setNamedItemNS](...args) {
    return this.setNamedItemNS.apply(this, args);
  }
};
html$._NamedNodeMap.prototype[dart.isList] = true;
dart.addTypeTests(html$._NamedNodeMap);
html$._NamedNodeMap[dart.implements] = () => [JavaScriptIndexingBehaviorOfNode(), ListOfNode()];
dart.setMethodSignature(html$._NamedNodeMap, () => ({
  __proto__: dart.getMethods(html$._NamedNodeMap.__proto__),
  [$_get]: dart.fnType(html$.Node, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.Node, [core.int]),
  [$getNamedItem]: dart.fnType(html$._Attr, [core.String]),
  [$getNamedItemNS]: dart.fnType(html$._Attr, [core.String, core.String]),
  [$item]: dart.fnType(html$._Attr, [core.int]),
  [$removeNamedItem]: dart.fnType(html$._Attr, [core.String]),
  [$removeNamedItemNS]: dart.fnType(html$._Attr, [core.String, core.String]),
  [$setNamedItem]: dart.fnType(html$._Attr, [html$._Attr]),
  [$setNamedItemNS]: dart.fnType(html$._Attr, [html$._Attr])
}));
dart.setGetterSignature(html$._NamedNodeMap, () => ({
  __proto__: dart.getGetters(html$._NamedNodeMap.__proto__),
  [$length]: core.int,
  [$first]: html$.Node,
  [$last]: html$.Node,
  [$single]: html$.Node
}));
dart.setSetterSignature(html$._NamedNodeMap, () => ({
  __proto__: dart.getSetters(html$._NamedNodeMap.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$._NamedNodeMap, "dart:html");
dart.registerExtension("NamedNodeMap", html$._NamedNodeMap);
dart.registerExtension("MozNamedAttrMap", html$._NamedNodeMap);
html$._PagePopupController = class _PagePopupController extends _interceptors.Interceptor {};
dart.addTypeTests(html$._PagePopupController);
dart.setLibraryUri(html$._PagePopupController, "dart:html");
dart.registerExtension("PagePopupController", html$._PagePopupController);
html$._Report = class _Report extends _interceptors.Interceptor {
  get [$body]() {
    return this.body;
  }
  get [$type]() {
    return this.type;
  }
  get [$url]() {
    return this.url;
  }
};
dart.addTypeTests(html$._Report);
dart.setLibraryUri(html$._Report, "dart:html");
dart.setFieldSignature(html$._Report, () => ({
  __proto__: dart.getFields(html$._Report.__proto__),
  [$body]: dart.finalFieldType(html$.ReportBody),
  [$type]: dart.finalFieldType(core.String),
  [$url]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Report", html$._Report);
html$._Request = class _Request extends html$.Body {
  static new(input, requestInitDict) {
    if (requestInitDict === void 0) requestInitDict = null;
    if (requestInitDict != null) {
      let requestInitDict_1 = html_common.convertDartToNative_Dictionary(requestInitDict);
      return html$._Request._create_1(input, requestInitDict_1);
    }
    return html$._Request._create_2(input);
  }
  static _create_1(input, requestInitDict) {
    return new Request(input, requestInitDict);
  }
  static _create_2(input) {
    return new Request(input);
  }
  get [$cache]() {
    return this.cache;
  }
  get [$credentials]() {
    return this.credentials;
  }
  get [$headers]() {
    return this.headers;
  }
  get [$integrity]() {
    return this.integrity;
  }
  get [$mode]() {
    return this.mode;
  }
  get [$redirect]() {
    return this.redirect;
  }
  get [$referrer]() {
    return this.referrer;
  }
  get [$referrerPolicy]() {
    return this.referrerPolicy;
  }
  get [$url]() {
    return this.url;
  }
  [$clone](...args) {
    return this.clone.apply(this, args);
  }
};
dart.addTypeTests(html$._Request);
dart.setMethodSignature(html$._Request, () => ({
  __proto__: dart.getMethods(html$._Request.__proto__),
  [$clone]: dart.fnType(html$._Request, [])
}));
dart.setLibraryUri(html$._Request, "dart:html");
dart.setFieldSignature(html$._Request, () => ({
  __proto__: dart.getFields(html$._Request.__proto__),
  [$cache]: dart.finalFieldType(core.String),
  [$credentials]: dart.finalFieldType(core.String),
  [$headers]: dart.finalFieldType(html$.Headers),
  [$integrity]: dart.finalFieldType(core.String),
  [$mode]: dart.finalFieldType(core.String),
  [$redirect]: dart.finalFieldType(core.String),
  [$referrer]: dart.finalFieldType(core.String),
  [$referrerPolicy]: dart.finalFieldType(core.String),
  [$url]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Request", html$._Request);
html$._ResourceProgressEvent = class _ResourceProgressEvent extends html$.ProgressEvent {};
dart.addTypeTests(html$._ResourceProgressEvent);
dart.setLibraryUri(html$._ResourceProgressEvent, "dart:html");
dart.registerExtension("ResourceProgressEvent", html$._ResourceProgressEvent);
html$._Response = class _Response extends html$.Body {
  static new(body, init) {
    if (body === void 0) body = null;
    if (init === void 0) init = null;
    if (init != null) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return html$._Response._create_1(body, init_1);
    }
    if (body != null) {
      return html$._Response._create_2(body);
    }
    return html$._Response._create_3();
  }
  static _create_1(body, init) {
    return new Response(body, init);
  }
  static _create_2(body) {
    return new Response(body);
  }
  static _create_3() {
    return new Response();
  }
};
dart.addTypeTests(html$._Response);
dart.setLibraryUri(html$._Response, "dart:html");
dart.registerExtension("Response", html$._Response);
const Interceptor_ListMixin$$11 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$11.new = function() {
  Interceptor_ListMixin$$11.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$11.prototype;
dart.applyMixin(Interceptor_ListMixin$$11, collection.ListMixin$(html$.SpeechRecognitionResult));
const Interceptor_ImmutableListMixin$$11 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$11 {};
(Interceptor_ImmutableListMixin$$11.new = function() {
  Interceptor_ImmutableListMixin$$11.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$11.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$11, html$.ImmutableListMixin$(html$.SpeechRecognitionResult));
html$._SpeechRecognitionResultList = class _SpeechRecognitionResultList extends Interceptor_ImmutableListMixin$$11 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.SpeechRecognitionResult._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$._SpeechRecognitionResultList.prototype[dart.isList] = true;
dart.addTypeTests(html$._SpeechRecognitionResultList);
html$._SpeechRecognitionResultList[dart.implements] = () => [JavaScriptIndexingBehaviorOfSpeechRecognitionResult(), ListOfSpeechRecognitionResult()];
dart.setMethodSignature(html$._SpeechRecognitionResultList, () => ({
  __proto__: dart.getMethods(html$._SpeechRecognitionResultList.__proto__),
  [$_get]: dart.fnType(html$.SpeechRecognitionResult, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.SpeechRecognitionResult, [core.int]),
  [$item]: dart.fnType(html$.SpeechRecognitionResult, [core.int])
}));
dart.setGetterSignature(html$._SpeechRecognitionResultList, () => ({
  __proto__: dart.getGetters(html$._SpeechRecognitionResultList.__proto__),
  [$length]: core.int,
  [$first]: html$.SpeechRecognitionResult,
  [$last]: html$.SpeechRecognitionResult,
  [$single]: html$.SpeechRecognitionResult
}));
dart.setSetterSignature(html$._SpeechRecognitionResultList, () => ({
  __proto__: dart.getSetters(html$._SpeechRecognitionResultList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$._SpeechRecognitionResultList, "dart:html");
dart.registerExtension("SpeechRecognitionResultList", html$._SpeechRecognitionResultList);
const Interceptor_ListMixin$$12 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$12.new = function() {
  Interceptor_ListMixin$$12.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$12.prototype;
dart.applyMixin(Interceptor_ListMixin$$12, collection.ListMixin$(html$.StyleSheet));
const Interceptor_ImmutableListMixin$$12 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$12 {};
(Interceptor_ImmutableListMixin$$12.new = function() {
  Interceptor_ImmutableListMixin$$12.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$12.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$12, html$.ImmutableListMixin$(html$.StyleSheet));
html$._StyleSheetList = class _StyleSheetList extends Interceptor_ImmutableListMixin$$12 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[index];
  }
  [$_set](index, value) {
    html$.StyleSheet._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [__getter__](...args) {
    return this.__getter__.apply(this, args);
  }
  [$item](...args) {
    return this.item.apply(this, args);
  }
};
html$._StyleSheetList.prototype[dart.isList] = true;
dart.addTypeTests(html$._StyleSheetList);
html$._StyleSheetList[dart.implements] = () => [ListOfStyleSheet(), JavaScriptIndexingBehaviorOfStyleSheet()];
dart.setMethodSignature(html$._StyleSheetList, () => ({
  __proto__: dart.getMethods(html$._StyleSheetList.__proto__),
  [$_get]: dart.fnType(html$.StyleSheet, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(html$.StyleSheet, [core.int]),
  [__getter__]: dart.fnType(html$.CssStyleSheet, [core.String]),
  [$item]: dart.fnType(html$.StyleSheet, [core.int])
}));
dart.setGetterSignature(html$._StyleSheetList, () => ({
  __proto__: dart.getGetters(html$._StyleSheetList.__proto__),
  [$length]: core.int,
  [$first]: html$.StyleSheet,
  [$last]: html$.StyleSheet,
  [$single]: html$.StyleSheet
}));
dart.setSetterSignature(html$._StyleSheetList, () => ({
  __proto__: dart.getSetters(html$._StyleSheetList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(html$._StyleSheetList, "dart:html");
dart.registerExtension("StyleSheetList", html$._StyleSheetList);
html$._SubtleCrypto = class _SubtleCrypto extends _interceptors.Interceptor {};
dart.addTypeTests(html$._SubtleCrypto);
dart.setLibraryUri(html$._SubtleCrypto, "dart:html");
dart.registerExtension("SubtleCrypto", html$._SubtleCrypto);
html$._USB = class _USB extends html$.EventTarget {};
dart.addTypeTests(html$._USB);
dart.setLibraryUri(html$._USB, "dart:html");
dart.registerExtension("USB", html$._USB);
html$._USBAlternateInterface = class _USBAlternateInterface extends _interceptors.Interceptor {
  static new(deviceInterface, alternateSetting) {
    return html$._USBAlternateInterface._create_1(deviceInterface, alternateSetting);
  }
  static _create_1(deviceInterface, alternateSetting) {
    return new USBAlternateInterface(deviceInterface, alternateSetting);
  }
};
dart.addTypeTests(html$._USBAlternateInterface);
dart.setLibraryUri(html$._USBAlternateInterface, "dart:html");
dart.registerExtension("USBAlternateInterface", html$._USBAlternateInterface);
html$._USBConfiguration = class _USBConfiguration extends _interceptors.Interceptor {
  static new(device, configurationValue) {
    return html$._USBConfiguration._create_1(device, configurationValue);
  }
  static _create_1(device, configurationValue) {
    return new USBConfiguration(device, configurationValue);
  }
};
dart.addTypeTests(html$._USBConfiguration);
dart.setLibraryUri(html$._USBConfiguration, "dart:html");
dart.registerExtension("USBConfiguration", html$._USBConfiguration);
html$._USBConnectionEvent = class _USBConnectionEvent extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return html$._USBConnectionEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new USBConnectionEvent(type, eventInitDict);
  }
};
dart.addTypeTests(html$._USBConnectionEvent);
dart.setLibraryUri(html$._USBConnectionEvent, "dart:html");
dart.registerExtension("USBConnectionEvent", html$._USBConnectionEvent);
html$._USBDevice = class _USBDevice extends _interceptors.Interceptor {};
dart.addTypeTests(html$._USBDevice);
dart.setLibraryUri(html$._USBDevice, "dart:html");
dart.registerExtension("USBDevice", html$._USBDevice);
html$._USBEndpoint = class _USBEndpoint extends _interceptors.Interceptor {
  static new(alternate, endpointNumber, direction) {
    return html$._USBEndpoint._create_1(alternate, endpointNumber, direction);
  }
  static _create_1(alternate, endpointNumber, direction) {
    return new USBEndpoint(alternate, endpointNumber, direction);
  }
};
dart.addTypeTests(html$._USBEndpoint);
dart.setLibraryUri(html$._USBEndpoint, "dart:html");
dart.registerExtension("USBEndpoint", html$._USBEndpoint);
html$._USBInTransferResult = class _USBInTransferResult extends _interceptors.Interceptor {
  static new(status, data) {
    if (data === void 0) data = null;
    if (data != null) {
      return html$._USBInTransferResult._create_1(status, data);
    }
    return html$._USBInTransferResult._create_2(status);
  }
  static _create_1(status, data) {
    return new USBInTransferResult(status, data);
  }
  static _create_2(status) {
    return new USBInTransferResult(status);
  }
};
dart.addTypeTests(html$._USBInTransferResult);
dart.setLibraryUri(html$._USBInTransferResult, "dart:html");
dart.registerExtension("USBInTransferResult", html$._USBInTransferResult);
html$._USBInterface = class _USBInterface extends _interceptors.Interceptor {
  static new(configuration, interfaceNumber) {
    return html$._USBInterface._create_1(configuration, interfaceNumber);
  }
  static _create_1(configuration, interfaceNumber) {
    return new USBInterface(configuration, interfaceNumber);
  }
};
dart.addTypeTests(html$._USBInterface);
dart.setLibraryUri(html$._USBInterface, "dart:html");
dart.registerExtension("USBInterface", html$._USBInterface);
html$._USBIsochronousInTransferPacket = class _USBIsochronousInTransferPacket extends _interceptors.Interceptor {
  static new(status, data) {
    if (data === void 0) data = null;
    if (data != null) {
      return html$._USBIsochronousInTransferPacket._create_1(status, data);
    }
    return html$._USBIsochronousInTransferPacket._create_2(status);
  }
  static _create_1(status, data) {
    return new USBIsochronousInTransferPacket(status, data);
  }
  static _create_2(status) {
    return new USBIsochronousInTransferPacket(status);
  }
};
dart.addTypeTests(html$._USBIsochronousInTransferPacket);
dart.setLibraryUri(html$._USBIsochronousInTransferPacket, "dart:html");
dart.registerExtension("USBIsochronousInTransferPacket", html$._USBIsochronousInTransferPacket);
html$._USBIsochronousInTransferResult = class _USBIsochronousInTransferResult extends _interceptors.Interceptor {
  static new(packets, data) {
    if (data === void 0) data = null;
    if (data != null) {
      return html$._USBIsochronousInTransferResult._create_1(packets, data);
    }
    return html$._USBIsochronousInTransferResult._create_2(packets);
  }
  static _create_1(packets, data) {
    return new USBIsochronousInTransferResult(packets, data);
  }
  static _create_2(packets) {
    return new USBIsochronousInTransferResult(packets);
  }
};
dart.addTypeTests(html$._USBIsochronousInTransferResult);
dart.setLibraryUri(html$._USBIsochronousInTransferResult, "dart:html");
dart.registerExtension("USBIsochronousInTransferResult", html$._USBIsochronousInTransferResult);
html$._USBIsochronousOutTransferPacket = class _USBIsochronousOutTransferPacket extends _interceptors.Interceptor {
  static new(status, bytesWritten) {
    if (bytesWritten === void 0) bytesWritten = null;
    if (bytesWritten != null) {
      return html$._USBIsochronousOutTransferPacket._create_1(status, bytesWritten);
    }
    return html$._USBIsochronousOutTransferPacket._create_2(status);
  }
  static _create_1(status, bytesWritten) {
    return new USBIsochronousOutTransferPacket(status, bytesWritten);
  }
  static _create_2(status) {
    return new USBIsochronousOutTransferPacket(status);
  }
};
dart.addTypeTests(html$._USBIsochronousOutTransferPacket);
dart.setLibraryUri(html$._USBIsochronousOutTransferPacket, "dart:html");
dart.registerExtension("USBIsochronousOutTransferPacket", html$._USBIsochronousOutTransferPacket);
html$._USBIsochronousOutTransferResult = class _USBIsochronousOutTransferResult extends _interceptors.Interceptor {
  static new(packets) {
    return html$._USBIsochronousOutTransferResult._create_1(packets);
  }
  static _create_1(packets) {
    return new USBIsochronousOutTransferResult(packets);
  }
};
dart.addTypeTests(html$._USBIsochronousOutTransferResult);
dart.setLibraryUri(html$._USBIsochronousOutTransferResult, "dart:html");
dart.registerExtension("USBIsochronousOutTransferResult", html$._USBIsochronousOutTransferResult);
html$._USBOutTransferResult = class _USBOutTransferResult extends _interceptors.Interceptor {
  static new(status, bytesWritten) {
    if (bytesWritten === void 0) bytesWritten = null;
    if (bytesWritten != null) {
      return html$._USBOutTransferResult._create_1(status, bytesWritten);
    }
    return html$._USBOutTransferResult._create_2(status);
  }
  static _create_1(status, bytesWritten) {
    return new USBOutTransferResult(status, bytesWritten);
  }
  static _create_2(status) {
    return new USBOutTransferResult(status);
  }
};
dart.addTypeTests(html$._USBOutTransferResult);
dart.setLibraryUri(html$._USBOutTransferResult, "dart:html");
dart.registerExtension("USBOutTransferResult", html$._USBOutTransferResult);
html$._WindowTimers = class _WindowTimers extends _interceptors.Interceptor {};
dart.addTypeTests(html$._WindowTimers);
dart.setLibraryUri(html$._WindowTimers, "dart:html");
html$._WorkerLocation = class _WorkerLocation extends _interceptors.Interceptor {};
dart.addTypeTests(html$._WorkerLocation);
html$._WorkerLocation[dart.implements] = () => [html$.UrlUtilsReadOnly];
dart.setLibraryUri(html$._WorkerLocation, "dart:html");
dart.registerExtension("WorkerLocation", html$._WorkerLocation);
html$._WorkerNavigator = class _WorkerNavigator extends html$.NavigatorConcurrentHardware {};
dart.addTypeTests(html$._WorkerNavigator);
html$._WorkerNavigator[dart.implements] = () => [html$.NavigatorOnLine, html$.NavigatorID];
dart.setLibraryUri(html$._WorkerNavigator, "dart:html");
dart.registerExtension("WorkerNavigator", html$._WorkerNavigator);
html$._Worklet = class _Worklet extends _interceptors.Interceptor {};
dart.addTypeTests(html$._Worklet);
dart.setLibraryUri(html$._Worklet, "dart:html");
dart.registerExtension("Worklet", html$._Worklet);
const _matches = dart.privateName(html$, "_matches");
html$._AttributeMap = class _AttributeMap extends collection.MapBase$(core.String, core.String) {
  addAll(other) {
    MapOfString$String()._check(other);
    other[$forEach](dart.fn((k, v) => {
      this._set(k, v);
    }, StringAndStringToNull()));
  }
  cast(K, V) {
    return core.Map.castFrom(core.String, core.String, K, V, this);
  }
  containsValue(value) {
    for (let v of this.values) {
      if (dart.equals(value, v)) {
        return true;
      }
    }
    return false;
  }
  putIfAbsent(key, ifAbsent) {
    core.String._check(key);
    VoidToString()._check(ifAbsent);
    if (!dart.test(this[$containsKey](key))) {
      this._set(key, ifAbsent());
    }
    return this._get(key);
  }
  clear() {
    for (let key of this.keys) {
      this[$remove](key);
    }
  }
  forEach(f) {
    for (let key of this.keys) {
      let value = this._get(key);
      f(key, value);
    }
  }
  get keys() {
    let attributes = this[_element$][_attributes$];
    let keys = JSArrayOfString().of([]);
    for (let i = 0, len = attributes[$length]; i < dart.notNull(len); i++) {
      let attr = html$._Attr._check(attributes[$_get](i));
      if (dart.test(this[_matches](attr))) {
        keys[$add](attr.name);
      }
    }
    return keys;
  }
  get values() {
    let attributes = this[_element$][_attributes$];
    let values = JSArrayOfString().of([]);
    for (let i = 0, len = attributes[$length]; i < dart.notNull(len); i++) {
      let attr = html$._Attr._check(attributes[$_get](i));
      if (dart.test(this[_matches](attr))) {
        values[$add](attr.value);
      }
    }
    return values;
  }
  get isEmpty() {
    return this[$length] === 0;
  }
  get isNotEmpty() {
    return !dart.test(this.isEmpty);
  }
};
(html$._AttributeMap.new = function(element) {
  this[_element$] = element;
}).prototype = html$._AttributeMap.prototype;
dart.addTypeTests(html$._AttributeMap);
dart.setMethodSignature(html$._AttributeMap, () => ({
  __proto__: dart.getMethods(html$._AttributeMap.__proto__),
  addAll: dart.fnType(dart.void, [core.Object]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  cast: dart.gFnType((K, V) => [core.Map$(K, V), []]),
  [$cast]: dart.gFnType((K, V) => [core.Map$(K, V), []]),
  containsValue: dart.fnType(core.bool, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [core.Object]),
  putIfAbsent: dart.fnType(core.String, [core.Object, core.Object]),
  [$putIfAbsent]: dart.fnType(core.String, [core.Object, core.Object]),
  clear: dart.fnType(dart.void, []),
  [$clear]: dart.fnType(dart.void, []),
  forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, core.String])]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, core.String])])
}));
dart.setGetterSignature(html$._AttributeMap, () => ({
  __proto__: dart.getGetters(html$._AttributeMap.__proto__),
  keys: core.Iterable$(core.String),
  [$keys]: core.Iterable$(core.String),
  values: core.Iterable$(core.String),
  [$values]: core.Iterable$(core.String),
  isEmpty: core.bool,
  [$isEmpty]: core.bool,
  isNotEmpty: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setLibraryUri(html$._AttributeMap, "dart:html");
dart.setFieldSignature(html$._AttributeMap, () => ({
  __proto__: dart.getFields(html$._AttributeMap.__proto__),
  [_element$]: dart.finalFieldType(html$.Element)
}));
dart.defineExtensionMethods(html$._AttributeMap, [
  'addAll',
  'cast',
  'containsValue',
  'putIfAbsent',
  'clear',
  'forEach'
]);
dart.defineExtensionAccessors(html$._AttributeMap, ['keys', 'values', 'isEmpty', 'isNotEmpty']);
html$._ElementAttributeMap = class _ElementAttributeMap extends html$._AttributeMap {
  containsKey(key) {
    return this[_element$][_hasAttribute](core.String._check(key));
  }
  _get(key) {
    return this[_element$][$getAttribute](core.String._check(key));
  }
  _set(key, value) {
    core.String._check(key);
    core.String._check(value);
    this[_element$][$setAttribute](key, value);
    return value;
  }
  remove(key) {
    return typeof key == 'string' ? html$._ElementAttributeMap._remove(this[_element$], key) : null;
  }
  get length() {
    return this.keys[$length];
  }
  [_matches](node) {
    return node[_namespaceUri] == null;
  }
  static _remove(element, key) {
    let value = element.getAttribute(key);
    element.removeAttribute(key);
    return value;
  }
};
(html$._ElementAttributeMap.new = function(element) {
  html$._ElementAttributeMap.__proto__.new.call(this, element);
}).prototype = html$._ElementAttributeMap.prototype;
dart.addTypeTests(html$._ElementAttributeMap);
dart.setMethodSignature(html$._ElementAttributeMap, () => ({
  __proto__: dart.getMethods(html$._ElementAttributeMap.__proto__),
  containsKey: dart.fnType(core.bool, [core.Object]),
  [$containsKey]: dart.fnType(core.bool, [core.Object]),
  _get: dart.fnType(core.String, [core.Object]),
  [$_get]: dart.fnType(core.String, [core.Object]),
  _set: dart.fnType(dart.void, [core.Object, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
  remove: dart.fnType(core.String, [core.Object]),
  [$remove]: dart.fnType(core.String, [core.Object]),
  [_matches]: dart.fnType(core.bool, [html$._Attr])
}));
dart.setGetterSignature(html$._ElementAttributeMap, () => ({
  __proto__: dart.getGetters(html$._ElementAttributeMap.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(html$._ElementAttributeMap, "dart:html");
dart.defineExtensionMethods(html$._ElementAttributeMap, ['containsKey', '_get', '_set', 'remove']);
dart.defineExtensionAccessors(html$._ElementAttributeMap, ['length']);
const _namespace = dart.privateName(html$, "_namespace");
html$._NamespacedAttributeMap = class _NamespacedAttributeMap extends html$._AttributeMap {
  containsKey(key) {
    return this[_element$][_hasAttributeNS](this[_namespace], core.String._check(key));
  }
  _get(key) {
    return this[_element$][$getAttributeNS](this[_namespace], core.String._check(key));
  }
  _set(key, value) {
    core.String._check(key);
    core.String._check(value);
    this[_element$][$setAttributeNS](this[_namespace], key, value);
    return value;
  }
  remove(key) {
    return typeof key == 'string' ? html$._NamespacedAttributeMap._remove(this[_namespace], this[_element$], key) : null;
  }
  get length() {
    return this.keys[$length];
  }
  [_matches](node) {
    return node[_namespaceUri] == this[_namespace];
  }
  static _remove(namespace, element, key) {
    let value = element.getAttributeNS(namespace, key);
    element.removeAttributeNS(namespace, key);
    return value;
  }
};
(html$._NamespacedAttributeMap.new = function(element, namespace) {
  this[_namespace] = namespace;
  html$._NamespacedAttributeMap.__proto__.new.call(this, element);
}).prototype = html$._NamespacedAttributeMap.prototype;
dart.addTypeTests(html$._NamespacedAttributeMap);
dart.setMethodSignature(html$._NamespacedAttributeMap, () => ({
  __proto__: dart.getMethods(html$._NamespacedAttributeMap.__proto__),
  containsKey: dart.fnType(core.bool, [core.Object]),
  [$containsKey]: dart.fnType(core.bool, [core.Object]),
  _get: dart.fnType(core.String, [core.Object]),
  [$_get]: dart.fnType(core.String, [core.Object]),
  _set: dart.fnType(dart.void, [core.Object, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
  remove: dart.fnType(core.String, [core.Object]),
  [$remove]: dart.fnType(core.String, [core.Object]),
  [_matches]: dart.fnType(core.bool, [html$._Attr])
}));
dart.setGetterSignature(html$._NamespacedAttributeMap, () => ({
  __proto__: dart.getGetters(html$._NamespacedAttributeMap.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(html$._NamespacedAttributeMap, "dart:html");
dart.setFieldSignature(html$._NamespacedAttributeMap, () => ({
  __proto__: dart.getFields(html$._NamespacedAttributeMap.__proto__),
  [_namespace]: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(html$._NamespacedAttributeMap, ['containsKey', '_get', '_set', 'remove']);
dart.defineExtensionAccessors(html$._NamespacedAttributeMap, ['length']);
const _attr = dart.privateName(html$, "_attr");
const _strip = dart.privateName(html$, "_strip");
const _toHyphenedName = dart.privateName(html$, "_toHyphenedName");
const _toCamelCase = dart.privateName(html$, "_toCamelCase");
html$._DataAttributeMap = class _DataAttributeMap extends collection.MapBase$(core.String, core.String) {
  addAll(other) {
    MapOfString$String()._check(other);
    other[$forEach](dart.fn((k, v) => {
      this._set(k, v);
    }, StringAndStringToNull()));
  }
  cast(K, V) {
    return core.Map.castFrom(core.String, core.String, K, V, this);
  }
  containsValue(value) {
    return this.values[$any](dart.fn(v => core.identical(v, value), StringTobool()));
  }
  containsKey(key) {
    return this[_attributes$][$containsKey](this[_attr](core.String._check(key)));
  }
  _get(key) {
    return this[_attributes$][$_get](this[_attr](core.String._check(key)));
  }
  _set(key, value) {
    core.String._check(key);
    core.String._check(value);
    this[_attributes$][$_set](this[_attr](key), value);
    return value;
  }
  putIfAbsent(key, ifAbsent) {
    core.String._check(key);
    VoidToString()._check(ifAbsent);
    return this[_attributes$][$putIfAbsent](this[_attr](key), ifAbsent);
  }
  remove(key) {
    return this[_attributes$][$remove](this[_attr](core.String._check(key)));
  }
  clear() {
    for (let key of this.keys) {
      this.remove(key);
    }
  }
  forEach(f) {
    this[_attributes$][$forEach](dart.fn((key, value) => {
      if (dart.test(this[_matches](key))) {
        f(this[_strip](key), value);
      }
    }, StringAndStringToNull()));
  }
  get keys() {
    let keys = JSArrayOfString().of([]);
    this[_attributes$][$forEach](dart.fn((key, value) => {
      if (dart.test(this[_matches](key))) {
        keys[$add](this[_strip](key));
      }
    }, StringAndStringToNull()));
    return keys;
  }
  get values() {
    let values = JSArrayOfString().of([]);
    this[_attributes$][$forEach](dart.fn((key, value) => {
      if (dart.test(this[_matches](key))) {
        values[$add](value);
      }
    }, StringAndStringToNull()));
    return values;
  }
  get length() {
    return this.keys[$length];
  }
  get isEmpty() {
    return this.length === 0;
  }
  get isNotEmpty() {
    return !dart.test(this.isEmpty);
  }
  [_attr](key) {
    return "data-" + dart.str(this[_toHyphenedName](key));
  }
  [_matches](key) {
    return key[$startsWith]("data-");
  }
  [_strip](key) {
    return this[_toCamelCase](key[$substring](5));
  }
  [_toCamelCase](hyphenedName, opts) {
    let startUppercase = opts && 'startUppercase' in opts ? opts.startUppercase : false;
    let segments = hyphenedName[$split]("-");
    let start = dart.test(startUppercase) ? 0 : 1;
    for (let i = start; i < dart.notNull(segments[$length]); i++) {
      let segment = segments[$_get](i);
      if (segment.length > 0) {
        segments[$_set](i, segment[$_get](0)[$toUpperCase]() + segment[$substring](1));
      }
    }
    return segments[$join]("");
  }
  [_toHyphenedName](word) {
    let sb = new core.StringBuffer.new();
    for (let i = 0; i < word.length; i++) {
      let lower = word[$_get](i)[$toLowerCase]();
      if (word[$_get](i) !== lower && i > 0) sb.write("-");
      sb.write(lower);
    }
    return sb.toString();
  }
};
(html$._DataAttributeMap.new = function(attributes) {
  this[_attributes$] = attributes;
}).prototype = html$._DataAttributeMap.prototype;
dart.addTypeTests(html$._DataAttributeMap);
dart.setMethodSignature(html$._DataAttributeMap, () => ({
  __proto__: dart.getMethods(html$._DataAttributeMap.__proto__),
  addAll: dart.fnType(dart.void, [core.Object]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  cast: dart.gFnType((K, V) => [core.Map$(K, V), []]),
  [$cast]: dart.gFnType((K, V) => [core.Map$(K, V), []]),
  containsValue: dart.fnType(core.bool, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [core.Object]),
  containsKey: dart.fnType(core.bool, [core.Object]),
  [$containsKey]: dart.fnType(core.bool, [core.Object]),
  _get: dart.fnType(core.String, [core.Object]),
  [$_get]: dart.fnType(core.String, [core.Object]),
  _set: dart.fnType(dart.void, [core.Object, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.Object, core.Object]),
  putIfAbsent: dart.fnType(core.String, [core.Object, core.Object]),
  [$putIfAbsent]: dart.fnType(core.String, [core.Object, core.Object]),
  remove: dart.fnType(core.String, [core.Object]),
  [$remove]: dart.fnType(core.String, [core.Object]),
  clear: dart.fnType(dart.void, []),
  [$clear]: dart.fnType(dart.void, []),
  forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, core.String])]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, core.String])]),
  [_attr]: dart.fnType(core.String, [core.String]),
  [_matches]: dart.fnType(core.bool, [core.String]),
  [_strip]: dart.fnType(core.String, [core.String]),
  [_toCamelCase]: dart.fnType(core.String, [core.String], {startUppercase: core.bool}),
  [_toHyphenedName]: dart.fnType(core.String, [core.String])
}));
dart.setGetterSignature(html$._DataAttributeMap, () => ({
  __proto__: dart.getGetters(html$._DataAttributeMap.__proto__),
  keys: core.Iterable$(core.String),
  [$keys]: core.Iterable$(core.String),
  values: core.Iterable$(core.String),
  [$values]: core.Iterable$(core.String),
  length: core.int,
  [$length]: core.int,
  isEmpty: core.bool,
  [$isEmpty]: core.bool,
  isNotEmpty: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setLibraryUri(html$._DataAttributeMap, "dart:html");
dart.setFieldSignature(html$._DataAttributeMap, () => ({
  __proto__: dart.getFields(html$._DataAttributeMap.__proto__),
  [_attributes$]: dart.finalFieldType(MapOfString$String())
}));
dart.defineExtensionMethods(html$._DataAttributeMap, [
  'addAll',
  'cast',
  'containsValue',
  'containsKey',
  '_get',
  '_set',
  'putIfAbsent',
  'remove',
  'clear',
  'forEach'
]);
dart.defineExtensionAccessors(html$._DataAttributeMap, [
  'keys',
  'values',
  'length',
  'isEmpty',
  'isNotEmpty'
]);
html$.CanvasImageSource = class CanvasImageSource extends core.Object {};
(html$.CanvasImageSource.new = function() {
}).prototype = html$.CanvasImageSource.prototype;
dart.addTypeTests(html$.CanvasImageSource);
dart.setLibraryUri(html$.CanvasImageSource, "dart:html");
html$.WindowBase = class WindowBase extends core.Object {};
(html$.WindowBase.new = function() {
}).prototype = html$.WindowBase.prototype;
dart.addTypeTests(html$.WindowBase);
html$.WindowBase[dart.implements] = () => [html$.EventTarget];
dart.setLibraryUri(html$.WindowBase, "dart:html");
html$.LocationBase = class LocationBase extends core.Object {};
(html$.LocationBase.new = function() {
}).prototype = html$.LocationBase.prototype;
dart.addTypeTests(html$.LocationBase);
dart.setLibraryUri(html$.LocationBase, "dart:html");
html$.HistoryBase = class HistoryBase extends core.Object {};
(html$.HistoryBase.new = function() {
}).prototype = html$.HistoryBase.prototype;
dart.addTypeTests(html$.HistoryBase);
dart.setLibraryUri(html$.HistoryBase, "dart:html");
html$.CssClassSet = class CssClassSet extends core.Object {};
(html$.CssClassSet.new = function() {
}).prototype = html$.CssClassSet.prototype;
dart.addTypeTests(html$.CssClassSet);
html$.CssClassSet[dart.implements] = () => [SetOfString()];
dart.setLibraryUri(html$.CssClassSet, "dart:html");
const _addOrSubtractToBoxModel = dart.privateName(html$, "_addOrSubtractToBoxModel");
html$.CssRect = class CssRect extends core.Object {
  set height(newHeight) {
    dart.throw(new core.UnsupportedError.new("Can only set height for content rect."));
  }
  set width(newWidth) {
    dart.throw(new core.UnsupportedError.new("Can only set width for content rect."));
  }
  [_addOrSubtractToBoxModel](dimensions, augmentingMeasurement) {
    let styles = this[_element$][$getComputedStyle]();
    let val = 0;
    for (let measurement of dimensions) {
      if (augmentingMeasurement == html$._MARGIN) {
        val = val + dart.notNull(new html$.Dimension.css(styles[$getPropertyValue](dart.str(augmentingMeasurement) + "-" + dart.str(measurement))).value);
      }
      if (augmentingMeasurement == html$._CONTENT) {
        val = val - dart.notNull(new html$.Dimension.css(styles[$getPropertyValue](dart.str(html$._PADDING) + "-" + dart.str(measurement))).value);
      }
      if (augmentingMeasurement != html$._MARGIN) {
        val = val - dart.notNull(new html$.Dimension.css(styles[$getPropertyValue]("border-" + dart.str(measurement) + "-width")).value);
      }
    }
    return val;
  }
  get right() {
    return dart.notNull(this.left) + dart.notNull(this.width);
  }
  get bottom() {
    return dart.notNull(this.top) + dart.notNull(this.height);
  }
  toString() {
    return "Rectangle (" + dart.str(this.left) + ", " + dart.str(this.top) + ") " + dart.str(this.width) + " x " + dart.str(this.height);
  }
  _equals(other) {
    if (!RectangleOfnum().is(other)) return false;
    return core.identical(this.left, dart.dload(other, 'left')) && core.identical(this.top, dart.dload(other, 'top')) && core.identical(this.right, dart.dload(other, 'right')) && core.identical(this.bottom, dart.dload(other, 'bottom'));
  }
  get hashCode() {
    return html$._JenkinsSmiHash.hash4(dart.hashCode(this.left), dart.hashCode(this.top), dart.hashCode(this.right), dart.hashCode(this.bottom));
  }
  intersection(other) {
    let x0 = math.max(core.num, this.left, other[$left]);
    let x1 = math.min(core.num, dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[$left]) + dart.notNull(other[$width]));
    if (x0 <= x1) {
      let y0 = math.max(core.num, this.top, other[$top]);
      let y1 = math.min(core.num, dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[$top]) + dart.notNull(other[$height]));
      if (y0 <= y1) {
        return new (RectangleOfnum()).new(x0, y0, x1 - x0, y1 - y0);
      }
    }
    return null;
  }
  intersects(other) {
    return dart.notNull(this.left) <= dart.notNull(other[$left]) + dart.notNull(other[$width]) && dart.notNull(other[$left]) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(this.top) <= dart.notNull(other[$top]) + dart.notNull(other[$height]) && dart.notNull(other[$top]) <= dart.notNull(this.top) + dart.notNull(this.height);
  }
  boundingBox(other) {
    let right = math.max(core.num, dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[$left]) + dart.notNull(other[$width]));
    let bottom = math.max(core.num, dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[$top]) + dart.notNull(other[$height]));
    let left = math.min(core.num, this.left, other[$left]);
    let top = math.min(core.num, this.top, other[$top]);
    return new (RectangleOfnum()).new(left, top, right - left, bottom - top);
  }
  containsRectangle(another) {
    return dart.notNull(this.left) <= dart.notNull(another[$left]) && dart.notNull(this.left) + dart.notNull(this.width) >= dart.notNull(another[$left]) + dart.notNull(another[$width]) && dart.notNull(this.top) <= dart.notNull(another[$top]) && dart.notNull(this.top) + dart.notNull(this.height) >= dart.notNull(another[$top]) + dart.notNull(another[$height]);
  }
  containsPoint(another) {
    return dart.notNull(another.x) >= dart.notNull(this.left) && dart.notNull(another.x) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(another.y) >= dart.notNull(this.top) && dart.notNull(another.y) <= dart.notNull(this.top) + dart.notNull(this.height);
  }
  get topLeft() {
    return new (PointOfnum()).new(this.left, this.top);
  }
  get topRight() {
    return new (PointOfnum()).new(dart.notNull(this.left) + dart.notNull(this.width), this.top);
  }
  get bottomRight() {
    return new (PointOfnum()).new(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(this.top) + dart.notNull(this.height));
  }
  get bottomLeft() {
    return new (PointOfnum()).new(this.left, dart.notNull(this.top) + dart.notNull(this.height));
  }
};
(html$.CssRect.new = function(element) {
  this[_element$] = element;
}).prototype = html$.CssRect.prototype;
dart.addTypeTests(html$.CssRect);
html$.CssRect[dart.implements] = () => [RectangleOfnum()];
dart.setMethodSignature(html$.CssRect, () => ({
  __proto__: dart.getMethods(html$.CssRect.__proto__),
  [_addOrSubtractToBoxModel]: dart.fnType(core.num, [core.List$(core.String), core.String]),
  intersection: dart.fnType(math.Rectangle$(core.num), [math.Rectangle$(core.num)]),
  [$intersection]: dart.fnType(math.Rectangle$(core.num), [math.Rectangle$(core.num)]),
  intersects: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
  [$intersects]: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
  boundingBox: dart.fnType(math.Rectangle$(core.num), [math.Rectangle$(core.num)]),
  [$boundingBox]: dart.fnType(math.Rectangle$(core.num), [math.Rectangle$(core.num)]),
  containsRectangle: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
  [$containsRectangle]: dart.fnType(core.bool, [math.Rectangle$(core.num)]),
  containsPoint: dart.fnType(core.bool, [math.Point$(core.num)]),
  [$containsPoint]: dart.fnType(core.bool, [math.Point$(core.num)])
}));
dart.setGetterSignature(html$.CssRect, () => ({
  __proto__: dart.getGetters(html$.CssRect.__proto__),
  right: core.num,
  [$right]: core.num,
  bottom: core.num,
  [$bottom]: core.num,
  topLeft: math.Point$(core.num),
  [$topLeft]: math.Point$(core.num),
  topRight: math.Point$(core.num),
  [$topRight]: math.Point$(core.num),
  bottomRight: math.Point$(core.num),
  [$bottomRight]: math.Point$(core.num),
  bottomLeft: math.Point$(core.num),
  [$bottomLeft]: math.Point$(core.num)
}));
dart.setSetterSignature(html$.CssRect, () => ({
  __proto__: dart.getSetters(html$.CssRect.__proto__),
  height: dart.dynamic,
  [$height]: dart.dynamic,
  width: dart.dynamic,
  [$width]: dart.dynamic
}));
dart.setLibraryUri(html$.CssRect, "dart:html");
dart.setFieldSignature(html$.CssRect, () => ({
  __proto__: dart.getFields(html$.CssRect.__proto__),
  [_element$]: dart.fieldType(html$.Element)
}));
dart.defineExtensionMethods(html$.CssRect, [
  'toString',
  '_equals',
  'intersection',
  'intersects',
  'boundingBox',
  'containsRectangle',
  'containsPoint'
]);
dart.defineExtensionAccessors(html$.CssRect, [
  'height',
  'width',
  'right',
  'bottom',
  'hashCode',
  'topLeft',
  'topRight',
  'bottomRight',
  'bottomLeft'
]);
html$._ContentCssRect = class _ContentCssRect extends html$.CssRect {
  get height() {
    return dart.notNull(this[_element$][$offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._CONTENT));
  }
  get width() {
    return dart.notNull(this[_element$][$offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._CONTENT));
  }
  set height(newHeight) {
    if (html$.Dimension.is(newHeight)) {
      let newHeightAsDimension = html$.Dimension._check(newHeight);
      if (dart.notNull(newHeightAsDimension.value) < 0) newHeight = new html$.Dimension.px(0);
      this[_element$].style[$height] = dart.toString(newHeight);
    } else if (typeof newHeight == 'number') {
      if (dart.dtest(dart.dsend(newHeight, '<', [0]))) newHeight = 0;
      this[_element$].style[$height] = dart.str(newHeight) + "px";
    } else {
      dart.throw(new core.ArgumentError.new("newHeight is not a Dimension or num"));
    }
  }
  set width(newWidth) {
    if (html$.Dimension.is(newWidth)) {
      let newWidthAsDimension = html$.Dimension._check(newWidth);
      if (dart.notNull(newWidthAsDimension.value) < 0) newWidth = new html$.Dimension.px(0);
      this[_element$].style[$width] = dart.toString(newWidth);
    } else if (typeof newWidth == 'number') {
      if (dart.dtest(dart.dsend(newWidth, '<', [0]))) newWidth = 0;
      this[_element$].style[$width] = dart.str(newWidth) + "px";
    } else {
      dart.throw(new core.ArgumentError.new("newWidth is not a Dimension or num"));
    }
  }
  get left() {
    return dart.notNull(this[_element$].getBoundingClientRect()[$left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(["left"]), html$._CONTENT));
  }
  get top() {
    return dart.notNull(this[_element$].getBoundingClientRect()[$top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(["top"]), html$._CONTENT));
  }
};
(html$._ContentCssRect.new = function(element) {
  html$._ContentCssRect.__proto__.new.call(this, element);
}).prototype = html$._ContentCssRect.prototype;
dart.addTypeTests(html$._ContentCssRect);
dart.setGetterSignature(html$._ContentCssRect, () => ({
  __proto__: dart.getGetters(html$._ContentCssRect.__proto__),
  height: core.num,
  [$height]: core.num,
  width: core.num,
  [$width]: core.num,
  left: core.num,
  [$left]: core.num,
  top: core.num,
  [$top]: core.num
}));
dart.setLibraryUri(html$._ContentCssRect, "dart:html");
dart.defineExtensionAccessors(html$._ContentCssRect, ['height', 'width', 'left', 'top']);
const _elementList = dart.privateName(html$, "_elementList");
html$._ContentCssListRect = class _ContentCssListRect extends html$._ContentCssRect {
  set height(newHeight) {
    this[_elementList][$forEach](dart.fn(e => e[$contentEdge].height = newHeight, ElementTodynamic()));
  }
  get height() {
    return super.height;
  }
  set width(newWidth) {
    this[_elementList][$forEach](dart.fn(e => e[$contentEdge].width = newWidth, ElementTodynamic()));
  }
  get width() {
    return super.width;
  }
};
(html$._ContentCssListRect.new = function(elementList) {
  this[_elementList] = null;
  html$._ContentCssListRect.__proto__.new.call(this, elementList[$first]);
  this[_elementList] = elementList;
}).prototype = html$._ContentCssListRect.prototype;
dart.addTypeTests(html$._ContentCssListRect);
dart.setLibraryUri(html$._ContentCssListRect, "dart:html");
dart.setFieldSignature(html$._ContentCssListRect, () => ({
  __proto__: dart.getFields(html$._ContentCssListRect.__proto__),
  [_elementList]: dart.fieldType(ListOfElement())
}));
dart.defineExtensionAccessors(html$._ContentCssListRect, ['height', 'width']);
html$._PaddingCssRect = class _PaddingCssRect extends html$.CssRect {
  get height() {
    return dart.notNull(this[_element$][$offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._PADDING));
  }
  set height(value) {
    super.height = value;
  }
  get width() {
    return dart.notNull(this[_element$][$offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._PADDING));
  }
  set width(value) {
    super.width = value;
  }
  get left() {
    return dart.notNull(this[_element$].getBoundingClientRect()[$left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(["left"]), html$._PADDING));
  }
  get top() {
    return dart.notNull(this[_element$].getBoundingClientRect()[$top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(["top"]), html$._PADDING));
  }
};
(html$._PaddingCssRect.new = function(element) {
  html$._PaddingCssRect.__proto__.new.call(this, html$.Element._check(element));
}).prototype = html$._PaddingCssRect.prototype;
dart.addTypeTests(html$._PaddingCssRect);
dart.setGetterSignature(html$._PaddingCssRect, () => ({
  __proto__: dart.getGetters(html$._PaddingCssRect.__proto__),
  height: core.num,
  [$height]: core.num,
  width: core.num,
  [$width]: core.num,
  left: core.num,
  [$left]: core.num,
  top: core.num,
  [$top]: core.num
}));
dart.setLibraryUri(html$._PaddingCssRect, "dart:html");
dart.defineExtensionAccessors(html$._PaddingCssRect, ['height', 'width', 'left', 'top']);
html$._BorderCssRect = class _BorderCssRect extends html$.CssRect {
  get height() {
    return this[_element$][$offsetHeight];
  }
  set height(value) {
    super.height = value;
  }
  get width() {
    return this[_element$][$offsetWidth];
  }
  set width(value) {
    super.width = value;
  }
  get left() {
    return this[_element$].getBoundingClientRect()[$left];
  }
  get top() {
    return this[_element$].getBoundingClientRect()[$top];
  }
};
(html$._BorderCssRect.new = function(element) {
  html$._BorderCssRect.__proto__.new.call(this, html$.Element._check(element));
}).prototype = html$._BorderCssRect.prototype;
dart.addTypeTests(html$._BorderCssRect);
dart.setGetterSignature(html$._BorderCssRect, () => ({
  __proto__: dart.getGetters(html$._BorderCssRect.__proto__),
  height: core.num,
  [$height]: core.num,
  width: core.num,
  [$width]: core.num,
  left: core.num,
  [$left]: core.num,
  top: core.num,
  [$top]: core.num
}));
dart.setLibraryUri(html$._BorderCssRect, "dart:html");
dart.defineExtensionAccessors(html$._BorderCssRect, ['height', 'width', 'left', 'top']);
html$._MarginCssRect = class _MarginCssRect extends html$.CssRect {
  get height() {
    return dart.notNull(this[_element$][$offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._MARGIN));
  }
  set height(value) {
    super.height = value;
  }
  get width() {
    return dart.notNull(this[_element$][$offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._MARGIN));
  }
  set width(value) {
    super.width = value;
  }
  get left() {
    return dart.notNull(this[_element$].getBoundingClientRect()[$left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(["left"]), html$._MARGIN));
  }
  get top() {
    return dart.notNull(this[_element$].getBoundingClientRect()[$top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(["top"]), html$._MARGIN));
  }
};
(html$._MarginCssRect.new = function(element) {
  html$._MarginCssRect.__proto__.new.call(this, html$.Element._check(element));
}).prototype = html$._MarginCssRect.prototype;
dart.addTypeTests(html$._MarginCssRect);
dart.setGetterSignature(html$._MarginCssRect, () => ({
  __proto__: dart.getGetters(html$._MarginCssRect.__proto__),
  height: core.num,
  [$height]: core.num,
  width: core.num,
  [$width]: core.num,
  left: core.num,
  [$left]: core.num,
  top: core.num,
  [$top]: core.num
}));
dart.setLibraryUri(html$._MarginCssRect, "dart:html");
dart.defineExtensionAccessors(html$._MarginCssRect, ['height', 'width', 'left', 'top']);
dart.defineLazy(html$, {
  /*html$._HEIGHT*/get _HEIGHT() {
    return JSArrayOfString().of(["top", "bottom"]);
  },
  /*html$._WIDTH*/get _WIDTH() {
    return JSArrayOfString().of(["right", "left"]);
  },
  /*html$._CONTENT*/get _CONTENT() {
    return "content";
  },
  /*html$._PADDING*/get _PADDING() {
    return "padding";
  },
  /*html$._MARGIN*/get _MARGIN() {
    return "margin";
  }
});
const _sets = dart.privateName(html$, "_sets");
const _validateToken = dart.privateName(html_common, "_validateToken");
html_common.CssClassSetImpl = class CssClassSetImpl extends collection.SetBase$(core.String) {
  [_validateToken](value) {
    if (dart.test(html_common.CssClassSetImpl._validTokenRE.hasMatch(value))) return value;
    dart.throw(new core.ArgumentError.value(value, "value", "Not a valid class token"));
  }
  toString() {
    return this.readClasses().join(" ");
  }
  toggle(value, shouldAdd) {
    if (shouldAdd === void 0) shouldAdd = null;
    this[_validateToken](value);
    let s = this.readClasses();
    let result = false;
    if (shouldAdd == null) shouldAdd = !dart.test(s.contains(value));
    if (dart.test(shouldAdd)) {
      s.add(value);
      result = true;
    } else {
      s.remove(value);
    }
    this.writeClasses(s);
    return result;
  }
  get frozen() {
    return false;
  }
  get iterator() {
    return this.readClasses().iterator;
  }
  forEach(f) {
    this.readClasses().forEach(f);
  }
  join(separator) {
    if (separator === void 0) separator = "";
    return this.readClasses().join(separator);
  }
  map(T, f) {
    return core.Iterable$(T)._check(this.readClasses().map(T, f));
  }
  where(f) {
    return this.readClasses().where(f);
  }
  expand(T, f) {
    return core.Iterable$(T)._check(this.readClasses().expand(T, f));
  }
  every(f) {
    return this.readClasses().every(f);
  }
  any(f) {
    return this.readClasses().any(f);
  }
  get isEmpty() {
    return this.readClasses().isEmpty;
  }
  get isNotEmpty() {
    return this.readClasses().isNotEmpty;
  }
  get length() {
    return this.readClasses().length;
  }
  reduce(combine) {
    StringAndStringToString()._check(combine);
    return this.readClasses().reduce(combine);
  }
  fold(T, initialValue, combine) {
    return T._check(this.readClasses().fold(T, initialValue, combine));
  }
  contains(value) {
    if (!(typeof value == 'string')) return false;
    this[_validateToken](core.String._check(value));
    return this.readClasses().contains(value);
  }
  lookup(value) {
    return core.String._check(dart.test(this.contains(value)) ? value : null);
  }
  add(value) {
    core.String._check(value);
    this[_validateToken](value);
    return core.bool._check(this.modify(dart.fn(s => s.add(value), SetOfStringTobool())));
  }
  remove(value) {
    this[_validateToken](core.String._check(value));
    if (!(typeof value == 'string')) return false;
    let s = this.readClasses();
    let result = s.remove(value);
    this.writeClasses(s);
    return result;
  }
  addAll(iterable) {
    IterableOfString()._check(iterable);
    this.modify(dart.fn(s => s.addAll(IterableOfString()._check(iterable[$map](core.String, dart.bind(this, _validateToken)))), SetOfStringTovoid()));
  }
  removeAll(iterable) {
    this.modify(dart.fn(s => s.removeAll(iterable), SetOfStringTovoid()));
  }
  toggleAll(iterable, shouldAdd) {
    if (shouldAdd === void 0) shouldAdd = null;
    iterable[$forEach](dart.fn(e => this.toggle(e, shouldAdd), StringTobool()));
  }
  retainAll(iterable) {
    this.modify(dart.fn(s => s.retainAll(iterable), SetOfStringTovoid()));
  }
  removeWhere(test) {
    this.modify(dart.fn(s => s.removeWhere(test), SetOfStringTovoid()));
  }
  retainWhere(test) {
    this.modify(dart.fn(s => s.retainWhere(test), SetOfStringTovoid()));
  }
  containsAll(collection) {
    return this.readClasses().containsAll(collection);
  }
  intersection(other) {
    return this.readClasses().intersection(other);
  }
  union(other) {
    SetOfString()._check(other);
    return this.readClasses().union(other);
  }
  difference(other) {
    return this.readClasses().difference(other);
  }
  get first() {
    return this.readClasses().first;
  }
  get last() {
    return this.readClasses().last;
  }
  get single() {
    return this.readClasses().single;
  }
  toList(opts) {
    let growable = opts && 'growable' in opts ? opts.growable : true;
    return this.readClasses().toList({growable: growable});
  }
  toSet() {
    return this.readClasses().toSet();
  }
  take(n) {
    return this.readClasses().take(n);
  }
  takeWhile(test) {
    return this.readClasses().takeWhile(test);
  }
  skip(n) {
    return this.readClasses().skip(n);
  }
  skipWhile(test) {
    return this.readClasses().skipWhile(test);
  }
  firstWhere(test, opts) {
    let orElse = opts && 'orElse' in opts ? opts.orElse : null;
    VoidToString()._check(orElse);
    return this.readClasses().firstWhere(test, {orElse: orElse});
  }
  lastWhere(test, opts) {
    let orElse = opts && 'orElse' in opts ? opts.orElse : null;
    VoidToString()._check(orElse);
    return this.readClasses().lastWhere(test, {orElse: orElse});
  }
  singleWhere(test, opts) {
    let orElse = opts && 'orElse' in opts ? opts.orElse : null;
    VoidToString()._check(orElse);
    return this.readClasses().singleWhere(test, {orElse: orElse});
  }
  elementAt(index) {
    return this.readClasses().elementAt(index);
  }
  clear() {
    this.modify(dart.fn(s => s.clear(), SetOfStringTovoid()));
  }
  modify(f) {
    let s = this.readClasses();
    let ret = f(s);
    this.writeClasses(s);
    return ret;
  }
};
(html_common.CssClassSetImpl.new = function() {
}).prototype = html_common.CssClassSetImpl.prototype;
dart.addTypeTests(html_common.CssClassSetImpl);
html_common.CssClassSetImpl[dart.implements] = () => [html$.CssClassSet];
dart.setMethodSignature(html_common.CssClassSetImpl, () => ({
  __proto__: dart.getMethods(html_common.CssClassSetImpl.__proto__),
  [_validateToken]: dart.fnType(core.String, [core.String]),
  toString: dart.fnType(core.String, []),
  [$toString]: dart.fnType(core.String, []),
  toggle: dart.fnType(core.bool, [core.String], [core.bool]),
  forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String])]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String])]),
  join: dart.fnType(core.String, [], [core.String]),
  [$join]: dart.fnType(core.String, [], [core.String]),
  map: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [core.String])]]),
  [$map]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(T, [core.String])]]),
  where: dart.fnType(core.Iterable$(core.String), [dart.fnType(core.bool, [core.String])]),
  [$where]: dart.fnType(core.Iterable$(core.String), [dart.fnType(core.bool, [core.String])]),
  expand: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [core.String])]]),
  [$expand]: dart.gFnType(T => [core.Iterable$(T), [dart.fnType(core.Iterable$(T), [core.String])]]),
  every: dart.fnType(core.bool, [dart.fnType(core.bool, [core.String])]),
  [$every]: dart.fnType(core.bool, [dart.fnType(core.bool, [core.String])]),
  any: dart.fnType(core.bool, [dart.fnType(core.bool, [core.String])]),
  [$any]: dart.fnType(core.bool, [dart.fnType(core.bool, [core.String])]),
  reduce: dart.fnType(core.String, [core.Object]),
  [$reduce]: dart.fnType(core.String, [core.Object]),
  fold: dart.gFnType(T => [T, [T, dart.fnType(T, [T, core.String])]]),
  [$fold]: dart.gFnType(T => [T, [T, dart.fnType(T, [T, core.String])]]),
  contains: dart.fnType(core.bool, [core.Object]),
  [$contains]: dart.fnType(core.bool, [core.Object]),
  lookup: dart.fnType(core.String, [core.Object]),
  add: dart.fnType(core.bool, [core.Object]),
  remove: dart.fnType(core.bool, [core.Object]),
  addAll: dart.fnType(dart.void, [core.Object]),
  removeAll: dart.fnType(dart.void, [core.Iterable$(core.Object)]),
  toggleAll: dart.fnType(dart.void, [core.Iterable$(core.String)], [core.bool]),
  retainAll: dart.fnType(dart.void, [core.Iterable$(core.Object)]),
  removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [core.String])]),
  retainWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [core.String])]),
  containsAll: dart.fnType(core.bool, [core.Iterable$(core.Object)]),
  intersection: dart.fnType(core.Set$(core.String), [core.Set$(core.Object)]),
  union: dart.fnType(core.Set$(core.String), [core.Object]),
  difference: dart.fnType(core.Set$(core.String), [core.Set$(core.Object)]),
  toList: dart.fnType(core.List$(core.String), [], {growable: core.bool}),
  [$toList]: dart.fnType(core.List$(core.String), [], {growable: core.bool}),
  toSet: dart.fnType(core.Set$(core.String), []),
  [$toSet]: dart.fnType(core.Set$(core.String), []),
  take: dart.fnType(core.Iterable$(core.String), [core.int]),
  [$take]: dart.fnType(core.Iterable$(core.String), [core.int]),
  takeWhile: dart.fnType(core.Iterable$(core.String), [dart.fnType(core.bool, [core.String])]),
  [$takeWhile]: dart.fnType(core.Iterable$(core.String), [dart.fnType(core.bool, [core.String])]),
  skip: dart.fnType(core.Iterable$(core.String), [core.int]),
  [$skip]: dart.fnType(core.Iterable$(core.String), [core.int]),
  skipWhile: dart.fnType(core.Iterable$(core.String), [dart.fnType(core.bool, [core.String])]),
  [$skipWhile]: dart.fnType(core.Iterable$(core.String), [dart.fnType(core.bool, [core.String])]),
  firstWhere: dart.fnType(core.String, [dart.fnType(core.bool, [core.String])], {orElse: core.Object}),
  [$firstWhere]: dart.fnType(core.String, [dart.fnType(core.bool, [core.String])], {orElse: core.Object}),
  lastWhere: dart.fnType(core.String, [dart.fnType(core.bool, [core.String])], {orElse: core.Object}),
  [$lastWhere]: dart.fnType(core.String, [dart.fnType(core.bool, [core.String])], {orElse: core.Object}),
  singleWhere: dart.fnType(core.String, [dart.fnType(core.bool, [core.String])], {orElse: core.Object}),
  [$singleWhere]: dart.fnType(core.String, [dart.fnType(core.bool, [core.String])], {orElse: core.Object}),
  elementAt: dart.fnType(core.String, [core.int]),
  [$elementAt]: dart.fnType(core.String, [core.int]),
  clear: dart.fnType(dart.void, []),
  modify: dart.fnType(dart.dynamic, [dart.fnType(dart.dynamic, [core.Set$(core.String)])])
}));
dart.setGetterSignature(html_common.CssClassSetImpl, () => ({
  __proto__: dart.getGetters(html_common.CssClassSetImpl.__proto__),
  frozen: core.bool,
  iterator: core.Iterator$(core.String),
  [$iterator]: core.Iterator$(core.String),
  isEmpty: core.bool,
  [$isEmpty]: core.bool,
  isNotEmpty: core.bool,
  [$isNotEmpty]: core.bool,
  length: core.int,
  [$length]: core.int,
  first: core.String,
  [$first]: core.String,
  last: core.String,
  [$last]: core.String,
  single: core.String,
  [$single]: core.String
}));
dart.setLibraryUri(html_common.CssClassSetImpl, "dart:html_common");
dart.defineExtensionMethods(html_common.CssClassSetImpl, [
  'toString',
  'forEach',
  'join',
  'map',
  'where',
  'expand',
  'every',
  'any',
  'reduce',
  'fold',
  'contains',
  'toList',
  'toSet',
  'take',
  'takeWhile',
  'skip',
  'skipWhile',
  'firstWhere',
  'lastWhere',
  'singleWhere',
  'elementAt'
]);
dart.defineExtensionAccessors(html_common.CssClassSetImpl, [
  'iterator',
  'isEmpty',
  'isNotEmpty',
  'length',
  'first',
  'last',
  'single'
]);
dart.defineLazy(html_common.CssClassSetImpl, {
  /*html_common.CssClassSetImpl._validTokenRE*/get _validTokenRE() {
    return core.RegExp.new("^\\S+$");
  }
});
html$._MultiElementCssClassSet = class _MultiElementCssClassSet extends html_common.CssClassSetImpl {
  static new(elements) {
    return new html$._MultiElementCssClassSet.__(elements, ListOfCssClassSetImpl().from(elements[$map](dart.dynamic, dart.fn(e => e[$classes], ElementToCssClassSet()))));
  }
  readClasses() {
    let s = new (_IdentityHashSetOfString()).new();
    this[_sets][$forEach](dart.fn(e => s.addAll(e.readClasses()), CssClassSetImplTovoid()));
    return s;
  }
  writeClasses(s) {
    let classes = s.join(" ");
    for (let e of this[_elementIterable]) {
      e.className = classes;
    }
  }
  modify(f) {
    this[_sets][$forEach](dart.fn(e => e.modify(f), CssClassSetImplTodynamic()));
  }
  toggle(value, shouldAdd) {
    if (shouldAdd === void 0) shouldAdd = null;
    return core.bool._check(this[_sets][$fold](core.bool, false, dart.fn((changed, e) => dart.test(e.toggle(value, shouldAdd)) || dart.test(changed), boolAndCssClassSetImplTobool())));
  }
  remove(value) {
    return core.bool._check(this[_sets][$fold](core.bool, false, dart.fn((changed, e) => dart.test(e.remove(value)) || dart.test(changed), boolAndCssClassSetImplTobool())));
  }
};
(html$._MultiElementCssClassSet.__ = function(elementIterable, sets) {
  this[_elementIterable] = elementIterable;
  this[_sets] = sets;
}).prototype = html$._MultiElementCssClassSet.prototype;
dart.addTypeTests(html$._MultiElementCssClassSet);
dart.setMethodSignature(html$._MultiElementCssClassSet, () => ({
  __proto__: dart.getMethods(html$._MultiElementCssClassSet.__proto__),
  readClasses: dart.fnType(core.Set$(core.String), []),
  writeClasses: dart.fnType(dart.void, [core.Set$(core.String)])
}));
dart.setLibraryUri(html$._MultiElementCssClassSet, "dart:html");
dart.setFieldSignature(html$._MultiElementCssClassSet, () => ({
  __proto__: dart.getFields(html$._MultiElementCssClassSet.__proto__),
  [_elementIterable]: dart.finalFieldType(IterableOfElement()),
  [_sets]: dart.finalFieldType(ListOfCssClassSetImpl())
}));
html$._ElementCssClassSet = class _ElementCssClassSet extends html_common.CssClassSetImpl {
  readClasses() {
    let s = new (_IdentityHashSetOfString()).new();
    let classname = this[_element$].className;
    for (let name of classname[$split](" ")) {
      let trimmed = name[$trim]();
      if (!trimmed[$isEmpty]) {
        s.add(trimmed);
      }
    }
    return s;
  }
  writeClasses(s) {
    this[_element$].className = s.join(" ");
  }
  get length() {
    return html$._ElementCssClassSet._classListLength(html$._ElementCssClassSet._classListOf(this[_element$]));
  }
  get isEmpty() {
    return this.length === 0;
  }
  get isNotEmpty() {
    return this.length !== 0;
  }
  clear() {
    this[_element$].className = "";
  }
  contains(value) {
    return html$._ElementCssClassSet._contains(this[_element$], value);
  }
  add(value) {
    core.String._check(value);
    return html$._ElementCssClassSet._add(this[_element$], value);
  }
  remove(value) {
    return typeof value == 'string' && dart.test(html$._ElementCssClassSet._remove(this[_element$], value));
  }
  toggle(value, shouldAdd) {
    if (shouldAdd === void 0) shouldAdd = null;
    return html$._ElementCssClassSet._toggle(this[_element$], value, shouldAdd);
  }
  addAll(iterable) {
    IterableOfString()._check(iterable);
    html$._ElementCssClassSet._addAll(this[_element$], iterable);
  }
  removeAll(iterable) {
    html$._ElementCssClassSet._removeAll(this[_element$], iterable);
  }
  retainAll(iterable) {
    html$._ElementCssClassSet._removeWhere(this[_element$], dart.bind(iterable[$toSet](), 'contains'), false);
  }
  removeWhere(test) {
    html$._ElementCssClassSet._removeWhere(this[_element$], test, true);
  }
  retainWhere(test) {
    html$._ElementCssClassSet._removeWhere(this[_element$], test, false);
  }
  static _contains(_element, value) {
    return typeof value == 'string' && dart.test(html$._ElementCssClassSet._classListContains(html$._ElementCssClassSet._classListOf(_element), value));
  }
  static _add(_element, value) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    let added = !dart.test(html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value));
    html$._ElementCssClassSet._classListAdd(list, value);
    return added;
  }
  static _remove(_element, value) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    let removed = html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value);
    html$._ElementCssClassSet._classListRemove(list, value);
    return removed;
  }
  static _toggle(_element, value, shouldAdd) {
    return shouldAdd == null ? html$._ElementCssClassSet._toggleDefault(_element, value) : html$._ElementCssClassSet._toggleOnOff(_element, value, shouldAdd);
  }
  static _toggleDefault(_element, value) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    return html$._ElementCssClassSet._classListToggle1(list, value);
  }
  static _toggleOnOff(_element, value, shouldAdd) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    if (dart.test(shouldAdd)) {
      html$._ElementCssClassSet._classListAdd(list, value);
      return true;
    } else {
      html$._ElementCssClassSet._classListRemove(list, value);
      return false;
    }
  }
  static _addAll(_element, iterable) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    for (let value of iterable) {
      html$._ElementCssClassSet._classListAdd(list, value);
    }
  }
  static _removeAll(_element, iterable) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    for (let value of iterable) {
      core.String._check(value);
      html$._ElementCssClassSet._classListRemove(list, value);
    }
  }
  static _removeWhere(_element, test, doRemove) {
    let list = html$._ElementCssClassSet._classListOf(_element);
    let i = 0;
    while (i < dart.notNull(html$._ElementCssClassSet._classListLength(list))) {
      let item = list.item(i);
      if (doRemove == test(item)) {
        html$._ElementCssClassSet._classListRemove(list, item);
      } else {
        ++i;
      }
    }
  }
  static _classListOf(e) {
    return e.classList;
  }
  static _classListLength(list) {
    return list.length;
  }
  static _classListContains(list, value) {
    return list.contains(value);
  }
  static _classListContainsBeforeAddOrRemove(list, value) {
    return list.contains(value);
  }
  static _classListAdd(list, value) {
    list.add(value);
  }
  static _classListRemove(list, value) {
    list.remove(value);
  }
  static _classListToggle1(list, value) {
    return list.toggle(value);
  }
  static _classListToggle2(list, value, shouldAdd) {
    return list.toggle(value, shouldAdd);
  }
};
(html$._ElementCssClassSet.new = function(element) {
  this[_element$] = element;
}).prototype = html$._ElementCssClassSet.prototype;
dart.addTypeTests(html$._ElementCssClassSet);
dart.setMethodSignature(html$._ElementCssClassSet, () => ({
  __proto__: dart.getMethods(html$._ElementCssClassSet.__proto__),
  readClasses: dart.fnType(core.Set$(core.String), []),
  writeClasses: dart.fnType(dart.void, [core.Set$(core.String)]),
  add: dart.fnType(core.bool, [core.Object]),
  addAll: dart.fnType(dart.void, [core.Object])
}));
dart.setLibraryUri(html$._ElementCssClassSet, "dart:html");
dart.setFieldSignature(html$._ElementCssClassSet, () => ({
  __proto__: dart.getFields(html$._ElementCssClassSet.__proto__),
  [_element$]: dart.finalFieldType(html$.Element)
}));
dart.defineExtensionMethods(html$._ElementCssClassSet, ['contains']);
dart.defineExtensionAccessors(html$._ElementCssClassSet, ['length', 'isEmpty', 'isNotEmpty']);
const _unit = dart.privateName(html$, "_unit");
html$.Dimension = class Dimension extends core.Object {
  toString() {
    return dart.str(this[_value$3]) + dart.str(this[_unit]);
  }
  get value() {
    return this[_value$3];
  }
};
(html$.Dimension.percent = function(value) {
  this[_value$3] = value;
  this[_unit] = "%";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.px = function(value) {
  this[_value$3] = value;
  this[_unit] = "px";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.pc = function(value) {
  this[_value$3] = value;
  this[_unit] = "pc";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.pt = function(value) {
  this[_value$3] = value;
  this[_unit] = "pt";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.inch = function(value) {
  this[_value$3] = value;
  this[_unit] = "in";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.cm = function(value) {
  this[_value$3] = value;
  this[_unit] = "cm";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.mm = function(value) {
  this[_value$3] = value;
  this[_unit] = "mm";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.em = function(value) {
  this[_value$3] = value;
  this[_unit] = "em";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.ex = function(value) {
  this[_value$3] = value;
  this[_unit] = "ex";
}).prototype = html$.Dimension.prototype;
(html$.Dimension.css = function(cssValue) {
  this[_value$3] = null;
  this[_unit] = null;
  if (cssValue === "") cssValue = "0px";
  if (cssValue[$endsWith]("%")) {
    this[_unit] = "%";
  } else {
    this[_unit] = cssValue[$substring](cssValue.length - 2);
  }
  if (cssValue[$contains](".")) {
    this[_value$3] = core.double.parse(cssValue[$substring](0, cssValue.length - this[_unit].length));
  } else {
    this[_value$3] = core.int.parse(cssValue[$substring](0, cssValue.length - this[_unit].length));
  }
}).prototype = html$.Dimension.prototype;
dart.addTypeTests(html$.Dimension);
dart.setGetterSignature(html$.Dimension, () => ({
  __proto__: dart.getGetters(html$.Dimension.__proto__),
  value: core.num
}));
dart.setLibraryUri(html$.Dimension, "dart:html");
dart.setFieldSignature(html$.Dimension, () => ({
  __proto__: dart.getFields(html$.Dimension.__proto__),
  [_value$3]: dart.fieldType(core.num),
  [_unit]: dart.fieldType(core.String)
}));
dart.defineExtensionMethods(html$.Dimension, ['toString']);
const _is_EventStreamProvider_default = Symbol('_is_EventStreamProvider_default');
html$.EventStreamProvider$ = dart.generic(T => {
  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
  class EventStreamProvider extends core.Object {
    forTarget(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_EventStreamOfT()).new(e, this[_eventType], useCapture);
    }
    forElement(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementEventStreamImplOfT()).new(e, this[_eventType], useCapture);
    }
    [_forElementList](e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementListEventStreamImplOfT()).new(e, this[_eventType], useCapture);
    }
    getEventType(target) {
      return this[_eventType];
    }
  }
  (EventStreamProvider.new = function(eventType) {
    this[_eventType] = eventType;
  }).prototype = EventStreamProvider.prototype;
  dart.addTypeTests(EventStreamProvider);
  EventStreamProvider.prototype[_is_EventStreamProvider_default] = true;
  dart.setMethodSignature(EventStreamProvider, () => ({
    __proto__: dart.getMethods(EventStreamProvider.__proto__),
    forTarget: dart.fnType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
    forElement: dart.fnType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
    [_forElementList]: dart.fnType(html$.ElementStream$(T), [html$.ElementList$(html$.Element)], {useCapture: core.bool}),
    getEventType: dart.fnType(core.String, [html$.EventTarget])
  }));
  dart.setLibraryUri(EventStreamProvider, "dart:html");
  dart.setFieldSignature(EventStreamProvider, () => ({
    __proto__: dart.getFields(EventStreamProvider.__proto__),
    [_eventType]: dart.finalFieldType(core.String)
  }));
  return EventStreamProvider;
});
html$.EventStreamProvider = html$.EventStreamProvider$();
dart.addTypeTests(html$.EventStreamProvider, _is_EventStreamProvider_default);
const _is_ElementStream_default = Symbol('_is_ElementStream_default');
html$.ElementStream$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class ElementStream extends core.Object {}
  (ElementStream.new = function() {
  }).prototype = ElementStream.prototype;
  ElementStream.prototype[dart.isStream] = true;
  dart.addTypeTests(ElementStream);
  ElementStream.prototype[_is_ElementStream_default] = true;
  ElementStream[dart.implements] = () => [StreamOfT()];
  dart.setLibraryUri(ElementStream, "dart:html");
  return ElementStream;
});
html$.ElementStream = html$.ElementStream$();
dart.addTypeTests(html$.ElementStream, _is_ElementStream_default);
const _target$0 = dart.privateName(html$, "_target");
const _useCapture = dart.privateName(html$, "_useCapture");
const _is__EventStream_default = Symbol('_is__EventStream_default');
html$._EventStream$ = dart.generic(T => {
  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
  class _EventStream extends async.Stream$(T) {
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return this;
    }
    get isBroadcast() {
      return true;
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return new (_EventStreamSubscriptionOfT()).new(this[_target$0], this[_eventType], onData, this[_useCapture]);
    }
  }
  (_EventStream.new = function(target, eventType, useCapture) {
    this[_target$0] = target;
    this[_eventType] = eventType;
    this[_useCapture] = useCapture;
    _EventStream.__proto__.new.call(this);
  }).prototype = _EventStream.prototype;
  dart.addTypeTests(_EventStream);
  _EventStream.prototype[_is__EventStream_default] = true;
  dart.setMethodSignature(_EventStream, () => ({
    __proto__: dart.getMethods(_EventStream.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool})
  }));
  dart.setLibraryUri(_EventStream, "dart:html");
  dart.setFieldSignature(_EventStream, () => ({
    __proto__: dart.getFields(_EventStream.__proto__),
    [_target$0]: dart.finalFieldType(html$.EventTarget),
    [_eventType]: dart.finalFieldType(core.String),
    [_useCapture]: dart.finalFieldType(core.bool)
  }));
  return _EventStream;
});
html$._EventStream = html$._EventStream$();
dart.addTypeTests(html$._EventStream, _is__EventStream_default);
html$._matchesWithAncestors = function(event, selector) {
  let target = event[$target];
  return html$.Element.is(target) ? target[$matchesWithAncestors](selector) : false;
};
const _is__ElementEventStreamImpl_default = Symbol('_is__ElementEventStreamImpl_default');
html$._ElementEventStreamImpl$ = dart.generic(T => {
  let TToT = () => (TToT = dart.constFn(dart.fnType(T, [T])))();
  let TTobool = () => (TTobool = dart.constFn(dart.fnType(core.bool, [T])))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
  class _ElementEventStreamImpl extends html$._EventStream$(T) {
    matches(selector) {
      return StreamOfT()._check(this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T, dart.fn(e => {
        e[_selector] = selector;
        return e;
      }, TToT())));
    }
    capture(onData) {
      return new (_EventStreamSubscriptionOfT()).new(this[_target$0], this[_eventType], onData, true);
    }
  }
  (_ElementEventStreamImpl.new = function(target, eventType, useCapture) {
    _ElementEventStreamImpl.__proto__.new.call(this, html$.EventTarget._check(target), core.String._check(eventType), core.bool._check(useCapture));
  }).prototype = _ElementEventStreamImpl.prototype;
  dart.addTypeTests(_ElementEventStreamImpl);
  _ElementEventStreamImpl.prototype[_is__ElementEventStreamImpl_default] = true;
  _ElementEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
  dart.setMethodSignature(_ElementEventStreamImpl, () => ({
    __proto__: dart.getMethods(_ElementEventStreamImpl.__proto__),
    matches: dart.fnType(async.Stream$(T), [core.String]),
    capture: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])])
  }));
  dart.setLibraryUri(_ElementEventStreamImpl, "dart:html");
  return _ElementEventStreamImpl;
});
html$._ElementEventStreamImpl = html$._ElementEventStreamImpl$();
dart.addTypeTests(html$._ElementEventStreamImpl, _is__ElementEventStreamImpl_default);
const _targetList = dart.privateName(html$, "_targetList");
const _is__ElementListEventStreamImpl_default = Symbol('_is__ElementListEventStreamImpl_default');
html$._ElementListEventStreamImpl$ = dart.generic(T => {
  let TToT = () => (TToT = dart.constFn(dart.fnType(T, [T])))();
  let TTobool = () => (TTobool = dart.constFn(dart.fnType(core.bool, [T])))();
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let _StreamPoolOfT = () => (_StreamPoolOfT = dart.constFn(html$._StreamPool$(T)))();
  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
  class _ElementListEventStreamImpl extends async.Stream$(T) {
    matches(selector) {
      return StreamOfT()._check(this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T, dart.fn(e => {
        e[_selector] = selector;
        return e;
      }, TToT())));
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      let pool = new (_StreamPoolOfT()).broadcast();
      for (let target of this[_targetList]) {
        pool.add(new (_EventStreamOfT()).new(target, this[_eventType], this[_useCapture]));
      }
      return pool.stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    capture(onData) {
      let pool = new (_StreamPoolOfT()).broadcast();
      for (let target of this[_targetList]) {
        pool.add(new (_EventStreamOfT()).new(target, this[_eventType], true));
      }
      return pool.stream.listen(onData);
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return this;
    }
    get isBroadcast() {
      return true;
    }
  }
  (_ElementListEventStreamImpl.new = function(targetList, eventType, useCapture) {
    this[_targetList] = targetList;
    this[_eventType] = eventType;
    this[_useCapture] = useCapture;
    _ElementListEventStreamImpl.__proto__.new.call(this);
  }).prototype = _ElementListEventStreamImpl.prototype;
  dart.addTypeTests(_ElementListEventStreamImpl);
  _ElementListEventStreamImpl.prototype[_is__ElementListEventStreamImpl_default] = true;
  _ElementListEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
  dart.setMethodSignature(_ElementListEventStreamImpl, () => ({
    __proto__: dart.getMethods(_ElementListEventStreamImpl.__proto__),
    matches: dart.fnType(async.Stream$(T), [core.String]),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
    capture: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])])
  }));
  dart.setLibraryUri(_ElementListEventStreamImpl, "dart:html");
  dart.setFieldSignature(_ElementListEventStreamImpl, () => ({
    __proto__: dart.getFields(_ElementListEventStreamImpl.__proto__),
    [_targetList]: dart.finalFieldType(IterableOfElement()),
    [_useCapture]: dart.finalFieldType(core.bool),
    [_eventType]: dart.finalFieldType(core.String)
  }));
  return _ElementListEventStreamImpl;
});
html$._ElementListEventStreamImpl = html$._ElementListEventStreamImpl$();
dart.addTypeTests(html$._ElementListEventStreamImpl, _is__ElementListEventStreamImpl_default);
const _onData$1 = dart.privateName(html$, "_onData");
const _pauseCount$ = dart.privateName(html$, "_pauseCount");
const _tryResume = dart.privateName(html$, "_tryResume");
const _canceled = dart.privateName(html$, "_canceled");
const _unlisten = dart.privateName(html$, "_unlisten");
const _is__EventStreamSubscription_default = Symbol('_is__EventStreamSubscription_default');
html$._EventStreamSubscription$ = dart.generic(T => {
  class _EventStreamSubscription extends async.StreamSubscription$(T) {
    cancel() {
      if (dart.test(this[_canceled])) return null;
      this[_unlisten]();
      this[_target$0] = null;
      this[_onData$1] = null;
      return null;
    }
    get [_canceled]() {
      return this[_target$0] == null;
    }
    onData(handleData) {
      if (dart.test(this[_canceled])) {
        dart.throw(new core.StateError.new("Subscription has been canceled."));
      }
      this[_unlisten]();
      this[_onData$1] = html$._wrapZone(html$.Event, EventTovoid()._check(handleData));
      this[_tryResume]();
    }
    onError(handleError) {}
    onDone(handleDone) {}
    pause(resumeSignal) {
      if (resumeSignal === void 0) resumeSignal = null;
      if (dart.test(this[_canceled])) return;
      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
      this[_unlisten]();
      if (resumeSignal != null) {
        resumeSignal.whenComplete(dart.bind(this, 'resume'));
      }
    }
    get isPaused() {
      return dart.notNull(this[_pauseCount$]) > 0;
    }
    resume() {
      if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
      this[_tryResume]();
    }
    [_tryResume]() {
      if (this[_onData$1] != null && !dart.test(this.isPaused)) {
        this[_target$0][$addEventListener](this[_eventType], this[_onData$1], this[_useCapture]);
      }
    }
    [_unlisten]() {
      if (this[_onData$1] != null) {
        this[_target$0][$removeEventListener](this[_eventType], this[_onData$1], this[_useCapture]);
      }
    }
    asFuture(E, futureValue) {
      if (futureValue === void 0) futureValue = null;
      let completer = async.Completer$(E).new();
      return completer.future;
    }
  }
  (_EventStreamSubscription.new = function(target, eventType, onData, useCapture) {
    this[_pauseCount$] = 0;
    this[_target$0] = target;
    this[_eventType] = eventType;
    this[_useCapture] = useCapture;
    this[_onData$1] = onData == null ? null : html$._wrapZone(html$.Event, dart.fn(e => dart.dcall(onData, [e]), EventTodynamic()));
    this[_tryResume]();
  }).prototype = _EventStreamSubscription.prototype;
  dart.addTypeTests(_EventStreamSubscription);
  _EventStreamSubscription.prototype[_is__EventStreamSubscription_default] = true;
  dart.setMethodSignature(_EventStreamSubscription, () => ({
    __proto__: dart.getMethods(_EventStreamSubscription.__proto__),
    cancel: dart.fnType(async.Future, []),
    onData: dart.fnType(dart.void, [dart.fnType(dart.void, [T])]),
    onError: dart.fnType(dart.void, [core.Function]),
    onDone: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
    pause: dart.fnType(dart.void, [], [async.Future]),
    resume: dart.fnType(dart.void, []),
    [_tryResume]: dart.fnType(dart.void, []),
    [_unlisten]: dart.fnType(dart.void, []),
    asFuture: dart.gFnType(E => [async.Future$(E), [], [E]])
  }));
  dart.setGetterSignature(_EventStreamSubscription, () => ({
    __proto__: dart.getGetters(_EventStreamSubscription.__proto__),
    [_canceled]: core.bool,
    isPaused: core.bool
  }));
  dart.setLibraryUri(_EventStreamSubscription, "dart:html");
  dart.setFieldSignature(_EventStreamSubscription, () => ({
    __proto__: dart.getFields(_EventStreamSubscription.__proto__),
    [_pauseCount$]: dart.fieldType(core.int),
    [_target$0]: dart.fieldType(html$.EventTarget),
    [_eventType]: dart.finalFieldType(core.String),
    [_onData$1]: dart.fieldType(EventTodynamic()),
    [_useCapture]: dart.finalFieldType(core.bool)
  }));
  return _EventStreamSubscription;
});
html$._EventStreamSubscription = html$._EventStreamSubscription$();
dart.addTypeTests(html$._EventStreamSubscription, _is__EventStreamSubscription_default);
const _is_CustomStream_default = Symbol('_is_CustomStream_default');
html$.CustomStream$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  class CustomStream extends core.Object {}
  (CustomStream.new = function() {
  }).prototype = CustomStream.prototype;
  CustomStream.prototype[dart.isStream] = true;
  dart.addTypeTests(CustomStream);
  CustomStream.prototype[_is_CustomStream_default] = true;
  CustomStream[dart.implements] = () => [StreamOfT()];
  dart.setLibraryUri(CustomStream, "dart:html");
  return CustomStream;
});
html$.CustomStream = html$.CustomStream$();
dart.addTypeTests(html$.CustomStream, _is_CustomStream_default);
const _streamController = dart.privateName(html$, "_streamController");
const _type$1 = dart.privateName(html$, "_type");
const _is__CustomEventStreamImpl_default = Symbol('_is__CustomEventStreamImpl_default');
html$._CustomEventStreamImpl$ = dart.generic(T => {
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let CustomStreamOfT = () => (CustomStreamOfT = dart.constFn(html$.CustomStream$(T)))();
  class _CustomEventStreamImpl extends async.Stream$(T) {
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_streamController].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    asBroadcastStream(opts) {
      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
      return this[_streamController].stream;
    }
    get isBroadcast() {
      return true;
    }
    add(event) {
      T._check(event);
      if (event.type == this[_type$1]) this[_streamController].add(event);
    }
  }
  (_CustomEventStreamImpl.new = function(type) {
    this[_streamController] = null;
    this[_type$1] = null;
    _CustomEventStreamImpl.__proto__.new.call(this);
    this[_type$1] = type;
    this[_streamController] = StreamControllerOfT().broadcast({sync: true});
  }).prototype = _CustomEventStreamImpl.prototype;
  dart.addTypeTests(_CustomEventStreamImpl);
  _CustomEventStreamImpl.prototype[_is__CustomEventStreamImpl_default] = true;
  _CustomEventStreamImpl[dart.implements] = () => [CustomStreamOfT()];
  dart.setMethodSignature(_CustomEventStreamImpl, () => ({
    __proto__: dart.getMethods(_CustomEventStreamImpl.__proto__),
    listen: dart.fnType(async.StreamSubscription$(T), [dart.fnType(dart.void, [T])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
    add: dart.fnType(dart.void, [core.Object])
  }));
  dart.setLibraryUri(_CustomEventStreamImpl, "dart:html");
  dart.setFieldSignature(_CustomEventStreamImpl, () => ({
    __proto__: dart.getFields(_CustomEventStreamImpl.__proto__),
    [_streamController]: dart.fieldType(StreamControllerOfT()),
    [_type$1]: dart.fieldType(core.String)
  }));
  return _CustomEventStreamImpl;
});
html$._CustomEventStreamImpl = html$._CustomEventStreamImpl$();
dart.addTypeTests(html$._CustomEventStreamImpl, _is__CustomEventStreamImpl_default);
const _parent$ = dart.privateName(html$, "_parent");
const _shadowAltKey = dart.privateName(html$, "_shadowAltKey");
const _shadowCharCode = dart.privateName(html$, "_shadowCharCode");
const _shadowKeyCode = dart.privateName(html$, "_shadowKeyCode");
const _currentTarget = dart.privateName(html$, "_currentTarget");
const _realAltKey = dart.privateName(html$, "_realAltKey");
const _realCharCode = dart.privateName(html$, "_realCharCode");
const _realKeyCode = dart.privateName(html$, "_realKeyCode");
const _shadowKeyIdentifier = dart.privateName(html$, "_shadowKeyIdentifier");
const _keyIdentifier = dart.privateName(html$, "_keyIdentifier");
html$.KeyEvent = class KeyEvent extends html$._WrappedEvent {
  get keyCode() {
    return this[_shadowKeyCode];
  }
  get charCode() {
    return this.type === "keypress" ? this[_shadowCharCode] : 0;
  }
  get altKey() {
    return this[_shadowAltKey];
  }
  get which() {
    return this.keyCode;
  }
  get [_realKeyCode]() {
    return this[_parent$].keyCode;
  }
  get [_realCharCode]() {
    return this[_parent$].charCode;
  }
  get [_realAltKey]() {
    return this[_parent$].altKey;
  }
  get sourceCapabilities() {
    return this[sourceCapabilities$];
  }
  set sourceCapabilities(value) {
    super.sourceCapabilities = value;
  }
  static _makeRecord() {
    let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html$.KeyboardEvent));
    return _js_helper.makeLeafDispatchRecord(interceptor);
  }
  static new(type, opts) {
    let view = opts && 'view' in opts ? opts.view : null;
    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
    let keyCode = opts && 'keyCode' in opts ? opts.keyCode : 0;
    let charCode = opts && 'charCode' in opts ? opts.charCode : 0;
    let location = opts && 'location' in opts ? opts.location : 1;
    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
    let currentTarget = opts && 'currentTarget' in opts ? opts.currentTarget : null;
    if (view == null) {
      view = html$.window;
    }
    let eventObj = null;
    eventObj = html$.Event.eventType("KeyboardEvent", type, {canBubble: canBubble, cancelable: cancelable});
    Object.defineProperty(eventObj, 'keyCode', {
      get: function() {
        return this.keyCodeVal;
      }
    });
    Object.defineProperty(eventObj, 'which', {
      get: function() {
        return this.keyCodeVal;
      }
    });
    Object.defineProperty(eventObj, 'charCode', {
      get: function() {
        return this.charCodeVal;
      }
    });
    let keyIdentifier = html$.KeyEvent._convertToHexString(charCode, keyCode);
    dart.dsend(eventObj, _initKeyboardEvent, [type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey]);
    eventObj.keyCodeVal = keyCode;
    eventObj.charCodeVal = charCode;
    _interceptors.setDispatchProperty(eventObj, html$.KeyEvent._keyboardEventDispatchRecord);
    let keyEvent = new html$.KeyEvent.wrap(html$.KeyboardEvent._check(eventObj));
    if (keyEvent[_currentTarget] == null) {
      keyEvent[_currentTarget] = currentTarget == null ? html$.window : currentTarget;
    }
    return keyEvent;
  }
  static get canUseDispatchEvent() {
    return typeof document.body.dispatchEvent == "function" && document.body.dispatchEvent.length > 0;
  }
  get currentTarget() {
    return this[_currentTarget];
  }
  static _convertToHexString(charCode, keyCode) {
    if (charCode !== -1) {
      let hex = charCode[$toRadixString](16);
      let sb = new core.StringBuffer.new("U+");
      for (let i = 0; i < 4 - hex.length; i++)
        sb.write("0");
      sb.write(hex);
      return sb.toString();
    } else {
      return html$.KeyCode._convertKeyCodeToKeyName(keyCode);
    }
  }
  get code() {
    return this[_parent$].code;
  }
  get ctrlKey() {
    return this[_parent$].ctrlKey;
  }
  get detail() {
    return this[_parent$].detail;
  }
  get isComposing() {
    return this[_parent$].isComposing;
  }
  get key() {
    return this[_parent$].key;
  }
  get location() {
    return this[_parent$].location;
  }
  get metaKey() {
    return this[_parent$].metaKey;
  }
  get shiftKey() {
    return this[_parent$].shiftKey;
  }
  get view() {
    return html$.Window._check(this[_parent$][$view]);
  }
  [_initUIEvent](type, canBubble, cancelable, view, detail) {
    dart.throw(new core.UnsupportedError.new("Cannot initialize a UI Event from a KeyEvent."));
  }
  get [_shadowKeyIdentifier]() {
    return this[_parent$].keyIdentifier;
  }
  get [_charCode]() {
    return this.charCode;
  }
  get [_keyCode]() {
    return this.keyCode;
  }
  get [_which]() {
    return this.which;
  }
  get [_keyIdentifier]() {
    dart.throw(new core.UnsupportedError.new("keyIdentifier is unsupported."));
  }
  [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey) {
    dart.throw(new core.UnsupportedError.new("Cannot initialize a KeyboardEvent from a KeyEvent."));
  }
  getModifierState(keyArgument) {
    return dart.throw(new core.UnimplementedError.new());
  }
  get repeat() {
    return dart.throw(new core.UnimplementedError.new());
  }
  get isComposed() {
    return dart.throw(new core.UnimplementedError.new());
  }
  get [_get_view]() {
    return dart.throw(new core.UnimplementedError.new());
  }
};
(html$.KeyEvent.wrap = function(parent) {
  this[_parent$] = null;
  this[_shadowAltKey] = null;
  this[_shadowCharCode] = null;
  this[_shadowKeyCode] = null;
  this[_currentTarget] = null;
  this[sourceCapabilities$] = null;
  html$.KeyEvent.__proto__.new.call(this, parent);
  this[_parent$] = parent;
  this[_shadowAltKey] = this[_realAltKey];
  this[_shadowCharCode] = this[_realCharCode];
  this[_shadowKeyCode] = this[_realKeyCode];
  this[_currentTarget] = this[_parent$][$currentTarget];
}).prototype = html$.KeyEvent.prototype;
dart.addTypeTests(html$.KeyEvent);
const sourceCapabilities$ = Symbol("KeyEvent.sourceCapabilities");
html$.KeyEvent[dart.implements] = () => [html$.KeyboardEvent];
dart.setMethodSignature(html$.KeyEvent, () => ({
  __proto__: dart.getMethods(html$.KeyEvent.__proto__),
  [_initUIEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int]),
  [_initKeyboardEvent]: dart.fnType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
  getModifierState: dart.fnType(core.bool, [core.String]),
  [$getModifierState]: dart.fnType(core.bool, [core.String])
}));
dart.setGetterSignature(html$.KeyEvent, () => ({
  __proto__: dart.getGetters(html$.KeyEvent.__proto__),
  keyCode: core.int,
  [$keyCode]: core.int,
  charCode: core.int,
  [$charCode]: core.int,
  altKey: core.bool,
  [$altKey]: core.bool,
  which: core.int,
  [$which]: core.int,
  [_realKeyCode]: core.int,
  [_realCharCode]: core.int,
  [_realAltKey]: core.bool,
  code: core.String,
  [$code]: core.String,
  ctrlKey: core.bool,
  [$ctrlKey]: core.bool,
  detail: core.int,
  [$detail]: core.int,
  isComposing: core.bool,
  [$isComposing]: core.bool,
  key: core.String,
  [$key]: core.String,
  location: core.int,
  [$location]: core.int,
  metaKey: core.bool,
  [$metaKey]: core.bool,
  shiftKey: core.bool,
  [$shiftKey]: core.bool,
  view: html$.Window,
  [$view]: html$.Window,
  [_shadowKeyIdentifier]: core.String,
  [_charCode]: core.int,
  [_keyCode]: core.int,
  [_which]: core.int,
  [_keyIdentifier]: core.String,
  repeat: core.bool,
  [$repeat]: core.bool,
  isComposed: core.bool,
  [_get_view]: dart.dynamic
}));
dart.setLibraryUri(html$.KeyEvent, "dart:html");
dart.setFieldSignature(html$.KeyEvent, () => ({
  __proto__: dart.getFields(html$.KeyEvent.__proto__),
  [_parent$]: dart.fieldType(html$.KeyboardEvent),
  [_shadowAltKey]: dart.fieldType(core.bool),
  [_shadowCharCode]: dart.fieldType(core.int),
  [_shadowKeyCode]: dart.fieldType(core.int),
  [_currentTarget]: dart.fieldType(html$.EventTarget),
  sourceCapabilities: dart.finalFieldType(html$.InputDeviceCapabilities)
}));
dart.defineExtensionMethods(html$.KeyEvent, ['getModifierState']);
dart.defineExtensionAccessors(html$.KeyEvent, [
  'keyCode',
  'charCode',
  'altKey',
  'which',
  'currentTarget',
  'code',
  'ctrlKey',
  'detail',
  'isComposing',
  'key',
  'location',
  'metaKey',
  'shiftKey',
  'view',
  'repeat',
  'sourceCapabilities'
]);
dart.defineLazy(html$.KeyEvent, {
  /*html$.KeyEvent._keyboardEventDispatchRecord*/get _keyboardEventDispatchRecord() {
    return html$.KeyEvent._makeRecord();
  },
  /*html$.KeyEvent.keyDownEvent*/get keyDownEvent() {
    return new html$._KeyboardEventHandler.new("keydown");
  },
  set keyDownEvent(_) {},
  /*html$.KeyEvent.keyUpEvent*/get keyUpEvent() {
    return new html$._KeyboardEventHandler.new("keyup");
  },
  set keyUpEvent(_) {},
  /*html$.KeyEvent.keyPressEvent*/get keyPressEvent() {
    return new html$._KeyboardEventHandler.new("keypress");
  },
  set keyPressEvent(_) {}
});
html$._CustomKeyEventStreamImpl = class _CustomKeyEventStreamImpl extends html$._CustomEventStreamImpl$(html$.KeyEvent) {
  add(event) {
    html$.KeyEvent._check(event);
    if (event.type == this[_type$1]) {
      event.currentTarget.dispatchEvent(event[_parent$]);
      this[_streamController].add(event);
    }
  }
};
(html$._CustomKeyEventStreamImpl.new = function(type) {
  html$._CustomKeyEventStreamImpl.__proto__.new.call(this, type);
}).prototype = html$._CustomKeyEventStreamImpl.prototype;
dart.addTypeTests(html$._CustomKeyEventStreamImpl);
html$._CustomKeyEventStreamImpl[dart.implements] = () => [CustomStreamOfKeyEvent()];
dart.setMethodSignature(html$._CustomKeyEventStreamImpl, () => ({
  __proto__: dart.getMethods(html$._CustomKeyEventStreamImpl.__proto__),
  add: dart.fnType(dart.void, [core.Object])
}));
dart.setLibraryUri(html$._CustomKeyEventStreamImpl, "dart:html");
const _controller$0 = dart.privateName(html$, "_controller");
const _subscriptions = dart.privateName(html$, "_subscriptions");
const _is__StreamPool_default = Symbol('_is__StreamPool_default');
html$._StreamPool$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
  let LinkedMapOfStreamOfT$StreamSubscriptionOfT = () => (LinkedMapOfStreamOfT$StreamSubscriptionOfT = dart.constFn(_js_helper.LinkedMap$(StreamOfT(), StreamSubscriptionOfT())))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let MapOfStreamOfT$StreamSubscriptionOfT = () => (MapOfStreamOfT$StreamSubscriptionOfT = dart.constFn(core.Map$(StreamOfT(), StreamSubscriptionOfT())))();
  class _StreamPool extends core.Object {
    get stream() {
      return this[_controller$0].stream;
    }
    add(stream) {
      StreamOfT()._check(stream);
      if (dart.test(this[_subscriptions][$containsKey](stream))) return;
      this[_subscriptions][$_set](stream, stream.listen(dart.bind(this[_controller$0], 'add'), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.fn(() => this.remove(stream), VoidTovoid())}));
    }
    remove(stream) {
      StreamOfT()._check(stream);
      let subscription = this[_subscriptions][$remove](stream);
      if (subscription != null) subscription.cancel();
    }
    close() {
      for (let subscription of this[_subscriptions][$values]) {
        subscription.cancel();
      }
      this[_subscriptions][$clear]();
      this[_controller$0].close();
    }
  }
  (_StreamPool.broadcast = function() {
    this[_controller$0] = null;
    this[_subscriptions] = new (LinkedMapOfStreamOfT$StreamSubscriptionOfT()).new();
    this[_controller$0] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
  }).prototype = _StreamPool.prototype;
  dart.addTypeTests(_StreamPool);
  _StreamPool.prototype[_is__StreamPool_default] = true;
  dart.setMethodSignature(_StreamPool, () => ({
    __proto__: dart.getMethods(_StreamPool.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    remove: dart.fnType(dart.void, [core.Object]),
    close: dart.fnType(dart.void, [])
  }));
  dart.setGetterSignature(_StreamPool, () => ({
    __proto__: dart.getGetters(_StreamPool.__proto__),
    stream: async.Stream$(T)
  }));
  dart.setLibraryUri(_StreamPool, "dart:html");
  dart.setFieldSignature(_StreamPool, () => ({
    __proto__: dart.getFields(_StreamPool.__proto__),
    [_controller$0]: dart.fieldType(StreamControllerOfT()),
    [_subscriptions]: dart.fieldType(MapOfStreamOfT$StreamSubscriptionOfT())
  }));
  return _StreamPool;
});
html$._StreamPool = html$._StreamPool$();
dart.addTypeTests(html$._StreamPool, _is__StreamPool_default);
const _eventTypeGetter = dart.privateName(html$, "_eventTypeGetter");
const _is__CustomEventStreamProvider_default = Symbol('_is__CustomEventStreamProvider_default');
html$._CustomEventStreamProvider$ = dart.generic(T => {
  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
  let EventStreamProviderOfT = () => (EventStreamProviderOfT = dart.constFn(html$.EventStreamProvider$(T)))();
  class _CustomEventStreamProvider extends core.Object {
    forTarget(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_EventStreamOfT()).new(e, core.String._check(dart.dcall(this[_eventTypeGetter], [e])), useCapture);
    }
    forElement(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementEventStreamImplOfT()).new(e, dart.dcall(this[_eventTypeGetter], [e]), useCapture);
    }
    [_forElementList](e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementListEventStreamImplOfT()).new(e, core.String._check(dart.dcall(this[_eventTypeGetter], [e])), useCapture);
    }
    getEventType(target) {
      return core.String._check(dart.dcall(this[_eventTypeGetter], [target]));
    }
    get [_eventType]() {
      return dart.throw(new core.UnsupportedError.new("Access type through getEventType method."));
    }
  }
  (_CustomEventStreamProvider.new = function(eventTypeGetter) {
    this[_eventTypeGetter] = eventTypeGetter;
  }).prototype = _CustomEventStreamProvider.prototype;
  dart.addTypeTests(_CustomEventStreamProvider);
  _CustomEventStreamProvider.prototype[_is__CustomEventStreamProvider_default] = true;
  _CustomEventStreamProvider[dart.implements] = () => [EventStreamProviderOfT()];
  dart.setMethodSignature(_CustomEventStreamProvider, () => ({
    __proto__: dart.getMethods(_CustomEventStreamProvider.__proto__),
    forTarget: dart.fnType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
    forElement: dart.fnType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
    [_forElementList]: dart.fnType(html$.ElementStream$(T), [html$.ElementList$(html$.Element)], {useCapture: core.bool}),
    getEventType: dart.fnType(core.String, [html$.EventTarget])
  }));
  dart.setGetterSignature(_CustomEventStreamProvider, () => ({
    __proto__: dart.getGetters(_CustomEventStreamProvider.__proto__),
    [_eventType]: core.String
  }));
  dart.setLibraryUri(_CustomEventStreamProvider, "dart:html");
  dart.setFieldSignature(_CustomEventStreamProvider, () => ({
    __proto__: dart.getFields(_CustomEventStreamProvider.__proto__),
    [_eventTypeGetter]: dart.finalFieldType(dart.dynamic)
  }));
  return _CustomEventStreamProvider;
});
html$._CustomEventStreamProvider = html$._CustomEventStreamProvider$();
dart.addTypeTests(html$._CustomEventStreamProvider, _is__CustomEventStreamProvider_default);
html$._Html5NodeValidator = class _Html5NodeValidator extends core.Object {
  allowsElement(element) {
    return html$._Html5NodeValidator._allowedElements.contains(html$.Element._safeTagName(element));
  }
  allowsAttribute(element, attributeName, value) {
    let tagName = html$.Element._safeTagName(element);
    let validator = html$._Html5NodeValidator._attributeValidators[$_get](dart.str(tagName) + "::" + dart.str(attributeName));
    if (validator == null) {
      validator = html$._Html5NodeValidator._attributeValidators[$_get]("*::" + dart.str(attributeName));
    }
    if (validator == null) {
      return false;
    }
    return core.bool._check(dart.dcall(validator, [element, attributeName, value, this]));
  }
  static _standardAttributeValidator(element, attributeName, value, context) {
    return true;
  }
  static _uriAttributeValidator(element, attributeName, value, context) {
    return context.uriPolicy.allowsUri(value);
  }
};
(html$._Html5NodeValidator.new = function(opts) {
  let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
  this.uriPolicy = uriPolicy != null ? uriPolicy : html$.UriPolicy.new();
  if (dart.test(html$._Html5NodeValidator._attributeValidators[$isEmpty])) {
    for (let attr of html$._Html5NodeValidator._standardAttributes) {
      html$._Html5NodeValidator._attributeValidators[$_set](attr, dart.fn(html$._Html5NodeValidator._standardAttributeValidator, ElementAndStringAndString__Tobool()));
    }
    for (let attr of html$._Html5NodeValidator._uriAttributes) {
      html$._Html5NodeValidator._attributeValidators[$_set](attr, dart.fn(html$._Html5NodeValidator._uriAttributeValidator, ElementAndStringAndString__Tobool()));
    }
  }
}).prototype = html$._Html5NodeValidator.prototype;
dart.addTypeTests(html$._Html5NodeValidator);
html$._Html5NodeValidator[dart.implements] = () => [html$.NodeValidator];
dart.setMethodSignature(html$._Html5NodeValidator, () => ({
  __proto__: dart.getMethods(html$._Html5NodeValidator.__proto__),
  allowsElement: dart.fnType(core.bool, [html$.Element]),
  allowsAttribute: dart.fnType(core.bool, [html$.Element, core.String, core.String])
}));
dart.setLibraryUri(html$._Html5NodeValidator, "dart:html");
dart.setFieldSignature(html$._Html5NodeValidator, () => ({
  __proto__: dart.getFields(html$._Html5NodeValidator.__proto__),
  uriPolicy: dart.finalFieldType(html$.UriPolicy)
}));
dart.defineLazy(html$._Html5NodeValidator, {
  /*html$._Html5NodeValidator._allowedElements*/get _allowedElements() {
    return SetOfString().from(["A", "ABBR", "ACRONYM", "ADDRESS", "AREA", "ARTICLE", "ASIDE", "AUDIO", "B", "BDI", "BDO", "BIG", "BLOCKQUOTE", "BR", "BUTTON", "CANVAS", "CAPTION", "CENTER", "CITE", "CODE", "COL", "COLGROUP", "COMMAND", "DATA", "DATALIST", "DD", "DEL", "DETAILS", "DFN", "DIR", "DIV", "DL", "DT", "EM", "FIELDSET", "FIGCAPTION", "FIGURE", "FONT", "FOOTER", "FORM", "H1", "H2", "H3", "H4", "H5", "H6", "HEADER", "HGROUP", "HR", "I", "IFRAME", "IMG", "INPUT", "INS", "KBD", "LABEL", "LEGEND", "LI", "MAP", "MARK", "MENU", "METER", "NAV", "NOBR", "OL", "OPTGROUP", "OPTION", "OUTPUT", "P", "PRE", "PROGRESS", "Q", "S", "SAMP", "SECTION", "SELECT", "SMALL", "SOURCE", "SPAN", "STRIKE", "STRONG", "SUB", "SUMMARY", "SUP", "TABLE", "TBODY", "TD", "TEXTAREA", "TFOOT", "TH", "THEAD", "TIME", "TR", "TRACK", "TT", "U", "UL", "VAR", "VIDEO", "WBR"]);
  },
  /*html$._Html5NodeValidator._standardAttributes*/get _standardAttributes() {
    return dart.constList(["*::class", "*::dir", "*::draggable", "*::hidden", "*::id", "*::inert", "*::itemprop", "*::itemref", "*::itemscope", "*::lang", "*::spellcheck", "*::title", "*::translate", "A::accesskey", "A::coords", "A::hreflang", "A::name", "A::shape", "A::tabindex", "A::target", "A::type", "AREA::accesskey", "AREA::alt", "AREA::coords", "AREA::nohref", "AREA::shape", "AREA::tabindex", "AREA::target", "AUDIO::controls", "AUDIO::loop", "AUDIO::mediagroup", "AUDIO::muted", "AUDIO::preload", "BDO::dir", "BODY::alink", "BODY::bgcolor", "BODY::link", "BODY::text", "BODY::vlink", "BR::clear", "BUTTON::accesskey", "BUTTON::disabled", "BUTTON::name", "BUTTON::tabindex", "BUTTON::type", "BUTTON::value", "CANVAS::height", "CANVAS::width", "CAPTION::align", "COL::align", "COL::char", "COL::charoff", "COL::span", "COL::valign", "COL::width", "COLGROUP::align", "COLGROUP::char", "COLGROUP::charoff", "COLGROUP::span", "COLGROUP::valign", "COLGROUP::width", "COMMAND::checked", "COMMAND::command", "COMMAND::disabled", "COMMAND::label", "COMMAND::radiogroup", "COMMAND::type", "DATA::value", "DEL::datetime", "DETAILS::open", "DIR::compact", "DIV::align", "DL::compact", "FIELDSET::disabled", "FONT::color", "FONT::face", "FONT::size", "FORM::accept", "FORM::autocomplete", "FORM::enctype", "FORM::method", "FORM::name", "FORM::novalidate", "FORM::target", "FRAME::name", "H1::align", "H2::align", "H3::align", "H4::align", "H5::align", "H6::align", "HR::align", "HR::noshade", "HR::size", "HR::width", "HTML::version", "IFRAME::align", "IFRAME::frameborder", "IFRAME::height", "IFRAME::marginheight", "IFRAME::marginwidth", "IFRAME::width", "IMG::align", "IMG::alt", "IMG::border", "IMG::height", "IMG::hspace", "IMG::ismap", "IMG::name", "IMG::usemap", "IMG::vspace", "IMG::width", "INPUT::accept", "INPUT::accesskey", "INPUT::align", "INPUT::alt", "INPUT::autocomplete", "INPUT::autofocus", "INPUT::checked", "INPUT::disabled", "INPUT::inputmode", "INPUT::ismap", "INPUT::list", "INPUT::max", "INPUT::maxlength", "INPUT::min", "INPUT::multiple", "INPUT::name", "INPUT::placeholder", "INPUT::readonly", "INPUT::required", "INPUT::size", "INPUT::step", "INPUT::tabindex", "INPUT::type", "INPUT::usemap", "INPUT::value", "INS::datetime", "KEYGEN::disabled", "KEYGEN::keytype", "KEYGEN::name", "LABEL::accesskey", "LABEL::for", "LEGEND::accesskey", "LEGEND::align", "LI::type", "LI::value", "LINK::sizes", "MAP::name", "MENU::compact", "MENU::label", "MENU::type", "METER::high", "METER::low", "METER::max", "METER::min", "METER::value", "OBJECT::typemustmatch", "OL::compact", "OL::reversed", "OL::start", "OL::type", "OPTGROUP::disabled", "OPTGROUP::label", "OPTION::disabled", "OPTION::label", "OPTION::selected", "OPTION::value", "OUTPUT::for", "OUTPUT::name", "P::align", "PRE::width", "PROGRESS::max", "PROGRESS::min", "PROGRESS::value", "SELECT::autocomplete", "SELECT::disabled", "SELECT::multiple", "SELECT::name", "SELECT::required", "SELECT::size", "SELECT::tabindex", "SOURCE::type", "TABLE::align", "TABLE::bgcolor", "TABLE::border", "TABLE::cellpadding", "TABLE::cellspacing", "TABLE::frame", "TABLE::rules", "TABLE::summary", "TABLE::width", "TBODY::align", "TBODY::char", "TBODY::charoff", "TBODY::valign", "TD::abbr", "TD::align", "TD::axis", "TD::bgcolor", "TD::char", "TD::charoff", "TD::colspan", "TD::headers", "TD::height", "TD::nowrap", "TD::rowspan", "TD::scope", "TD::valign", "TD::width", "TEXTAREA::accesskey", "TEXTAREA::autocomplete", "TEXTAREA::cols", "TEXTAREA::disabled", "TEXTAREA::inputmode", "TEXTAREA::name", "TEXTAREA::placeholder", "TEXTAREA::readonly", "TEXTAREA::required", "TEXTAREA::rows", "TEXTAREA::tabindex", "TEXTAREA::wrap", "TFOOT::align", "TFOOT::char", "TFOOT::charoff", "TFOOT::valign", "TH::abbr", "TH::align", "TH::axis", "TH::bgcolor", "TH::char", "TH::charoff", "TH::colspan", "TH::headers", "TH::height", "TH::nowrap", "TH::rowspan", "TH::scope", "TH::valign", "TH::width", "THEAD::align", "THEAD::char", "THEAD::charoff", "THEAD::valign", "TR::align", "TR::bgcolor", "TR::char", "TR::charoff", "TR::valign", "TRACK::default", "TRACK::kind", "TRACK::label", "TRACK::srclang", "UL::compact", "UL::type", "VIDEO::controls", "VIDEO::height", "VIDEO::loop", "VIDEO::mediagroup", "VIDEO::muted", "VIDEO::preload", "VIDEO::width"], core.String);
  },
  /*html$._Html5NodeValidator._uriAttributes*/get _uriAttributes() {
    return dart.constList(["A::href", "AREA::href", "BLOCKQUOTE::cite", "BODY::background", "COMMAND::icon", "DEL::cite", "FORM::action", "IMG::src", "INPUT::src", "INS::cite", "Q::cite", "VIDEO::poster"], core.String);
  },
  /*html$._Html5NodeValidator._attributeValidators*/get _attributeValidators() {
    return new (IdentityMapOfString$Function()).new();
  }
});
html$.KeyCode = class KeyCode extends core.Object {
  static isCharacterKey(keyCode) {
    if (dart.notNull(keyCode) >= 48 && dart.notNull(keyCode) <= 57 || dart.notNull(keyCode) >= 96 && dart.notNull(keyCode) <= 106 || dart.notNull(keyCode) >= 65 && dart.notNull(keyCode) <= 90) {
      return true;
    }
    if (dart.test(html_common.Device.isWebKit) && keyCode === 0) {
      return true;
    }
    return keyCode === 32 || keyCode === 63 || keyCode === 107 || keyCode === 109 || keyCode === 110 || keyCode === 111 || keyCode === 186 || keyCode === 59 || keyCode === 189 || keyCode === 187 || keyCode === 61 || keyCode === 188 || keyCode === 190 || keyCode === 191 || keyCode === 192 || keyCode === 222 || keyCode === 219 || keyCode === 220 || keyCode === 221;
  }
  static _convertKeyCodeToKeyName(keyCode) {
    switch (keyCode) {
      case html$.KeyCode.ALT:
      {
        return html$._KeyName.ALT;
      }
      case html$.KeyCode.BACKSPACE:
      {
        return html$._KeyName.BACKSPACE;
      }
      case html$.KeyCode.CAPS_LOCK:
      {
        return html$._KeyName.CAPS_LOCK;
      }
      case html$.KeyCode.CTRL:
      {
        return html$._KeyName.CONTROL;
      }
      case html$.KeyCode.DELETE:
      {
        return html$._KeyName.DEL;
      }
      case html$.KeyCode.DOWN:
      {
        return html$._KeyName.DOWN;
      }
      case html$.KeyCode.END:
      {
        return html$._KeyName.END;
      }
      case html$.KeyCode.ENTER:
      {
        return html$._KeyName.ENTER;
      }
      case html$.KeyCode.ESC:
      {
        return html$._KeyName.ESC;
      }
      case html$.KeyCode.F1:
      {
        return html$._KeyName.F1;
      }
      case html$.KeyCode.F2:
      {
        return html$._KeyName.F2;
      }
      case html$.KeyCode.F3:
      {
        return html$._KeyName.F3;
      }
      case html$.KeyCode.F4:
      {
        return html$._KeyName.F4;
      }
      case html$.KeyCode.F5:
      {
        return html$._KeyName.F5;
      }
      case html$.KeyCode.F6:
      {
        return html$._KeyName.F6;
      }
      case html$.KeyCode.F7:
      {
        return html$._KeyName.F7;
      }
      case html$.KeyCode.F8:
      {
        return html$._KeyName.F8;
      }
      case html$.KeyCode.F9:
      {
        return html$._KeyName.F9;
      }
      case html$.KeyCode.F10:
      {
        return html$._KeyName.F10;
      }
      case html$.KeyCode.F11:
      {
        return html$._KeyName.F11;
      }
      case html$.KeyCode.F12:
      {
        return html$._KeyName.F12;
      }
      case html$.KeyCode.HOME:
      {
        return html$._KeyName.HOME;
      }
      case html$.KeyCode.INSERT:
      {
        return html$._KeyName.INSERT;
      }
      case html$.KeyCode.LEFT:
      {
        return html$._KeyName.LEFT;
      }
      case html$.KeyCode.META:
      {
        return html$._KeyName.META;
      }
      case html$.KeyCode.NUMLOCK:
      {
        return html$._KeyName.NUM_LOCK;
      }
      case html$.KeyCode.PAGE_DOWN:
      {
        return html$._KeyName.PAGE_DOWN;
      }
      case html$.KeyCode.PAGE_UP:
      {
        return html$._KeyName.PAGE_UP;
      }
      case html$.KeyCode.PAUSE:
      {
        return html$._KeyName.PAUSE;
      }
      case html$.KeyCode.PRINT_SCREEN:
      {
        return html$._KeyName.PRINT_SCREEN;
      }
      case html$.KeyCode.RIGHT:
      {
        return html$._KeyName.RIGHT;
      }
      case html$.KeyCode.SCROLL_LOCK:
      {
        return html$._KeyName.SCROLL;
      }
      case html$.KeyCode.SHIFT:
      {
        return html$._KeyName.SHIFT;
      }
      case html$.KeyCode.SPACE:
      {
        return html$._KeyName.SPACEBAR;
      }
      case html$.KeyCode.TAB:
      {
        return html$._KeyName.TAB;
      }
      case html$.KeyCode.UP:
      {
        return html$._KeyName.UP;
      }
      case html$.KeyCode.WIN_IME:
      case html$.KeyCode.WIN_KEY:
      case html$.KeyCode.WIN_KEY_LEFT:
      case html$.KeyCode.WIN_KEY_RIGHT:
      {
        return html$._KeyName.WIN;
      }
      default:
      {
        return html$._KeyName.UNIDENTIFIED;
      }
    }
    return html$._KeyName.UNIDENTIFIED;
  }
};
(html$.KeyCode.new = function() {
}).prototype = html$.KeyCode.prototype;
dart.addTypeTests(html$.KeyCode);
dart.setLibraryUri(html$.KeyCode, "dart:html");
dart.defineLazy(html$.KeyCode, {
  /*html$.KeyCode.WIN_KEY_FF_LINUX*/get WIN_KEY_FF_LINUX() {
    return 0;
  },
  /*html$.KeyCode.MAC_ENTER*/get MAC_ENTER() {
    return 3;
  },
  /*html$.KeyCode.BACKSPACE*/get BACKSPACE() {
    return 8;
  },
  /*html$.KeyCode.TAB*/get TAB() {
    return 9;
  },
  /*html$.KeyCode.NUM_CENTER*/get NUM_CENTER() {
    return 12;
  },
  /*html$.KeyCode.ENTER*/get ENTER() {
    return 13;
  },
  /*html$.KeyCode.SHIFT*/get SHIFT() {
    return 16;
  },
  /*html$.KeyCode.CTRL*/get CTRL() {
    return 17;
  },
  /*html$.KeyCode.ALT*/get ALT() {
    return 18;
  },
  /*html$.KeyCode.PAUSE*/get PAUSE() {
    return 19;
  },
  /*html$.KeyCode.CAPS_LOCK*/get CAPS_LOCK() {
    return 20;
  },
  /*html$.KeyCode.ESC*/get ESC() {
    return 27;
  },
  /*html$.KeyCode.SPACE*/get SPACE() {
    return 32;
  },
  /*html$.KeyCode.PAGE_UP*/get PAGE_UP() {
    return 33;
  },
  /*html$.KeyCode.PAGE_DOWN*/get PAGE_DOWN() {
    return 34;
  },
  /*html$.KeyCode.END*/get END() {
    return 35;
  },
  /*html$.KeyCode.HOME*/get HOME() {
    return 36;
  },
  /*html$.KeyCode.LEFT*/get LEFT() {
    return 37;
  },
  /*html$.KeyCode.UP*/get UP() {
    return 38;
  },
  /*html$.KeyCode.RIGHT*/get RIGHT() {
    return 39;
  },
  /*html$.KeyCode.DOWN*/get DOWN() {
    return 40;
  },
  /*html$.KeyCode.NUM_NORTH_EAST*/get NUM_NORTH_EAST() {
    return 33;
  },
  /*html$.KeyCode.NUM_SOUTH_EAST*/get NUM_SOUTH_EAST() {
    return 34;
  },
  /*html$.KeyCode.NUM_SOUTH_WEST*/get NUM_SOUTH_WEST() {
    return 35;
  },
  /*html$.KeyCode.NUM_NORTH_WEST*/get NUM_NORTH_WEST() {
    return 36;
  },
  /*html$.KeyCode.NUM_WEST*/get NUM_WEST() {
    return 37;
  },
  /*html$.KeyCode.NUM_NORTH*/get NUM_NORTH() {
    return 38;
  },
  /*html$.KeyCode.NUM_EAST*/get NUM_EAST() {
    return 39;
  },
  /*html$.KeyCode.NUM_SOUTH*/get NUM_SOUTH() {
    return 40;
  },
  /*html$.KeyCode.PRINT_SCREEN*/get PRINT_SCREEN() {
    return 44;
  },
  /*html$.KeyCode.INSERT*/get INSERT() {
    return 45;
  },
  /*html$.KeyCode.NUM_INSERT*/get NUM_INSERT() {
    return 45;
  },
  /*html$.KeyCode.DELETE*/get DELETE() {
    return 46;
  },
  /*html$.KeyCode.NUM_DELETE*/get NUM_DELETE() {
    return 46;
  },
  /*html$.KeyCode.ZERO*/get ZERO() {
    return 48;
  },
  /*html$.KeyCode.ONE*/get ONE() {
    return 49;
  },
  /*html$.KeyCode.TWO*/get TWO() {
    return 50;
  },
  /*html$.KeyCode.THREE*/get THREE() {
    return 51;
  },
  /*html$.KeyCode.FOUR*/get FOUR() {
    return 52;
  },
  /*html$.KeyCode.FIVE*/get FIVE() {
    return 53;
  },
  /*html$.KeyCode.SIX*/get SIX() {
    return 54;
  },
  /*html$.KeyCode.SEVEN*/get SEVEN() {
    return 55;
  },
  /*html$.KeyCode.EIGHT*/get EIGHT() {
    return 56;
  },
  /*html$.KeyCode.NINE*/get NINE() {
    return 57;
  },
  /*html$.KeyCode.FF_SEMICOLON*/get FF_SEMICOLON() {
    return 59;
  },
  /*html$.KeyCode.FF_EQUALS*/get FF_EQUALS() {
    return 61;
  },
  /*html$.KeyCode.QUESTION_MARK*/get QUESTION_MARK() {
    return 63;
  },
  /*html$.KeyCode.A*/get A() {
    return 65;
  },
  /*html$.KeyCode.B*/get B() {
    return 66;
  },
  /*html$.KeyCode.C*/get C() {
    return 67;
  },
  /*html$.KeyCode.D*/get D() {
    return 68;
  },
  /*html$.KeyCode.E*/get E() {
    return 69;
  },
  /*html$.KeyCode.F*/get F() {
    return 70;
  },
  /*html$.KeyCode.G*/get G() {
    return 71;
  },
  /*html$.KeyCode.H*/get H() {
    return 72;
  },
  /*html$.KeyCode.I*/get I() {
    return 73;
  },
  /*html$.KeyCode.J*/get J() {
    return 74;
  },
  /*html$.KeyCode.K*/get K() {
    return 75;
  },
  /*html$.KeyCode.L*/get L() {
    return 76;
  },
  /*html$.KeyCode.M*/get M() {
    return 77;
  },
  /*html$.KeyCode.N*/get N() {
    return 78;
  },
  /*html$.KeyCode.O*/get O() {
    return 79;
  },
  /*html$.KeyCode.P*/get P() {
    return 80;
  },
  /*html$.KeyCode.Q*/get Q() {
    return 81;
  },
  /*html$.KeyCode.R*/get R() {
    return 82;
  },
  /*html$.KeyCode.S*/get S() {
    return 83;
  },
  /*html$.KeyCode.T*/get T() {
    return 84;
  },
  /*html$.KeyCode.U*/get U() {
    return 85;
  },
  /*html$.KeyCode.V*/get V() {
    return 86;
  },
  /*html$.KeyCode.W*/get W() {
    return 87;
  },
  /*html$.KeyCode.X*/get X() {
    return 88;
  },
  /*html$.KeyCode.Y*/get Y() {
    return 89;
  },
  /*html$.KeyCode.Z*/get Z() {
    return 90;
  },
  /*html$.KeyCode.META*/get META() {
    return 91;
  },
  /*html$.KeyCode.WIN_KEY_LEFT*/get WIN_KEY_LEFT() {
    return 91;
  },
  /*html$.KeyCode.WIN_KEY_RIGHT*/get WIN_KEY_RIGHT() {
    return 92;
  },
  /*html$.KeyCode.CONTEXT_MENU*/get CONTEXT_MENU() {
    return 93;
  },
  /*html$.KeyCode.NUM_ZERO*/get NUM_ZERO() {
    return 96;
  },
  /*html$.KeyCode.NUM_ONE*/get NUM_ONE() {
    return 97;
  },
  /*html$.KeyCode.NUM_TWO*/get NUM_TWO() {
    return 98;
  },
  /*html$.KeyCode.NUM_THREE*/get NUM_THREE() {
    return 99;
  },
  /*html$.KeyCode.NUM_FOUR*/get NUM_FOUR() {
    return 100;
  },
  /*html$.KeyCode.NUM_FIVE*/get NUM_FIVE() {
    return 101;
  },
  /*html$.KeyCode.NUM_SIX*/get NUM_SIX() {
    return 102;
  },
  /*html$.KeyCode.NUM_SEVEN*/get NUM_SEVEN() {
    return 103;
  },
  /*html$.KeyCode.NUM_EIGHT*/get NUM_EIGHT() {
    return 104;
  },
  /*html$.KeyCode.NUM_NINE*/get NUM_NINE() {
    return 105;
  },
  /*html$.KeyCode.NUM_MULTIPLY*/get NUM_MULTIPLY() {
    return 106;
  },
  /*html$.KeyCode.NUM_PLUS*/get NUM_PLUS() {
    return 107;
  },
  /*html$.KeyCode.NUM_MINUS*/get NUM_MINUS() {
    return 109;
  },
  /*html$.KeyCode.NUM_PERIOD*/get NUM_PERIOD() {
    return 110;
  },
  /*html$.KeyCode.NUM_DIVISION*/get NUM_DIVISION() {
    return 111;
  },
  /*html$.KeyCode.F1*/get F1() {
    return 112;
  },
  /*html$.KeyCode.F2*/get F2() {
    return 113;
  },
  /*html$.KeyCode.F3*/get F3() {
    return 114;
  },
  /*html$.KeyCode.F4*/get F4() {
    return 115;
  },
  /*html$.KeyCode.F5*/get F5() {
    return 116;
  },
  /*html$.KeyCode.F6*/get F6() {
    return 117;
  },
  /*html$.KeyCode.F7*/get F7() {
    return 118;
  },
  /*html$.KeyCode.F8*/get F8() {
    return 119;
  },
  /*html$.KeyCode.F9*/get F9() {
    return 120;
  },
  /*html$.KeyCode.F10*/get F10() {
    return 121;
  },
  /*html$.KeyCode.F11*/get F11() {
    return 122;
  },
  /*html$.KeyCode.F12*/get F12() {
    return 123;
  },
  /*html$.KeyCode.NUMLOCK*/get NUMLOCK() {
    return 144;
  },
  /*html$.KeyCode.SCROLL_LOCK*/get SCROLL_LOCK() {
    return 145;
  },
  /*html$.KeyCode.FIRST_MEDIA_KEY*/get FIRST_MEDIA_KEY() {
    return 166;
  },
  /*html$.KeyCode.LAST_MEDIA_KEY*/get LAST_MEDIA_KEY() {
    return 183;
  },
  /*html$.KeyCode.SEMICOLON*/get SEMICOLON() {
    return 186;
  },
  /*html$.KeyCode.DASH*/get DASH() {
    return 189;
  },
  /*html$.KeyCode.EQUALS*/get EQUALS() {
    return 187;
  },
  /*html$.KeyCode.COMMA*/get COMMA() {
    return 188;
  },
  /*html$.KeyCode.PERIOD*/get PERIOD() {
    return 190;
  },
  /*html$.KeyCode.SLASH*/get SLASH() {
    return 191;
  },
  /*html$.KeyCode.APOSTROPHE*/get APOSTROPHE() {
    return 192;
  },
  /*html$.KeyCode.TILDE*/get TILDE() {
    return 192;
  },
  /*html$.KeyCode.SINGLE_QUOTE*/get SINGLE_QUOTE() {
    return 222;
  },
  /*html$.KeyCode.OPEN_SQUARE_BRACKET*/get OPEN_SQUARE_BRACKET() {
    return 219;
  },
  /*html$.KeyCode.BACKSLASH*/get BACKSLASH() {
    return 220;
  },
  /*html$.KeyCode.CLOSE_SQUARE_BRACKET*/get CLOSE_SQUARE_BRACKET() {
    return 221;
  },
  /*html$.KeyCode.WIN_KEY*/get WIN_KEY() {
    return 224;
  },
  /*html$.KeyCode.MAC_FF_META*/get MAC_FF_META() {
    return 224;
  },
  /*html$.KeyCode.WIN_IME*/get WIN_IME() {
    return 229;
  },
  /*html$.KeyCode.UNKNOWN*/get UNKNOWN() {
    return -1;
  }
});
html$.KeyLocation = class KeyLocation extends core.Object {};
(html$.KeyLocation.new = function() {
}).prototype = html$.KeyLocation.prototype;
dart.addTypeTests(html$.KeyLocation);
dart.setLibraryUri(html$.KeyLocation, "dart:html");
dart.defineLazy(html$.KeyLocation, {
  /*html$.KeyLocation.STANDARD*/get STANDARD() {
    return 0;
  },
  /*html$.KeyLocation.LEFT*/get LEFT() {
    return 1;
  },
  /*html$.KeyLocation.RIGHT*/get RIGHT() {
    return 2;
  },
  /*html$.KeyLocation.NUMPAD*/get NUMPAD() {
    return 3;
  },
  /*html$.KeyLocation.MOBILE*/get MOBILE() {
    return 4;
  },
  /*html$.KeyLocation.JOYSTICK*/get JOYSTICK() {
    return 5;
  }
});
html$._KeyName = class _KeyName extends core.Object {};
(html$._KeyName.new = function() {
}).prototype = html$._KeyName.prototype;
dart.addTypeTests(html$._KeyName);
dart.setLibraryUri(html$._KeyName, "dart:html");
dart.defineLazy(html$._KeyName, {
  /*html$._KeyName.ACCEPT*/get ACCEPT() {
    return "Accept";
  },
  /*html$._KeyName.ADD*/get ADD() {
    return "Add";
  },
  /*html$._KeyName.AGAIN*/get AGAIN() {
    return "Again";
  },
  /*html$._KeyName.ALL_CANDIDATES*/get ALL_CANDIDATES() {
    return "AllCandidates";
  },
  /*html$._KeyName.ALPHANUMERIC*/get ALPHANUMERIC() {
    return "Alphanumeric";
  },
  /*html$._KeyName.ALT*/get ALT() {
    return "Alt";
  },
  /*html$._KeyName.ALT_GRAPH*/get ALT_GRAPH() {
    return "AltGraph";
  },
  /*html$._KeyName.APPS*/get APPS() {
    return "Apps";
  },
  /*html$._KeyName.ATTN*/get ATTN() {
    return "Attn";
  },
  /*html$._KeyName.BROWSER_BACK*/get BROWSER_BACK() {
    return "BrowserBack";
  },
  /*html$._KeyName.BROWSER_FAVORTIES*/get BROWSER_FAVORTIES() {
    return "BrowserFavorites";
  },
  /*html$._KeyName.BROWSER_FORWARD*/get BROWSER_FORWARD() {
    return "BrowserForward";
  },
  /*html$._KeyName.BROWSER_NAME*/get BROWSER_NAME() {
    return "BrowserHome";
  },
  /*html$._KeyName.BROWSER_REFRESH*/get BROWSER_REFRESH() {
    return "BrowserRefresh";
  },
  /*html$._KeyName.BROWSER_SEARCH*/get BROWSER_SEARCH() {
    return "BrowserSearch";
  },
  /*html$._KeyName.BROWSER_STOP*/get BROWSER_STOP() {
    return "BrowserStop";
  },
  /*html$._KeyName.CAMERA*/get CAMERA() {
    return "Camera";
  },
  /*html$._KeyName.CAPS_LOCK*/get CAPS_LOCK() {
    return "CapsLock";
  },
  /*html$._KeyName.CLEAR*/get CLEAR() {
    return "Clear";
  },
  /*html$._KeyName.CODE_INPUT*/get CODE_INPUT() {
    return "CodeInput";
  },
  /*html$._KeyName.COMPOSE*/get COMPOSE() {
    return "Compose";
  },
  /*html$._KeyName.CONTROL*/get CONTROL() {
    return "Control";
  },
  /*html$._KeyName.CRSEL*/get CRSEL() {
    return "Crsel";
  },
  /*html$._KeyName.CONVERT*/get CONVERT() {
    return "Convert";
  },
  /*html$._KeyName.COPY*/get COPY() {
    return "Copy";
  },
  /*html$._KeyName.CUT*/get CUT() {
    return "Cut";
  },
  /*html$._KeyName.DECIMAL*/get DECIMAL() {
    return "Decimal";
  },
  /*html$._KeyName.DIVIDE*/get DIVIDE() {
    return "Divide";
  },
  /*html$._KeyName.DOWN*/get DOWN() {
    return "Down";
  },
  /*html$._KeyName.DOWN_LEFT*/get DOWN_LEFT() {
    return "DownLeft";
  },
  /*html$._KeyName.DOWN_RIGHT*/get DOWN_RIGHT() {
    return "DownRight";
  },
  /*html$._KeyName.EJECT*/get EJECT() {
    return "Eject";
  },
  /*html$._KeyName.END*/get END() {
    return "End";
  },
  /*html$._KeyName.ENTER*/get ENTER() {
    return "Enter";
  },
  /*html$._KeyName.ERASE_EOF*/get ERASE_EOF() {
    return "EraseEof";
  },
  /*html$._KeyName.EXECUTE*/get EXECUTE() {
    return "Execute";
  },
  /*html$._KeyName.EXSEL*/get EXSEL() {
    return "Exsel";
  },
  /*html$._KeyName.FN*/get FN() {
    return "Fn";
  },
  /*html$._KeyName.F1*/get F1() {
    return "F1";
  },
  /*html$._KeyName.F2*/get F2() {
    return "F2";
  },
  /*html$._KeyName.F3*/get F3() {
    return "F3";
  },
  /*html$._KeyName.F4*/get F4() {
    return "F4";
  },
  /*html$._KeyName.F5*/get F5() {
    return "F5";
  },
  /*html$._KeyName.F6*/get F6() {
    return "F6";
  },
  /*html$._KeyName.F7*/get F7() {
    return "F7";
  },
  /*html$._KeyName.F8*/get F8() {
    return "F8";
  },
  /*html$._KeyName.F9*/get F9() {
    return "F9";
  },
  /*html$._KeyName.F10*/get F10() {
    return "F10";
  },
  /*html$._KeyName.F11*/get F11() {
    return "F11";
  },
  /*html$._KeyName.F12*/get F12() {
    return "F12";
  },
  /*html$._KeyName.F13*/get F13() {
    return "F13";
  },
  /*html$._KeyName.F14*/get F14() {
    return "F14";
  },
  /*html$._KeyName.F15*/get F15() {
    return "F15";
  },
  /*html$._KeyName.F16*/get F16() {
    return "F16";
  },
  /*html$._KeyName.F17*/get F17() {
    return "F17";
  },
  /*html$._KeyName.F18*/get F18() {
    return "F18";
  },
  /*html$._KeyName.F19*/get F19() {
    return "F19";
  },
  /*html$._KeyName.F20*/get F20() {
    return "F20";
  },
  /*html$._KeyName.F21*/get F21() {
    return "F21";
  },
  /*html$._KeyName.F22*/get F22() {
    return "F22";
  },
  /*html$._KeyName.F23*/get F23() {
    return "F23";
  },
  /*html$._KeyName.F24*/get F24() {
    return "F24";
  },
  /*html$._KeyName.FINAL_MODE*/get FINAL_MODE() {
    return "FinalMode";
  },
  /*html$._KeyName.FIND*/get FIND() {
    return "Find";
  },
  /*html$._KeyName.FULL_WIDTH*/get FULL_WIDTH() {
    return "FullWidth";
  },
  /*html$._KeyName.HALF_WIDTH*/get HALF_WIDTH() {
    return "HalfWidth";
  },
  /*html$._KeyName.HANGUL_MODE*/get HANGUL_MODE() {
    return "HangulMode";
  },
  /*html$._KeyName.HANJA_MODE*/get HANJA_MODE() {
    return "HanjaMode";
  },
  /*html$._KeyName.HELP*/get HELP() {
    return "Help";
  },
  /*html$._KeyName.HIRAGANA*/get HIRAGANA() {
    return "Hiragana";
  },
  /*html$._KeyName.HOME*/get HOME() {
    return "Home";
  },
  /*html$._KeyName.INSERT*/get INSERT() {
    return "Insert";
  },
  /*html$._KeyName.JAPANESE_HIRAGANA*/get JAPANESE_HIRAGANA() {
    return "JapaneseHiragana";
  },
  /*html$._KeyName.JAPANESE_KATAKANA*/get JAPANESE_KATAKANA() {
    return "JapaneseKatakana";
  },
  /*html$._KeyName.JAPANESE_ROMAJI*/get JAPANESE_ROMAJI() {
    return "JapaneseRomaji";
  },
  /*html$._KeyName.JUNJA_MODE*/get JUNJA_MODE() {
    return "JunjaMode";
  },
  /*html$._KeyName.KANA_MODE*/get KANA_MODE() {
    return "KanaMode";
  },
  /*html$._KeyName.KANJI_MODE*/get KANJI_MODE() {
    return "KanjiMode";
  },
  /*html$._KeyName.KATAKANA*/get KATAKANA() {
    return "Katakana";
  },
  /*html$._KeyName.LAUNCH_APPLICATION_1*/get LAUNCH_APPLICATION_1() {
    return "LaunchApplication1";
  },
  /*html$._KeyName.LAUNCH_APPLICATION_2*/get LAUNCH_APPLICATION_2() {
    return "LaunchApplication2";
  },
  /*html$._KeyName.LAUNCH_MAIL*/get LAUNCH_MAIL() {
    return "LaunchMail";
  },
  /*html$._KeyName.LEFT*/get LEFT() {
    return "Left";
  },
  /*html$._KeyName.MENU*/get MENU() {
    return "Menu";
  },
  /*html$._KeyName.META*/get META() {
    return "Meta";
  },
  /*html$._KeyName.MEDIA_NEXT_TRACK*/get MEDIA_NEXT_TRACK() {
    return "MediaNextTrack";
  },
  /*html$._KeyName.MEDIA_PAUSE_PLAY*/get MEDIA_PAUSE_PLAY() {
    return "MediaPlayPause";
  },
  /*html$._KeyName.MEDIA_PREVIOUS_TRACK*/get MEDIA_PREVIOUS_TRACK() {
    return "MediaPreviousTrack";
  },
  /*html$._KeyName.MEDIA_STOP*/get MEDIA_STOP() {
    return "MediaStop";
  },
  /*html$._KeyName.MODE_CHANGE*/get MODE_CHANGE() {
    return "ModeChange";
  },
  /*html$._KeyName.NEXT_CANDIDATE*/get NEXT_CANDIDATE() {
    return "NextCandidate";
  },
  /*html$._KeyName.NON_CONVERT*/get NON_CONVERT() {
    return "Nonconvert";
  },
  /*html$._KeyName.NUM_LOCK*/get NUM_LOCK() {
    return "NumLock";
  },
  /*html$._KeyName.PAGE_DOWN*/get PAGE_DOWN() {
    return "PageDown";
  },
  /*html$._KeyName.PAGE_UP*/get PAGE_UP() {
    return "PageUp";
  },
  /*html$._KeyName.PASTE*/get PASTE() {
    return "Paste";
  },
  /*html$._KeyName.PAUSE*/get PAUSE() {
    return "Pause";
  },
  /*html$._KeyName.PLAY*/get PLAY() {
    return "Play";
  },
  /*html$._KeyName.POWER*/get POWER() {
    return "Power";
  },
  /*html$._KeyName.PREVIOUS_CANDIDATE*/get PREVIOUS_CANDIDATE() {
    return "PreviousCandidate";
  },
  /*html$._KeyName.PRINT_SCREEN*/get PRINT_SCREEN() {
    return "PrintScreen";
  },
  /*html$._KeyName.PROCESS*/get PROCESS() {
    return "Process";
  },
  /*html$._KeyName.PROPS*/get PROPS() {
    return "Props";
  },
  /*html$._KeyName.RIGHT*/get RIGHT() {
    return "Right";
  },
  /*html$._KeyName.ROMAN_CHARACTERS*/get ROMAN_CHARACTERS() {
    return "RomanCharacters";
  },
  /*html$._KeyName.SCROLL*/get SCROLL() {
    return "Scroll";
  },
  /*html$._KeyName.SELECT*/get SELECT() {
    return "Select";
  },
  /*html$._KeyName.SELECT_MEDIA*/get SELECT_MEDIA() {
    return "SelectMedia";
  },
  /*html$._KeyName.SEPARATOR*/get SEPARATOR() {
    return "Separator";
  },
  /*html$._KeyName.SHIFT*/get SHIFT() {
    return "Shift";
  },
  /*html$._KeyName.SOFT_1*/get SOFT_1() {
    return "Soft1";
  },
  /*html$._KeyName.SOFT_2*/get SOFT_2() {
    return "Soft2";
  },
  /*html$._KeyName.SOFT_3*/get SOFT_3() {
    return "Soft3";
  },
  /*html$._KeyName.SOFT_4*/get SOFT_4() {
    return "Soft4";
  },
  /*html$._KeyName.STOP*/get STOP() {
    return "Stop";
  },
  /*html$._KeyName.SUBTRACT*/get SUBTRACT() {
    return "Subtract";
  },
  /*html$._KeyName.SYMBOL_LOCK*/get SYMBOL_LOCK() {
    return "SymbolLock";
  },
  /*html$._KeyName.UP*/get UP() {
    return "Up";
  },
  /*html$._KeyName.UP_LEFT*/get UP_LEFT() {
    return "UpLeft";
  },
  /*html$._KeyName.UP_RIGHT*/get UP_RIGHT() {
    return "UpRight";
  },
  /*html$._KeyName.UNDO*/get UNDO() {
    return "Undo";
  },
  /*html$._KeyName.VOLUME_DOWN*/get VOLUME_DOWN() {
    return "VolumeDown";
  },
  /*html$._KeyName.VOLUMN_MUTE*/get VOLUMN_MUTE() {
    return "VolumeMute";
  },
  /*html$._KeyName.VOLUMN_UP*/get VOLUMN_UP() {
    return "VolumeUp";
  },
  /*html$._KeyName.WIN*/get WIN() {
    return "Win";
  },
  /*html$._KeyName.ZOOM*/get ZOOM() {
    return "Zoom";
  },
  /*html$._KeyName.BACKSPACE*/get BACKSPACE() {
    return "Backspace";
  },
  /*html$._KeyName.TAB*/get TAB() {
    return "Tab";
  },
  /*html$._KeyName.CANCEL*/get CANCEL() {
    return "Cancel";
  },
  /*html$._KeyName.ESC*/get ESC() {
    return "Esc";
  },
  /*html$._KeyName.SPACEBAR*/get SPACEBAR() {
    return "Spacebar";
  },
  /*html$._KeyName.DEL*/get DEL() {
    return "Del";
  },
  /*html$._KeyName.DEAD_GRAVE*/get DEAD_GRAVE() {
    return "DeadGrave";
  },
  /*html$._KeyName.DEAD_EACUTE*/get DEAD_EACUTE() {
    return "DeadEacute";
  },
  /*html$._KeyName.DEAD_CIRCUMFLEX*/get DEAD_CIRCUMFLEX() {
    return "DeadCircumflex";
  },
  /*html$._KeyName.DEAD_TILDE*/get DEAD_TILDE() {
    return "DeadTilde";
  },
  /*html$._KeyName.DEAD_MACRON*/get DEAD_MACRON() {
    return "DeadMacron";
  },
  /*html$._KeyName.DEAD_BREVE*/get DEAD_BREVE() {
    return "DeadBreve";
  },
  /*html$._KeyName.DEAD_ABOVE_DOT*/get DEAD_ABOVE_DOT() {
    return "DeadAboveDot";
  },
  /*html$._KeyName.DEAD_UMLAUT*/get DEAD_UMLAUT() {
    return "DeadUmlaut";
  },
  /*html$._KeyName.DEAD_ABOVE_RING*/get DEAD_ABOVE_RING() {
    return "DeadAboveRing";
  },
  /*html$._KeyName.DEAD_DOUBLEACUTE*/get DEAD_DOUBLEACUTE() {
    return "DeadDoubleacute";
  },
  /*html$._KeyName.DEAD_CARON*/get DEAD_CARON() {
    return "DeadCaron";
  },
  /*html$._KeyName.DEAD_CEDILLA*/get DEAD_CEDILLA() {
    return "DeadCedilla";
  },
  /*html$._KeyName.DEAD_OGONEK*/get DEAD_OGONEK() {
    return "DeadOgonek";
  },
  /*html$._KeyName.DEAD_IOTA*/get DEAD_IOTA() {
    return "DeadIota";
  },
  /*html$._KeyName.DEAD_VOICED_SOUND*/get DEAD_VOICED_SOUND() {
    return "DeadVoicedSound";
  },
  /*html$._KeyName.DEC_SEMIVOICED_SOUND*/get DEC_SEMIVOICED_SOUND() {
    return "DeadSemivoicedSound";
  },
  /*html$._KeyName.UNIDENTIFIED*/get UNIDENTIFIED() {
    return "Unidentified";
  }
});
const _stream$0 = dart.privateName(html$, "_stream");
const _keyDownList = dart.privateName(html$, "_keyDownList");
const _capsLockOn = dart.privateName(html$, "_capsLockOn");
const _determineKeyCodeForKeypress = dart.privateName(html$, "_determineKeyCodeForKeypress");
const _findCharCodeKeyDown = dart.privateName(html$, "_findCharCodeKeyDown");
const _firesKeyPressEvent = dart.privateName(html$, "_firesKeyPressEvent");
const _normalizeKeyCodes = dart.privateName(html$, "_normalizeKeyCodes");
html$._KeyboardEventHandler = class _KeyboardEventHandler extends html$.EventStreamProvider$(html$.KeyEvent) {
  forTarget(e, opts) {
    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
    let handler = new html$._KeyboardEventHandler.initializeAllEventListeners(this[_type$1], e);
    return handler[_stream$0];
  }
  get [_capsLockOn]() {
    return this[_keyDownList][$any](dart.fn(element => element.keyCode === html$.KeyCode.CAPS_LOCK, KeyEventTobool()));
  }
  [_determineKeyCodeForKeypress](event) {
    for (let prevEvent of this[_keyDownList]) {
      if (prevEvent[_shadowCharCode] == event.charCode) {
        return prevEvent.keyCode;
      }
      if ((dart.test(event.shiftKey) || dart.test(this[_capsLockOn])) && dart.notNull(event.charCode) >= dart.notNull("A"[$codeUnits][$_get](0)) && dart.notNull(event.charCode) <= dart.notNull("Z"[$codeUnits][$_get](0)) && dart.notNull(event.charCode) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET) === prevEvent[_shadowCharCode]) {
        return prevEvent.keyCode;
      }
    }
    return html$.KeyCode.UNKNOWN;
  }
  [_findCharCodeKeyDown](event) {
    if (event.location === 3) {
      switch (event.keyCode) {
        case html$.KeyCode.NUM_ZERO:
        {
          return html$.KeyCode.ZERO;
        }
        case html$.KeyCode.NUM_ONE:
        {
          return html$.KeyCode.ONE;
        }
        case html$.KeyCode.NUM_TWO:
        {
          return html$.KeyCode.TWO;
        }
        case html$.KeyCode.NUM_THREE:
        {
          return html$.KeyCode.THREE;
        }
        case html$.KeyCode.NUM_FOUR:
        {
          return html$.KeyCode.FOUR;
        }
        case html$.KeyCode.NUM_FIVE:
        {
          return html$.KeyCode.FIVE;
        }
        case html$.KeyCode.NUM_SIX:
        {
          return html$.KeyCode.SIX;
        }
        case html$.KeyCode.NUM_SEVEN:
        {
          return html$.KeyCode.SEVEN;
        }
        case html$.KeyCode.NUM_EIGHT:
        {
          return html$.KeyCode.EIGHT;
        }
        case html$.KeyCode.NUM_NINE:
        {
          return html$.KeyCode.NINE;
        }
        case html$.KeyCode.NUM_MULTIPLY:
        {
          return 42;
        }
        case html$.KeyCode.NUM_PLUS:
        {
          return 43;
        }
        case html$.KeyCode.NUM_MINUS:
        {
          return 45;
        }
        case html$.KeyCode.NUM_PERIOD:
        {
          return 46;
        }
        case html$.KeyCode.NUM_DIVISION:
        {
          return 47;
        }
      }
    } else if (dart.notNull(event.keyCode) >= 65 && dart.notNull(event.keyCode) <= 90) {
      return dart.notNull(event.keyCode) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET);
    }
    switch (event.keyCode) {
      case html$.KeyCode.SEMICOLON:
      {
        return html$.KeyCode.FF_SEMICOLON;
      }
      case html$.KeyCode.EQUALS:
      {
        return html$.KeyCode.FF_EQUALS;
      }
      case html$.KeyCode.COMMA:
      {
        return 44;
      }
      case html$.KeyCode.DASH:
      {
        return 45;
      }
      case html$.KeyCode.PERIOD:
      {
        return 46;
      }
      case html$.KeyCode.SLASH:
      {
        return 47;
      }
      case html$.KeyCode.APOSTROPHE:
      {
        return 96;
      }
      case html$.KeyCode.OPEN_SQUARE_BRACKET:
      {
        return 91;
      }
      case html$.KeyCode.BACKSLASH:
      {
        return 92;
      }
      case html$.KeyCode.CLOSE_SQUARE_BRACKET:
      {
        return 93;
      }
      case html$.KeyCode.SINGLE_QUOTE:
      {
        return 39;
      }
    }
    return event.keyCode;
  }
  [_firesKeyPressEvent](event) {
    if (!dart.test(html_common.Device.isIE) && !dart.test(html_common.Device.isWebKit)) {
      return true;
    }
    if (html_common.Device.userAgent[$contains]("Mac") && dart.test(event.altKey)) {
      return html$.KeyCode.isCharacterKey(event.keyCode);
    }
    if (dart.test(event.altKey) && !dart.test(event.ctrlKey)) {
      return false;
    }
    if (!dart.test(event.shiftKey) && (this[_keyDownList][$last].keyCode === html$.KeyCode.CTRL || this[_keyDownList][$last].keyCode === html$.KeyCode.ALT || html_common.Device.userAgent[$contains]("Mac") && this[_keyDownList][$last].keyCode === html$.KeyCode.META)) {
      return false;
    }
    if (dart.test(html_common.Device.isWebKit) && dart.test(event.ctrlKey) && dart.test(event.shiftKey) && (event.keyCode === html$.KeyCode.BACKSLASH || event.keyCode === html$.KeyCode.OPEN_SQUARE_BRACKET || event.keyCode === html$.KeyCode.CLOSE_SQUARE_BRACKET || event.keyCode === html$.KeyCode.TILDE || event.keyCode === html$.KeyCode.SEMICOLON || event.keyCode === html$.KeyCode.DASH || event.keyCode === html$.KeyCode.EQUALS || event.keyCode === html$.KeyCode.COMMA || event.keyCode === html$.KeyCode.PERIOD || event.keyCode === html$.KeyCode.SLASH || event.keyCode === html$.KeyCode.APOSTROPHE || event.keyCode === html$.KeyCode.SINGLE_QUOTE)) {
      return false;
    }
    switch (event.keyCode) {
      case html$.KeyCode.ENTER:
      {
        return !dart.test(html_common.Device.isIE);
      }
      case html$.KeyCode.ESC:
      {
        return !dart.test(html_common.Device.isWebKit);
      }
    }
    return html$.KeyCode.isCharacterKey(event.keyCode);
  }
  [_normalizeKeyCodes](event) {
    if (dart.test(html_common.Device.isFirefox)) {
      switch (event.keyCode) {
        case html$.KeyCode.FF_EQUALS:
        {
          return html$.KeyCode.EQUALS;
        }
        case html$.KeyCode.FF_SEMICOLON:
        {
          return html$.KeyCode.SEMICOLON;
        }
        case html$.KeyCode.MAC_FF_META:
        {
          return html$.KeyCode.META;
        }
        case html$.KeyCode.WIN_KEY_FF_LINUX:
        {
          return html$.KeyCode.WIN_KEY;
        }
      }
    }
    return event.keyCode;
  }
  processKeyDown(e) {
    if (dart.notNull(this[_keyDownList][$length]) > 0 && (this[_keyDownList][$last].keyCode === html$.KeyCode.CTRL && !dart.test(e.ctrlKey) || this[_keyDownList][$last].keyCode === html$.KeyCode.ALT && !dart.test(e.altKey) || html_common.Device.userAgent[$contains]("Mac") && this[_keyDownList][$last].keyCode === html$.KeyCode.META && !dart.test(e.metaKey))) {
      this[_keyDownList][$clear]();
    }
    let event = new html$.KeyEvent.wrap(e);
    event[_shadowKeyCode] = this[_normalizeKeyCodes](event);
    event[_shadowCharCode] = this[_findCharCodeKeyDown](event);
    if (dart.notNull(this[_keyDownList][$length]) > 0 && event.keyCode != this[_keyDownList][$last].keyCode && !dart.test(this[_firesKeyPressEvent](event))) {
      this.processKeyPress(e);
    }
    this[_keyDownList][$add](event);
    this[_stream$0].add(event);
  }
  processKeyPress(event) {
    let e = new html$.KeyEvent.wrap(event);
    if (dart.test(html_common.Device.isIE)) {
      if (e.keyCode === html$.KeyCode.ENTER || e.keyCode === html$.KeyCode.ESC) {
        e[_shadowCharCode] = 0;
      } else {
        e[_shadowCharCode] = e.keyCode;
      }
    } else if (dart.test(html_common.Device.isOpera)) {
      e[_shadowCharCode] = dart.test(html$.KeyCode.isCharacterKey(e.keyCode)) ? e.keyCode : 0;
    }
    e[_shadowKeyCode] = this[_determineKeyCodeForKeypress](e);
    if (e[_shadowKeyIdentifier] != null && dart.test(html$._KeyboardEventHandler._keyIdentifier[$containsKey](e[_shadowKeyIdentifier]))) {
      e[_shadowKeyCode] = html$._KeyboardEventHandler._keyIdentifier[$_get](e[_shadowKeyIdentifier]);
    }
    e[_shadowAltKey] = this[_keyDownList][$any](dart.fn(element => element.altKey, KeyEventTobool()));
    this[_stream$0].add(e);
  }
  processKeyUp(event) {
    let e = new html$.KeyEvent.wrap(event);
    let toRemove = null;
    for (let key of this[_keyDownList]) {
      if (key.keyCode == e.keyCode) {
        toRemove = key;
      }
    }
    if (toRemove != null) {
      this[_keyDownList][$removeWhere](dart.fn(element => dart.equals(element, toRemove), KeyEventTobool()));
    } else if (dart.notNull(this[_keyDownList][$length]) > 0) {
      this[_keyDownList][$removeLast]();
    }
    this[_stream$0].add(e);
  }
};
(html$._KeyboardEventHandler.new = function(type) {
  this[_keyDownList] = JSArrayOfKeyEvent().of([]);
  this[_type$1] = type;
  this[_stream$0] = new html$._CustomKeyEventStreamImpl.new("event");
  this[_target$0] = null;
  html$._KeyboardEventHandler.__proto__.new.call(this, "KeyEvent");
}).prototype = html$._KeyboardEventHandler.prototype;
(html$._KeyboardEventHandler.initializeAllEventListeners = function(type, target) {
  this[_keyDownList] = JSArrayOfKeyEvent().of([]);
  this[_stream$0] = null;
  this[_type$1] = type;
  this[_target$0] = target;
  html$._KeyboardEventHandler.__proto__.new.call(this, "KeyEvent");
  html$.Element.keyDownEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
  html$.Element.keyPressEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
  html$.Element.keyUpEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
  this[_stream$0] = new html$._CustomKeyEventStreamImpl.new(this[_type$1]);
}).prototype = html$._KeyboardEventHandler.prototype;
dart.addTypeTests(html$._KeyboardEventHandler);
dart.setMethodSignature(html$._KeyboardEventHandler, () => ({
  __proto__: dart.getMethods(html$._KeyboardEventHandler.__proto__),
  forTarget: dart.fnType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget], {useCapture: core.bool}),
  [_determineKeyCodeForKeypress]: dart.fnType(core.int, [html$.KeyboardEvent]),
  [_findCharCodeKeyDown]: dart.fnType(core.int, [html$.KeyboardEvent]),
  [_firesKeyPressEvent]: dart.fnType(core.bool, [html$.KeyEvent]),
  [_normalizeKeyCodes]: dart.fnType(core.int, [html$.KeyboardEvent]),
  processKeyDown: dart.fnType(dart.void, [html$.KeyboardEvent]),
  processKeyPress: dart.fnType(dart.void, [html$.KeyboardEvent]),
  processKeyUp: dart.fnType(dart.void, [html$.KeyboardEvent])
}));
dart.setGetterSignature(html$._KeyboardEventHandler, () => ({
  __proto__: dart.getGetters(html$._KeyboardEventHandler.__proto__),
  [_capsLockOn]: core.bool
}));
dart.setLibraryUri(html$._KeyboardEventHandler, "dart:html");
dart.setFieldSignature(html$._KeyboardEventHandler, () => ({
  __proto__: dart.getFields(html$._KeyboardEventHandler.__proto__),
  [_keyDownList]: dart.finalFieldType(ListOfKeyEvent()),
  [_type$1]: dart.finalFieldType(core.String),
  [_target$0]: dart.finalFieldType(html$.EventTarget),
  [_stream$0]: dart.fieldType(html$._CustomKeyEventStreamImpl)
}));
dart.defineLazy(html$._KeyboardEventHandler, {
  /*html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET*/get _ROMAN_ALPHABET_OFFSET() {
    return dart.notNull("a"[$codeUnits][$_get](0)) - dart.notNull("A"[$codeUnits][$_get](0));
  },
  /*html$._KeyboardEventHandler._EVENT_TYPE*/get _EVENT_TYPE() {
    return "KeyEvent";
  },
  /*html$._KeyboardEventHandler._keyIdentifier*/get _keyIdentifier() {
    return dart.constMap(core.String, core.int, ["Up", html$.KeyCode.UP, "Down", html$.KeyCode.DOWN, "Left", html$.KeyCode.LEFT, "Right", html$.KeyCode.RIGHT, "Enter", html$.KeyCode.ENTER, "F1", html$.KeyCode.F1, "F2", html$.KeyCode.F2, "F3", html$.KeyCode.F3, "F4", html$.KeyCode.F4, "F5", html$.KeyCode.F5, "F6", html$.KeyCode.F6, "F7", html$.KeyCode.F7, "F8", html$.KeyCode.F8, "F9", html$.KeyCode.F9, "F10", html$.KeyCode.F10, "F11", html$.KeyCode.F11, "F12", html$.KeyCode.F12, "U+007F", html$.KeyCode.DELETE, "Home", html$.KeyCode.HOME, "End", html$.KeyCode.END, "PageUp", html$.KeyCode.PAGE_UP, "PageDown", html$.KeyCode.PAGE_DOWN, "Insert", html$.KeyCode.INSERT]);
  }
});
html$.KeyboardEventStream = class KeyboardEventStream extends core.Object {
  static onKeyPress(target) {
    return new html$._KeyboardEventHandler.new("keypress").forTarget(target);
  }
  static onKeyUp(target) {
    return new html$._KeyboardEventHandler.new("keyup").forTarget(target);
  }
  static onKeyDown(target) {
    return new html$._KeyboardEventHandler.new("keydown").forTarget(target);
  }
};
(html$.KeyboardEventStream.new = function() {
}).prototype = html$.KeyboardEventStream.prototype;
dart.addTypeTests(html$.KeyboardEventStream);
dart.setLibraryUri(html$.KeyboardEventStream, "dart:html");
const _validators = dart.privateName(html$, "_validators");
html$.NodeValidatorBuilder = class NodeValidatorBuilder extends core.Object {
  allowNavigation(uriPolicy) {
    if (uriPolicy === void 0) uriPolicy = null;
    if (uriPolicy == null) {
      uriPolicy = html$.UriPolicy.new();
    }
    this.add(html$._SimpleNodeValidator.allowNavigation(uriPolicy));
  }
  allowImages(uriPolicy) {
    if (uriPolicy === void 0) uriPolicy = null;
    if (uriPolicy == null) {
      uriPolicy = html$.UriPolicy.new();
    }
    this.add(html$._SimpleNodeValidator.allowImages(uriPolicy));
  }
  allowTextElements() {
    this.add(html$._SimpleNodeValidator.allowTextElements());
  }
  allowInlineStyles(opts) {
    let tagName = opts && 'tagName' in opts ? opts.tagName : null;
    if (tagName == null) {
      tagName = "*";
    } else {
      tagName = tagName[$toUpperCase]();
    }
    this.add(new html$._SimpleNodeValidator.new(null, {allowedAttributes: JSArrayOfString().of([dart.str(tagName) + "::style"])}));
  }
  allowHtml5(opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    this.add(new html$._Html5NodeValidator.new({uriPolicy: uriPolicy}));
  }
  allowSvg() {
    this.add(new html$._SvgNodeValidator.new());
  }
  allowCustomElement(tagName, opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
    let tagNameUpper = tagName[$toUpperCase]();
    let attrs = IterableOfString()._check(attributes == null ? null : attributes[$map](core.String, dart.fn(name => tagNameUpper + "::" + name[$toLowerCase](), StringToString())));
    let uriAttrs = IterableOfString()._check(uriAttributes == null ? null : uriAttributes[$map](core.String, dart.fn(name => tagNameUpper + "::" + name[$toLowerCase](), StringToString())));
    if (uriPolicy == null) {
      uriPolicy = html$.UriPolicy.new();
    }
    this.add(new html$._CustomElementNodeValidator.new(uriPolicy, JSArrayOfString().of([tagNameUpper]), attrs, uriAttrs, false, true));
  }
  allowTagExtension(tagName, baseName, opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
    let baseNameUpper = baseName[$toUpperCase]();
    let tagNameUpper = tagName[$toUpperCase]();
    let attrs = IterableOfString()._check(attributes == null ? null : attributes[$map](core.String, dart.fn(name => baseNameUpper + "::" + name[$toLowerCase](), StringToString())));
    let uriAttrs = IterableOfString()._check(uriAttributes == null ? null : uriAttributes[$map](core.String, dart.fn(name => baseNameUpper + "::" + name[$toLowerCase](), StringToString())));
    if (uriPolicy == null) {
      uriPolicy = html$.UriPolicy.new();
    }
    this.add(new html$._CustomElementNodeValidator.new(uriPolicy, JSArrayOfString().of([tagNameUpper, baseNameUpper]), attrs, uriAttrs, true, false));
  }
  allowElement(tagName, opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
    this.allowCustomElement(tagName, {uriPolicy: uriPolicy, attributes: attributes, uriAttributes: uriAttributes});
  }
  allowTemplating() {
    this.add(new html$._TemplatingNodeValidator.new());
  }
  add(validator) {
    this[_validators][$add](validator);
  }
  allowsElement(element) {
    return this[_validators][$any](dart.fn(v => v.allowsElement(element), NodeValidatorTobool()));
  }
  allowsAttribute(element, attributeName, value) {
    return this[_validators][$any](dart.fn(v => v.allowsAttribute(element, attributeName, value), NodeValidatorTobool()));
  }
};
(html$.NodeValidatorBuilder.new = function() {
  this[_validators] = JSArrayOfNodeValidator().of([]);
}).prototype = html$.NodeValidatorBuilder.prototype;
(html$.NodeValidatorBuilder.common = function() {
  this[_validators] = JSArrayOfNodeValidator().of([]);
  this.allowHtml5();
  this.allowTemplating();
}).prototype = html$.NodeValidatorBuilder.prototype;
dart.addTypeTests(html$.NodeValidatorBuilder);
html$.NodeValidatorBuilder[dart.implements] = () => [html$.NodeValidator];
dart.setMethodSignature(html$.NodeValidatorBuilder, () => ({
  __proto__: dart.getMethods(html$.NodeValidatorBuilder.__proto__),
  allowNavigation: dart.fnType(dart.void, [], [html$.UriPolicy]),
  allowImages: dart.fnType(dart.void, [], [html$.UriPolicy]),
  allowTextElements: dart.fnType(dart.void, []),
  allowInlineStyles: dart.fnType(dart.void, [], {tagName: core.String}),
  allowHtml5: dart.fnType(dart.void, [], {uriPolicy: html$.UriPolicy}),
  allowSvg: dart.fnType(dart.void, []),
  allowCustomElement: dart.fnType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: core.Iterable$(core.String), uriAttributes: core.Iterable$(core.String)}),
  allowTagExtension: dart.fnType(dart.void, [core.String, core.String], {uriPolicy: html$.UriPolicy, attributes: core.Iterable$(core.String), uriAttributes: core.Iterable$(core.String)}),
  allowElement: dart.fnType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: core.Iterable$(core.String), uriAttributes: core.Iterable$(core.String)}),
  allowTemplating: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [html$.NodeValidator]),
  allowsElement: dart.fnType(core.bool, [html$.Element]),
  allowsAttribute: dart.fnType(core.bool, [html$.Element, core.String, core.String])
}));
dart.setLibraryUri(html$.NodeValidatorBuilder, "dart:html");
dart.setFieldSignature(html$.NodeValidatorBuilder, () => ({
  __proto__: dart.getFields(html$.NodeValidatorBuilder.__proto__),
  [_validators]: dart.finalFieldType(ListOfNodeValidator())
}));
let const$79;
let const$80;
let const$81;
let const$82;
let const$83;
let const$84;
let const$85;
let const$86;
let const$87;
let const$88;
html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
  static allowNavigation(uriPolicy) {
    return new html$._SimpleNodeValidator.new(uriPolicy, {allowedElements: const$82 || (const$82 = dart.constList(["A", "FORM"], core.String)), allowedAttributes: const$83 || (const$83 = dart.constList(["A::accesskey", "A::coords", "A::hreflang", "A::name", "A::shape", "A::tabindex", "A::target", "A::type", "FORM::accept", "FORM::autocomplete", "FORM::enctype", "FORM::method", "FORM::name", "FORM::novalidate", "FORM::target"], core.String)), allowedUriAttributes: const$84 || (const$84 = dart.constList(["A::href", "FORM::action"], core.String))});
  }
  static allowImages(uriPolicy) {
    return new html$._SimpleNodeValidator.new(uriPolicy, {allowedElements: const$85 || (const$85 = dart.constList(["IMG"], core.String)), allowedAttributes: const$86 || (const$86 = dart.constList(["IMG::align", "IMG::alt", "IMG::border", "IMG::height", "IMG::hspace", "IMG::ismap", "IMG::name", "IMG::usemap", "IMG::vspace", "IMG::width"], core.String)), allowedUriAttributes: const$87 || (const$87 = dart.constList(["IMG::src"], core.String))});
  }
  static allowTextElements() {
    return new html$._SimpleNodeValidator.new(null, {allowedElements: const$88 || (const$88 = dart.constList(["B", "BLOCKQUOTE", "BR", "EM", "H1", "H2", "H3", "H4", "H5", "H6", "HR", "I", "LI", "OL", "P", "SPAN", "UL"], core.String))});
  }
  allowsElement(element) {
    return this.allowedElements.contains(html$.Element._safeTagName(element));
  }
  allowsAttribute(element, attributeName, value) {
    let tagName = html$.Element._safeTagName(element);
    if (dart.test(this.allowedUriAttributes.contains(dart.str(tagName) + "::" + dart.str(attributeName)))) {
      return this.uriPolicy.allowsUri(value);
    } else if (dart.test(this.allowedUriAttributes.contains("*::" + dart.str(attributeName)))) {
      return this.uriPolicy.allowsUri(value);
    } else if (dart.test(this.allowedAttributes.contains(dart.str(tagName) + "::" + dart.str(attributeName)))) {
      return true;
    } else if (dart.test(this.allowedAttributes.contains("*::" + dart.str(attributeName)))) {
      return true;
    } else if (dart.test(this.allowedAttributes.contains(dart.str(tagName) + "::*"))) {
      return true;
    } else if (dart.test(this.allowedAttributes.contains("*::*"))) {
      return true;
    }
    return false;
  }
};
(html$._SimpleNodeValidator.new = function(uriPolicy, opts) {
  let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
  let allowedAttributes = opts && 'allowedAttributes' in opts ? opts.allowedAttributes : null;
  let allowedUriAttributes = opts && 'allowedUriAttributes' in opts ? opts.allowedUriAttributes : null;
  this.allowedElements = new (_IdentityHashSetOfString()).new();
  this.allowedAttributes = new (_IdentityHashSetOfString()).new();
  this.allowedUriAttributes = new (_IdentityHashSetOfString()).new();
  this.uriPolicy = uriPolicy;
  this.allowedElements.addAll(allowedElements != null ? allowedElements : const$79 || (const$79 = dart.constList([], core.String)));
  allowedAttributes = allowedAttributes != null ? allowedAttributes : const$80 || (const$80 = dart.constList([], core.String));
  allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$81 || (const$81 = dart.constList([], core.String));
  let legalAttributes = allowedAttributes[$where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[$contains](x)), StringTobool()));
  let extraUriAttributes = allowedAttributes[$where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[$contains](x), StringTobool()));
  this.allowedAttributes.addAll(legalAttributes);
  this.allowedUriAttributes.addAll(allowedUriAttributes);
  this.allowedUriAttributes.addAll(extraUriAttributes);
}).prototype = html$._SimpleNodeValidator.prototype;
dart.addTypeTests(html$._SimpleNodeValidator);
html$._SimpleNodeValidator[dart.implements] = () => [html$.NodeValidator];
dart.setMethodSignature(html$._SimpleNodeValidator, () => ({
  __proto__: dart.getMethods(html$._SimpleNodeValidator.__proto__),
  allowsElement: dart.fnType(core.bool, [html$.Element]),
  allowsAttribute: dart.fnType(core.bool, [html$.Element, core.String, core.String])
}));
dart.setLibraryUri(html$._SimpleNodeValidator, "dart:html");
dart.setFieldSignature(html$._SimpleNodeValidator, () => ({
  __proto__: dart.getFields(html$._SimpleNodeValidator.__proto__),
  allowedElements: dart.finalFieldType(SetOfString()),
  allowedAttributes: dart.finalFieldType(SetOfString()),
  allowedUriAttributes: dart.finalFieldType(SetOfString()),
  uriPolicy: dart.finalFieldType(html$.UriPolicy)
}));
html$._CustomElementNodeValidator = class _CustomElementNodeValidator extends html$._SimpleNodeValidator {
  allowsElement(element) {
    if (dart.test(this.allowTypeExtension)) {
      let isAttr = element[$attributes][$_get]("is");
      if (isAttr != null) {
        return dart.test(this.allowedElements.contains(isAttr[$toUpperCase]())) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
      }
    }
    return dart.test(this.allowCustomTag) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
  }
  allowsAttribute(element, attributeName, value) {
    if (dart.test(this.allowsElement(element))) {
      if (dart.test(this.allowTypeExtension) && attributeName === "is" && dart.test(this.allowedElements.contains(value[$toUpperCase]()))) {
        return true;
      }
      return super.allowsAttribute(element, attributeName, value);
    }
    return false;
  }
};
(html$._CustomElementNodeValidator.new = function(uriPolicy, allowedElements, allowedAttributes, allowedUriAttributes, allowTypeExtension, allowCustomTag) {
  this.allowTypeExtension = allowTypeExtension === true;
  this.allowCustomTag = allowCustomTag === true;
  html$._CustomElementNodeValidator.__proto__.new.call(this, uriPolicy, {allowedElements: allowedElements, allowedAttributes: allowedAttributes, allowedUriAttributes: allowedUriAttributes});
}).prototype = html$._CustomElementNodeValidator.prototype;
dart.addTypeTests(html$._CustomElementNodeValidator);
dart.setLibraryUri(html$._CustomElementNodeValidator, "dart:html");
dart.setFieldSignature(html$._CustomElementNodeValidator, () => ({
  __proto__: dart.getFields(html$._CustomElementNodeValidator.__proto__),
  allowTypeExtension: dart.finalFieldType(core.bool),
  allowCustomTag: dart.finalFieldType(core.bool)
}));
const _templateAttrs = dart.privateName(html$, "_templateAttrs");
html$._TemplatingNodeValidator = class _TemplatingNodeValidator extends html$._SimpleNodeValidator {
  allowsAttribute(element, attributeName, value) {
    if (dart.test(super.allowsAttribute(element, attributeName, value))) {
      return true;
    }
    if (attributeName === "template" && value === "") {
      return true;
    }
    if (element[$attributes][$_get]("template") === "") {
      return this[_templateAttrs].contains(attributeName);
    }
    return false;
  }
};
(html$._TemplatingNodeValidator.new = function() {
  this[_templateAttrs] = SetOfString().from(html$._TemplatingNodeValidator._TEMPLATE_ATTRS);
  html$._TemplatingNodeValidator.__proto__.new.call(this, null, {allowedElements: JSArrayOfString().of(["TEMPLATE"]), allowedAttributes: IterableOfString()._check(html$._TemplatingNodeValidator._TEMPLATE_ATTRS[$map](core.String, dart.fn(attr => "TEMPLATE::" + dart.str(attr), StringToString())))});
}).prototype = html$._TemplatingNodeValidator.prototype;
dart.addTypeTests(html$._TemplatingNodeValidator);
dart.setLibraryUri(html$._TemplatingNodeValidator, "dart:html");
dart.setFieldSignature(html$._TemplatingNodeValidator, () => ({
  __proto__: dart.getFields(html$._TemplatingNodeValidator.__proto__),
  [_templateAttrs]: dart.finalFieldType(SetOfString())
}));
dart.defineLazy(html$._TemplatingNodeValidator, {
  /*html$._TemplatingNodeValidator._TEMPLATE_ATTRS*/get _TEMPLATE_ATTRS() {
    return dart.constList(["bind", "if", "ref", "repeat", "syntax"], core.String);
  }
});
html$._SvgNodeValidator = class _SvgNodeValidator extends core.Object {
  allowsElement(element) {
    if (svg$.ScriptElement.is(element)) {
      return false;
    }
    if (svg$.SvgElement.is(element) && html$.Element._safeTagName(element) === "foreignObject") {
      return false;
    }
    if (svg$.SvgElement.is(element)) {
      return true;
    }
    return false;
  }
  allowsAttribute(element, attributeName, value) {
    if (attributeName === "is" || attributeName[$startsWith]("on")) {
      return false;
    }
    return this.allowsElement(element);
  }
};
(html$._SvgNodeValidator.new = function() {
}).prototype = html$._SvgNodeValidator.prototype;
dart.addTypeTests(html$._SvgNodeValidator);
html$._SvgNodeValidator[dart.implements] = () => [html$.NodeValidator];
dart.setMethodSignature(html$._SvgNodeValidator, () => ({
  __proto__: dart.getMethods(html$._SvgNodeValidator.__proto__),
  allowsElement: dart.fnType(core.bool, [html$.Element]),
  allowsAttribute: dart.fnType(core.bool, [html$.Element, core.String, core.String])
}));
dart.setLibraryUri(html$._SvgNodeValidator, "dart:html");
html$.ReadyState = class ReadyState extends core.Object {};
(html$.ReadyState.new = function() {
}).prototype = html$.ReadyState.prototype;
dart.addTypeTests(html$.ReadyState);
dart.setLibraryUri(html$.ReadyState, "dart:html");
dart.defineLazy(html$.ReadyState, {
  /*html$.ReadyState.LOADING*/get LOADING() {
    return "loading";
  },
  /*html$.ReadyState.INTERACTIVE*/get INTERACTIVE() {
    return "interactive";
  },
  /*html$.ReadyState.COMPLETE*/get COMPLETE() {
    return "complete";
  }
});
const _list$1 = dart.privateName(html$, "_list");
const _is__WrappedList_default = Symbol('_is__WrappedList_default');
html$._WrappedList$ = dart.generic(E => {
  let _WrappedIteratorOfE = () => (_WrappedIteratorOfE = dart.constFn(html$._WrappedIterator$(E)))();
  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
  class _WrappedList extends collection.ListBase$(E) {
    get iterator() {
      return new (_WrappedIteratorOfE()).new(this[_list$1][$iterator]);
    }
    get length() {
      return this[_list$1][$length];
    }
    add(element) {
      E._check(element);
      this[_list$1][$add](element);
    }
    remove(element) {
      return this[_list$1][$remove](element);
    }
    clear() {
      this[_list$1][$clear]();
    }
    _get(index) {
      return E._check(this[_list$1][$_get](index));
    }
    _set(index, value) {
      E._check(value);
      this[_list$1][$_set](index, value);
      return value;
    }
    set length(newLength) {
      this[_list$1][$length] = newLength;
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      this[_list$1][$sort](dart.fn((a, b) => compare(E._check(a), E._check(b)), NodeAndNodeToint()));
    }
    indexOf(element, start) {
      if (start === void 0) start = 0;
      return this[_list$1][$indexOf](html$.Node._check(element), start);
    }
    lastIndexOf(element, start) {
      if (start === void 0) start = null;
      return this[_list$1][$lastIndexOf](html$.Node._check(element), start);
    }
    insert(index, element) {
      E._check(element);
      return this[_list$1][$insert](index, element);
    }
    removeAt(index) {
      return E._check(this[_list$1][$removeAt](index));
    }
    setRange(start, end, iterable, skipCount) {
      IterableOfE()._check(iterable);
      if (skipCount === void 0) skipCount = 0;
      this[_list$1][$setRange](start, end, iterable, skipCount);
    }
    removeRange(start, end) {
      this[_list$1][$removeRange](start, end);
    }
    replaceRange(start, end, iterable) {
      IterableOfE()._check(iterable);
      this[_list$1][$replaceRange](start, end, iterable);
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      E._check(fillValue);
      this[_list$1][$fillRange](start, end, fillValue);
    }
    get rawList() {
      return this[_list$1];
    }
  }
  (_WrappedList.new = function(list) {
    this[_list$1] = list;
  }).prototype = _WrappedList.prototype;
  dart.addTypeTests(_WrappedList);
  _WrappedList.prototype[_is__WrappedList_default] = true;
  _WrappedList[dart.implements] = () => [html_common.NodeListWrapper];
  dart.setMethodSignature(_WrappedList, () => ({
    __proto__: dart.getMethods(_WrappedList.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    [$add]: dart.fnType(dart.void, [core.Object]),
    _get: dart.fnType(E, [core.int]),
    [$_get]: dart.fnType(E, [core.int]),
    _set: dart.fnType(dart.void, [core.int, core.Object]),
    [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
    insert: dart.fnType(dart.void, [core.int, core.Object]),
    [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
    setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
    replaceRange: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object]),
    fillRange: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
    [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object])
  }));
  dart.setGetterSignature(_WrappedList, () => ({
    __proto__: dart.getGetters(_WrappedList.__proto__),
    length: core.int,
    [$length]: core.int,
    rawList: core.List$(html$.Node)
  }));
  dart.setSetterSignature(_WrappedList, () => ({
    __proto__: dart.getSetters(_WrappedList.__proto__),
    length: core.int,
    [$length]: core.int
  }));
  dart.setLibraryUri(_WrappedList, "dart:html");
  dart.setFieldSignature(_WrappedList, () => ({
    __proto__: dart.getFields(_WrappedList.__proto__),
    [_list$1]: dart.finalFieldType(ListOfNode())
  }));
  dart.defineExtensionMethods(_WrappedList, [
    'add',
    'remove',
    'clear',
    '_get',
    '_set',
    'sort',
    'indexOf',
    'lastIndexOf',
    'insert',
    'removeAt',
    'setRange',
    'removeRange',
    'replaceRange',
    'fillRange'
  ]);
  dart.defineExtensionAccessors(_WrappedList, ['iterator', 'length']);
  return _WrappedList;
});
html$._WrappedList = html$._WrappedList$();
dart.addTypeTests(html$._WrappedList, _is__WrappedList_default);
const _iterator$1 = dart.privateName(html$, "_iterator");
const _is__WrappedIterator_default = Symbol('_is__WrappedIterator_default');
html$._WrappedIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class _WrappedIterator extends core.Object {
    moveNext() {
      return this[_iterator$1].moveNext();
    }
    get current() {
      return E._check(this[_iterator$1].current);
    }
  }
  (_WrappedIterator.new = function(iterator) {
    this[_iterator$1] = iterator;
  }).prototype = _WrappedIterator.prototype;
  dart.addTypeTests(_WrappedIterator);
  _WrappedIterator.prototype[_is__WrappedIterator_default] = true;
  _WrappedIterator[dart.implements] = () => [IteratorOfE()];
  dart.setMethodSignature(_WrappedIterator, () => ({
    __proto__: dart.getMethods(_WrappedIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(_WrappedIterator, () => ({
    __proto__: dart.getGetters(_WrappedIterator.__proto__),
    current: E
  }));
  dart.setLibraryUri(_WrappedIterator, "dart:html");
  dart.setFieldSignature(_WrappedIterator, () => ({
    __proto__: dart.getFields(_WrappedIterator.__proto__),
    [_iterator$1]: dart.fieldType(IteratorOfNode())
  }));
  return _WrappedIterator;
});
html$._WrappedIterator = html$._WrappedIterator$();
dart.addTypeTests(html$._WrappedIterator, _is__WrappedIterator_default);
html$._HttpRequestUtils = class _HttpRequestUtils extends core.Object {
  static get(url, onComplete, withCredentials) {
    let request = html$.HttpRequest.new();
    request.open("GET", url, {async: true});
    request.withCredentials = withCredentials;
    request[$onReadyStateChange].listen(dart.fn(e => {
      if (request.readyState === html$.HttpRequest.DONE) {
        onComplete(request);
      }
    }, EventToNull()));
    request.send();
    return request;
  }
};
(html$._HttpRequestUtils.new = function() {
}).prototype = html$._HttpRequestUtils.prototype;
dart.addTypeTests(html$._HttpRequestUtils);
dart.setLibraryUri(html$._HttpRequestUtils, "dart:html");
const _array = dart.privateName(html$, "_array");
const _current$2 = dart.privateName(html$, "_current");
const _is_FixedSizeListIterator_default = Symbol('_is_FixedSizeListIterator_default');
html$.FixedSizeListIterator$ = dart.generic(T => {
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  class FixedSizeListIterator extends core.Object {
    moveNext() {
      let nextPosition = dart.notNull(this[_position$1]) + 1;
      if (nextPosition < dart.notNull(this[_length$2])) {
        this[_current$2] = this[_array][$_get](nextPosition);
        this[_position$1] = nextPosition;
        return true;
      }
      this[_current$2] = null;
      this[_position$1] = this[_length$2];
      return false;
    }
    get current() {
      return this[_current$2];
    }
  }
  (FixedSizeListIterator.new = function(array) {
    this[_current$2] = null;
    this[_array] = array;
    this[_position$1] = -1;
    this[_length$2] = array[$length];
  }).prototype = FixedSizeListIterator.prototype;
  dart.addTypeTests(FixedSizeListIterator);
  FixedSizeListIterator.prototype[_is_FixedSizeListIterator_default] = true;
  FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setMethodSignature(FixedSizeListIterator, () => ({
    __proto__: dart.getMethods(FixedSizeListIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(FixedSizeListIterator, () => ({
    __proto__: dart.getGetters(FixedSizeListIterator.__proto__),
    current: T
  }));
  dart.setLibraryUri(FixedSizeListIterator, "dart:html");
  dart.setFieldSignature(FixedSizeListIterator, () => ({
    __proto__: dart.getFields(FixedSizeListIterator.__proto__),
    [_array]: dart.finalFieldType(ListOfT()),
    [_length$2]: dart.finalFieldType(core.int),
    [_position$1]: dart.fieldType(core.int),
    [_current$2]: dart.fieldType(T)
  }));
  return FixedSizeListIterator;
});
html$.FixedSizeListIterator = html$.FixedSizeListIterator$();
dart.addTypeTests(html$.FixedSizeListIterator, _is_FixedSizeListIterator_default);
const _is__VariableSizeListIterator_default = Symbol('_is__VariableSizeListIterator_default');
html$._VariableSizeListIterator$ = dart.generic(T => {
  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
  class _VariableSizeListIterator extends core.Object {
    moveNext() {
      let nextPosition = dart.notNull(this[_position$1]) + 1;
      if (nextPosition < dart.notNull(this[_array][$length])) {
        this[_current$2] = this[_array][$_get](nextPosition);
        this[_position$1] = nextPosition;
        return true;
      }
      this[_current$2] = null;
      this[_position$1] = this[_array][$length];
      return false;
    }
    get current() {
      return this[_current$2];
    }
  }
  (_VariableSizeListIterator.new = function(array) {
    this[_current$2] = null;
    this[_array] = array;
    this[_position$1] = -1;
  }).prototype = _VariableSizeListIterator.prototype;
  dart.addTypeTests(_VariableSizeListIterator);
  _VariableSizeListIterator.prototype[_is__VariableSizeListIterator_default] = true;
  _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setMethodSignature(_VariableSizeListIterator, () => ({
    __proto__: dart.getMethods(_VariableSizeListIterator.__proto__),
    moveNext: dart.fnType(core.bool, [])
  }));
  dart.setGetterSignature(_VariableSizeListIterator, () => ({
    __proto__: dart.getGetters(_VariableSizeListIterator.__proto__),
    current: T
  }));
  dart.setLibraryUri(_VariableSizeListIterator, "dart:html");
  dart.setFieldSignature(_VariableSizeListIterator, () => ({
    __proto__: dart.getFields(_VariableSizeListIterator.__proto__),
    [_array]: dart.finalFieldType(ListOfT()),
    [_position$1]: dart.fieldType(core.int),
    [_current$2]: dart.fieldType(T)
  }));
  return _VariableSizeListIterator;
});
html$._VariableSizeListIterator = html$._VariableSizeListIterator$();
dart.addTypeTests(html$._VariableSizeListIterator, _is__VariableSizeListIterator_default);
const _isConsoleDefined = dart.privateName(html$, "_isConsoleDefined");
html$.Console = class Console extends core.Object {
  get [_isConsoleDefined]() {
    return typeof console != "undefined";
  }
  get memory() {
    return dart.test(this[_isConsoleDefined]) ? window.console.memory : null;
  }
  assertCondition(condition, arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.assertCondition(condition, arg) : null;
  }
  clear(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.clear(arg) : null;
  }
  count(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.count(arg) : null;
  }
  debug(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.debug(arg) : null;
  }
  dir(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.dir(arg) : null;
  }
  dirxml(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.dirxml(arg) : null;
  }
  error(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.error(arg) : null;
  }
  group(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.group(arg) : null;
  }
  groupCollapsed(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.groupCollapsed(arg) : null;
  }
  groupEnd() {
    return dart.test(this[_isConsoleDefined]) ? window.console.groupEnd() : null;
  }
  info(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.info(arg) : null;
  }
  log(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.log(arg) : null;
  }
  markTimeline(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.markTimeline(arg) : null;
  }
  profile(title) {
    return dart.test(this[_isConsoleDefined]) ? window.console.profile(title) : null;
  }
  profileEnd(title) {
    return dart.test(this[_isConsoleDefined]) ? window.console.profileEnd(title) : null;
  }
  table(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.table(arg) : null;
  }
  time(title) {
    return dart.test(this[_isConsoleDefined]) ? window.console.time(title) : null;
  }
  timeEnd(title) {
    return dart.test(this[_isConsoleDefined]) ? window.console.timeEnd(title) : null;
  }
  timeStamp(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.timeStamp(arg) : null;
  }
  trace(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.trace(arg) : null;
  }
  warn(arg) {
    return dart.test(this[_isConsoleDefined]) ? window.console.warn(arg) : null;
  }
};
(html$.Console._safe = function() {
}).prototype = html$.Console.prototype;
dart.addTypeTests(html$.Console);
dart.setMethodSignature(html$.Console, () => ({
  __proto__: dart.getMethods(html$.Console.__proto__),
  assertCondition: dart.fnType(dart.void, [core.bool, core.Object]),
  clear: dart.fnType(dart.void, [core.Object]),
  count: dart.fnType(dart.void, [core.Object]),
  debug: dart.fnType(dart.void, [core.Object]),
  dir: dart.fnType(dart.void, [core.Object]),
  dirxml: dart.fnType(dart.void, [core.Object]),
  error: dart.fnType(dart.void, [core.Object]),
  group: dart.fnType(dart.void, [core.Object]),
  groupCollapsed: dart.fnType(dart.void, [core.Object]),
  groupEnd: dart.fnType(dart.void, []),
  info: dart.fnType(dart.void, [core.Object]),
  log: dart.fnType(dart.void, [core.Object]),
  markTimeline: dart.fnType(dart.void, [core.Object]),
  profile: dart.fnType(dart.void, [core.String]),
  profileEnd: dart.fnType(dart.void, [core.String]),
  table: dart.fnType(dart.void, [core.Object]),
  time: dart.fnType(dart.void, [core.String]),
  timeEnd: dart.fnType(dart.void, [core.String]),
  timeStamp: dart.fnType(dart.void, [core.Object]),
  trace: dart.fnType(dart.void, [core.Object]),
  warn: dart.fnType(dart.void, [core.Object])
}));
dart.setGetterSignature(html$.Console, () => ({
  __proto__: dart.getGetters(html$.Console.__proto__),
  [_isConsoleDefined]: core.bool,
  memory: html$.MemoryInfo
}));
dart.setLibraryUri(html$.Console, "dart:html");
dart.defineLazy(html$.Console, {
  /*html$.Console._safeConsole*/get _safeConsole() {
    return dart.const(new html$.Console._safe());
  }
});
html$._convertNativeToDart_Window = function(win) {
  if (win == null) return null;
  return html$._DOMWindowCrossFrame._createSafe(win);
};
html$._convertNativeToDart_EventTarget = function(e) {
  if (e == null) {
    return null;
  }
  if ("postMessage" in e) {
    let window = html$._DOMWindowCrossFrame._createSafe(e);
    if (html$.EventTarget.is(window)) {
      return window;
    }
    return null;
  } else
    return html$.EventTarget._check(e);
};
const _window = dart.privateName(html$, "_window");
html$._convertDartToNative_EventTarget = function(e) {
  if (html$._DOMWindowCrossFrame.is(e)) {
    return html$.EventTarget._check(e[_window]);
  } else {
    return html$.EventTarget._check(e);
  }
};
html$._convertNativeToDart_XHR_Response = function(o) {
  if (html$.Document.is(o)) {
    return o;
  }
  return html_common.convertNativeToDart_SerializedScriptValue(o);
};
html$._callConstructor = function(constructor, interceptor) {
  return dart.fn(receiver => {
    _js_helper.setNativeSubclassDispatchRecord(receiver, interceptor);
    receiver.constructor = receiver.__proto__.constructor;
    return constructor(receiver);
  }, dynamicTodynamic());
};
html$._callAttached = function(receiver) {
  return dart.dsend(receiver, 'attached', []);
};
html$._callDetached = function(receiver) {
  return dart.dsend(receiver, 'detached', []);
};
html$._callAttributeChanged = function(receiver, name, oldValue, newValue) {
  return dart.dsend(receiver, 'attributeChanged', [name, oldValue, newValue]);
};
html$._makeCallbackMethod = function(callback) {
  return (function(invokeCallback) {
    return function() {
      return invokeCallback(this);
    };
  })(_js_helper.convertDartClosureToJS(dart.dynamic, callback, 1));
};
html$._makeCallbackMethod3 = function(callback) {
  return (function(invokeCallback) {
    return function(arg1, arg2, arg3) {
      return invokeCallback(this, arg1, arg2, arg3);
    };
  })(_js_helper.convertDartClosureToJS(dart.dynamic, callback, 4));
};
html$._checkExtendsNativeClassOrTemplate = function(element, extendsTag, baseClassName) {
  if (!(element instanceof window[baseClassName]) && !(extendsTag === "template" && element instanceof window.HTMLUnknownElement)) {
    dart.throw(new core.UnsupportedError.new("extendsTag does not match base native class"));
  }
};
html$._registerCustomElement = function(context, document, tag, options) {
  if (options === void 0) options = null;
  let extendsTagName = "";
  let type = null;
  if (options != null) {
    extendsTagName = core.String._check(options[$_get]("extends"));
    type = core.Type._check(options[$_get]("prototype"));
  }
  let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
  if (interceptorClass == null) {
    dart.throw(new core.ArgumentError.new(type));
  }
  let interceptor = interceptorClass.prototype;
  let constructor = _interceptors.findConstructorForNativeSubclassType(type, "created");
  if (constructor == null) {
    dart.throw(new core.ArgumentError.new(dart.str(type) + " has no constructor called 'created'"));
  }
  _interceptors.getNativeInterceptor(html$.Element.tag("article"));
  let baseClassName = core.String._check(_js_helper.findDispatchTagForInterceptorClass(interceptorClass));
  if (baseClassName == null) {
    dart.throw(new core.ArgumentError.new(type));
  }
  if (extendsTagName == null) {
    if (baseClassName !== "HTMLElement") {
      dart.throw(new core.UnsupportedError.new("Class must provide extendsTag if base " + "native class is not HtmlElement"));
    }
  } else {
    let element = dart.dsend(document, 'createElement', [extendsTagName]);
    html$._checkExtendsNativeClassOrTemplate(html$.Element._check(element), extendsTagName, baseClassName);
  }
  let baseConstructor = context[baseClassName];
  let properties = {};
  properties.createdCallback = {value: html$._makeCallbackMethod(html$._callConstructor(constructor, interceptor))};
  properties.attachedCallback = {value: html$._makeCallbackMethod(html$._callAttached)};
  properties.detachedCallback = {value: html$._makeCallbackMethod(html$._callDetached)};
  properties.attributeChangedCallback = {value: html$._makeCallbackMethod3(html$._callAttributeChanged)};
  let baseProto = baseConstructor.prototype;
  let proto = Object.create(baseProto, properties);
  _js_helper.setNativeSubclassDispatchRecord(proto, interceptor);
  let opts = {prototype: proto};
  if (extendsTagName != null) {
    opts.extends = extendsTagName;
  }
  return document.registerElement(tag, opts);
};
html$._initializeCustomElement = function(e) {
};
const _interceptor = dart.privateName(html$, "_interceptor");
const _constructor = dart.privateName(html$, "_constructor");
const _nativeType = dart.privateName(html$, "_nativeType");
html$._JSElementUpgrader = class _JSElementUpgrader extends core.Object {
  upgrade(element) {
    if (!dart.equals(dart.runtimeType(element), this[_nativeType])) {
      if (!dart.equals(this[_nativeType], dart.wrapType(html$.HtmlElement)) || !dart.equals(dart.runtimeType(element), dart.wrapType(html$.UnknownElement))) {
        dart.throw(new core.ArgumentError.new("element is not subclass of " + dart.str(this[_nativeType])));
      }
    }
    _js_helper.setNativeSubclassDispatchRecord(element, this[_interceptor]);
    this[_constructor](element);
    return element;
  }
};
(html$._JSElementUpgrader.new = function(document, type, extendsTag) {
  this[_interceptor] = null;
  this[_constructor] = null;
  this[_nativeType] = null;
  let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
  if (interceptorClass == null) {
    dart.throw(new core.ArgumentError.new(type));
  }
  this[_constructor] = _interceptors.findConstructorForNativeSubclassType(type, "created");
  if (this[_constructor] == null) {
    dart.throw(new core.ArgumentError.new(dart.str(type) + " has no constructor called 'created'"));
  }
  _interceptors.getNativeInterceptor(html$.Element.tag("article"));
  let baseClassName = _js_helper.findDispatchTagForInterceptorClass(interceptorClass);
  if (baseClassName == null) {
    dart.throw(new core.ArgumentError.new(type));
  }
  if (extendsTag == null) {
    if (!dart.equals(baseClassName, "HTMLElement")) {
      dart.throw(new core.UnsupportedError.new("Class must provide extendsTag if base " + "native class is not HtmlElement"));
    }
    this[_nativeType] = dart.wrapType(html$.HtmlElement);
  } else {
    let element = document[$createElement](extendsTag);
    html$._checkExtendsNativeClassOrTemplate(element, extendsTag, core.String._check(baseClassName));
    this[_nativeType] = dart.runtimeType(element);
  }
  this[_interceptor] = interceptorClass.prototype;
}).prototype = html$._JSElementUpgrader.prototype;
dart.addTypeTests(html$._JSElementUpgrader);
html$._JSElementUpgrader[dart.implements] = () => [html$.ElementUpgrader];
dart.setMethodSignature(html$._JSElementUpgrader, () => ({
  __proto__: dart.getMethods(html$._JSElementUpgrader.__proto__),
  upgrade: dart.fnType(html$.Element, [html$.Element])
}));
dart.setLibraryUri(html$._JSElementUpgrader, "dart:html");
dart.setFieldSignature(html$._JSElementUpgrader, () => ({
  __proto__: dart.getFields(html$._JSElementUpgrader.__proto__),
  [_interceptor]: dart.fieldType(dart.dynamic),
  [_constructor]: dart.fieldType(dart.dynamic),
  [_nativeType]: dart.fieldType(dart.dynamic)
}));
html$._DOMWindowCrossFrame = class _DOMWindowCrossFrame extends core.Object {
  get history() {
    return html$._HistoryCrossFrame._createSafe(this[_window].history);
  }
  get location() {
    return html$._LocationCrossFrame._createSafe(this[_window].location);
  }
  get closed() {
    return this[_window].closed;
  }
  get opener() {
    return html$._DOMWindowCrossFrame._createSafe(this[_window].opener);
  }
  get parent() {
    return html$._DOMWindowCrossFrame._createSafe(this[_window].parent);
  }
  get top() {
    return html$._DOMWindowCrossFrame._createSafe(this[_window].top);
  }
  close() {
    return this[_window].close();
  }
  postMessage(message, targetOrigin, messagePorts) {
    if (messagePorts === void 0) messagePorts = null;
    if (messagePorts == null) {
      this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin);
    } else {
      this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
    }
  }
  static _createSafe(w) {
    if (core.identical(w, html$.window)) {
      return html$.WindowBase._check(w);
    } else {
      _js_helper.registerGlobalObject(w);
      return new html$._DOMWindowCrossFrame.new(w);
    }
  }
  get on() {
    return dart.throw(new core.UnsupportedError.new("You can only attach EventListeners to your own window."));
  }
  [_addEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    return dart.throw(new core.UnsupportedError.new("You can only attach EventListeners to your own window."));
  }
  addEventListener(type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    return dart.throw(new core.UnsupportedError.new("You can only attach EventListeners to your own window."));
  }
  dispatchEvent(event) {
    return dart.throw(new core.UnsupportedError.new("You can only attach EventListeners to your own window."));
  }
  [_removeEventListener](type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    return dart.throw(new core.UnsupportedError.new("You can only attach EventListeners to your own window."));
  }
  removeEventListener(type, listener, useCapture) {
    if (useCapture === void 0) useCapture = null;
    return dart.throw(new core.UnsupportedError.new("You can only attach EventListeners to your own window."));
  }
};
(html$._DOMWindowCrossFrame.new = function(window) {
  this[_window] = window;
}).prototype = html$._DOMWindowCrossFrame.prototype;
dart.addTypeTests(html$._DOMWindowCrossFrame);
html$._DOMWindowCrossFrame[dart.implements] = () => [html$.WindowBase];
dart.setMethodSignature(html$._DOMWindowCrossFrame, () => ({
  __proto__: dart.getMethods(html$._DOMWindowCrossFrame.__proto__),
  close: dart.fnType(dart.void, []),
  [$close]: dart.fnType(dart.void, []),
  postMessage: dart.fnType(dart.void, [dart.dynamic, core.String], [core.List]),
  [$postMessage]: dart.fnType(dart.void, [dart.dynamic, core.String], [core.List]),
  [_addEventListener]: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool]),
  addEventListener: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool]),
  [$addEventListener]: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool]),
  dispatchEvent: dart.fnType(core.bool, [html$.Event]),
  [$dispatchEvent]: dart.fnType(core.bool, [html$.Event]),
  [_removeEventListener]: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool]),
  removeEventListener: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool]),
  [$removeEventListener]: dart.fnType(dart.void, [core.String, dart.fnType(dart.dynamic, [html$.Event])], [core.bool])
}));
dart.setGetterSignature(html$._DOMWindowCrossFrame, () => ({
  __proto__: dart.getGetters(html$._DOMWindowCrossFrame.__proto__),
  history: html$.HistoryBase,
  [$history]: html$.HistoryBase,
  location: html$.LocationBase,
  [$location]: html$.LocationBase,
  closed: core.bool,
  [$closed]: core.bool,
  opener: html$.WindowBase,
  [$opener]: html$.WindowBase,
  parent: html$.WindowBase,
  [$parent]: html$.WindowBase,
  top: html$.WindowBase,
  [$top]: html$.WindowBase,
  on: html$.Events,
  [$on]: html$.Events
}));
dart.setLibraryUri(html$._DOMWindowCrossFrame, "dart:html");
dart.setFieldSignature(html$._DOMWindowCrossFrame, () => ({
  __proto__: dart.getFields(html$._DOMWindowCrossFrame.__proto__),
  [_window]: dart.finalFieldType(dart.dynamic)
}));
dart.defineExtensionMethods(html$._DOMWindowCrossFrame, [
  'close',
  'postMessage',
  'addEventListener',
  'dispatchEvent',
  'removeEventListener'
]);
dart.defineExtensionAccessors(html$._DOMWindowCrossFrame, [
  'history',
  'location',
  'closed',
  'opener',
  'parent',
  'top',
  'on'
]);
html$._LocationCrossFrame = class _LocationCrossFrame extends core.Object {
  set href(val) {
    return html$._LocationCrossFrame._setHref(this[_location], val);
  }
  static _setHref(location, val) {
    location.href = val;
  }
  static _createSafe(location) {
    if (core.identical(location, html$.window[$location])) {
      return html$.LocationBase._check(location);
    } else {
      return new html$._LocationCrossFrame.new(location);
    }
  }
};
(html$._LocationCrossFrame.new = function(location) {
  this[_location] = location;
}).prototype = html$._LocationCrossFrame.prototype;
dart.addTypeTests(html$._LocationCrossFrame);
html$._LocationCrossFrame[dart.implements] = () => [html$.LocationBase];
dart.setSetterSignature(html$._LocationCrossFrame, () => ({
  __proto__: dart.getSetters(html$._LocationCrossFrame.__proto__),
  href: core.String,
  [$href]: core.String
}));
dart.setLibraryUri(html$._LocationCrossFrame, "dart:html");
dart.setFieldSignature(html$._LocationCrossFrame, () => ({
  __proto__: dart.getFields(html$._LocationCrossFrame.__proto__),
  [_location]: dart.fieldType(dart.dynamic)
}));
dart.defineExtensionAccessors(html$._LocationCrossFrame, ['href']);
const _history = dart.privateName(html$, "_history");
html$._HistoryCrossFrame = class _HistoryCrossFrame extends core.Object {
  back() {
    return this[_history].back();
  }
  forward() {
    return this[_history].forward();
  }
  go(distance) {
    return this[_history].go(distance);
  }
  static _createSafe(h) {
    if (core.identical(h, html$.window.history)) {
      return html$.HistoryBase._check(h);
    } else {
      return new html$._HistoryCrossFrame.new(h);
    }
  }
};
(html$._HistoryCrossFrame.new = function(history) {
  this[_history] = history;
}).prototype = html$._HistoryCrossFrame.prototype;
dart.addTypeTests(html$._HistoryCrossFrame);
html$._HistoryCrossFrame[dart.implements] = () => [html$.HistoryBase];
dart.setMethodSignature(html$._HistoryCrossFrame, () => ({
  __proto__: dart.getMethods(html$._HistoryCrossFrame.__proto__),
  back: dart.fnType(dart.void, []),
  [$back]: dart.fnType(dart.void, []),
  forward: dart.fnType(dart.void, []),
  [$forward]: dart.fnType(dart.void, []),
  go: dart.fnType(dart.void, [core.int]),
  [$go]: dart.fnType(dart.void, [core.int])
}));
dart.setLibraryUri(html$._HistoryCrossFrame, "dart:html");
dart.setFieldSignature(html$._HistoryCrossFrame, () => ({
  __proto__: dart.getFields(html$._HistoryCrossFrame.__proto__),
  [_history]: dart.fieldType(dart.dynamic)
}));
dart.defineExtensionMethods(html$._HistoryCrossFrame, ['back', 'forward', 'go']);
html$.Platform = class Platform extends core.Object {};
(html$.Platform.new = function() {
}).prototype = html$.Platform.prototype;
dart.addTypeTests(html$.Platform);
dart.setLibraryUri(html$.Platform, "dart:html");
dart.defineLazy(html$.Platform, {
  /*html$.Platform.supportsTypedData*/get supportsTypedData() {
    return !!window.ArrayBuffer;
  },
  /*html$.Platform.supportsSimd*/get supportsSimd() {
    return false;
  }
});
html$._wrapZone = function(T, callback) {
  if (dart.equals(async.Zone.current, async.Zone.root)) return callback;
  if (callback == null) return null;
  return async.Zone.current.bindUnaryCallbackGuarded(T, callback);
};
html$._wrapBinaryZone = function(T1, T2, callback) {
  if (dart.equals(async.Zone.current, async.Zone.root)) return callback;
  if (callback == null) return null;
  return async.Zone.current.bindBinaryCallbackGuarded(T1, T2, callback);
};
html$.querySelector = function(selectors) {
  return html$.document.querySelector(selectors);
};
html$.querySelectorAll = function(T, selectors) {
  return html$.document[$querySelectorAll](T, selectors);
};
html$.ElementUpgrader = class ElementUpgrader extends core.Object {};
(html$.ElementUpgrader.new = function() {
}).prototype = html$.ElementUpgrader.prototype;
dart.addTypeTests(html$.ElementUpgrader);
dart.setLibraryUri(html$.ElementUpgrader, "dart:html");
html$.NodeValidator = class NodeValidator extends core.Object {
  static new(opts) {
    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
    return new html$._Html5NodeValidator.new({uriPolicy: uriPolicy});
  }
  static throws(base) {
    return new html$._ThrowsNodeValidator.new(base);
  }
};
(html$.NodeValidator[dart.mixinNew] = function() {
}).prototype = html$.NodeValidator.prototype;
dart.addTypeTests(html$.NodeValidator);
dart.setLibraryUri(html$.NodeValidator, "dart:html");
html$.NodeTreeSanitizer = class NodeTreeSanitizer extends core.Object {
  static new(validator) {
    return new html$._ValidatingTreeSanitizer.new(validator);
  }
};
(html$.NodeTreeSanitizer[dart.mixinNew] = function() {
}).prototype = html$.NodeTreeSanitizer.prototype;
dart.addTypeTests(html$.NodeTreeSanitizer);
dart.setLibraryUri(html$.NodeTreeSanitizer, "dart:html");
dart.defineLazy(html$.NodeTreeSanitizer, {
  /*html$.NodeTreeSanitizer.trusted*/get trusted() {
    return dart.const(new html$._TrustedHtmlTreeSanitizer.new());
  }
});
html$._TrustedHtmlTreeSanitizer = class _TrustedHtmlTreeSanitizer extends core.Object {
  sanitizeTree(node) {}
};
(html$._TrustedHtmlTreeSanitizer.new = function() {
}).prototype = html$._TrustedHtmlTreeSanitizer.prototype;
dart.addTypeTests(html$._TrustedHtmlTreeSanitizer);
html$._TrustedHtmlTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
dart.setMethodSignature(html$._TrustedHtmlTreeSanitizer, () => ({
  __proto__: dart.getMethods(html$._TrustedHtmlTreeSanitizer.__proto__),
  sanitizeTree: dart.fnType(dart.void, [html$.Node])
}));
dart.setLibraryUri(html$._TrustedHtmlTreeSanitizer, "dart:html");
html$.UriPolicy = class UriPolicy extends core.Object {
  static new() {
    return new html$._SameOriginUriPolicy.new();
  }
};
(html$.UriPolicy[dart.mixinNew] = function() {
}).prototype = html$.UriPolicy.prototype;
dart.addTypeTests(html$.UriPolicy);
dart.setLibraryUri(html$.UriPolicy, "dart:html");
const _hiddenAnchor = dart.privateName(html$, "_hiddenAnchor");
const _loc = dart.privateName(html$, "_loc");
html$._SameOriginUriPolicy = class _SameOriginUriPolicy extends core.Object {
  allowsUri(uri) {
    this[_hiddenAnchor].href = uri;
    return this[_hiddenAnchor].hostname == this[_loc].hostname && this[_hiddenAnchor].port == this[_loc].port && this[_hiddenAnchor].protocol == this[_loc].protocol || this[_hiddenAnchor].hostname === "" && this[_hiddenAnchor].port === "" && (this[_hiddenAnchor].protocol === ":" || this[_hiddenAnchor].protocol === "");
  }
};
(html$._SameOriginUriPolicy.new = function() {
  this[_hiddenAnchor] = html$.AnchorElement.new();
  this[_loc] = html$.window[$location];
}).prototype = html$._SameOriginUriPolicy.prototype;
dart.addTypeTests(html$._SameOriginUriPolicy);
html$._SameOriginUriPolicy[dart.implements] = () => [html$.UriPolicy];
dart.setMethodSignature(html$._SameOriginUriPolicy, () => ({
  __proto__: dart.getMethods(html$._SameOriginUriPolicy.__proto__),
  allowsUri: dart.fnType(core.bool, [core.String])
}));
dart.setLibraryUri(html$._SameOriginUriPolicy, "dart:html");
dart.setFieldSignature(html$._SameOriginUriPolicy, () => ({
  __proto__: dart.getFields(html$._SameOriginUriPolicy.__proto__),
  [_hiddenAnchor]: dart.finalFieldType(html$.AnchorElement),
  [_loc]: dart.finalFieldType(html$.Location)
}));
html$._ThrowsNodeValidator = class _ThrowsNodeValidator extends core.Object {
  allowsElement(element) {
    if (!dart.test(this.validator.allowsElement(element))) {
      dart.throw(new core.ArgumentError.new(html$.Element._safeTagName(element)));
    }
    return true;
  }
  allowsAttribute(element, attributeName, value) {
    if (!dart.test(this.validator.allowsAttribute(element, attributeName, value))) {
      dart.throw(new core.ArgumentError.new(dart.str(html$.Element._safeTagName(element)) + "[" + dart.str(attributeName) + "=\"" + dart.str(value) + "\"]"));
    }
  }
};
(html$._ThrowsNodeValidator.new = function(validator) {
  this.validator = validator;
}).prototype = html$._ThrowsNodeValidator.prototype;
dart.addTypeTests(html$._ThrowsNodeValidator);
html$._ThrowsNodeValidator[dart.implements] = () => [html$.NodeValidator];
dart.setMethodSignature(html$._ThrowsNodeValidator, () => ({
  __proto__: dart.getMethods(html$._ThrowsNodeValidator.__proto__),
  allowsElement: dart.fnType(core.bool, [html$.Element]),
  allowsAttribute: dart.fnType(core.bool, [html$.Element, core.String, core.String])
}));
dart.setLibraryUri(html$._ThrowsNodeValidator, "dart:html");
dart.setFieldSignature(html$._ThrowsNodeValidator, () => ({
  __proto__: dart.getFields(html$._ThrowsNodeValidator.__proto__),
  validator: dart.finalFieldType(html$.NodeValidator)
}));
const _removeNode = dart.privateName(html$, "_removeNode");
const _sanitizeElement = dart.privateName(html$, "_sanitizeElement");
const _sanitizeUntrustedElement = dart.privateName(html$, "_sanitizeUntrustedElement");
html$._ValidatingTreeSanitizer = class _ValidatingTreeSanitizer extends core.Object {
  sanitizeTree(node) {
    const walk = (node, parent) => {
      this.sanitizeNode(node, parent);
      let child = node.lastChild;
      while (null != child) {
        let nextChild = null;
        try {
          nextChild = child[$previousNode];
        } catch (e$) {
          let e = dart.getThrown(e$);
          this[_removeNode](child, node);
          child = null;
          nextChild = node.lastChild;
        }
        if (child != null) walk(child, node);
        child = html$.Node._check(nextChild);
      }
    };
    dart.fn(walk, NodeAndNodeTovoid());
    walk(node, null);
  }
  [_removeNode](node, parent) {
    if (parent == null) {
      node[$remove]();
    } else {
      parent[_removeChild](node);
    }
  }
  [_sanitizeUntrustedElement](element, parent) {
    let corrupted = true;
    let attrs = null;
    let isAttr = null;
    try {
      attrs = dart.dload(element, 'attributes');
      isAttr = dart.dindex(attrs, "is");
      let corruptedTest1 = html$.Element._hasCorruptedAttributes(html$.Element._check(element));
      corrupted = dart.test(corruptedTest1) ? true : html$.Element._hasCorruptedAttributesAdditionalCheck(html$.Element._check(element));
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    let elementText = "element unprintable";
    try {
      elementText = dart.toString(element);
    } catch (e$0) {
      let e = dart.getThrown(e$0);
    }
    try {
      let elementTagName = html$.Element._safeTagName(element);
      this[_sanitizeElement](html$.Element._check(element), parent, corrupted, elementText, elementTagName, core.Map._check(attrs), core.String._check(isAttr));
    } catch (e$1) {
      let ex = dart.getThrown(e$1);
      if (core.ArgumentError.is(ex)) {
        dart.rethrow(e$1);
      } else {
        let e = ex;
        this[_removeNode](html$.Node._check(element), parent);
        html$.window[$console].warn("Removing corrupted element " + dart.str(elementText));
      }
    }
  }
  [_sanitizeElement](element, parent, corrupted, text, tag, attrs, isAttr) {
    if (false !== corrupted) {
      this[_removeNode](element, parent);
      html$.window[$console].warn("Removing element due to corrupted attributes on <" + dart.str(text) + ">");
      return;
    }
    if (!dart.test(this.validator.allowsElement(element))) {
      this[_removeNode](element, parent);
      html$.window[$console].warn("Removing disallowed element <" + dart.str(tag) + "> from " + dart.str(parent));
      return;
    }
    if (isAttr != null) {
      if (!dart.test(this.validator.allowsAttribute(element, "is", isAttr))) {
        this[_removeNode](element, parent);
        html$.window[$console].warn("Removing disallowed type extension " + ("<" + dart.str(tag) + " is=\"" + dart.str(isAttr) + "\">"));
        return;
      }
    }
    let keys = attrs[$keys][$toList]();
    for (let i = dart.notNull(attrs[$length]) - 1; i >= 0; --i) {
      let name = keys[$_get](i);
      if (!dart.test(this.validator.allowsAttribute(element, core.String._check(dart.dsend(name, 'toLowerCase', [])), core.String._check(attrs[$_get](name))))) {
        html$.window[$console].warn("Removing disallowed attribute " + ("<" + dart.str(tag) + " " + dart.str(name) + "=\"" + dart.str(attrs[$_get](name)) + "\">"));
        attrs[$remove](name);
      }
    }
    if (html$.TemplateElement.is(element)) {
      let template = element;
      this.sanitizeTree(template.content);
    }
  }
  sanitizeNode(node, parent) {
    switch (node.nodeType) {
      case html$.Node.ELEMENT_NODE:
      {
        this[_sanitizeUntrustedElement](node, parent);
        break;
      }
      case html$.Node.COMMENT_NODE:
      case html$.Node.DOCUMENT_FRAGMENT_NODE:
      case html$.Node.TEXT_NODE:
      case html$.Node.CDATA_SECTION_NODE:
      {
        break;
      }
      default:
      {
        this[_removeNode](node, parent);
      }
    }
  }
};
(html$._ValidatingTreeSanitizer.new = function(validator) {
  this.validator = validator;
}).prototype = html$._ValidatingTreeSanitizer.prototype;
dart.addTypeTests(html$._ValidatingTreeSanitizer);
html$._ValidatingTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
dart.setMethodSignature(html$._ValidatingTreeSanitizer, () => ({
  __proto__: dart.getMethods(html$._ValidatingTreeSanitizer.__proto__),
  sanitizeTree: dart.fnType(dart.void, [html$.Node]),
  [_removeNode]: dart.fnType(dart.void, [html$.Node, html$.Node]),
  [_sanitizeUntrustedElement]: dart.fnType(dart.void, [dart.dynamic, html$.Node]),
  [_sanitizeElement]: dart.fnType(dart.void, [html$.Element, html$.Node, core.bool, core.String, core.String, core.Map, core.String]),
  sanitizeNode: dart.fnType(dart.void, [html$.Node, html$.Node])
}));
dart.setLibraryUri(html$._ValidatingTreeSanitizer, "dart:html");
dart.setFieldSignature(html$._ValidatingTreeSanitizer, () => ({
  __proto__: dart.getFields(html$._ValidatingTreeSanitizer.__proto__),
  validator: dart.fieldType(html$.NodeValidator)
}));
html_common.convertDartToNative_SerializedScriptValue = function(value) {
  return html_common.convertDartToNative_PrepareForStructuredClone(value);
};
html_common.convertNativeToDart_SerializedScriptValue = function(object) {
  return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: true});
};
html_common._StructuredClone = class _StructuredClone extends core.Object {
  findSlot(value) {
    let length = this.values[$length];
    for (let i = 0; i < dart.notNull(length); i++) {
      if (core.identical(this.values[$_get](i), value)) return i;
    }
    this.values[$add](value);
    this.copies[$add](null);
    return length;
  }
  readSlot(i) {
    return this.copies[$_get](i);
  }
  writeSlot(i, x) {
    this.copies[$_set](i, x);
  }
  cleanupSlots() {}
  walk(e) {
    if (e == null) return e;
    if (typeof e == 'boolean') return e;
    if (typeof e == 'number') return e;
    if (typeof e == 'string') return e;
    if (core.DateTime.is(e)) {
      return html_common.convertDartToNative_DateTime(e);
    }
    if (core.RegExp.is(e)) {
      dart.throw(new core.UnimplementedError.new("structured clone of RegExp"));
    }
    if (html$.File.is(e)) return e;
    if (html$.Blob.is(e)) return e;
    if (html$.FileList.is(e)) return e;
    if (html$.ImageData.is(e)) return e;
    if (dart.test(this.cloneNotRequired(e))) return e;
    if (core.Map.is(e)) {
      let slot = this.findSlot(e);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      copy = this.newJsMap();
      this.writeSlot(slot, copy);
      e[$forEach](dart.fn((key, value) => {
        this.putIntoMap(copy, key, this.walk(value));
      }, dynamicAnddynamicToNull()));
      return copy;
    }
    if (core.List.is(e)) {
      let slot = this.findSlot(e);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      copy = this.copyList(e, slot);
      return copy;
    }
    dart.throw(new core.UnimplementedError.new("structured clone of other type"));
  }
  copyList(e, slot) {
    let i = 0;
    let length = e[$length];
    let copy = this.newJsList(length);
    this.writeSlot(slot, copy);
    for (; i < dart.notNull(length); i++) {
      copy[$_set](i, this.walk(e[$_get](i)));
    }
    return copy;
  }
  convertDartToNative_PrepareForStructuredClone(value) {
    let copy = this.walk(value);
    this.cleanupSlots();
    return copy;
  }
};
(html_common._StructuredClone.new = function() {
  this.values = [];
  this.copies = [];
}).prototype = html_common._StructuredClone.prototype;
dart.addTypeTests(html_common._StructuredClone);
dart.setMethodSignature(html_common._StructuredClone, () => ({
  __proto__: dart.getMethods(html_common._StructuredClone.__proto__),
  findSlot: dart.fnType(core.int, [dart.dynamic]),
  readSlot: dart.fnType(dart.dynamic, [core.int]),
  writeSlot: dart.fnType(dart.dynamic, [core.int, dart.dynamic]),
  cleanupSlots: dart.fnType(dart.dynamic, []),
  walk: dart.fnType(dart.dynamic, [dart.dynamic]),
  copyList: dart.fnType(core.List, [core.List, core.int]),
  convertDartToNative_PrepareForStructuredClone: dart.fnType(dart.dynamic, [dart.dynamic])
}));
dart.setLibraryUri(html_common._StructuredClone, "dart:html_common");
dart.setFieldSignature(html_common._StructuredClone, () => ({
  __proto__: dart.getFields(html_common._StructuredClone.__proto__),
  values: dart.fieldType(core.List),
  copies: dart.fieldType(core.List)
}));
html_common._AcceptStructuredClone = class _AcceptStructuredClone extends core.Object {
  findSlot(value) {
    let length = this.values[$length];
    for (let i = 0; i < dart.notNull(length); i++) {
      if (dart.test(this.identicalInJs(this.values[$_get](i), value))) return i;
    }
    this.values[$add](value);
    this.copies[$add](null);
    return length;
  }
  readSlot(i) {
    return this.copies[$_get](i);
  }
  writeSlot(i, x) {
    this.copies[$_set](i, x);
  }
  walk(e) {
    if (e == null) return e;
    if (typeof e == 'boolean') return e;
    if (typeof e == 'number') return e;
    if (typeof e == 'string') return e;
    if (dart.test(html_common.isJavaScriptDate(e))) {
      return html_common.convertNativeToDart_DateTime(e);
    }
    if (dart.test(html_common.isJavaScriptRegExp(e))) {
      dart.throw(new core.UnimplementedError.new("structured clone of RegExp"));
    }
    if (dart.test(html_common.isJavaScriptPromise(e))) {
      return html_common.convertNativePromiseToDartFuture(e);
    }
    if (dart.test(html_common.isJavaScriptSimpleObject(e))) {
      let slot = this.findSlot(e);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      copy = new _js_helper.LinkedMap.new();
      this.writeSlot(slot, copy);
      this.forEachJsField(e, dart.fn((key, value) => dart.dsetindex(copy, key, this.walk(value)), dynamicAnddynamicTodynamic()));
      return copy;
    }
    if (dart.test(html_common.isJavaScriptArray(e))) {
      let l = e;
      let slot = this.findSlot(l);
      let copy = this.readSlot(slot);
      if (copy != null) return copy;
      let length = core.int._check(dart.dload(l, 'length'));
      copy = dart.test(this.mustCopy) ? this.newDartList(length) : l;
      this.writeSlot(slot, copy);
      for (let i = 0; i < dart.notNull(length); i++) {
        dart.dsetindex(copy, i, this.walk(dart.dindex(l, i)));
      }
      return copy;
    }
    return e;
  }
  convertNativeToDart_AcceptStructuredClone(object, opts) {
    let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
    this.mustCopy = core.bool._check(mustCopy);
    let copy = this.walk(object);
    return copy;
  }
};
(html_common._AcceptStructuredClone.new = function() {
  this.values = [];
  this.copies = [];
  this.mustCopy = false;
}).prototype = html_common._AcceptStructuredClone.prototype;
dart.addTypeTests(html_common._AcceptStructuredClone);
dart.setMethodSignature(html_common._AcceptStructuredClone, () => ({
  __proto__: dart.getMethods(html_common._AcceptStructuredClone.__proto__),
  findSlot: dart.fnType(core.int, [dart.dynamic]),
  readSlot: dart.fnType(dart.dynamic, [core.int]),
  writeSlot: dart.fnType(dart.dynamic, [core.int, dart.dynamic]),
  walk: dart.fnType(dart.dynamic, [dart.dynamic]),
  convertNativeToDart_AcceptStructuredClone: dart.fnType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})
}));
dart.setLibraryUri(html_common._AcceptStructuredClone, "dart:html_common");
dart.setFieldSignature(html_common._AcceptStructuredClone, () => ({
  __proto__: dart.getFields(html_common._AcceptStructuredClone.__proto__),
  values: dart.fieldType(core.List),
  copies: dart.fieldType(core.List),
  mustCopy: dart.fieldType(core.bool)
}));
html_common.ContextAttributes = class ContextAttributes extends core.Object {
  get alpha() {
    return this[alpha$0];
  }
  set alpha(value) {
    this[alpha$0] = value;
  }
  get antialias() {
    return this[antialias$];
  }
  set antialias(value) {
    this[antialias$] = value;
  }
  get depth() {
    return this[depth$];
  }
  set depth(value) {
    this[depth$] = value;
  }
  get premultipliedAlpha() {
    return this[premultipliedAlpha$];
  }
  set premultipliedAlpha(value) {
    this[premultipliedAlpha$] = value;
  }
  get preserveDrawingBuffer() {
    return this[preserveDrawingBuffer$];
  }
  set preserveDrawingBuffer(value) {
    this[preserveDrawingBuffer$] = value;
  }
  get stencil() {
    return this[stencil$];
  }
  set stencil(value) {
    this[stencil$] = value;
  }
  get failIfMajorPerformanceCaveat() {
    return this[failIfMajorPerformanceCaveat$];
  }
  set failIfMajorPerformanceCaveat(value) {
    this[failIfMajorPerformanceCaveat$] = value;
  }
};
(html_common.ContextAttributes.new = function(alpha, antialias, depth, failIfMajorPerformanceCaveat, premultipliedAlpha, preserveDrawingBuffer, stencil) {
  this[alpha$0] = alpha;
  this[antialias$] = antialias;
  this[depth$] = depth;
  this[failIfMajorPerformanceCaveat$] = failIfMajorPerformanceCaveat;
  this[premultipliedAlpha$] = premultipliedAlpha;
  this[preserveDrawingBuffer$] = preserveDrawingBuffer;
  this[stencil$] = stencil;
}).prototype = html_common.ContextAttributes.prototype;
dart.addTypeTests(html_common.ContextAttributes);
const alpha$0 = Symbol("ContextAttributes.alpha");
const antialias$ = Symbol("ContextAttributes.antialias");
const depth$ = Symbol("ContextAttributes.depth");
const premultipliedAlpha$ = Symbol("ContextAttributes.premultipliedAlpha");
const preserveDrawingBuffer$ = Symbol("ContextAttributes.preserveDrawingBuffer");
const stencil$ = Symbol("ContextAttributes.stencil");
const failIfMajorPerformanceCaveat$ = Symbol("ContextAttributes.failIfMajorPerformanceCaveat");
dart.setLibraryUri(html_common.ContextAttributes, "dart:html_common");
dart.setFieldSignature(html_common.ContextAttributes, () => ({
  __proto__: dart.getFields(html_common.ContextAttributes.__proto__),
  alpha: dart.fieldType(core.bool),
  antialias: dart.fieldType(core.bool),
  depth: dart.fieldType(core.bool),
  premultipliedAlpha: dart.fieldType(core.bool),
  preserveDrawingBuffer: dart.fieldType(core.bool),
  stencil: dart.fieldType(core.bool),
  failIfMajorPerformanceCaveat: dart.fieldType(core.bool)
}));
html_common.convertNativeToDart_ContextAttributes = function(nativeContextAttributes) {
  return new html_common.ContextAttributes.new(nativeContextAttributes.alpha, nativeContextAttributes.antialias, nativeContextAttributes.depth, nativeContextAttributes.failIfMajorPerformanceCaveat, nativeContextAttributes.premultipliedAlpha, nativeContextAttributes.preserveDrawingBuffer, nativeContextAttributes.stencil);
};
html_common._TypedImageData = class _TypedImageData extends core.Object {
  get data() {
    return this[data$9];
  }
  set data(value) {
    super.data = value;
  }
  get height() {
    return this[height$13];
  }
  set height(value) {
    super.height = value;
  }
  get width() {
    return this[width$15];
  }
  set width(value) {
    super.width = value;
  }
};
(html_common._TypedImageData.new = function(data, height, width) {
  this[data$9] = data;
  this[height$13] = height;
  this[width$15] = width;
}).prototype = html_common._TypedImageData.prototype;
dart.addTypeTests(html_common._TypedImageData);
const data$9 = Symbol("_TypedImageData.data");
const height$13 = Symbol("_TypedImageData.height");
const width$15 = Symbol("_TypedImageData.width");
html_common._TypedImageData[dart.implements] = () => [html$.ImageData];
dart.setLibraryUri(html_common._TypedImageData, "dart:html_common");
dart.setFieldSignature(html_common._TypedImageData, () => ({
  __proto__: dart.getFields(html_common._TypedImageData.__proto__),
  data: dart.finalFieldType(typed_data.Uint8ClampedList),
  height: dart.finalFieldType(core.int),
  width: dart.finalFieldType(core.int)
}));
dart.defineExtensionAccessors(html_common._TypedImageData, ['data', 'height', 'width']);
html_common.convertNativeToDart_ImageData = function(nativeImageData) {
  0;
  if (html$.ImageData.is(nativeImageData)) {
    let data = nativeImageData.data;
    if (data.constructor === Array) {
      if (typeof CanvasPixelArray !== "undefined") {
        data.constructor = CanvasPixelArray;
        data.BYTES_PER_ELEMENT = 1;
      }
    }
    return nativeImageData;
  }
  return new html_common._TypedImageData.new(nativeImageData.data, nativeImageData.height, nativeImageData.width);
};
html_common.convertDartToNative_ImageData = function(imageData) {
  if (html_common._TypedImageData.is(imageData)) {
    return {data: imageData.data, height: imageData.height, width: imageData.width};
  }
  return imageData;
};
html_common.convertNativeToDart_Dictionary = function(object) {
  if (object == null) return null;
  let dict = new (IdentityMapOfString$dynamic()).new();
  let keys = Object.getOwnPropertyNames(object);
  for (let key of core.Iterable._check(keys)) {
    dict[$_set](core.String._check(key), object[key]);
  }
  return dict;
};
html_common.convertDartToNative_Dictionary = function(dict, postCreate) {
  if (postCreate === void 0) postCreate = null;
  if (dict == null) return null;
  let object = {};
  if (postCreate != null) {
    postCreate(object);
  }
  dict[$forEach](dart.fn((key, value) => {
    object[key] = value;
  }, dynamicAnddynamicToNull()));
  return object;
};
html_common.convertDartToNative_StringArray = function(input) {
  return input;
};
html_common.convertNativeToDart_DateTime = function(date) {
  let millisSinceEpoch = date.getTime();
  return new core.DateTime.fromMillisecondsSinceEpoch(millisSinceEpoch, {isUtc: true});
};
html_common.convertDartToNative_DateTime = function(date) {
  return new Date(date.millisecondsSinceEpoch);
};
html_common.convertDartToNative_PrepareForStructuredClone = function(value) {
  return new html_common._StructuredCloneDart2Js.new().convertDartToNative_PrepareForStructuredClone(value);
};
html_common.convertNativeToDart_AcceptStructuredClone = function(object, opts) {
  let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
  return new html_common._AcceptStructuredCloneDart2Js.new().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
};
html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
  newJsMap() {
    return {};
  }
  putIntoMap(map, key, value) {
    return map[key] = value;
  }
  newJsList(length) {
    return new Array(length);
  }
  cloneNotRequired(e) {
    return _native_typed_data.NativeByteBuffer.is(e) || _native_typed_data.NativeTypedData.is(e) || html$.MessagePort.is(e);
  }
};
(html_common._StructuredCloneDart2Js.new = function() {
  html_common._StructuredCloneDart2Js.__proto__.new.call(this);
}).prototype = html_common._StructuredCloneDart2Js.prototype;
dart.addTypeTests(html_common._StructuredCloneDart2Js);
dart.setMethodSignature(html_common._StructuredCloneDart2Js, () => ({
  __proto__: dart.getMethods(html_common._StructuredCloneDart2Js.__proto__),
  newJsMap: dart.fnType(dart.dynamic, []),
  putIntoMap: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
  newJsList: dart.fnType(core.List, [dart.dynamic]),
  cloneNotRequired: dart.fnType(core.bool, [dart.dynamic])
}));
dart.setLibraryUri(html_common._StructuredCloneDart2Js, "dart:html_common");
html_common._AcceptStructuredCloneDart2Js = class _AcceptStructuredCloneDart2Js extends html_common._AcceptStructuredClone {
  newJsList(length) {
    return new Array(length);
  }
  newDartList(length) {
    return this.newJsList(length);
  }
  identicalInJs(a, b) {
    return core.identical(a, b);
  }
  forEachJsField(object, action) {
    for (let key of Object.keys(object)) {
      action(key, object[key]);
    }
  }
};
(html_common._AcceptStructuredCloneDart2Js.new = function() {
  html_common._AcceptStructuredCloneDart2Js.__proto__.new.call(this);
}).prototype = html_common._AcceptStructuredCloneDart2Js.prototype;
dart.addTypeTests(html_common._AcceptStructuredCloneDart2Js);
dart.setMethodSignature(html_common._AcceptStructuredCloneDart2Js, () => ({
  __proto__: dart.getMethods(html_common._AcceptStructuredCloneDart2Js.__proto__),
  newJsList: dart.fnType(core.List, [dart.dynamic]),
  newDartList: dart.fnType(core.List, [dart.dynamic]),
  identicalInJs: dart.fnType(core.bool, [dart.dynamic, dart.dynamic]),
  forEachJsField: dart.fnType(dart.void, [dart.dynamic, dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic])])
}));
dart.setLibraryUri(html_common._AcceptStructuredCloneDart2Js, "dart:html_common");
html_common.isJavaScriptDate = function(value) {
  return value instanceof Date;
};
html_common.isJavaScriptRegExp = function(value) {
  return value instanceof RegExp;
};
html_common.isJavaScriptArray = function(value) {
  return value instanceof Array;
};
html_common.isJavaScriptSimpleObject = function(value) {
  let proto = Object.getPrototypeOf(value);
  return proto === Object.prototype || proto === null;
};
html_common.isImmutableJavaScriptArray = function(value) {
  return !!value.immutable$list;
};
html_common.isJavaScriptPromise = function(value) {
  return typeof Promise != "undefined" && value instanceof Promise;
};
html_common.convertNativePromiseToDartFuture = function(promise) {
  let completer = async.Completer.new();
  let then = _js_helper.convertDartClosureToJS(dynamicTovoid(), dart.fn(result => completer.complete(result), dynamicTovoid()), 1);
  let error = _js_helper.convertDartClosureToJS(dynamicTovoid(), dart.fn(result => completer.completeError(result), dynamicTovoid()), 1);
  let newPromise = promise.then(then).catch(error);
  return completer.future;
};
dart.defineLazy(html_common, {
  /*html_common._serializedScriptValue*/get _serializedScriptValue() {
    return "num|String|bool|" + "JSExtendableArray|=Object|" + "Blob|File|NativeByteBuffer|NativeTypedData|MessagePort";
  },
  /*html_common.annotation_Creates_SerializedScriptValue*/get annotation_Creates_SerializedScriptValue() {
    return dart.const(new _js_helper.Creates.new("num|String|bool|JSExtendableArray|=Object|Blob|File|NativeByteBuffer|NativeTypedData|MessagePort"));
  },
  /*html_common.annotation_Returns_SerializedScriptValue*/get annotation_Returns_SerializedScriptValue() {
    return dart.const(new _js_helper.Returns.new("num|String|bool|JSExtendableArray|=Object|Blob|File|NativeByteBuffer|NativeTypedData|MessagePort"));
  }
});
html_common.Device = class Device extends core.Object {
  static get userAgent() {
    return html$.window.navigator.userAgent;
  }
  static get isOpera() {
    if (html_common.Device._isOpera == null) {
      html_common.Device._isOpera = html_common.Device.userAgent[$contains]("Opera", 0);
    }
    return html_common.Device._isOpera;
  }
  static get isIE() {
    if (html_common.Device._isIE == null) {
      html_common.Device._isIE = !dart.test(html_common.Device.isOpera) && html_common.Device.userAgent[$contains]("Trident/", 0);
    }
    return html_common.Device._isIE;
  }
  static get isFirefox() {
    if (html_common.Device._isFirefox == null) {
      html_common.Device._isFirefox = html_common.Device.userAgent[$contains]("Firefox", 0);
    }
    return html_common.Device._isFirefox;
  }
  static get isWebKit() {
    if (html_common.Device._isWebKit == null) {
      html_common.Device._isWebKit = !dart.test(html_common.Device.isOpera) && html_common.Device.userAgent[$contains]("WebKit", 0);
    }
    return html_common.Device._isWebKit;
  }
  static get cssPrefix() {
    let prefix = html_common.Device._cachedCssPrefix;
    if (prefix != null) return prefix;
    if (dart.test(html_common.Device.isFirefox)) {
      prefix = "-moz-";
    } else if (dart.test(html_common.Device.isIE)) {
      prefix = "-ms-";
    } else if (dart.test(html_common.Device.isOpera)) {
      prefix = "-o-";
    } else {
      prefix = "-webkit-";
    }
    return html_common.Device._cachedCssPrefix = prefix;
  }
  static get propertyPrefix() {
    let prefix = html_common.Device._cachedPropertyPrefix;
    if (prefix != null) return prefix;
    if (dart.test(html_common.Device.isFirefox)) {
      prefix = "moz";
    } else if (dart.test(html_common.Device.isIE)) {
      prefix = "ms";
    } else if (dart.test(html_common.Device.isOpera)) {
      prefix = "o";
    } else {
      prefix = "webkit";
    }
    return html_common.Device._cachedPropertyPrefix = prefix;
  }
  static isEventTypeSupported(eventType) {
    try {
      let e = html$.Event.eventType(eventType, "");
      return html$.Event.is(e);
    } catch (e$) {
      let _ = dart.getThrown(e$);
    }
    return false;
  }
};
(html_common.Device.new = function() {
}).prototype = html_common.Device.prototype;
dart.addTypeTests(html_common.Device);
dart.setLibraryUri(html_common.Device, "dart:html_common");
dart.defineLazy(html_common.Device, {
  /*html_common.Device._isOpera*/get _isOpera() {
    return null;
  },
  set _isOpera(_) {},
  /*html_common.Device._isIE*/get _isIE() {
    return null;
  },
  set _isIE(_) {},
  /*html_common.Device._isFirefox*/get _isFirefox() {
    return null;
  },
  set _isFirefox(_) {},
  /*html_common.Device._isWebKit*/get _isWebKit() {
    return null;
  },
  set _isWebKit(_) {},
  /*html_common.Device._cachedCssPrefix*/get _cachedCssPrefix() {
    return null;
  },
  set _cachedCssPrefix(_) {},
  /*html_common.Device._cachedPropertyPrefix*/get _cachedPropertyPrefix() {
    return null;
  },
  set _cachedPropertyPrefix(_) {}
});
const _childNodes = dart.privateName(html_common, "_childNodes");
const _node = dart.privateName(html_common, "_node");
const _iterable$0 = dart.privateName(html_common, "_iterable");
const _filtered = dart.privateName(html_common, "_filtered");
html_common.FilteredElementList = class FilteredElementList extends collection.ListBase$(html$.Element) {
  get [_iterable$0]() {
    return IterableOfElement()._check(this[_childNodes][$where](dart.fn(n => html$.Element.is(n), NodeTobool()))[$map](html$.Element, dart.fn(n => html$.Element.as(n), NodeToElement())));
  }
  get [_filtered]() {
    return ListOfElement().from(this[_iterable$0], {growable: false});
  }
  forEach(f) {
    this[_filtered][$forEach](f);
  }
  _set(index, value) {
    html$.Element._check(value);
    this._get(index)[$replaceWith](value);
    return value;
  }
  set length(newLength) {
    let len = this.length;
    if (dart.notNull(newLength) >= dart.notNull(len)) {
      return;
    } else if (dart.notNull(newLength) < 0) {
      dart.throw(new core.ArgumentError.new("Invalid list length"));
    }
    this.removeRange(newLength, len);
  }
  add(value) {
    html$.Element._check(value);
    this[_childNodes][$add](value);
  }
  addAll(iterable) {
    IterableOfElement()._check(iterable);
    for (let element of iterable) {
      this.add(element);
    }
  }
  contains(needle) {
    if (!html$.Element.is(needle)) return false;
    let element = html$.Element._check(needle);
    return dart.equals(element.parentNode, this[_node]);
  }
  get reversed() {
    return this[_filtered][$reversed];
  }
  sort(compare) {
    if (compare === void 0) compare = null;
    dart.throw(new core.UnsupportedError.new("Cannot sort filtered list"));
  }
  setRange(start, end, iterable, skipCount) {
    IterableOfElement()._check(iterable);
    if (skipCount === void 0) skipCount = 0;
    dart.throw(new core.UnsupportedError.new("Cannot setRange on filtered list"));
  }
  fillRange(start, end, fillValue) {
    if (fillValue === void 0) fillValue = null;
    html$.Element._check(fillValue);
    dart.throw(new core.UnsupportedError.new("Cannot fillRange on filtered list"));
  }
  replaceRange(start, end, iterable) {
    IterableOfElement()._check(iterable);
    dart.throw(new core.UnsupportedError.new("Cannot replaceRange on filtered list"));
  }
  removeRange(start, end) {
    core.List.from(this[_iterable$0][$skip](start)[$take](dart.notNull(end) - dart.notNull(start)))[$forEach](dart.fn(el => dart.dsend(el, 'remove', []), dynamicTodynamic()));
  }
  clear() {
    this[_childNodes][$clear]();
  }
  removeLast() {
    let result = this[_iterable$0][$last];
    if (result != null) {
      result[$remove]();
    }
    return result;
  }
  insert(index, value) {
    html$.Element._check(value);
    if (index == this.length) {
      this.add(value);
    } else {
      let element = this[_iterable$0][$elementAt](index);
      element.parentNode.insertBefore(value, element);
    }
  }
  insertAll(index, iterable) {
    IterableOfElement()._check(iterable);
    if (index == this.length) {
      this.addAll(iterable);
    } else {
      let element = this[_iterable$0][$elementAt](index);
      element.parentNode[$insertAllBefore](iterable, element);
    }
  }
  removeAt(index) {
    let result = this._get(index);
    result[$remove]();
    return result;
  }
  remove(element) {
    if (!html$.Element.is(element)) return false;
    if (dart.test(this.contains(element))) {
      html$.Element.as(element)[$remove]();
      return true;
    } else {
      return false;
    }
  }
  get length() {
    return this[_iterable$0][$length];
  }
  _get(index) {
    return this[_iterable$0][$elementAt](index);
  }
  get iterator() {
    return this[_filtered][$iterator];
  }
  get rawList() {
    return this[_node].childNodes;
  }
};
(html_common.FilteredElementList.new = function(node) {
  this[_childNodes] = node[$nodes];
  this[_node] = node;
}).prototype = html_common.FilteredElementList.prototype;
dart.addTypeTests(html_common.FilteredElementList);
html_common.FilteredElementList[dart.implements] = () => [html_common.NodeListWrapper];
dart.setMethodSignature(html_common.FilteredElementList, () => ({
  __proto__: dart.getMethods(html_common.FilteredElementList.__proto__),
  forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.Element])]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [html$.Element])]),
  _set: dart.fnType(dart.void, [core.int, core.Object]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  add: dart.fnType(dart.void, [core.Object]),
  [$add]: dart.fnType(dart.void, [core.Object]),
  addAll: dart.fnType(dart.void, [core.Object]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  contains: dart.fnType(core.bool, [core.Object]),
  [$contains]: dart.fnType(core.bool, [core.Object]),
  sort: dart.fnType(dart.void, [], [dart.fnType(core.int, [html$.Element, html$.Element])]),
  [$sort]: dart.fnType(dart.void, [], [dart.fnType(core.int, [html$.Element, html$.Element])]),
  setRange: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
  [$setRange]: dart.fnType(dart.void, [core.int, core.int, core.Object], [core.int]),
  fillRange: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
  [$fillRange]: dart.fnType(dart.void, [core.int, core.int], [core.Object]),
  replaceRange: dart.fnType(dart.void, [core.int, core.int, core.Object]),
  [$replaceRange]: dart.fnType(dart.void, [core.int, core.int, core.Object]),
  removeRange: dart.fnType(dart.void, [core.int, core.int]),
  [$removeRange]: dart.fnType(dart.void, [core.int, core.int]),
  clear: dart.fnType(dart.void, []),
  [$clear]: dart.fnType(dart.void, []),
  removeLast: dart.fnType(html$.Element, []),
  [$removeLast]: dart.fnType(html$.Element, []),
  insert: dart.fnType(dart.void, [core.int, core.Object]),
  [$insert]: dart.fnType(dart.void, [core.int, core.Object]),
  insertAll: dart.fnType(dart.void, [core.int, core.Object]),
  [$insertAll]: dart.fnType(dart.void, [core.int, core.Object]),
  removeAt: dart.fnType(html$.Element, [core.int]),
  [$removeAt]: dart.fnType(html$.Element, [core.int]),
  remove: dart.fnType(core.bool, [core.Object]),
  [$remove]: dart.fnType(core.bool, [core.Object]),
  _get: dart.fnType(html$.Element, [core.int]),
  [$_get]: dart.fnType(html$.Element, [core.int])
}));
dart.setGetterSignature(html_common.FilteredElementList, () => ({
  __proto__: dart.getGetters(html_common.FilteredElementList.__proto__),
  [_iterable$0]: core.Iterable$(html$.Element),
  [_filtered]: core.List$(html$.Element),
  reversed: core.Iterable$(html$.Element),
  [$reversed]: core.Iterable$(html$.Element),
  length: core.int,
  [$length]: core.int,
  iterator: core.Iterator$(html$.Element),
  [$iterator]: core.Iterator$(html$.Element),
  rawList: core.List$(html$.Node)
}));
dart.setSetterSignature(html_common.FilteredElementList, () => ({
  __proto__: dart.getSetters(html_common.FilteredElementList.__proto__),
  length: core.int,
  [$length]: core.int
}));
dart.setLibraryUri(html_common.FilteredElementList, "dart:html_common");
dart.setFieldSignature(html_common.FilteredElementList, () => ({
  __proto__: dart.getFields(html_common.FilteredElementList.__proto__),
  [_node]: dart.finalFieldType(html$.Node),
  [_childNodes]: dart.finalFieldType(ListOfNode())
}));
dart.defineExtensionMethods(html_common.FilteredElementList, [
  'forEach',
  '_set',
  'add',
  'addAll',
  'contains',
  'sort',
  'setRange',
  'fillRange',
  'replaceRange',
  'removeRange',
  'clear',
  'removeLast',
  'insert',
  'insertAll',
  'removeAt',
  'remove',
  '_get'
]);
dart.defineExtensionAccessors(html_common.FilteredElementList, ['length', 'reversed', 'iterator']);
html_common.Lists = class Lists extends core.Object {
  static indexOf(a, element, startIndex, endIndex) {
    if (dart.notNull(startIndex) >= dart.notNull(a[$length])) {
      return -1;
    }
    if (dart.notNull(startIndex) < 0) {
      startIndex = 0;
    }
    for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
      if (dart.equals(a[$_get](i), element)) {
        return i;
      }
    }
    return -1;
  }
  static lastIndexOf(a, element, startIndex) {
    if (dart.notNull(startIndex) < 0) {
      return -1;
    }
    if (dart.notNull(startIndex) >= dart.notNull(a[$length])) {
      startIndex = dart.notNull(a[$length]) - 1;
    }
    for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
      if (dart.equals(a[$_get](i), element)) {
        return i;
      }
    }
    return -1;
  }
  static getRange(a, start, end, accumulator) {
    if (dart.notNull(start) < 0) dart.throw(new core.RangeError.value(start));
    if (dart.notNull(end) < dart.notNull(start)) dart.throw(new core.RangeError.value(end));
    if (dart.notNull(end) > dart.notNull(a[$length])) dart.throw(new core.RangeError.value(end));
    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
      accumulator[$add](a[$_get](i));
    }
    return accumulator;
  }
};
(html_common.Lists.new = function() {
}).prototype = html_common.Lists.prototype;
dart.addTypeTests(html_common.Lists);
dart.setLibraryUri(html_common.Lists, "dart:html_common");
html_common.NodeListWrapper = class NodeListWrapper extends core.Object {};
(html_common.NodeListWrapper.new = function() {
}).prototype = html_common.NodeListWrapper.prototype;
dart.addTypeTests(html_common.NodeListWrapper);
dart.setLibraryUri(html_common.NodeListWrapper, "dart:html_common");
svg$._SvgElementFactoryProvider = class _SvgElementFactoryProvider extends core.Object {
  static createSvgElement_tag(tag) {
    let temp = html$.document[$createElementNS]("http://www.w3.org/2000/svg", tag);
    return svg$.SvgElement._check(temp);
  }
};
(svg$._SvgElementFactoryProvider.new = function() {
}).prototype = svg$._SvgElementFactoryProvider.prototype;
dart.addTypeTests(svg$._SvgElementFactoryProvider);
dart.setLibraryUri(svg$._SvgElementFactoryProvider, "dart:svg");
const _children$ = dart.privateName(svg$, "_children");
const _svgClassName = dart.privateName(svg$, "_svgClassName");
svg$.SvgElement = class SvgElement extends html$.Element {
  static tag(tag) {
    return svg$.SvgElement._check(html$.document[$createElementNS]("http://www.w3.org/2000/svg", tag));
  }
  static svg(svg, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (validator == null && treeSanitizer == null) {
      validator = new html$.NodeValidatorBuilder.common();
      validator.allowSvg();
    }
    let match = svg$.SvgElement._START_TAG_REGEXP.firstMatch(svg);
    let parentElement = null;
    if (match != null && match.group(1)[$toLowerCase]() === "svg") {
      parentElement = html$.document.body;
    } else {
      parentElement = svg$.SvgSvgElement.new();
    }
    let fragment = dart.dsend(parentElement, 'createFragment', [svg], {validator: validator, treeSanitizer: treeSanitizer});
    return svg$.SvgElement._check(dart.dload(dart.dsend(dart.dload(fragment, 'nodes'), 'where', [dart.fn(e => svg$.SvgElement.is(e), dynamicTobool())]), 'single'));
  }
  get [$classes]() {
    return new svg$.AttributeClassSet.new(this);
  }
  set [$classes](value) {
    super[$classes] = value;
  }
  get [$children]() {
    return new html_common.FilteredElementList.new(this);
  }
  set [$children](value) {
    let children = this[$children];
    children[$clear]();
    children[$addAll](value);
  }
  get [$outerHtml]() {
    let container = html$.DivElement.new();
    let cloned = svg$.SvgElement._check(this[$clone](true));
    container[$children][$add](cloned);
    return container[$innerHtml];
  }
  get [$innerHtml]() {
    let container = html$.DivElement.new();
    let cloned = svg$.SvgElement._check(this[$clone](true));
    container[$children][$addAll](cloned[$children]);
    return container[$innerHtml];
  }
  set [$innerHtml](value) {
    this[$setInnerHtml](value);
  }
  [$createFragment](svg, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    if (treeSanitizer == null) {
      if (validator == null) {
        validator = new html$.NodeValidatorBuilder.common();
        validator.allowSvg();
      }
      treeSanitizer = html$.NodeTreeSanitizer.new(validator);
    }
    let html = "<svg version=\"1.1\">" + dart.str(svg) + "</svg>";
    let fragment = html$.document.body[$createFragment](html, {treeSanitizer: treeSanitizer});
    let svgFragment = html$.DocumentFragment.new();
    let root = fragment[$nodes][$single];
    while (root.firstChild != null) {
      svgFragment[$append](root.firstChild);
    }
    return svgFragment;
  }
  [$insertAdjacentText](where, text) {
    dart.throw(new core.UnsupportedError.new("Cannot invoke insertAdjacentText on SVG."));
  }
  [$insertAdjacentHtml](where, text, opts) {
    let validator = opts && 'validator' in opts ? opts.validator : null;
    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
    dart.throw(new core.UnsupportedError.new("Cannot invoke insertAdjacentHtml on SVG."));
  }
  [$insertAdjacentElement](where, element) {
    dart.throw(new core.UnsupportedError.new("Cannot invoke insertAdjacentElement on SVG."));
  }
  get [_children$]() {
    dart.throw(new core.UnsupportedError.new("Cannot get _children on SVG."));
  }
  get [$isContentEditable]() {
    return false;
  }
  [$click]() {
    dart.throw(new core.UnsupportedError.new("Cannot invoke click SVG."));
  }
  static isTagSupported(tag) {
    let e = svg$.SvgElement.tag(tag);
    return svg$.SvgElement.is(e) && !html$.UnknownElement.is(e);
  }
  get [_svgClassName]() {
    return this.className;
  }
  get [$ownerSvgElement]() {
    return this.ownerSVGElement;
  }
  get [$viewportElement]() {
    return this.viewportElement;
  }
  [$blur](...args) {
    return this.blur.apply(this, args);
  }
  [$focus](...args) {
    return this.focus.apply(this, args);
  }
  get [$nonce]() {
    return this.nonce;
  }
  set [$nonce](value) {
    this.nonce = value;
  }
  get [$onAbort]() {
    return svg$.SvgElement.abortEvent.forElement(this);
  }
  get [$onBlur]() {
    return svg$.SvgElement.blurEvent.forElement(this);
  }
  get [$onCanPlay]() {
    return svg$.SvgElement.canPlayEvent.forElement(this);
  }
  get [$onCanPlayThrough]() {
    return svg$.SvgElement.canPlayThroughEvent.forElement(this);
  }
  get [$onChange]() {
    return svg$.SvgElement.changeEvent.forElement(this);
  }
  get [$onClick]() {
    return svg$.SvgElement.clickEvent.forElement(this);
  }
  get [$onContextMenu]() {
    return svg$.SvgElement.contextMenuEvent.forElement(this);
  }
  get [$onDoubleClick]() {
    return svg$.SvgElement.doubleClickEvent.forElement(this);
  }
  get [$onDrag]() {
    return svg$.SvgElement.dragEvent.forElement(this);
  }
  get [$onDragEnd]() {
    return svg$.SvgElement.dragEndEvent.forElement(this);
  }
  get [$onDragEnter]() {
    return svg$.SvgElement.dragEnterEvent.forElement(this);
  }
  get [$onDragLeave]() {
    return svg$.SvgElement.dragLeaveEvent.forElement(this);
  }
  get [$onDragOver]() {
    return svg$.SvgElement.dragOverEvent.forElement(this);
  }
  get [$onDragStart]() {
    return svg$.SvgElement.dragStartEvent.forElement(this);
  }
  get [$onDrop]() {
    return svg$.SvgElement.dropEvent.forElement(this);
  }
  get [$onDurationChange]() {
    return svg$.SvgElement.durationChangeEvent.forElement(this);
  }
  get [$onEmptied]() {
    return svg$.SvgElement.emptiedEvent.forElement(this);
  }
  get [$onEnded]() {
    return svg$.SvgElement.endedEvent.forElement(this);
  }
  get [$onError]() {
    return svg$.SvgElement.errorEvent.forElement(this);
  }
  get [$onFocus]() {
    return svg$.SvgElement.focusEvent.forElement(this);
  }
  get [$onInput]() {
    return svg$.SvgElement.inputEvent.forElement(this);
  }
  get [$onInvalid]() {
    return svg$.SvgElement.invalidEvent.forElement(this);
  }
  get [$onKeyDown]() {
    return svg$.SvgElement.keyDownEvent.forElement(this);
  }
  get [$onKeyPress]() {
    return svg$.SvgElement.keyPressEvent.forElement(this);
  }
  get [$onKeyUp]() {
    return svg$.SvgElement.keyUpEvent.forElement(this);
  }
  get [$onLoad]() {
    return svg$.SvgElement.loadEvent.forElement(this);
  }
  get [$onLoadedData]() {
    return svg$.SvgElement.loadedDataEvent.forElement(this);
  }
  get [$onLoadedMetadata]() {
    return svg$.SvgElement.loadedMetadataEvent.forElement(this);
  }
  get [$onMouseDown]() {
    return svg$.SvgElement.mouseDownEvent.forElement(this);
  }
  get [$onMouseEnter]() {
    return svg$.SvgElement.mouseEnterEvent.forElement(this);
  }
  get [$onMouseLeave]() {
    return svg$.SvgElement.mouseLeaveEvent.forElement(this);
  }
  get [$onMouseMove]() {
    return svg$.SvgElement.mouseMoveEvent.forElement(this);
  }
  get [$onMouseOut]() {
    return svg$.SvgElement.mouseOutEvent.forElement(this);
  }
  get [$onMouseOver]() {
    return svg$.SvgElement.mouseOverEvent.forElement(this);
  }
  get [$onMouseUp]() {
    return svg$.SvgElement.mouseUpEvent.forElement(this);
  }
  get [$onMouseWheel]() {
    return svg$.SvgElement.mouseWheelEvent.forElement(this);
  }
  get [$onPause]() {
    return svg$.SvgElement.pauseEvent.forElement(this);
  }
  get [$onPlay]() {
    return svg$.SvgElement.playEvent.forElement(this);
  }
  get [$onPlaying]() {
    return svg$.SvgElement.playingEvent.forElement(this);
  }
  get [$onRateChange]() {
    return svg$.SvgElement.rateChangeEvent.forElement(this);
  }
  get [$onReset]() {
    return svg$.SvgElement.resetEvent.forElement(this);
  }
  get [$onResize]() {
    return svg$.SvgElement.resizeEvent.forElement(this);
  }
  get [$onScroll]() {
    return svg$.SvgElement.scrollEvent.forElement(this);
  }
  get [$onSeeked]() {
    return svg$.SvgElement.seekedEvent.forElement(this);
  }
  get [$onSeeking]() {
    return svg$.SvgElement.seekingEvent.forElement(this);
  }
  get [$onSelect]() {
    return svg$.SvgElement.selectEvent.forElement(this);
  }
  get [$onStalled]() {
    return svg$.SvgElement.stalledEvent.forElement(this);
  }
  get [$onSubmit]() {
    return svg$.SvgElement.submitEvent.forElement(this);
  }
  get [$onSuspend]() {
    return svg$.SvgElement.suspendEvent.forElement(this);
  }
  get [$onTimeUpdate]() {
    return svg$.SvgElement.timeUpdateEvent.forElement(this);
  }
  get [$onTouchCancel]() {
    return svg$.SvgElement.touchCancelEvent.forElement(this);
  }
  get [$onTouchEnd]() {
    return svg$.SvgElement.touchEndEvent.forElement(this);
  }
  get [$onTouchMove]() {
    return svg$.SvgElement.touchMoveEvent.forElement(this);
  }
  get [$onTouchStart]() {
    return svg$.SvgElement.touchStartEvent.forElement(this);
  }
  get [$onVolumeChange]() {
    return svg$.SvgElement.volumeChangeEvent.forElement(this);
  }
  get [$onWaiting]() {
    return svg$.SvgElement.waitingEvent.forElement(this);
  }
  get [$onWheel]() {
    return svg$.SvgElement.wheelEvent.forElement(this);
  }
};
(svg$.SvgElement.created = function() {
  this[ownerSvgElement] = null;
  this[viewportElement] = null;
  this[nonce$0] = null;
  svg$.SvgElement.__proto__.created.call(this);
}).prototype = svg$.SvgElement.prototype;
dart.addTypeTests(svg$.SvgElement);
const ownerSvgElement = Symbol("SvgElement.ownerSvgElement");
const viewportElement = Symbol("SvgElement.viewportElement");
const nonce$0 = Symbol("SvgElement.nonce");
svg$.SvgElement[dart.implements] = () => [html$.GlobalEventHandlers, html$.NoncedElement];
dart.setGetterSignature(svg$.SvgElement, () => ({
  __proto__: dart.getGetters(svg$.SvgElement.__proto__),
  [_children$]: html$.HtmlCollection,
  [_svgClassName]: svg$.AnimatedString
}));
dart.setLibraryUri(svg$.SvgElement, "dart:svg");
dart.setFieldSignature(svg$.SvgElement, () => ({
  __proto__: dart.getFields(svg$.SvgElement.__proto__),
  [$ownerSvgElement]: dart.finalFieldType(svg$.SvgSvgElement),
  [$viewportElement]: dart.finalFieldType(svg$.SvgElement),
  [$nonce]: dart.fieldType(core.String)
}));
dart.defineLazy(svg$.SvgElement, {
  /*svg$.SvgElement._START_TAG_REGEXP*/get _START_TAG_REGEXP() {
    return core.RegExp.new("<(\\w+)");
  },
  /*svg$.SvgElement.abortEvent*/get abortEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("abort"));
  },
  /*svg$.SvgElement.blurEvent*/get blurEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("blur"));
  },
  /*svg$.SvgElement.canPlayEvent*/get canPlayEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("canplay"));
  },
  /*svg$.SvgElement.canPlayThroughEvent*/get canPlayThroughEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("canplaythrough"));
  },
  /*svg$.SvgElement.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  },
  /*svg$.SvgElement.clickEvent*/get clickEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("click"));
  },
  /*svg$.SvgElement.contextMenuEvent*/get contextMenuEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("contextmenu"));
  },
  /*svg$.SvgElement.doubleClickEvent*/get doubleClickEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("dblclick"));
  },
  /*svg$.SvgElement.dragEvent*/get dragEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("drag"));
  },
  /*svg$.SvgElement.dragEndEvent*/get dragEndEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragend"));
  },
  /*svg$.SvgElement.dragEnterEvent*/get dragEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragenter"));
  },
  /*svg$.SvgElement.dragLeaveEvent*/get dragLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragleave"));
  },
  /*svg$.SvgElement.dragOverEvent*/get dragOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragover"));
  },
  /*svg$.SvgElement.dragStartEvent*/get dragStartEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("dragstart"));
  },
  /*svg$.SvgElement.dropEvent*/get dropEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("drop"));
  },
  /*svg$.SvgElement.durationChangeEvent*/get durationChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("durationchange"));
  },
  /*svg$.SvgElement.emptiedEvent*/get emptiedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("emptied"));
  },
  /*svg$.SvgElement.endedEvent*/get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("ended"));
  },
  /*svg$.SvgElement.errorEvent*/get errorEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("error"));
  },
  /*svg$.SvgElement.focusEvent*/get focusEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("focus"));
  },
  /*svg$.SvgElement.inputEvent*/get inputEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("input"));
  },
  /*svg$.SvgElement.invalidEvent*/get invalidEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("invalid"));
  },
  /*svg$.SvgElement.keyDownEvent*/get keyDownEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keydown"));
  },
  /*svg$.SvgElement.keyPressEvent*/get keyPressEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keypress"));
  },
  /*svg$.SvgElement.keyUpEvent*/get keyUpEvent() {
    return dart.const(new (EventStreamProviderOfKeyboardEvent()).new("keyup"));
  },
  /*svg$.SvgElement.loadEvent*/get loadEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("load"));
  },
  /*svg$.SvgElement.loadedDataEvent*/get loadedDataEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("loadeddata"));
  },
  /*svg$.SvgElement.loadedMetadataEvent*/get loadedMetadataEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("loadedmetadata"));
  },
  /*svg$.SvgElement.mouseDownEvent*/get mouseDownEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mousedown"));
  },
  /*svg$.SvgElement.mouseEnterEvent*/get mouseEnterEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseenter"));
  },
  /*svg$.SvgElement.mouseLeaveEvent*/get mouseLeaveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseleave"));
  },
  /*svg$.SvgElement.mouseMoveEvent*/get mouseMoveEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mousemove"));
  },
  /*svg$.SvgElement.mouseOutEvent*/get mouseOutEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseout"));
  },
  /*svg$.SvgElement.mouseOverEvent*/get mouseOverEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseover"));
  },
  /*svg$.SvgElement.mouseUpEvent*/get mouseUpEvent() {
    return dart.const(new (EventStreamProviderOfMouseEvent()).new("mouseup"));
  },
  /*svg$.SvgElement.mouseWheelEvent*/get mouseWheelEvent() {
    return dart.const(new (EventStreamProviderOfWheelEvent()).new("mousewheel"));
  },
  /*svg$.SvgElement.pauseEvent*/get pauseEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("pause"));
  },
  /*svg$.SvgElement.playEvent*/get playEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("play"));
  },
  /*svg$.SvgElement.playingEvent*/get playingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("playing"));
  },
  /*svg$.SvgElement.rateChangeEvent*/get rateChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("ratechange"));
  },
  /*svg$.SvgElement.resetEvent*/get resetEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("reset"));
  },
  /*svg$.SvgElement.resizeEvent*/get resizeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("resize"));
  },
  /*svg$.SvgElement.scrollEvent*/get scrollEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("scroll"));
  },
  /*svg$.SvgElement.seekedEvent*/get seekedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("seeked"));
  },
  /*svg$.SvgElement.seekingEvent*/get seekingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("seeking"));
  },
  /*svg$.SvgElement.selectEvent*/get selectEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("select"));
  },
  /*svg$.SvgElement.stalledEvent*/get stalledEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("stalled"));
  },
  /*svg$.SvgElement.submitEvent*/get submitEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("submit"));
  },
  /*svg$.SvgElement.suspendEvent*/get suspendEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("suspend"));
  },
  /*svg$.SvgElement.timeUpdateEvent*/get timeUpdateEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("timeupdate"));
  },
  /*svg$.SvgElement.touchCancelEvent*/get touchCancelEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchcancel"));
  },
  /*svg$.SvgElement.touchEndEvent*/get touchEndEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchend"));
  },
  /*svg$.SvgElement.touchMoveEvent*/get touchMoveEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchmove"));
  },
  /*svg$.SvgElement.touchStartEvent*/get touchStartEvent() {
    return dart.const(new (EventStreamProviderOfTouchEvent()).new("touchstart"));
  },
  /*svg$.SvgElement.volumeChangeEvent*/get volumeChangeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("volumechange"));
  },
  /*svg$.SvgElement.waitingEvent*/get waitingEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("waiting"));
  },
  /*svg$.SvgElement.wheelEvent*/get wheelEvent() {
    return dart.const(new (EventStreamProviderOfWheelEvent()).new("wheel"));
  }
});
dart.registerExtension("SVGElement", svg$.SvgElement);
svg$.GraphicsElement = class GraphicsElement extends svg$.SvgElement {
  get [$farthestViewportElement]() {
    return this.farthestViewportElement;
  }
  get [$nearestViewportElement]() {
    return this.nearestViewportElement;
  }
  get [$transform]() {
    return this.transform;
  }
  [$getBBox](...args) {
    return this.getBBox.apply(this, args);
  }
  [$getCtm](...args) {
    return this.getCTM.apply(this, args);
  }
  [$getScreenCtm](...args) {
    return this.getScreenCTM.apply(this, args);
  }
  get [$requiredExtensions]() {
    return this.requiredExtensions;
  }
  get [$systemLanguage]() {
    return this.systemLanguage;
  }
};
(svg$.GraphicsElement.created = function() {
  this[farthestViewportElement] = null;
  this[nearestViewportElement] = null;
  this[transform] = null;
  this[requiredExtensions] = null;
  this[systemLanguage] = null;
  svg$.GraphicsElement.__proto__.created.call(this);
}).prototype = svg$.GraphicsElement.prototype;
dart.addTypeTests(svg$.GraphicsElement);
const farthestViewportElement = Symbol("GraphicsElement.farthestViewportElement");
const nearestViewportElement = Symbol("GraphicsElement.nearestViewportElement");
const transform = Symbol("GraphicsElement.transform");
const requiredExtensions = Symbol("GraphicsElement.requiredExtensions");
const systemLanguage = Symbol("GraphicsElement.systemLanguage");
svg$.GraphicsElement[dart.implements] = () => [svg$.Tests];
dart.setMethodSignature(svg$.GraphicsElement, () => ({
  __proto__: dart.getMethods(svg$.GraphicsElement.__proto__),
  [$getBBox]: dart.fnType(svg$.Rect, []),
  [$getCtm]: dart.fnType(svg$.Matrix, []),
  [$getScreenCtm]: dart.fnType(svg$.Matrix, [])
}));
dart.setLibraryUri(svg$.GraphicsElement, "dart:svg");
dart.setFieldSignature(svg$.GraphicsElement, () => ({
  __proto__: dart.getFields(svg$.GraphicsElement.__proto__),
  [$farthestViewportElement]: dart.finalFieldType(svg$.SvgElement),
  [$nearestViewportElement]: dart.finalFieldType(svg$.SvgElement),
  [$transform]: dart.finalFieldType(svg$.AnimatedTransformList),
  [$requiredExtensions]: dart.finalFieldType(svg$.StringList),
  [$systemLanguage]: dart.finalFieldType(svg$.StringList)
}));
dart.registerExtension("SVGGraphicsElement", svg$.GraphicsElement);
svg$.AElement = class AElement extends svg$.GraphicsElement {
  static new() {
    return svg$.AElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("a"));
  }
  get [$target]() {
    return this.target;
  }
  get [$href]() {
    return this.href;
  }
};
(svg$.AElement.created = function() {
  this[target$7] = null;
  this[href$8] = null;
  svg$.AElement.__proto__.created.call(this);
}).prototype = svg$.AElement.prototype;
dart.addTypeTests(svg$.AElement);
const target$7 = Symbol("AElement.target");
const href$8 = Symbol("AElement.href");
svg$.AElement[dart.implements] = () => [svg$.UriReference];
dart.setLibraryUri(svg$.AElement, "dart:svg");
dart.setFieldSignature(svg$.AElement, () => ({
  __proto__: dart.getFields(svg$.AElement.__proto__),
  [$target]: dart.finalFieldType(svg$.AnimatedString),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.registerExtension("SVGAElement", svg$.AElement);
svg$.Angle = class Angle extends _interceptors.Interceptor {
  get [$unitType]() {
    return this.unitType;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  get [$valueAsString]() {
    return this.valueAsString;
  }
  set [$valueAsString](value) {
    this.valueAsString = value;
  }
  get [$valueInSpecifiedUnits]() {
    return this.valueInSpecifiedUnits;
  }
  set [$valueInSpecifiedUnits](value) {
    this.valueInSpecifiedUnits = value;
  }
  [$convertToSpecifiedUnits](...args) {
    return this.convertToSpecifiedUnits.apply(this, args);
  }
  [$newValueSpecifiedUnits](...args) {
    return this.newValueSpecifiedUnits.apply(this, args);
  }
};
dart.addTypeTests(svg$.Angle);
const unitType = Symbol("Angle.unitType");
const value$18 = Symbol("Angle.value");
const valueAsString = Symbol("Angle.valueAsString");
const valueInSpecifiedUnits = Symbol("Angle.valueInSpecifiedUnits");
dart.setMethodSignature(svg$.Angle, () => ({
  __proto__: dart.getMethods(svg$.Angle.__proto__),
  [$convertToSpecifiedUnits]: dart.fnType(dart.void, [core.int]),
  [$newValueSpecifiedUnits]: dart.fnType(dart.void, [core.int, core.num])
}));
dart.setLibraryUri(svg$.Angle, "dart:svg");
dart.setFieldSignature(svg$.Angle, () => ({
  __proto__: dart.getFields(svg$.Angle.__proto__),
  [$unitType]: dart.finalFieldType(core.int),
  [$value]: dart.fieldType(core.num),
  [$valueAsString]: dart.fieldType(core.String),
  [$valueInSpecifiedUnits]: dart.fieldType(core.num)
}));
dart.defineLazy(svg$.Angle, {
  /*svg$.Angle.SVG_ANGLETYPE_DEG*/get SVG_ANGLETYPE_DEG() {
    return 2;
  },
  /*svg$.Angle.SVG_ANGLETYPE_GRAD*/get SVG_ANGLETYPE_GRAD() {
    return 4;
  },
  /*svg$.Angle.SVG_ANGLETYPE_RAD*/get SVG_ANGLETYPE_RAD() {
    return 3;
  },
  /*svg$.Angle.SVG_ANGLETYPE_UNKNOWN*/get SVG_ANGLETYPE_UNKNOWN() {
    return 0;
  },
  /*svg$.Angle.SVG_ANGLETYPE_UNSPECIFIED*/get SVG_ANGLETYPE_UNSPECIFIED() {
    return 1;
  }
});
dart.registerExtension("SVGAngle", svg$.Angle);
svg$.AnimationElement = class AnimationElement extends svg$.SvgElement {
  static new() {
    return svg$.AnimationElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animation"));
  }
  get [$targetElement]() {
    return this.targetElement;
  }
  [$beginElement](...args) {
    return this.beginElement.apply(this, args);
  }
  [$beginElementAt](...args) {
    return this.beginElementAt.apply(this, args);
  }
  [$endElement](...args) {
    return this.endElement.apply(this, args);
  }
  [$endElementAt](...args) {
    return this.endElementAt.apply(this, args);
  }
  [$getCurrentTime](...args) {
    return this.getCurrentTime.apply(this, args);
  }
  [$getSimpleDuration](...args) {
    return this.getSimpleDuration.apply(this, args);
  }
  [$getStartTime](...args) {
    return this.getStartTime.apply(this, args);
  }
  get [$requiredExtensions]() {
    return this.requiredExtensions;
  }
  get [$systemLanguage]() {
    return this.systemLanguage;
  }
};
(svg$.AnimationElement.created = function() {
  this[targetElement] = null;
  this[requiredExtensions$] = null;
  this[systemLanguage$] = null;
  svg$.AnimationElement.__proto__.created.call(this);
}).prototype = svg$.AnimationElement.prototype;
dart.addTypeTests(svg$.AnimationElement);
const targetElement = Symbol("AnimationElement.targetElement");
const requiredExtensions$ = Symbol("AnimationElement.requiredExtensions");
const systemLanguage$ = Symbol("AnimationElement.systemLanguage");
svg$.AnimationElement[dart.implements] = () => [svg$.Tests];
dart.setMethodSignature(svg$.AnimationElement, () => ({
  __proto__: dart.getMethods(svg$.AnimationElement.__proto__),
  [$beginElement]: dart.fnType(dart.void, []),
  [$beginElementAt]: dart.fnType(dart.void, [core.num]),
  [$endElement]: dart.fnType(dart.void, []),
  [$endElementAt]: dart.fnType(dart.void, [core.num]),
  [$getCurrentTime]: dart.fnType(core.double, []),
  [$getSimpleDuration]: dart.fnType(core.double, []),
  [$getStartTime]: dart.fnType(core.double, [])
}));
dart.setLibraryUri(svg$.AnimationElement, "dart:svg");
dart.setFieldSignature(svg$.AnimationElement, () => ({
  __proto__: dart.getFields(svg$.AnimationElement.__proto__),
  [$targetElement]: dart.finalFieldType(svg$.SvgElement),
  [$requiredExtensions]: dart.finalFieldType(svg$.StringList),
  [$systemLanguage]: dart.finalFieldType(svg$.StringList)
}));
dart.registerExtension("SVGAnimationElement", svg$.AnimationElement);
svg$.AnimateElement = class AnimateElement extends svg$.AnimationElement {
  static new() {
    return svg$.AnimateElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animate"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("animate")) && svg$.AnimateElement.is(svg$.SvgElement.tag("animate"));
  }
};
(svg$.AnimateElement.created = function() {
  svg$.AnimateElement.__proto__.created.call(this);
}).prototype = svg$.AnimateElement.prototype;
dart.addTypeTests(svg$.AnimateElement);
dart.setLibraryUri(svg$.AnimateElement, "dart:svg");
dart.registerExtension("SVGAnimateElement", svg$.AnimateElement);
svg$.AnimateMotionElement = class AnimateMotionElement extends svg$.AnimationElement {
  static new() {
    return svg$.AnimateMotionElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateMotion"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("animateMotion")) && svg$.AnimateMotionElement.is(svg$.SvgElement.tag("animateMotion"));
  }
};
(svg$.AnimateMotionElement.created = function() {
  svg$.AnimateMotionElement.__proto__.created.call(this);
}).prototype = svg$.AnimateMotionElement.prototype;
dart.addTypeTests(svg$.AnimateMotionElement);
dart.setLibraryUri(svg$.AnimateMotionElement, "dart:svg");
dart.registerExtension("SVGAnimateMotionElement", svg$.AnimateMotionElement);
svg$.AnimateTransformElement = class AnimateTransformElement extends svg$.AnimationElement {
  static new() {
    return svg$.AnimateTransformElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateTransform"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("animateTransform")) && svg$.AnimateTransformElement.is(svg$.SvgElement.tag("animateTransform"));
  }
};
(svg$.AnimateTransformElement.created = function() {
  svg$.AnimateTransformElement.__proto__.created.call(this);
}).prototype = svg$.AnimateTransformElement.prototype;
dart.addTypeTests(svg$.AnimateTransformElement);
dart.setLibraryUri(svg$.AnimateTransformElement, "dart:svg");
dart.registerExtension("SVGAnimateTransformElement", svg$.AnimateTransformElement);
svg$.AnimatedAngle = class AnimatedAngle extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
};
dart.addTypeTests(svg$.AnimatedAngle);
const animVal = Symbol("AnimatedAngle.animVal");
const baseVal = Symbol("AnimatedAngle.baseVal");
dart.setLibraryUri(svg$.AnimatedAngle, "dart:svg");
dart.setFieldSignature(svg$.AnimatedAngle, () => ({
  __proto__: dart.getFields(svg$.AnimatedAngle.__proto__),
  [$animVal]: dart.finalFieldType(svg$.Angle),
  [$baseVal]: dart.finalFieldType(svg$.Angle)
}));
dart.registerExtension("SVGAnimatedAngle", svg$.AnimatedAngle);
svg$.AnimatedBoolean = class AnimatedBoolean extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
  set [$baseVal](value) {
    this.baseVal = value;
  }
};
dart.addTypeTests(svg$.AnimatedBoolean);
const animVal$ = Symbol("AnimatedBoolean.animVal");
const baseVal$ = Symbol("AnimatedBoolean.baseVal");
dart.setLibraryUri(svg$.AnimatedBoolean, "dart:svg");
dart.setFieldSignature(svg$.AnimatedBoolean, () => ({
  __proto__: dart.getFields(svg$.AnimatedBoolean.__proto__),
  [$animVal]: dart.finalFieldType(core.bool),
  [$baseVal]: dart.fieldType(core.bool)
}));
dart.registerExtension("SVGAnimatedBoolean", svg$.AnimatedBoolean);
svg$.AnimatedEnumeration = class AnimatedEnumeration extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
  set [$baseVal](value) {
    this.baseVal = value;
  }
};
dart.addTypeTests(svg$.AnimatedEnumeration);
const animVal$0 = Symbol("AnimatedEnumeration.animVal");
const baseVal$0 = Symbol("AnimatedEnumeration.baseVal");
dart.setLibraryUri(svg$.AnimatedEnumeration, "dart:svg");
dart.setFieldSignature(svg$.AnimatedEnumeration, () => ({
  __proto__: dart.getFields(svg$.AnimatedEnumeration.__proto__),
  [$animVal]: dart.finalFieldType(core.int),
  [$baseVal]: dart.fieldType(core.int)
}));
dart.registerExtension("SVGAnimatedEnumeration", svg$.AnimatedEnumeration);
svg$.AnimatedInteger = class AnimatedInteger extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
  set [$baseVal](value) {
    this.baseVal = value;
  }
};
dart.addTypeTests(svg$.AnimatedInteger);
const animVal$1 = Symbol("AnimatedInteger.animVal");
const baseVal$1 = Symbol("AnimatedInteger.baseVal");
dart.setLibraryUri(svg$.AnimatedInteger, "dart:svg");
dart.setFieldSignature(svg$.AnimatedInteger, () => ({
  __proto__: dart.getFields(svg$.AnimatedInteger.__proto__),
  [$animVal]: dart.finalFieldType(core.int),
  [$baseVal]: dart.fieldType(core.int)
}));
dart.registerExtension("SVGAnimatedInteger", svg$.AnimatedInteger);
svg$.AnimatedLength = class AnimatedLength extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
};
dart.addTypeTests(svg$.AnimatedLength);
const animVal$2 = Symbol("AnimatedLength.animVal");
const baseVal$2 = Symbol("AnimatedLength.baseVal");
dart.setLibraryUri(svg$.AnimatedLength, "dart:svg");
dart.setFieldSignature(svg$.AnimatedLength, () => ({
  __proto__: dart.getFields(svg$.AnimatedLength.__proto__),
  [$animVal]: dart.finalFieldType(svg$.Length),
  [$baseVal]: dart.finalFieldType(svg$.Length)
}));
dart.registerExtension("SVGAnimatedLength", svg$.AnimatedLength);
svg$.AnimatedLengthList = class AnimatedLengthList extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
};
dart.addTypeTests(svg$.AnimatedLengthList);
const animVal$3 = Symbol("AnimatedLengthList.animVal");
const baseVal$3 = Symbol("AnimatedLengthList.baseVal");
dart.setLibraryUri(svg$.AnimatedLengthList, "dart:svg");
dart.setFieldSignature(svg$.AnimatedLengthList, () => ({
  __proto__: dart.getFields(svg$.AnimatedLengthList.__proto__),
  [$animVal]: dart.finalFieldType(svg$.LengthList),
  [$baseVal]: dart.finalFieldType(svg$.LengthList)
}));
dart.registerExtension("SVGAnimatedLengthList", svg$.AnimatedLengthList);
svg$.AnimatedNumber = class AnimatedNumber extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
  set [$baseVal](value) {
    this.baseVal = value;
  }
};
dart.addTypeTests(svg$.AnimatedNumber);
const animVal$4 = Symbol("AnimatedNumber.animVal");
const baseVal$4 = Symbol("AnimatedNumber.baseVal");
dart.setLibraryUri(svg$.AnimatedNumber, "dart:svg");
dart.setFieldSignature(svg$.AnimatedNumber, () => ({
  __proto__: dart.getFields(svg$.AnimatedNumber.__proto__),
  [$animVal]: dart.finalFieldType(core.num),
  [$baseVal]: dart.fieldType(core.num)
}));
dart.registerExtension("SVGAnimatedNumber", svg$.AnimatedNumber);
svg$.AnimatedNumberList = class AnimatedNumberList extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
};
dart.addTypeTests(svg$.AnimatedNumberList);
const animVal$5 = Symbol("AnimatedNumberList.animVal");
const baseVal$5 = Symbol("AnimatedNumberList.baseVal");
dart.setLibraryUri(svg$.AnimatedNumberList, "dart:svg");
dart.setFieldSignature(svg$.AnimatedNumberList, () => ({
  __proto__: dart.getFields(svg$.AnimatedNumberList.__proto__),
  [$animVal]: dart.finalFieldType(svg$.NumberList),
  [$baseVal]: dart.finalFieldType(svg$.NumberList)
}));
dart.registerExtension("SVGAnimatedNumberList", svg$.AnimatedNumberList);
svg$.AnimatedPreserveAspectRatio = class AnimatedPreserveAspectRatio extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
};
dart.addTypeTests(svg$.AnimatedPreserveAspectRatio);
const animVal$6 = Symbol("AnimatedPreserveAspectRatio.animVal");
const baseVal$6 = Symbol("AnimatedPreserveAspectRatio.baseVal");
dart.setLibraryUri(svg$.AnimatedPreserveAspectRatio, "dart:svg");
dart.setFieldSignature(svg$.AnimatedPreserveAspectRatio, () => ({
  __proto__: dart.getFields(svg$.AnimatedPreserveAspectRatio.__proto__),
  [$animVal]: dart.finalFieldType(svg$.PreserveAspectRatio),
  [$baseVal]: dart.finalFieldType(svg$.PreserveAspectRatio)
}));
dart.registerExtension("SVGAnimatedPreserveAspectRatio", svg$.AnimatedPreserveAspectRatio);
svg$.AnimatedRect = class AnimatedRect extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
};
dart.addTypeTests(svg$.AnimatedRect);
const animVal$7 = Symbol("AnimatedRect.animVal");
const baseVal$7 = Symbol("AnimatedRect.baseVal");
dart.setLibraryUri(svg$.AnimatedRect, "dart:svg");
dart.setFieldSignature(svg$.AnimatedRect, () => ({
  __proto__: dart.getFields(svg$.AnimatedRect.__proto__),
  [$animVal]: dart.finalFieldType(svg$.Rect),
  [$baseVal]: dart.finalFieldType(svg$.Rect)
}));
dart.registerExtension("SVGAnimatedRect", svg$.AnimatedRect);
svg$.AnimatedString = class AnimatedString extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
  set [$baseVal](value) {
    this.baseVal = value;
  }
};
dart.addTypeTests(svg$.AnimatedString);
const animVal$8 = Symbol("AnimatedString.animVal");
const baseVal$8 = Symbol("AnimatedString.baseVal");
dart.setLibraryUri(svg$.AnimatedString, "dart:svg");
dart.setFieldSignature(svg$.AnimatedString, () => ({
  __proto__: dart.getFields(svg$.AnimatedString.__proto__),
  [$animVal]: dart.finalFieldType(core.String),
  [$baseVal]: dart.fieldType(core.String)
}));
dart.registerExtension("SVGAnimatedString", svg$.AnimatedString);
svg$.AnimatedTransformList = class AnimatedTransformList extends _interceptors.Interceptor {
  get [$animVal]() {
    return this.animVal;
  }
  get [$baseVal]() {
    return this.baseVal;
  }
};
dart.addTypeTests(svg$.AnimatedTransformList);
const animVal$9 = Symbol("AnimatedTransformList.animVal");
const baseVal$9 = Symbol("AnimatedTransformList.baseVal");
dart.setLibraryUri(svg$.AnimatedTransformList, "dart:svg");
dart.setFieldSignature(svg$.AnimatedTransformList, () => ({
  __proto__: dart.getFields(svg$.AnimatedTransformList.__proto__),
  [$animVal]: dart.finalFieldType(svg$.TransformList),
  [$baseVal]: dart.finalFieldType(svg$.TransformList)
}));
dart.registerExtension("SVGAnimatedTransformList", svg$.AnimatedTransformList);
svg$.GeometryElement = class GeometryElement extends svg$.GraphicsElement {
  get [$pathLength]() {
    return this.pathLength;
  }
  [$getPointAtLength](...args) {
    return this.getPointAtLength.apply(this, args);
  }
  [$getTotalLength](...args) {
    return this.getTotalLength.apply(this, args);
  }
  [$isPointInFill](...args) {
    return this.isPointInFill.apply(this, args);
  }
  [$isPointInStroke](...args) {
    return this.isPointInStroke.apply(this, args);
  }
};
(svg$.GeometryElement.created = function() {
  this[pathLength] = null;
  svg$.GeometryElement.__proto__.created.call(this);
}).prototype = svg$.GeometryElement.prototype;
dart.addTypeTests(svg$.GeometryElement);
const pathLength = Symbol("GeometryElement.pathLength");
dart.setMethodSignature(svg$.GeometryElement, () => ({
  __proto__: dart.getMethods(svg$.GeometryElement.__proto__),
  [$getPointAtLength]: dart.fnType(svg$.Point, [core.num]),
  [$getTotalLength]: dart.fnType(core.double, []),
  [$isPointInFill]: dart.fnType(core.bool, [svg$.Point]),
  [$isPointInStroke]: dart.fnType(core.bool, [svg$.Point])
}));
dart.setLibraryUri(svg$.GeometryElement, "dart:svg");
dart.setFieldSignature(svg$.GeometryElement, () => ({
  __proto__: dart.getFields(svg$.GeometryElement.__proto__),
  [$pathLength]: dart.finalFieldType(svg$.AnimatedNumber)
}));
dart.registerExtension("SVGGeometryElement", svg$.GeometryElement);
svg$.CircleElement = class CircleElement extends svg$.GeometryElement {
  static new() {
    return svg$.CircleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("circle"));
  }
  get [$cx]() {
    return this.cx;
  }
  get [$cy]() {
    return this.cy;
  }
  get [$r]() {
    return this.r;
  }
};
(svg$.CircleElement.created = function() {
  this[cx] = null;
  this[cy] = null;
  this[r] = null;
  svg$.CircleElement.__proto__.created.call(this);
}).prototype = svg$.CircleElement.prototype;
dart.addTypeTests(svg$.CircleElement);
const cx = Symbol("CircleElement.cx");
const cy = Symbol("CircleElement.cy");
const r = Symbol("CircleElement.r");
dart.setLibraryUri(svg$.CircleElement, "dart:svg");
dart.setFieldSignature(svg$.CircleElement, () => ({
  __proto__: dart.getFields(svg$.CircleElement.__proto__),
  [$cx]: dart.finalFieldType(svg$.AnimatedLength),
  [$cy]: dart.finalFieldType(svg$.AnimatedLength),
  [$r]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGCircleElement", svg$.CircleElement);
svg$.ClipPathElement = class ClipPathElement extends svg$.GraphicsElement {
  static new() {
    return svg$.ClipPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("clipPath"));
  }
  get [$clipPathUnits]() {
    return this.clipPathUnits;
  }
};
(svg$.ClipPathElement.created = function() {
  this[clipPathUnits] = null;
  svg$.ClipPathElement.__proto__.created.call(this);
}).prototype = svg$.ClipPathElement.prototype;
dart.addTypeTests(svg$.ClipPathElement);
const clipPathUnits = Symbol("ClipPathElement.clipPathUnits");
dart.setLibraryUri(svg$.ClipPathElement, "dart:svg");
dart.setFieldSignature(svg$.ClipPathElement, () => ({
  __proto__: dart.getFields(svg$.ClipPathElement.__proto__),
  [$clipPathUnits]: dart.finalFieldType(svg$.AnimatedEnumeration)
}));
dart.registerExtension("SVGClipPathElement", svg$.ClipPathElement);
svg$.DefsElement = class DefsElement extends svg$.GraphicsElement {
  static new() {
    return svg$.DefsElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("defs"));
  }
};
(svg$.DefsElement.created = function() {
  svg$.DefsElement.__proto__.created.call(this);
}).prototype = svg$.DefsElement.prototype;
dart.addTypeTests(svg$.DefsElement);
dart.setLibraryUri(svg$.DefsElement, "dart:svg");
dart.registerExtension("SVGDefsElement", svg$.DefsElement);
svg$.DescElement = class DescElement extends svg$.SvgElement {
  static new() {
    return svg$.DescElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("desc"));
  }
};
(svg$.DescElement.created = function() {
  svg$.DescElement.__proto__.created.call(this);
}).prototype = svg$.DescElement.prototype;
dart.addTypeTests(svg$.DescElement);
dart.setLibraryUri(svg$.DescElement, "dart:svg");
dart.registerExtension("SVGDescElement", svg$.DescElement);
svg$.DiscardElement = class DiscardElement extends svg$.SvgElement {};
(svg$.DiscardElement.created = function() {
  svg$.DiscardElement.__proto__.created.call(this);
}).prototype = svg$.DiscardElement.prototype;
dart.addTypeTests(svg$.DiscardElement);
dart.setLibraryUri(svg$.DiscardElement, "dart:svg");
dart.registerExtension("SVGDiscardElement", svg$.DiscardElement);
svg$.EllipseElement = class EllipseElement extends svg$.GeometryElement {
  static new() {
    return svg$.EllipseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("ellipse"));
  }
  get [$cx]() {
    return this.cx;
  }
  get [$cy]() {
    return this.cy;
  }
  get [$rx]() {
    return this.rx;
  }
  get [$ry]() {
    return this.ry;
  }
};
(svg$.EllipseElement.created = function() {
  this[cx$] = null;
  this[cy$] = null;
  this[rx] = null;
  this[ry] = null;
  svg$.EllipseElement.__proto__.created.call(this);
}).prototype = svg$.EllipseElement.prototype;
dart.addTypeTests(svg$.EllipseElement);
const cx$ = Symbol("EllipseElement.cx");
const cy$ = Symbol("EllipseElement.cy");
const rx = Symbol("EllipseElement.rx");
const ry = Symbol("EllipseElement.ry");
dart.setLibraryUri(svg$.EllipseElement, "dart:svg");
dart.setFieldSignature(svg$.EllipseElement, () => ({
  __proto__: dart.getFields(svg$.EllipseElement.__proto__),
  [$cx]: dart.finalFieldType(svg$.AnimatedLength),
  [$cy]: dart.finalFieldType(svg$.AnimatedLength),
  [$rx]: dart.finalFieldType(svg$.AnimatedLength),
  [$ry]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGEllipseElement", svg$.EllipseElement);
svg$.FEBlendElement = class FEBlendElement extends svg$.SvgElement {
  static new() {
    return svg$.FEBlendElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feBlend"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feBlend")) && svg$.FEBlendElement.is(svg$.SvgElement.tag("feBlend"));
  }
  get [$in1]() {
    return this.in1;
  }
  get [$in2]() {
    return this.in2;
  }
  get [$mode]() {
    return this.mode;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEBlendElement.created = function() {
  this[in1] = null;
  this[in2] = null;
  this[mode$4] = null;
  this[height$14] = null;
  this[result] = null;
  this[width$16] = null;
  this[x$7] = null;
  this[y$6] = null;
  svg$.FEBlendElement.__proto__.created.call(this);
}).prototype = svg$.FEBlendElement.prototype;
dart.addTypeTests(svg$.FEBlendElement);
const in1 = Symbol("FEBlendElement.in1");
const in2 = Symbol("FEBlendElement.in2");
const mode$4 = Symbol("FEBlendElement.mode");
const height$14 = Symbol("FEBlendElement.height");
const result = Symbol("FEBlendElement.result");
const width$16 = Symbol("FEBlendElement.width");
const x$7 = Symbol("FEBlendElement.x");
const y$6 = Symbol("FEBlendElement.y");
svg$.FEBlendElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEBlendElement, "dart:svg");
dart.setFieldSignature(svg$.FEBlendElement, () => ({
  __proto__: dart.getFields(svg$.FEBlendElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$in2]: dart.finalFieldType(svg$.AnimatedString),
  [$mode]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineLazy(svg$.FEBlendElement, {
  /*svg$.FEBlendElement.SVG_FEBLEND_MODE_DARKEN*/get SVG_FEBLEND_MODE_DARKEN() {
    return 4;
  },
  /*svg$.FEBlendElement.SVG_FEBLEND_MODE_LIGHTEN*/get SVG_FEBLEND_MODE_LIGHTEN() {
    return 5;
  },
  /*svg$.FEBlendElement.SVG_FEBLEND_MODE_MULTIPLY*/get SVG_FEBLEND_MODE_MULTIPLY() {
    return 2;
  },
  /*svg$.FEBlendElement.SVG_FEBLEND_MODE_NORMAL*/get SVG_FEBLEND_MODE_NORMAL() {
    return 1;
  },
  /*svg$.FEBlendElement.SVG_FEBLEND_MODE_SCREEN*/get SVG_FEBLEND_MODE_SCREEN() {
    return 3;
  },
  /*svg$.FEBlendElement.SVG_FEBLEND_MODE_UNKNOWN*/get SVG_FEBLEND_MODE_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGFEBlendElement", svg$.FEBlendElement);
svg$.FEColorMatrixElement = class FEColorMatrixElement extends svg$.SvgElement {
  static new() {
    return svg$.FEColorMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feColorMatrix")) && svg$.FEColorMatrixElement.is(svg$.SvgElement.tag("feColorMatrix"));
  }
  get [$in1]() {
    return this.in1;
  }
  get [$type]() {
    return this.type;
  }
  get [$values]() {
    return this.values;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEColorMatrixElement.created = function() {
  this[in1$] = null;
  this[type$37] = null;
  this[values] = null;
  this[height$15] = null;
  this[result$0] = null;
  this[width$17] = null;
  this[x$8] = null;
  this[y$7] = null;
  svg$.FEColorMatrixElement.__proto__.created.call(this);
}).prototype = svg$.FEColorMatrixElement.prototype;
dart.addTypeTests(svg$.FEColorMatrixElement);
const in1$ = Symbol("FEColorMatrixElement.in1");
const type$37 = Symbol("FEColorMatrixElement.type");
const values = Symbol("FEColorMatrixElement.values");
const height$15 = Symbol("FEColorMatrixElement.height");
const result$0 = Symbol("FEColorMatrixElement.result");
const width$17 = Symbol("FEColorMatrixElement.width");
const x$8 = Symbol("FEColorMatrixElement.x");
const y$7 = Symbol("FEColorMatrixElement.y");
svg$.FEColorMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEColorMatrixElement, "dart:svg");
dart.setFieldSignature(svg$.FEColorMatrixElement, () => ({
  __proto__: dart.getFields(svg$.FEColorMatrixElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$type]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$values]: dart.finalFieldType(svg$.AnimatedNumberList),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineLazy(svg$.FEColorMatrixElement, {
  /*svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE*/get SVG_FECOLORMATRIX_TYPE_HUEROTATE() {
    return 3;
  },
  /*svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA*/get SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA() {
    return 4;
  },
  /*svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX*/get SVG_FECOLORMATRIX_TYPE_MATRIX() {
    return 1;
  },
  /*svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE*/get SVG_FECOLORMATRIX_TYPE_SATURATE() {
    return 2;
  },
  /*svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN*/get SVG_FECOLORMATRIX_TYPE_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGFEColorMatrixElement", svg$.FEColorMatrixElement);
svg$.FEComponentTransferElement = class FEComponentTransferElement extends svg$.SvgElement {
  static new() {
    return svg$.FEComponentTransferElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feComponentTransfer")) && svg$.FEComponentTransferElement.is(svg$.SvgElement.tag("feComponentTransfer"));
  }
  get [$in1]() {
    return this.in1;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEComponentTransferElement.created = function() {
  this[in1$0] = null;
  this[height$16] = null;
  this[result$1] = null;
  this[width$18] = null;
  this[x$9] = null;
  this[y$8] = null;
  svg$.FEComponentTransferElement.__proto__.created.call(this);
}).prototype = svg$.FEComponentTransferElement.prototype;
dart.addTypeTests(svg$.FEComponentTransferElement);
const in1$0 = Symbol("FEComponentTransferElement.in1");
const height$16 = Symbol("FEComponentTransferElement.height");
const result$1 = Symbol("FEComponentTransferElement.result");
const width$18 = Symbol("FEComponentTransferElement.width");
const x$9 = Symbol("FEComponentTransferElement.x");
const y$8 = Symbol("FEComponentTransferElement.y");
svg$.FEComponentTransferElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEComponentTransferElement, "dart:svg");
dart.setFieldSignature(svg$.FEComponentTransferElement, () => ({
  __proto__: dart.getFields(svg$.FEComponentTransferElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGFEComponentTransferElement", svg$.FEComponentTransferElement);
svg$.FECompositeElement = class FECompositeElement extends svg$.SvgElement {
  get [$in1]() {
    return this.in1;
  }
  get [$in2]() {
    return this.in2;
  }
  get [$k1]() {
    return this.k1;
  }
  get [$k2]() {
    return this.k2;
  }
  get [$k3]() {
    return this.k3;
  }
  get [$k4]() {
    return this.k4;
  }
  get [$operator]() {
    return this.operator;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FECompositeElement.created = function() {
  this[in1$1] = null;
  this[in2$] = null;
  this[k1] = null;
  this[k2] = null;
  this[k3] = null;
  this[k4] = null;
  this[operator] = null;
  this[height$17] = null;
  this[result$2] = null;
  this[width$19] = null;
  this[x$10] = null;
  this[y$9] = null;
  svg$.FECompositeElement.__proto__.created.call(this);
}).prototype = svg$.FECompositeElement.prototype;
dart.addTypeTests(svg$.FECompositeElement);
const in1$1 = Symbol("FECompositeElement.in1");
const in2$ = Symbol("FECompositeElement.in2");
const k1 = Symbol("FECompositeElement.k1");
const k2 = Symbol("FECompositeElement.k2");
const k3 = Symbol("FECompositeElement.k3");
const k4 = Symbol("FECompositeElement.k4");
const operator = Symbol("FECompositeElement.operator");
const height$17 = Symbol("FECompositeElement.height");
const result$2 = Symbol("FECompositeElement.result");
const width$19 = Symbol("FECompositeElement.width");
const x$10 = Symbol("FECompositeElement.x");
const y$9 = Symbol("FECompositeElement.y");
svg$.FECompositeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FECompositeElement, "dart:svg");
dart.setFieldSignature(svg$.FECompositeElement, () => ({
  __proto__: dart.getFields(svg$.FECompositeElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$in2]: dart.finalFieldType(svg$.AnimatedString),
  [$k1]: dart.finalFieldType(svg$.AnimatedNumber),
  [$k2]: dart.finalFieldType(svg$.AnimatedNumber),
  [$k3]: dart.finalFieldType(svg$.AnimatedNumber),
  [$k4]: dart.finalFieldType(svg$.AnimatedNumber),
  [$operator]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineLazy(svg$.FECompositeElement, {
  /*svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC*/get SVG_FECOMPOSITE_OPERATOR_ARITHMETIC() {
    return 6;
  },
  /*svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP*/get SVG_FECOMPOSITE_OPERATOR_ATOP() {
    return 4;
  },
  /*svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN*/get SVG_FECOMPOSITE_OPERATOR_IN() {
    return 2;
  },
  /*svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT*/get SVG_FECOMPOSITE_OPERATOR_OUT() {
    return 3;
  },
  /*svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER*/get SVG_FECOMPOSITE_OPERATOR_OVER() {
    return 1;
  },
  /*svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN*/get SVG_FECOMPOSITE_OPERATOR_UNKNOWN() {
    return 0;
  },
  /*svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR*/get SVG_FECOMPOSITE_OPERATOR_XOR() {
    return 5;
  }
});
dart.registerExtension("SVGFECompositeElement", svg$.FECompositeElement);
svg$.FEConvolveMatrixElement = class FEConvolveMatrixElement extends svg$.SvgElement {
  static new() {
    return svg$.FEConvolveMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feConvolveMatrix")) && svg$.FEConvolveMatrixElement.is(svg$.SvgElement.tag("feConvolveMatrix"));
  }
  get [$bias]() {
    return this.bias;
  }
  get [$divisor]() {
    return this.divisor;
  }
  get [$edgeMode]() {
    return this.edgeMode;
  }
  get [$in1]() {
    return this.in1;
  }
  get [$kernelMatrix]() {
    return this.kernelMatrix;
  }
  get [$kernelUnitLengthX]() {
    return this.kernelUnitLengthX;
  }
  get [$kernelUnitLengthY]() {
    return this.kernelUnitLengthY;
  }
  get [$orderX]() {
    return this.orderX;
  }
  get [$orderY]() {
    return this.orderY;
  }
  get [$preserveAlpha]() {
    return this.preserveAlpha;
  }
  get [$targetX]() {
    return this.targetX;
  }
  get [$targetY]() {
    return this.targetY;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEConvolveMatrixElement.created = function() {
  this[bias] = null;
  this[divisor] = null;
  this[edgeMode] = null;
  this[in1$2] = null;
  this[kernelMatrix] = null;
  this[kernelUnitLengthX] = null;
  this[kernelUnitLengthY] = null;
  this[orderX] = null;
  this[orderY] = null;
  this[preserveAlpha] = null;
  this[targetX] = null;
  this[targetY] = null;
  this[height$18] = null;
  this[result$3] = null;
  this[width$20] = null;
  this[x$11] = null;
  this[y$10] = null;
  svg$.FEConvolveMatrixElement.__proto__.created.call(this);
}).prototype = svg$.FEConvolveMatrixElement.prototype;
dart.addTypeTests(svg$.FEConvolveMatrixElement);
const bias = Symbol("FEConvolveMatrixElement.bias");
const divisor = Symbol("FEConvolveMatrixElement.divisor");
const edgeMode = Symbol("FEConvolveMatrixElement.edgeMode");
const in1$2 = Symbol("FEConvolveMatrixElement.in1");
const kernelMatrix = Symbol("FEConvolveMatrixElement.kernelMatrix");
const kernelUnitLengthX = Symbol("FEConvolveMatrixElement.kernelUnitLengthX");
const kernelUnitLengthY = Symbol("FEConvolveMatrixElement.kernelUnitLengthY");
const orderX = Symbol("FEConvolveMatrixElement.orderX");
const orderY = Symbol("FEConvolveMatrixElement.orderY");
const preserveAlpha = Symbol("FEConvolveMatrixElement.preserveAlpha");
const targetX = Symbol("FEConvolveMatrixElement.targetX");
const targetY = Symbol("FEConvolveMatrixElement.targetY");
const height$18 = Symbol("FEConvolveMatrixElement.height");
const result$3 = Symbol("FEConvolveMatrixElement.result");
const width$20 = Symbol("FEConvolveMatrixElement.width");
const x$11 = Symbol("FEConvolveMatrixElement.x");
const y$10 = Symbol("FEConvolveMatrixElement.y");
svg$.FEConvolveMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEConvolveMatrixElement, "dart:svg");
dart.setFieldSignature(svg$.FEConvolveMatrixElement, () => ({
  __proto__: dart.getFields(svg$.FEConvolveMatrixElement.__proto__),
  [$bias]: dart.finalFieldType(svg$.AnimatedNumber),
  [$divisor]: dart.finalFieldType(svg$.AnimatedNumber),
  [$edgeMode]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$kernelMatrix]: dart.finalFieldType(svg$.AnimatedNumberList),
  [$kernelUnitLengthX]: dart.finalFieldType(svg$.AnimatedNumber),
  [$kernelUnitLengthY]: dart.finalFieldType(svg$.AnimatedNumber),
  [$orderX]: dart.finalFieldType(svg$.AnimatedInteger),
  [$orderY]: dart.finalFieldType(svg$.AnimatedInteger),
  [$preserveAlpha]: dart.finalFieldType(svg$.AnimatedBoolean),
  [$targetX]: dart.finalFieldType(svg$.AnimatedInteger),
  [$targetY]: dart.finalFieldType(svg$.AnimatedInteger),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineLazy(svg$.FEConvolveMatrixElement, {
  /*svg$.FEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE*/get SVG_EDGEMODE_DUPLICATE() {
    return 1;
  },
  /*svg$.FEConvolveMatrixElement.SVG_EDGEMODE_NONE*/get SVG_EDGEMODE_NONE() {
    return 3;
  },
  /*svg$.FEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN*/get SVG_EDGEMODE_UNKNOWN() {
    return 0;
  },
  /*svg$.FEConvolveMatrixElement.SVG_EDGEMODE_WRAP*/get SVG_EDGEMODE_WRAP() {
    return 2;
  }
});
dart.registerExtension("SVGFEConvolveMatrixElement", svg$.FEConvolveMatrixElement);
svg$.FEDiffuseLightingElement = class FEDiffuseLightingElement extends svg$.SvgElement {
  static new() {
    return svg$.FEDiffuseLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feDiffuseLighting")) && svg$.FEDiffuseLightingElement.is(svg$.SvgElement.tag("feDiffuseLighting"));
  }
  get [$diffuseConstant]() {
    return this.diffuseConstant;
  }
  get [$in1]() {
    return this.in1;
  }
  get [$kernelUnitLengthX]() {
    return this.kernelUnitLengthX;
  }
  get [$kernelUnitLengthY]() {
    return this.kernelUnitLengthY;
  }
  get [$surfaceScale]() {
    return this.surfaceScale;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEDiffuseLightingElement.created = function() {
  this[diffuseConstant] = null;
  this[in1$3] = null;
  this[kernelUnitLengthX$] = null;
  this[kernelUnitLengthY$] = null;
  this[surfaceScale] = null;
  this[height$19] = null;
  this[result$4] = null;
  this[width$21] = null;
  this[x$12] = null;
  this[y$11] = null;
  svg$.FEDiffuseLightingElement.__proto__.created.call(this);
}).prototype = svg$.FEDiffuseLightingElement.prototype;
dart.addTypeTests(svg$.FEDiffuseLightingElement);
const diffuseConstant = Symbol("FEDiffuseLightingElement.diffuseConstant");
const in1$3 = Symbol("FEDiffuseLightingElement.in1");
const kernelUnitLengthX$ = Symbol("FEDiffuseLightingElement.kernelUnitLengthX");
const kernelUnitLengthY$ = Symbol("FEDiffuseLightingElement.kernelUnitLengthY");
const surfaceScale = Symbol("FEDiffuseLightingElement.surfaceScale");
const height$19 = Symbol("FEDiffuseLightingElement.height");
const result$4 = Symbol("FEDiffuseLightingElement.result");
const width$21 = Symbol("FEDiffuseLightingElement.width");
const x$12 = Symbol("FEDiffuseLightingElement.x");
const y$11 = Symbol("FEDiffuseLightingElement.y");
svg$.FEDiffuseLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEDiffuseLightingElement, "dart:svg");
dart.setFieldSignature(svg$.FEDiffuseLightingElement, () => ({
  __proto__: dart.getFields(svg$.FEDiffuseLightingElement.__proto__),
  [$diffuseConstant]: dart.finalFieldType(svg$.AnimatedNumber),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$kernelUnitLengthX]: dart.finalFieldType(svg$.AnimatedNumber),
  [$kernelUnitLengthY]: dart.finalFieldType(svg$.AnimatedNumber),
  [$surfaceScale]: dart.finalFieldType(svg$.AnimatedNumber),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGFEDiffuseLightingElement", svg$.FEDiffuseLightingElement);
svg$.FEDisplacementMapElement = class FEDisplacementMapElement extends svg$.SvgElement {
  static new() {
    return svg$.FEDisplacementMapElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feDisplacementMap")) && svg$.FEDisplacementMapElement.is(svg$.SvgElement.tag("feDisplacementMap"));
  }
  get [$in1]() {
    return this.in1;
  }
  get [$in2]() {
    return this.in2;
  }
  get [$scale]() {
    return this.scale;
  }
  get [$xChannelSelector]() {
    return this.xChannelSelector;
  }
  get [$yChannelSelector]() {
    return this.yChannelSelector;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEDisplacementMapElement.created = function() {
  this[in1$4] = null;
  this[in2$0] = null;
  this[scale$] = null;
  this[xChannelSelector] = null;
  this[yChannelSelector] = null;
  this[height$20] = null;
  this[result$5] = null;
  this[width$22] = null;
  this[x$13] = null;
  this[y$12] = null;
  svg$.FEDisplacementMapElement.__proto__.created.call(this);
}).prototype = svg$.FEDisplacementMapElement.prototype;
dart.addTypeTests(svg$.FEDisplacementMapElement);
const in1$4 = Symbol("FEDisplacementMapElement.in1");
const in2$0 = Symbol("FEDisplacementMapElement.in2");
const scale$ = Symbol("FEDisplacementMapElement.scale");
const xChannelSelector = Symbol("FEDisplacementMapElement.xChannelSelector");
const yChannelSelector = Symbol("FEDisplacementMapElement.yChannelSelector");
const height$20 = Symbol("FEDisplacementMapElement.height");
const result$5 = Symbol("FEDisplacementMapElement.result");
const width$22 = Symbol("FEDisplacementMapElement.width");
const x$13 = Symbol("FEDisplacementMapElement.x");
const y$12 = Symbol("FEDisplacementMapElement.y");
svg$.FEDisplacementMapElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEDisplacementMapElement, "dart:svg");
dart.setFieldSignature(svg$.FEDisplacementMapElement, () => ({
  __proto__: dart.getFields(svg$.FEDisplacementMapElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$in2]: dart.finalFieldType(svg$.AnimatedString),
  [$scale]: dart.finalFieldType(svg$.AnimatedNumber),
  [$xChannelSelector]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$yChannelSelector]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineLazy(svg$.FEDisplacementMapElement, {
  /*svg$.FEDisplacementMapElement.SVG_CHANNEL_A*/get SVG_CHANNEL_A() {
    return 4;
  },
  /*svg$.FEDisplacementMapElement.SVG_CHANNEL_B*/get SVG_CHANNEL_B() {
    return 3;
  },
  /*svg$.FEDisplacementMapElement.SVG_CHANNEL_G*/get SVG_CHANNEL_G() {
    return 2;
  },
  /*svg$.FEDisplacementMapElement.SVG_CHANNEL_R*/get SVG_CHANNEL_R() {
    return 1;
  },
  /*svg$.FEDisplacementMapElement.SVG_CHANNEL_UNKNOWN*/get SVG_CHANNEL_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGFEDisplacementMapElement", svg$.FEDisplacementMapElement);
svg$.FEDistantLightElement = class FEDistantLightElement extends svg$.SvgElement {
  static new() {
    return svg$.FEDistantLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDistantLight"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feDistantLight")) && svg$.FEDistantLightElement.is(svg$.SvgElement.tag("feDistantLight"));
  }
  get [$azimuth]() {
    return this.azimuth;
  }
  get [$elevation]() {
    return this.elevation;
  }
};
(svg$.FEDistantLightElement.created = function() {
  this[azimuth] = null;
  this[elevation] = null;
  svg$.FEDistantLightElement.__proto__.created.call(this);
}).prototype = svg$.FEDistantLightElement.prototype;
dart.addTypeTests(svg$.FEDistantLightElement);
const azimuth = Symbol("FEDistantLightElement.azimuth");
const elevation = Symbol("FEDistantLightElement.elevation");
dart.setLibraryUri(svg$.FEDistantLightElement, "dart:svg");
dart.setFieldSignature(svg$.FEDistantLightElement, () => ({
  __proto__: dart.getFields(svg$.FEDistantLightElement.__proto__),
  [$azimuth]: dart.finalFieldType(svg$.AnimatedNumber),
  [$elevation]: dart.finalFieldType(svg$.AnimatedNumber)
}));
dart.registerExtension("SVGFEDistantLightElement", svg$.FEDistantLightElement);
svg$.FEFloodElement = class FEFloodElement extends svg$.SvgElement {
  static new() {
    return svg$.FEFloodElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFlood"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feFlood")) && svg$.FEFloodElement.is(svg$.SvgElement.tag("feFlood"));
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEFloodElement.created = function() {
  this[height$21] = null;
  this[result$6] = null;
  this[width$23] = null;
  this[x$14] = null;
  this[y$13] = null;
  svg$.FEFloodElement.__proto__.created.call(this);
}).prototype = svg$.FEFloodElement.prototype;
dart.addTypeTests(svg$.FEFloodElement);
const height$21 = Symbol("FEFloodElement.height");
const result$6 = Symbol("FEFloodElement.result");
const width$23 = Symbol("FEFloodElement.width");
const x$14 = Symbol("FEFloodElement.x");
const y$13 = Symbol("FEFloodElement.y");
svg$.FEFloodElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEFloodElement, "dart:svg");
dart.setFieldSignature(svg$.FEFloodElement, () => ({
  __proto__: dart.getFields(svg$.FEFloodElement.__proto__),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGFEFloodElement", svg$.FEFloodElement);
svg$._SVGComponentTransferFunctionElement = class _SVGComponentTransferFunctionElement extends svg$.SvgElement {};
(svg$._SVGComponentTransferFunctionElement.created = function() {
  svg$._SVGComponentTransferFunctionElement.__proto__.created.call(this);
}).prototype = svg$._SVGComponentTransferFunctionElement.prototype;
dart.addTypeTests(svg$._SVGComponentTransferFunctionElement);
dart.setLibraryUri(svg$._SVGComponentTransferFunctionElement, "dart:svg");
dart.registerExtension("SVGComponentTransferFunctionElement", svg$._SVGComponentTransferFunctionElement);
svg$.FEFuncAElement = class FEFuncAElement extends svg$._SVGComponentTransferFunctionElement {
  static new() {
    return svg$.FEFuncAElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncA"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feFuncA")) && svg$.FEFuncAElement.is(svg$.SvgElement.tag("feFuncA"));
  }
};
(svg$.FEFuncAElement.created = function() {
  svg$.FEFuncAElement.__proto__.created.call(this);
}).prototype = svg$.FEFuncAElement.prototype;
dart.addTypeTests(svg$.FEFuncAElement);
dart.setLibraryUri(svg$.FEFuncAElement, "dart:svg");
dart.registerExtension("SVGFEFuncAElement", svg$.FEFuncAElement);
svg$.FEFuncBElement = class FEFuncBElement extends svg$._SVGComponentTransferFunctionElement {
  static new() {
    return svg$.FEFuncBElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncB"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feFuncB")) && svg$.FEFuncBElement.is(svg$.SvgElement.tag("feFuncB"));
  }
};
(svg$.FEFuncBElement.created = function() {
  svg$.FEFuncBElement.__proto__.created.call(this);
}).prototype = svg$.FEFuncBElement.prototype;
dart.addTypeTests(svg$.FEFuncBElement);
dart.setLibraryUri(svg$.FEFuncBElement, "dart:svg");
dart.registerExtension("SVGFEFuncBElement", svg$.FEFuncBElement);
svg$.FEFuncGElement = class FEFuncGElement extends svg$._SVGComponentTransferFunctionElement {
  static new() {
    return svg$.FEFuncGElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncG"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feFuncG")) && svg$.FEFuncGElement.is(svg$.SvgElement.tag("feFuncG"));
  }
};
(svg$.FEFuncGElement.created = function() {
  svg$.FEFuncGElement.__proto__.created.call(this);
}).prototype = svg$.FEFuncGElement.prototype;
dart.addTypeTests(svg$.FEFuncGElement);
dart.setLibraryUri(svg$.FEFuncGElement, "dart:svg");
dart.registerExtension("SVGFEFuncGElement", svg$.FEFuncGElement);
svg$.FEFuncRElement = class FEFuncRElement extends svg$._SVGComponentTransferFunctionElement {
  static new() {
    return svg$.FEFuncRElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncR"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feFuncR")) && svg$.FEFuncRElement.is(svg$.SvgElement.tag("feFuncR"));
  }
};
(svg$.FEFuncRElement.created = function() {
  svg$.FEFuncRElement.__proto__.created.call(this);
}).prototype = svg$.FEFuncRElement.prototype;
dart.addTypeTests(svg$.FEFuncRElement);
dart.setLibraryUri(svg$.FEFuncRElement, "dart:svg");
dart.registerExtension("SVGFEFuncRElement", svg$.FEFuncRElement);
svg$.FEGaussianBlurElement = class FEGaussianBlurElement extends svg$.SvgElement {
  static new() {
    return svg$.FEGaussianBlurElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feGaussianBlur")) && svg$.FEGaussianBlurElement.is(svg$.SvgElement.tag("feGaussianBlur"));
  }
  get [$in1]() {
    return this.in1;
  }
  get [$stdDeviationX]() {
    return this.stdDeviationX;
  }
  get [$stdDeviationY]() {
    return this.stdDeviationY;
  }
  [$setStdDeviation](...args) {
    return this.setStdDeviation.apply(this, args);
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEGaussianBlurElement.created = function() {
  this[in1$5] = null;
  this[stdDeviationX] = null;
  this[stdDeviationY] = null;
  this[height$22] = null;
  this[result$7] = null;
  this[width$24] = null;
  this[x$15] = null;
  this[y$14] = null;
  svg$.FEGaussianBlurElement.__proto__.created.call(this);
}).prototype = svg$.FEGaussianBlurElement.prototype;
dart.addTypeTests(svg$.FEGaussianBlurElement);
const in1$5 = Symbol("FEGaussianBlurElement.in1");
const stdDeviationX = Symbol("FEGaussianBlurElement.stdDeviationX");
const stdDeviationY = Symbol("FEGaussianBlurElement.stdDeviationY");
const height$22 = Symbol("FEGaussianBlurElement.height");
const result$7 = Symbol("FEGaussianBlurElement.result");
const width$24 = Symbol("FEGaussianBlurElement.width");
const x$15 = Symbol("FEGaussianBlurElement.x");
const y$14 = Symbol("FEGaussianBlurElement.y");
svg$.FEGaussianBlurElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setMethodSignature(svg$.FEGaussianBlurElement, () => ({
  __proto__: dart.getMethods(svg$.FEGaussianBlurElement.__proto__),
  [$setStdDeviation]: dart.fnType(dart.void, [core.num, core.num])
}));
dart.setLibraryUri(svg$.FEGaussianBlurElement, "dart:svg");
dart.setFieldSignature(svg$.FEGaussianBlurElement, () => ({
  __proto__: dart.getFields(svg$.FEGaussianBlurElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$stdDeviationX]: dart.finalFieldType(svg$.AnimatedNumber),
  [$stdDeviationY]: dart.finalFieldType(svg$.AnimatedNumber),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGFEGaussianBlurElement", svg$.FEGaussianBlurElement);
svg$.FEImageElement = class FEImageElement extends svg$.SvgElement {
  static new() {
    return svg$.FEImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feImage"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feImage")) && svg$.FEImageElement.is(svg$.SvgElement.tag("feImage"));
  }
  get [$preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$href]() {
    return this.href;
  }
};
(svg$.FEImageElement.created = function() {
  this[preserveAspectRatio] = null;
  this[height$23] = null;
  this[result$8] = null;
  this[width$25] = null;
  this[x$16] = null;
  this[y$15] = null;
  this[href$9] = null;
  svg$.FEImageElement.__proto__.created.call(this);
}).prototype = svg$.FEImageElement.prototype;
dart.addTypeTests(svg$.FEImageElement);
const preserveAspectRatio = Symbol("FEImageElement.preserveAspectRatio");
const height$23 = Symbol("FEImageElement.height");
const result$8 = Symbol("FEImageElement.result");
const width$25 = Symbol("FEImageElement.width");
const x$16 = Symbol("FEImageElement.x");
const y$15 = Symbol("FEImageElement.y");
const href$9 = Symbol("FEImageElement.href");
svg$.FEImageElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes, svg$.UriReference];
dart.setLibraryUri(svg$.FEImageElement, "dart:svg");
dart.setFieldSignature(svg$.FEImageElement, () => ({
  __proto__: dart.getFields(svg$.FEImageElement.__proto__),
  [$preserveAspectRatio]: dart.finalFieldType(svg$.AnimatedPreserveAspectRatio),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.registerExtension("SVGFEImageElement", svg$.FEImageElement);
svg$.FEMergeElement = class FEMergeElement extends svg$.SvgElement {
  static new() {
    return svg$.FEMergeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMerge"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feMerge")) && svg$.FEMergeElement.is(svg$.SvgElement.tag("feMerge"));
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEMergeElement.created = function() {
  this[height$24] = null;
  this[result$9] = null;
  this[width$26] = null;
  this[x$17] = null;
  this[y$16] = null;
  svg$.FEMergeElement.__proto__.created.call(this);
}).prototype = svg$.FEMergeElement.prototype;
dart.addTypeTests(svg$.FEMergeElement);
const height$24 = Symbol("FEMergeElement.height");
const result$9 = Symbol("FEMergeElement.result");
const width$26 = Symbol("FEMergeElement.width");
const x$17 = Symbol("FEMergeElement.x");
const y$16 = Symbol("FEMergeElement.y");
svg$.FEMergeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEMergeElement, "dart:svg");
dart.setFieldSignature(svg$.FEMergeElement, () => ({
  __proto__: dart.getFields(svg$.FEMergeElement.__proto__),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGFEMergeElement", svg$.FEMergeElement);
svg$.FEMergeNodeElement = class FEMergeNodeElement extends svg$.SvgElement {
  static new() {
    return svg$.FEMergeNodeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMergeNode"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feMergeNode")) && svg$.FEMergeNodeElement.is(svg$.SvgElement.tag("feMergeNode"));
  }
  get [$in1]() {
    return this.in1;
  }
};
(svg$.FEMergeNodeElement.created = function() {
  this[in1$6] = null;
  svg$.FEMergeNodeElement.__proto__.created.call(this);
}).prototype = svg$.FEMergeNodeElement.prototype;
dart.addTypeTests(svg$.FEMergeNodeElement);
const in1$6 = Symbol("FEMergeNodeElement.in1");
dart.setLibraryUri(svg$.FEMergeNodeElement, "dart:svg");
dart.setFieldSignature(svg$.FEMergeNodeElement, () => ({
  __proto__: dart.getFields(svg$.FEMergeNodeElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.registerExtension("SVGFEMergeNodeElement", svg$.FEMergeNodeElement);
svg$.FEMorphologyElement = class FEMorphologyElement extends svg$.SvgElement {
  get [$in1]() {
    return this.in1;
  }
  get [$operator]() {
    return this.operator;
  }
  get [$radiusX]() {
    return this.radiusX;
  }
  get [$radiusY]() {
    return this.radiusY;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEMorphologyElement.created = function() {
  this[in1$7] = null;
  this[operator$] = null;
  this[radiusX] = null;
  this[radiusY] = null;
  this[height$25] = null;
  this[result$10] = null;
  this[width$27] = null;
  this[x$18] = null;
  this[y$17] = null;
  svg$.FEMorphologyElement.__proto__.created.call(this);
}).prototype = svg$.FEMorphologyElement.prototype;
dart.addTypeTests(svg$.FEMorphologyElement);
const in1$7 = Symbol("FEMorphologyElement.in1");
const operator$ = Symbol("FEMorphologyElement.operator");
const radiusX = Symbol("FEMorphologyElement.radiusX");
const radiusY = Symbol("FEMorphologyElement.radiusY");
const height$25 = Symbol("FEMorphologyElement.height");
const result$10 = Symbol("FEMorphologyElement.result");
const width$27 = Symbol("FEMorphologyElement.width");
const x$18 = Symbol("FEMorphologyElement.x");
const y$17 = Symbol("FEMorphologyElement.y");
svg$.FEMorphologyElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEMorphologyElement, "dart:svg");
dart.setFieldSignature(svg$.FEMorphologyElement, () => ({
  __proto__: dart.getFields(svg$.FEMorphologyElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$operator]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$radiusX]: dart.finalFieldType(svg$.AnimatedNumber),
  [$radiusY]: dart.finalFieldType(svg$.AnimatedNumber),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineLazy(svg$.FEMorphologyElement, {
  /*svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE*/get SVG_MORPHOLOGY_OPERATOR_DILATE() {
    return 2;
  },
  /*svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE*/get SVG_MORPHOLOGY_OPERATOR_ERODE() {
    return 1;
  },
  /*svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN*/get SVG_MORPHOLOGY_OPERATOR_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGFEMorphologyElement", svg$.FEMorphologyElement);
svg$.FEOffsetElement = class FEOffsetElement extends svg$.SvgElement {
  static new() {
    return svg$.FEOffsetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feOffset"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feOffset")) && svg$.FEOffsetElement.is(svg$.SvgElement.tag("feOffset"));
  }
  get [$dx]() {
    return this.dx;
  }
  get [$dy]() {
    return this.dy;
  }
  get [$in1]() {
    return this.in1;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FEOffsetElement.created = function() {
  this[dx] = null;
  this[dy] = null;
  this[in1$8] = null;
  this[height$26] = null;
  this[result$11] = null;
  this[width$28] = null;
  this[x$19] = null;
  this[y$18] = null;
  svg$.FEOffsetElement.__proto__.created.call(this);
}).prototype = svg$.FEOffsetElement.prototype;
dart.addTypeTests(svg$.FEOffsetElement);
const dx = Symbol("FEOffsetElement.dx");
const dy = Symbol("FEOffsetElement.dy");
const in1$8 = Symbol("FEOffsetElement.in1");
const height$26 = Symbol("FEOffsetElement.height");
const result$11 = Symbol("FEOffsetElement.result");
const width$28 = Symbol("FEOffsetElement.width");
const x$19 = Symbol("FEOffsetElement.x");
const y$18 = Symbol("FEOffsetElement.y");
svg$.FEOffsetElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FEOffsetElement, "dart:svg");
dart.setFieldSignature(svg$.FEOffsetElement, () => ({
  __proto__: dart.getFields(svg$.FEOffsetElement.__proto__),
  [$dx]: dart.finalFieldType(svg$.AnimatedNumber),
  [$dy]: dart.finalFieldType(svg$.AnimatedNumber),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGFEOffsetElement", svg$.FEOffsetElement);
svg$.FEPointLightElement = class FEPointLightElement extends svg$.SvgElement {
  static new() {
    return svg$.FEPointLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("fePointLight"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("fePointLight")) && svg$.FEPointLightElement.is(svg$.SvgElement.tag("fePointLight"));
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$z]() {
    return this.z;
  }
};
(svg$.FEPointLightElement.created = function() {
  this[x$20] = null;
  this[y$19] = null;
  this[z$6] = null;
  svg$.FEPointLightElement.__proto__.created.call(this);
}).prototype = svg$.FEPointLightElement.prototype;
dart.addTypeTests(svg$.FEPointLightElement);
const x$20 = Symbol("FEPointLightElement.x");
const y$19 = Symbol("FEPointLightElement.y");
const z$6 = Symbol("FEPointLightElement.z");
dart.setLibraryUri(svg$.FEPointLightElement, "dart:svg");
dart.setFieldSignature(svg$.FEPointLightElement, () => ({
  __proto__: dart.getFields(svg$.FEPointLightElement.__proto__),
  [$x]: dart.finalFieldType(svg$.AnimatedNumber),
  [$y]: dart.finalFieldType(svg$.AnimatedNumber),
  [$z]: dart.finalFieldType(svg$.AnimatedNumber)
}));
dart.registerExtension("SVGFEPointLightElement", svg$.FEPointLightElement);
svg$.FESpecularLightingElement = class FESpecularLightingElement extends svg$.SvgElement {
  static new() {
    return svg$.FESpecularLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feSpecularLighting")) && svg$.FESpecularLightingElement.is(svg$.SvgElement.tag("feSpecularLighting"));
  }
  get [$in1]() {
    return this.in1;
  }
  get [$kernelUnitLengthX]() {
    return this.kernelUnitLengthX;
  }
  get [$kernelUnitLengthY]() {
    return this.kernelUnitLengthY;
  }
  get [$specularConstant]() {
    return this.specularConstant;
  }
  get [$specularExponent]() {
    return this.specularExponent;
  }
  get [$surfaceScale]() {
    return this.surfaceScale;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FESpecularLightingElement.created = function() {
  this[in1$9] = null;
  this[kernelUnitLengthX$0] = null;
  this[kernelUnitLengthY$0] = null;
  this[specularConstant] = null;
  this[specularExponent] = null;
  this[surfaceScale$] = null;
  this[height$27] = null;
  this[result$12] = null;
  this[width$29] = null;
  this[x$21] = null;
  this[y$20] = null;
  svg$.FESpecularLightingElement.__proto__.created.call(this);
}).prototype = svg$.FESpecularLightingElement.prototype;
dart.addTypeTests(svg$.FESpecularLightingElement);
const in1$9 = Symbol("FESpecularLightingElement.in1");
const kernelUnitLengthX$0 = Symbol("FESpecularLightingElement.kernelUnitLengthX");
const kernelUnitLengthY$0 = Symbol("FESpecularLightingElement.kernelUnitLengthY");
const specularConstant = Symbol("FESpecularLightingElement.specularConstant");
const specularExponent = Symbol("FESpecularLightingElement.specularExponent");
const surfaceScale$ = Symbol("FESpecularLightingElement.surfaceScale");
const height$27 = Symbol("FESpecularLightingElement.height");
const result$12 = Symbol("FESpecularLightingElement.result");
const width$29 = Symbol("FESpecularLightingElement.width");
const x$21 = Symbol("FESpecularLightingElement.x");
const y$20 = Symbol("FESpecularLightingElement.y");
svg$.FESpecularLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FESpecularLightingElement, "dart:svg");
dart.setFieldSignature(svg$.FESpecularLightingElement, () => ({
  __proto__: dart.getFields(svg$.FESpecularLightingElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$kernelUnitLengthX]: dart.finalFieldType(svg$.AnimatedNumber),
  [$kernelUnitLengthY]: dart.finalFieldType(svg$.AnimatedNumber),
  [$specularConstant]: dart.finalFieldType(svg$.AnimatedNumber),
  [$specularExponent]: dart.finalFieldType(svg$.AnimatedNumber),
  [$surfaceScale]: dart.finalFieldType(svg$.AnimatedNumber),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGFESpecularLightingElement", svg$.FESpecularLightingElement);
svg$.FESpotLightElement = class FESpotLightElement extends svg$.SvgElement {
  static new() {
    return svg$.FESpotLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpotLight"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feSpotLight")) && svg$.FESpotLightElement.is(svg$.SvgElement.tag("feSpotLight"));
  }
  get [$limitingConeAngle]() {
    return this.limitingConeAngle;
  }
  get [$pointsAtX]() {
    return this.pointsAtX;
  }
  get [$pointsAtY]() {
    return this.pointsAtY;
  }
  get [$pointsAtZ]() {
    return this.pointsAtZ;
  }
  get [$specularExponent]() {
    return this.specularExponent;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$z]() {
    return this.z;
  }
};
(svg$.FESpotLightElement.created = function() {
  this[limitingConeAngle] = null;
  this[pointsAtX] = null;
  this[pointsAtY] = null;
  this[pointsAtZ] = null;
  this[specularExponent$] = null;
  this[x$22] = null;
  this[y$21] = null;
  this[z$7] = null;
  svg$.FESpotLightElement.__proto__.created.call(this);
}).prototype = svg$.FESpotLightElement.prototype;
dart.addTypeTests(svg$.FESpotLightElement);
const limitingConeAngle = Symbol("FESpotLightElement.limitingConeAngle");
const pointsAtX = Symbol("FESpotLightElement.pointsAtX");
const pointsAtY = Symbol("FESpotLightElement.pointsAtY");
const pointsAtZ = Symbol("FESpotLightElement.pointsAtZ");
const specularExponent$ = Symbol("FESpotLightElement.specularExponent");
const x$22 = Symbol("FESpotLightElement.x");
const y$21 = Symbol("FESpotLightElement.y");
const z$7 = Symbol("FESpotLightElement.z");
dart.setLibraryUri(svg$.FESpotLightElement, "dart:svg");
dart.setFieldSignature(svg$.FESpotLightElement, () => ({
  __proto__: dart.getFields(svg$.FESpotLightElement.__proto__),
  [$limitingConeAngle]: dart.finalFieldType(svg$.AnimatedNumber),
  [$pointsAtX]: dart.finalFieldType(svg$.AnimatedNumber),
  [$pointsAtY]: dart.finalFieldType(svg$.AnimatedNumber),
  [$pointsAtZ]: dart.finalFieldType(svg$.AnimatedNumber),
  [$specularExponent]: dart.finalFieldType(svg$.AnimatedNumber),
  [$x]: dart.finalFieldType(svg$.AnimatedNumber),
  [$y]: dart.finalFieldType(svg$.AnimatedNumber),
  [$z]: dart.finalFieldType(svg$.AnimatedNumber)
}));
dart.registerExtension("SVGFESpotLightElement", svg$.FESpotLightElement);
svg$.FETileElement = class FETileElement extends svg$.SvgElement {
  static new() {
    return svg$.FETileElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTile"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feTile")) && svg$.FETileElement.is(svg$.SvgElement.tag("feTile"));
  }
  get [$in1]() {
    return this.in1;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FETileElement.created = function() {
  this[in1$10] = null;
  this[height$28] = null;
  this[result$13] = null;
  this[width$30] = null;
  this[x$23] = null;
  this[y$22] = null;
  svg$.FETileElement.__proto__.created.call(this);
}).prototype = svg$.FETileElement.prototype;
dart.addTypeTests(svg$.FETileElement);
const in1$10 = Symbol("FETileElement.in1");
const height$28 = Symbol("FETileElement.height");
const result$13 = Symbol("FETileElement.result");
const width$30 = Symbol("FETileElement.width");
const x$23 = Symbol("FETileElement.x");
const y$22 = Symbol("FETileElement.y");
svg$.FETileElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FETileElement, "dart:svg");
dart.setFieldSignature(svg$.FETileElement, () => ({
  __proto__: dart.getFields(svg$.FETileElement.__proto__),
  [$in1]: dart.finalFieldType(svg$.AnimatedString),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGFETileElement", svg$.FETileElement);
svg$.FETurbulenceElement = class FETurbulenceElement extends svg$.SvgElement {
  static new() {
    return svg$.FETurbulenceElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTurbulence"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("feTurbulence")) && svg$.FETurbulenceElement.is(svg$.SvgElement.tag("feTurbulence"));
  }
  get [$baseFrequencyX]() {
    return this.baseFrequencyX;
  }
  get [$baseFrequencyY]() {
    return this.baseFrequencyY;
  }
  get [$numOctaves]() {
    return this.numOctaves;
  }
  get [$seed]() {
    return this.seed;
  }
  get [$stitchTiles]() {
    return this.stitchTiles;
  }
  get [$type]() {
    return this.type;
  }
  get [$height]() {
    return this.height;
  }
  get [$result]() {
    return this.result;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.FETurbulenceElement.created = function() {
  this[baseFrequencyX] = null;
  this[baseFrequencyY] = null;
  this[numOctaves] = null;
  this[seed] = null;
  this[stitchTiles] = null;
  this[type$38] = null;
  this[height$29] = null;
  this[result$14] = null;
  this[width$31] = null;
  this[x$24] = null;
  this[y$23] = null;
  svg$.FETurbulenceElement.__proto__.created.call(this);
}).prototype = svg$.FETurbulenceElement.prototype;
dart.addTypeTests(svg$.FETurbulenceElement);
const baseFrequencyX = Symbol("FETurbulenceElement.baseFrequencyX");
const baseFrequencyY = Symbol("FETurbulenceElement.baseFrequencyY");
const numOctaves = Symbol("FETurbulenceElement.numOctaves");
const seed = Symbol("FETurbulenceElement.seed");
const stitchTiles = Symbol("FETurbulenceElement.stitchTiles");
const type$38 = Symbol("FETurbulenceElement.type");
const height$29 = Symbol("FETurbulenceElement.height");
const result$14 = Symbol("FETurbulenceElement.result");
const width$31 = Symbol("FETurbulenceElement.width");
const x$24 = Symbol("FETurbulenceElement.x");
const y$23 = Symbol("FETurbulenceElement.y");
svg$.FETurbulenceElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$.FETurbulenceElement, "dart:svg");
dart.setFieldSignature(svg$.FETurbulenceElement, () => ({
  __proto__: dart.getFields(svg$.FETurbulenceElement.__proto__),
  [$baseFrequencyX]: dart.finalFieldType(svg$.AnimatedNumber),
  [$baseFrequencyY]: dart.finalFieldType(svg$.AnimatedNumber),
  [$numOctaves]: dart.finalFieldType(svg$.AnimatedInteger),
  [$seed]: dart.finalFieldType(svg$.AnimatedNumber),
  [$stitchTiles]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$type]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$result]: dart.finalFieldType(svg$.AnimatedString),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineLazy(svg$.FETurbulenceElement, {
  /*svg$.FETurbulenceElement.SVG_STITCHTYPE_NOSTITCH*/get SVG_STITCHTYPE_NOSTITCH() {
    return 2;
  },
  /*svg$.FETurbulenceElement.SVG_STITCHTYPE_STITCH*/get SVG_STITCHTYPE_STITCH() {
    return 1;
  },
  /*svg$.FETurbulenceElement.SVG_STITCHTYPE_UNKNOWN*/get SVG_STITCHTYPE_UNKNOWN() {
    return 0;
  },
  /*svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE*/get SVG_TURBULENCE_TYPE_FRACTALNOISE() {
    return 1;
  },
  /*svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE*/get SVG_TURBULENCE_TYPE_TURBULENCE() {
    return 2;
  },
  /*svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN*/get SVG_TURBULENCE_TYPE_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGFETurbulenceElement", svg$.FETurbulenceElement);
svg$.FilterElement = class FilterElement extends svg$.SvgElement {
  static new() {
    return svg$.FilterElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("filter"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("filter")) && svg$.FilterElement.is(svg$.SvgElement.tag("filter"));
  }
  get [$filterUnits]() {
    return this.filterUnits;
  }
  get [$height]() {
    return this.height;
  }
  get [$primitiveUnits]() {
    return this.primitiveUnits;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$href]() {
    return this.href;
  }
};
(svg$.FilterElement.created = function() {
  this[filterUnits] = null;
  this[height$30] = null;
  this[primitiveUnits] = null;
  this[width$32] = null;
  this[x$25] = null;
  this[y$24] = null;
  this[href$10] = null;
  svg$.FilterElement.__proto__.created.call(this);
}).prototype = svg$.FilterElement.prototype;
dart.addTypeTests(svg$.FilterElement);
const filterUnits = Symbol("FilterElement.filterUnits");
const height$30 = Symbol("FilterElement.height");
const primitiveUnits = Symbol("FilterElement.primitiveUnits");
const width$32 = Symbol("FilterElement.width");
const x$25 = Symbol("FilterElement.x");
const y$24 = Symbol("FilterElement.y");
const href$10 = Symbol("FilterElement.href");
svg$.FilterElement[dart.implements] = () => [svg$.UriReference];
dart.setLibraryUri(svg$.FilterElement, "dart:svg");
dart.setFieldSignature(svg$.FilterElement, () => ({
  __proto__: dart.getFields(svg$.FilterElement.__proto__),
  [$filterUnits]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$primitiveUnits]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.registerExtension("SVGFilterElement", svg$.FilterElement);
svg$.FilterPrimitiveStandardAttributes = class FilterPrimitiveStandardAttributes extends _interceptors.Interceptor {
  get height() {
    return this[height$31];
  }
  set height(value) {
    super.height = value;
  }
  get result() {
    return this[result$15];
  }
  set result(value) {
    super.result = value;
  }
  get width() {
    return this[width$33];
  }
  set width(value) {
    super.width = value;
  }
  get x() {
    return this[x$26];
  }
  set x(value) {
    super.x = value;
  }
  get y() {
    return this[y$25];
  }
  set y(value) {
    super.y = value;
  }
};
dart.addTypeTests(svg$.FilterPrimitiveStandardAttributes);
const height$31 = Symbol("FilterPrimitiveStandardAttributes.height");
const result$15 = Symbol("FilterPrimitiveStandardAttributes.result");
const width$33 = Symbol("FilterPrimitiveStandardAttributes.width");
const x$26 = Symbol("FilterPrimitiveStandardAttributes.x");
const y$25 = Symbol("FilterPrimitiveStandardAttributes.y");
dart.setLibraryUri(svg$.FilterPrimitiveStandardAttributes, "dart:svg");
dart.setFieldSignature(svg$.FilterPrimitiveStandardAttributes, () => ({
  __proto__: dart.getFields(svg$.FilterPrimitiveStandardAttributes.__proto__),
  height: dart.finalFieldType(svg$.AnimatedLength),
  result: dart.finalFieldType(svg$.AnimatedString),
  width: dart.finalFieldType(svg$.AnimatedLength),
  x: dart.finalFieldType(svg$.AnimatedLength),
  y: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineExtensionAccessors(svg$.FilterPrimitiveStandardAttributes, [
  'height',
  'result',
  'width',
  'x',
  'y'
]);
svg$.FitToViewBox = class FitToViewBox extends _interceptors.Interceptor {
  get preserveAspectRatio() {
    return this[preserveAspectRatio$];
  }
  set preserveAspectRatio(value) {
    super.preserveAspectRatio = value;
  }
  get viewBox() {
    return this[viewBox];
  }
  set viewBox(value) {
    super.viewBox = value;
  }
};
dart.addTypeTests(svg$.FitToViewBox);
const preserveAspectRatio$ = Symbol("FitToViewBox.preserveAspectRatio");
const viewBox = Symbol("FitToViewBox.viewBox");
dart.setLibraryUri(svg$.FitToViewBox, "dart:svg");
dart.setFieldSignature(svg$.FitToViewBox, () => ({
  __proto__: dart.getFields(svg$.FitToViewBox.__proto__),
  preserveAspectRatio: dart.finalFieldType(svg$.AnimatedPreserveAspectRatio),
  viewBox: dart.finalFieldType(svg$.AnimatedRect)
}));
dart.defineExtensionAccessors(svg$.FitToViewBox, ['preserveAspectRatio', 'viewBox']);
svg$.ForeignObjectElement = class ForeignObjectElement extends svg$.GraphicsElement {
  static new() {
    return svg$.ForeignObjectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("foreignObject"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("foreignObject")) && svg$.ForeignObjectElement.is(svg$.SvgElement.tag("foreignObject"));
  }
  get [$height]() {
    return this.height;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.ForeignObjectElement.created = function() {
  this[height$32] = null;
  this[width$34] = null;
  this[x$27] = null;
  this[y$26] = null;
  svg$.ForeignObjectElement.__proto__.created.call(this);
}).prototype = svg$.ForeignObjectElement.prototype;
dart.addTypeTests(svg$.ForeignObjectElement);
const height$32 = Symbol("ForeignObjectElement.height");
const width$34 = Symbol("ForeignObjectElement.width");
const x$27 = Symbol("ForeignObjectElement.x");
const y$26 = Symbol("ForeignObjectElement.y");
dart.setLibraryUri(svg$.ForeignObjectElement, "dart:svg");
dart.setFieldSignature(svg$.ForeignObjectElement, () => ({
  __proto__: dart.getFields(svg$.ForeignObjectElement.__proto__),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGForeignObjectElement", svg$.ForeignObjectElement);
svg$.GElement = class GElement extends svg$.GraphicsElement {
  static new() {
    return svg$.GElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("g"));
  }
};
(svg$.GElement.created = function() {
  svg$.GElement.__proto__.created.call(this);
}).prototype = svg$.GElement.prototype;
dart.addTypeTests(svg$.GElement);
dart.setLibraryUri(svg$.GElement, "dart:svg");
dart.registerExtension("SVGGElement", svg$.GElement);
svg$.ImageElement = class ImageElement extends svg$.GraphicsElement {
  static new() {
    return svg$.ImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("image"));
  }
  get [$async]() {
    return this.async;
  }
  set [$async](value) {
    this.async = value;
  }
  get [$height]() {
    return this.height;
  }
  get [$preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  [$decode]() {
    return html$.promiseToFuture(dart.dynamic, this.decode());
  }
  get [$href]() {
    return this.href;
  }
};
(svg$.ImageElement.created = function() {
  this[async$1] = null;
  this[height$33] = null;
  this[preserveAspectRatio$0] = null;
  this[width$35] = null;
  this[x$28] = null;
  this[y$27] = null;
  this[href$11] = null;
  svg$.ImageElement.__proto__.created.call(this);
}).prototype = svg$.ImageElement.prototype;
dart.addTypeTests(svg$.ImageElement);
const async$1 = Symbol("ImageElement.async");
const height$33 = Symbol("ImageElement.height");
const preserveAspectRatio$0 = Symbol("ImageElement.preserveAspectRatio");
const width$35 = Symbol("ImageElement.width");
const x$28 = Symbol("ImageElement.x");
const y$27 = Symbol("ImageElement.y");
const href$11 = Symbol("ImageElement.href");
svg$.ImageElement[dart.implements] = () => [svg$.UriReference];
dart.setMethodSignature(svg$.ImageElement, () => ({
  __proto__: dart.getMethods(svg$.ImageElement.__proto__),
  [$decode]: dart.fnType(async.Future, [])
}));
dart.setLibraryUri(svg$.ImageElement, "dart:svg");
dart.setFieldSignature(svg$.ImageElement, () => ({
  __proto__: dart.getFields(svg$.ImageElement.__proto__),
  [$async]: dart.fieldType(core.String),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$preserveAspectRatio]: dart.finalFieldType(svg$.AnimatedPreserveAspectRatio),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.registerExtension("SVGImageElement", svg$.ImageElement);
svg$.Length = class Length extends _interceptors.Interceptor {
  get [$unitType]() {
    return this.unitType;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  get [$valueAsString]() {
    return this.valueAsString;
  }
  set [$valueAsString](value) {
    this.valueAsString = value;
  }
  get [$valueInSpecifiedUnits]() {
    return this.valueInSpecifiedUnits;
  }
  set [$valueInSpecifiedUnits](value) {
    this.valueInSpecifiedUnits = value;
  }
  [$convertToSpecifiedUnits](...args) {
    return this.convertToSpecifiedUnits.apply(this, args);
  }
  [$newValueSpecifiedUnits](...args) {
    return this.newValueSpecifiedUnits.apply(this, args);
  }
};
dart.addTypeTests(svg$.Length);
const unitType$ = Symbol("Length.unitType");
const value$19 = Symbol("Length.value");
const valueAsString$ = Symbol("Length.valueAsString");
const valueInSpecifiedUnits$ = Symbol("Length.valueInSpecifiedUnits");
dart.setMethodSignature(svg$.Length, () => ({
  __proto__: dart.getMethods(svg$.Length.__proto__),
  [$convertToSpecifiedUnits]: dart.fnType(dart.void, [core.int]),
  [$newValueSpecifiedUnits]: dart.fnType(dart.void, [core.int, core.num])
}));
dart.setLibraryUri(svg$.Length, "dart:svg");
dart.setFieldSignature(svg$.Length, () => ({
  __proto__: dart.getFields(svg$.Length.__proto__),
  [$unitType]: dart.finalFieldType(core.int),
  [$value]: dart.fieldType(core.num),
  [$valueAsString]: dart.fieldType(core.String),
  [$valueInSpecifiedUnits]: dart.fieldType(core.num)
}));
dart.defineLazy(svg$.Length, {
  /*svg$.Length.SVG_LENGTHTYPE_CM*/get SVG_LENGTHTYPE_CM() {
    return 6;
  },
  /*svg$.Length.SVG_LENGTHTYPE_EMS*/get SVG_LENGTHTYPE_EMS() {
    return 3;
  },
  /*svg$.Length.SVG_LENGTHTYPE_EXS*/get SVG_LENGTHTYPE_EXS() {
    return 4;
  },
  /*svg$.Length.SVG_LENGTHTYPE_IN*/get SVG_LENGTHTYPE_IN() {
    return 8;
  },
  /*svg$.Length.SVG_LENGTHTYPE_MM*/get SVG_LENGTHTYPE_MM() {
    return 7;
  },
  /*svg$.Length.SVG_LENGTHTYPE_NUMBER*/get SVG_LENGTHTYPE_NUMBER() {
    return 1;
  },
  /*svg$.Length.SVG_LENGTHTYPE_PC*/get SVG_LENGTHTYPE_PC() {
    return 10;
  },
  /*svg$.Length.SVG_LENGTHTYPE_PERCENTAGE*/get SVG_LENGTHTYPE_PERCENTAGE() {
    return 2;
  },
  /*svg$.Length.SVG_LENGTHTYPE_PT*/get SVG_LENGTHTYPE_PT() {
    return 9;
  },
  /*svg$.Length.SVG_LENGTHTYPE_PX*/get SVG_LENGTHTYPE_PX() {
    return 5;
  },
  /*svg$.Length.SVG_LENGTHTYPE_UNKNOWN*/get SVG_LENGTHTYPE_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGLength", svg$.Length);
const __setter__$ = dart.privateName(svg$, "__setter__");
const Interceptor_ListMixin$$13 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$13.new = function() {
  Interceptor_ListMixin$$13.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$13.prototype;
dart.applyMixin(Interceptor_ListMixin$$13, collection.ListMixin$(svg$.Length));
const Interceptor_ImmutableListMixin$$13 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$13 {};
(Interceptor_ImmutableListMixin$$13.new = function() {
  Interceptor_ImmutableListMixin$$13.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$13.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$13, html$.ImmutableListMixin$(svg$.Length));
svg$.LengthList = class LengthList extends Interceptor_ImmutableListMixin$$13 {
  get [$length]() {
    return this.length;
  }
  get [$numberOfItems]() {
    return this.numberOfItems;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this.getItem(index);
  }
  [$_set](index, value) {
    svg$.Length._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [$appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [$initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [$insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [$removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [$replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.LengthList.prototype[dart.isList] = true;
dart.addTypeTests(svg$.LengthList);
const numberOfItems = Symbol("LengthList.numberOfItems");
svg$.LengthList[dart.implements] = () => [ListOfLength()];
dart.setMethodSignature(svg$.LengthList, () => ({
  __proto__: dart.getMethods(svg$.LengthList.__proto__),
  [$_get]: dart.fnType(svg$.Length, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(svg$.Length, [core.int]),
  [__setter__$]: dart.fnType(dart.void, [core.int, svg$.Length]),
  [$appendItem]: dart.fnType(svg$.Length, [svg$.Length]),
  [$clear]: dart.fnType(dart.void, []),
  [$getItem]: dart.fnType(svg$.Length, [core.int]),
  [$initialize]: dart.fnType(svg$.Length, [svg$.Length]),
  [$insertItemBefore]: dart.fnType(svg$.Length, [svg$.Length, core.int]),
  [$removeItem]: dart.fnType(svg$.Length, [core.int]),
  [$replaceItem]: dart.fnType(svg$.Length, [svg$.Length, core.int])
}));
dart.setGetterSignature(svg$.LengthList, () => ({
  __proto__: dart.getGetters(svg$.LengthList.__proto__),
  [$length]: core.int,
  [$first]: svg$.Length,
  [$last]: svg$.Length,
  [$single]: svg$.Length
}));
dart.setSetterSignature(svg$.LengthList, () => ({
  __proto__: dart.getSetters(svg$.LengthList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(svg$.LengthList, "dart:svg");
dart.setFieldSignature(svg$.LengthList, () => ({
  __proto__: dart.getFields(svg$.LengthList.__proto__),
  [$numberOfItems]: dart.finalFieldType(core.int)
}));
dart.registerExtension("SVGLengthList", svg$.LengthList);
svg$.LineElement = class LineElement extends svg$.GeometryElement {
  static new() {
    return svg$.LineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("line"));
  }
  get [$x1]() {
    return this.x1;
  }
  get [$x2]() {
    return this.x2;
  }
  get [$y1]() {
    return this.y1;
  }
  get [$y2]() {
    return this.y2;
  }
};
(svg$.LineElement.created = function() {
  this[x1] = null;
  this[x2] = null;
  this[y1] = null;
  this[y2] = null;
  svg$.LineElement.__proto__.created.call(this);
}).prototype = svg$.LineElement.prototype;
dart.addTypeTests(svg$.LineElement);
const x1 = Symbol("LineElement.x1");
const x2 = Symbol("LineElement.x2");
const y1 = Symbol("LineElement.y1");
const y2 = Symbol("LineElement.y2");
dart.setLibraryUri(svg$.LineElement, "dart:svg");
dart.setFieldSignature(svg$.LineElement, () => ({
  __proto__: dart.getFields(svg$.LineElement.__proto__),
  [$x1]: dart.finalFieldType(svg$.AnimatedLength),
  [$x2]: dart.finalFieldType(svg$.AnimatedLength),
  [$y1]: dart.finalFieldType(svg$.AnimatedLength),
  [$y2]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGLineElement", svg$.LineElement);
svg$._GradientElement = class _GradientElement extends svg$.SvgElement {
  get [$gradientTransform]() {
    return this.gradientTransform;
  }
  get [$gradientUnits]() {
    return this.gradientUnits;
  }
  get [$spreadMethod]() {
    return this.spreadMethod;
  }
  get [$href]() {
    return this.href;
  }
};
(svg$._GradientElement.created = function() {
  this[gradientTransform] = null;
  this[gradientUnits] = null;
  this[spreadMethod] = null;
  this[href$12] = null;
  svg$._GradientElement.__proto__.created.call(this);
}).prototype = svg$._GradientElement.prototype;
dart.addTypeTests(svg$._GradientElement);
const gradientTransform = Symbol("_GradientElement.gradientTransform");
const gradientUnits = Symbol("_GradientElement.gradientUnits");
const spreadMethod = Symbol("_GradientElement.spreadMethod");
const href$12 = Symbol("_GradientElement.href");
svg$._GradientElement[dart.implements] = () => [svg$.UriReference];
dart.setLibraryUri(svg$._GradientElement, "dart:svg");
dart.setFieldSignature(svg$._GradientElement, () => ({
  __proto__: dart.getFields(svg$._GradientElement.__proto__),
  [$gradientTransform]: dart.finalFieldType(svg$.AnimatedTransformList),
  [$gradientUnits]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$spreadMethod]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.defineLazy(svg$._GradientElement, {
  /*svg$._GradientElement.SVG_SPREADMETHOD_PAD*/get SVG_SPREADMETHOD_PAD() {
    return 1;
  },
  /*svg$._GradientElement.SVG_SPREADMETHOD_REFLECT*/get SVG_SPREADMETHOD_REFLECT() {
    return 2;
  },
  /*svg$._GradientElement.SVG_SPREADMETHOD_REPEAT*/get SVG_SPREADMETHOD_REPEAT() {
    return 3;
  },
  /*svg$._GradientElement.SVG_SPREADMETHOD_UNKNOWN*/get SVG_SPREADMETHOD_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGGradientElement", svg$._GradientElement);
svg$.LinearGradientElement = class LinearGradientElement extends svg$._GradientElement {
  static new() {
    return svg$.LinearGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("linearGradient"));
  }
  get [$x1]() {
    return this.x1;
  }
  get [$x2]() {
    return this.x2;
  }
  get [$y1]() {
    return this.y1;
  }
  get [$y2]() {
    return this.y2;
  }
};
(svg$.LinearGradientElement.created = function() {
  this[x1$] = null;
  this[x2$] = null;
  this[y1$] = null;
  this[y2$] = null;
  svg$.LinearGradientElement.__proto__.created.call(this);
}).prototype = svg$.LinearGradientElement.prototype;
dart.addTypeTests(svg$.LinearGradientElement);
const x1$ = Symbol("LinearGradientElement.x1");
const x2$ = Symbol("LinearGradientElement.x2");
const y1$ = Symbol("LinearGradientElement.y1");
const y2$ = Symbol("LinearGradientElement.y2");
dart.setLibraryUri(svg$.LinearGradientElement, "dart:svg");
dart.setFieldSignature(svg$.LinearGradientElement, () => ({
  __proto__: dart.getFields(svg$.LinearGradientElement.__proto__),
  [$x1]: dart.finalFieldType(svg$.AnimatedLength),
  [$x2]: dart.finalFieldType(svg$.AnimatedLength),
  [$y1]: dart.finalFieldType(svg$.AnimatedLength),
  [$y2]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGLinearGradientElement", svg$.LinearGradientElement);
svg$.MarkerElement = class MarkerElement extends svg$.SvgElement {
  static new() {
    return svg$.MarkerElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("marker"));
  }
  get [$markerHeight]() {
    return this.markerHeight;
  }
  get [$markerUnits]() {
    return this.markerUnits;
  }
  get [$markerWidth]() {
    return this.markerWidth;
  }
  get [$orientAngle]() {
    return this.orientAngle;
  }
  get [$orientType]() {
    return this.orientType;
  }
  get [$refX]() {
    return this.refX;
  }
  get [$refY]() {
    return this.refY;
  }
  [$setOrientToAngle](...args) {
    return this.setOrientToAngle.apply(this, args);
  }
  [$setOrientToAuto](...args) {
    return this.setOrientToAuto.apply(this, args);
  }
  get [$preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [$viewBox]() {
    return this.viewBox;
  }
};
(svg$.MarkerElement.created = function() {
  this[markerHeight] = null;
  this[markerUnits] = null;
  this[markerWidth] = null;
  this[orientAngle] = null;
  this[orientType] = null;
  this[refX] = null;
  this[refY] = null;
  this[preserveAspectRatio$1] = null;
  this[viewBox$] = null;
  svg$.MarkerElement.__proto__.created.call(this);
}).prototype = svg$.MarkerElement.prototype;
dart.addTypeTests(svg$.MarkerElement);
const markerHeight = Symbol("MarkerElement.markerHeight");
const markerUnits = Symbol("MarkerElement.markerUnits");
const markerWidth = Symbol("MarkerElement.markerWidth");
const orientAngle = Symbol("MarkerElement.orientAngle");
const orientType = Symbol("MarkerElement.orientType");
const refX = Symbol("MarkerElement.refX");
const refY = Symbol("MarkerElement.refY");
const preserveAspectRatio$1 = Symbol("MarkerElement.preserveAspectRatio");
const viewBox$ = Symbol("MarkerElement.viewBox");
svg$.MarkerElement[dart.implements] = () => [svg$.FitToViewBox];
dart.setMethodSignature(svg$.MarkerElement, () => ({
  __proto__: dart.getMethods(svg$.MarkerElement.__proto__),
  [$setOrientToAngle]: dart.fnType(dart.void, [svg$.Angle]),
  [$setOrientToAuto]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(svg$.MarkerElement, "dart:svg");
dart.setFieldSignature(svg$.MarkerElement, () => ({
  __proto__: dart.getFields(svg$.MarkerElement.__proto__),
  [$markerHeight]: dart.finalFieldType(svg$.AnimatedLength),
  [$markerUnits]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$markerWidth]: dart.finalFieldType(svg$.AnimatedLength),
  [$orientAngle]: dart.finalFieldType(svg$.AnimatedAngle),
  [$orientType]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$refX]: dart.finalFieldType(svg$.AnimatedLength),
  [$refY]: dart.finalFieldType(svg$.AnimatedLength),
  [$preserveAspectRatio]: dart.finalFieldType(svg$.AnimatedPreserveAspectRatio),
  [$viewBox]: dart.finalFieldType(svg$.AnimatedRect)
}));
dart.defineLazy(svg$.MarkerElement, {
  /*svg$.MarkerElement.SVG_MARKERUNITS_STROKEWIDTH*/get SVG_MARKERUNITS_STROKEWIDTH() {
    return 2;
  },
  /*svg$.MarkerElement.SVG_MARKERUNITS_UNKNOWN*/get SVG_MARKERUNITS_UNKNOWN() {
    return 0;
  },
  /*svg$.MarkerElement.SVG_MARKERUNITS_USERSPACEONUSE*/get SVG_MARKERUNITS_USERSPACEONUSE() {
    return 1;
  },
  /*svg$.MarkerElement.SVG_MARKER_ORIENT_ANGLE*/get SVG_MARKER_ORIENT_ANGLE() {
    return 2;
  },
  /*svg$.MarkerElement.SVG_MARKER_ORIENT_AUTO*/get SVG_MARKER_ORIENT_AUTO() {
    return 1;
  },
  /*svg$.MarkerElement.SVG_MARKER_ORIENT_UNKNOWN*/get SVG_MARKER_ORIENT_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGMarkerElement", svg$.MarkerElement);
svg$.MaskElement = class MaskElement extends svg$.SvgElement {
  static new() {
    return svg$.MaskElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mask"));
  }
  get [$height]() {
    return this.height;
  }
  get [$maskContentUnits]() {
    return this.maskContentUnits;
  }
  get [$maskUnits]() {
    return this.maskUnits;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$requiredExtensions]() {
    return this.requiredExtensions;
  }
  get [$systemLanguage]() {
    return this.systemLanguage;
  }
};
(svg$.MaskElement.created = function() {
  this[height$34] = null;
  this[maskContentUnits] = null;
  this[maskUnits] = null;
  this[width$36] = null;
  this[x$29] = null;
  this[y$28] = null;
  this[requiredExtensions$0] = null;
  this[systemLanguage$0] = null;
  svg$.MaskElement.__proto__.created.call(this);
}).prototype = svg$.MaskElement.prototype;
dart.addTypeTests(svg$.MaskElement);
const height$34 = Symbol("MaskElement.height");
const maskContentUnits = Symbol("MaskElement.maskContentUnits");
const maskUnits = Symbol("MaskElement.maskUnits");
const width$36 = Symbol("MaskElement.width");
const x$29 = Symbol("MaskElement.x");
const y$28 = Symbol("MaskElement.y");
const requiredExtensions$0 = Symbol("MaskElement.requiredExtensions");
const systemLanguage$0 = Symbol("MaskElement.systemLanguage");
svg$.MaskElement[dart.implements] = () => [svg$.Tests];
dart.setLibraryUri(svg$.MaskElement, "dart:svg");
dart.setFieldSignature(svg$.MaskElement, () => ({
  __proto__: dart.getFields(svg$.MaskElement.__proto__),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$maskContentUnits]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$maskUnits]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength),
  [$requiredExtensions]: dart.finalFieldType(svg$.StringList),
  [$systemLanguage]: dart.finalFieldType(svg$.StringList)
}));
dart.registerExtension("SVGMaskElement", svg$.MaskElement);
svg$.Matrix = class Matrix extends _interceptors.Interceptor {
  get [$a]() {
    return this.a;
  }
  set [$a](value) {
    this.a = value;
  }
  get [$b]() {
    return this.b;
  }
  set [$b](value) {
    this.b = value;
  }
  get [$c]() {
    return this.c;
  }
  set [$c](value) {
    this.c = value;
  }
  get [$d]() {
    return this.d;
  }
  set [$d](value) {
    this.d = value;
  }
  get [$e]() {
    return this.e;
  }
  set [$e](value) {
    this.e = value;
  }
  get [$f]() {
    return this.f;
  }
  set [$f](value) {
    this.f = value;
  }
  [$flipX](...args) {
    return this.flipX.apply(this, args);
  }
  [$flipY](...args) {
    return this.flipY.apply(this, args);
  }
  [$inverse](...args) {
    return this.inverse.apply(this, args);
  }
  [$multiply](...args) {
    return this.multiply.apply(this, args);
  }
  [$rotate](...args) {
    return this.rotate.apply(this, args);
  }
  [$rotateFromVector](...args) {
    return this.rotateFromVector.apply(this, args);
  }
  [$scale](...args) {
    return this.scale.apply(this, args);
  }
  [$scaleNonUniform](...args) {
    return this.scaleNonUniform.apply(this, args);
  }
  [$skewX](...args) {
    return this.skewX.apply(this, args);
  }
  [$skewY](...args) {
    return this.skewY.apply(this, args);
  }
  [$translate](...args) {
    return this.translate.apply(this, args);
  }
};
dart.addTypeTests(svg$.Matrix);
const a = Symbol("Matrix.a");
const b = Symbol("Matrix.b");
const c = Symbol("Matrix.c");
const d = Symbol("Matrix.d");
const e = Symbol("Matrix.e");
const f = Symbol("Matrix.f");
dart.setMethodSignature(svg$.Matrix, () => ({
  __proto__: dart.getMethods(svg$.Matrix.__proto__),
  [$flipX]: dart.fnType(svg$.Matrix, []),
  [$flipY]: dart.fnType(svg$.Matrix, []),
  [$inverse]: dart.fnType(svg$.Matrix, []),
  [$multiply]: dart.fnType(svg$.Matrix, [svg$.Matrix]),
  [$rotate]: dart.fnType(svg$.Matrix, [core.num]),
  [$rotateFromVector]: dart.fnType(svg$.Matrix, [core.num, core.num]),
  [$scale]: dart.fnType(svg$.Matrix, [core.num]),
  [$scaleNonUniform]: dart.fnType(svg$.Matrix, [core.num, core.num]),
  [$skewX]: dart.fnType(svg$.Matrix, [core.num]),
  [$skewY]: dart.fnType(svg$.Matrix, [core.num]),
  [$translate]: dart.fnType(svg$.Matrix, [core.num, core.num])
}));
dart.setLibraryUri(svg$.Matrix, "dart:svg");
dart.setFieldSignature(svg$.Matrix, () => ({
  __proto__: dart.getFields(svg$.Matrix.__proto__),
  [$a]: dart.fieldType(core.num),
  [$b]: dart.fieldType(core.num),
  [$c]: dart.fieldType(core.num),
  [$d]: dart.fieldType(core.num),
  [$e]: dart.fieldType(core.num),
  [$f]: dart.fieldType(core.num)
}));
dart.registerExtension("SVGMatrix", svg$.Matrix);
svg$.MetadataElement = class MetadataElement extends svg$.SvgElement {};
(svg$.MetadataElement.created = function() {
  svg$.MetadataElement.__proto__.created.call(this);
}).prototype = svg$.MetadataElement.prototype;
dart.addTypeTests(svg$.MetadataElement);
dart.setLibraryUri(svg$.MetadataElement, "dart:svg");
dart.registerExtension("SVGMetadataElement", svg$.MetadataElement);
svg$.Number = class Number extends _interceptors.Interceptor {
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
};
dart.addTypeTests(svg$.Number);
const value$20 = Symbol("Number.value");
dart.setLibraryUri(svg$.Number, "dart:svg");
dart.setFieldSignature(svg$.Number, () => ({
  __proto__: dart.getFields(svg$.Number.__proto__),
  [$value]: dart.fieldType(core.num)
}));
dart.registerExtension("SVGNumber", svg$.Number);
const Interceptor_ListMixin$$14 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$14.new = function() {
  Interceptor_ListMixin$$14.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$14.prototype;
dart.applyMixin(Interceptor_ListMixin$$14, collection.ListMixin$(svg$.Number));
const Interceptor_ImmutableListMixin$$14 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$14 {};
(Interceptor_ImmutableListMixin$$14.new = function() {
  Interceptor_ImmutableListMixin$$14.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$14.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$14, html$.ImmutableListMixin$(svg$.Number));
svg$.NumberList = class NumberList extends Interceptor_ImmutableListMixin$$14 {
  get [$length]() {
    return this.length;
  }
  get [$numberOfItems]() {
    return this.numberOfItems;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this.getItem(index);
  }
  [$_set](index, value) {
    svg$.Number._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [$appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [$initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [$insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [$removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [$replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.NumberList.prototype[dart.isList] = true;
dart.addTypeTests(svg$.NumberList);
const numberOfItems$ = Symbol("NumberList.numberOfItems");
svg$.NumberList[dart.implements] = () => [ListOfNumber()];
dart.setMethodSignature(svg$.NumberList, () => ({
  __proto__: dart.getMethods(svg$.NumberList.__proto__),
  [$_get]: dart.fnType(svg$.Number, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(svg$.Number, [core.int]),
  [__setter__$]: dart.fnType(dart.void, [core.int, svg$.Number]),
  [$appendItem]: dart.fnType(svg$.Number, [svg$.Number]),
  [$clear]: dart.fnType(dart.void, []),
  [$getItem]: dart.fnType(svg$.Number, [core.int]),
  [$initialize]: dart.fnType(svg$.Number, [svg$.Number]),
  [$insertItemBefore]: dart.fnType(svg$.Number, [svg$.Number, core.int]),
  [$removeItem]: dart.fnType(svg$.Number, [core.int]),
  [$replaceItem]: dart.fnType(svg$.Number, [svg$.Number, core.int])
}));
dart.setGetterSignature(svg$.NumberList, () => ({
  __proto__: dart.getGetters(svg$.NumberList.__proto__),
  [$length]: core.int,
  [$first]: svg$.Number,
  [$last]: svg$.Number,
  [$single]: svg$.Number
}));
dart.setSetterSignature(svg$.NumberList, () => ({
  __proto__: dart.getSetters(svg$.NumberList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(svg$.NumberList, "dart:svg");
dart.setFieldSignature(svg$.NumberList, () => ({
  __proto__: dart.getFields(svg$.NumberList.__proto__),
  [$numberOfItems]: dart.finalFieldType(core.int)
}));
dart.registerExtension("SVGNumberList", svg$.NumberList);
svg$.PathElement = class PathElement extends svg$.GeometryElement {
  static new() {
    return svg$.PathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("path"));
  }
};
(svg$.PathElement.created = function() {
  svg$.PathElement.__proto__.created.call(this);
}).prototype = svg$.PathElement.prototype;
dart.addTypeTests(svg$.PathElement);
dart.setLibraryUri(svg$.PathElement, "dart:svg");
dart.registerExtension("SVGPathElement", svg$.PathElement);
svg$.PatternElement = class PatternElement extends svg$.SvgElement {
  static new() {
    return svg$.PatternElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("pattern"));
  }
  get [$height]() {
    return this.height;
  }
  get [$patternContentUnits]() {
    return this.patternContentUnits;
  }
  get [$patternTransform]() {
    return this.patternTransform;
  }
  get [$patternUnits]() {
    return this.patternUnits;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [$viewBox]() {
    return this.viewBox;
  }
  get [$requiredExtensions]() {
    return this.requiredExtensions;
  }
  get [$systemLanguage]() {
    return this.systemLanguage;
  }
  get [$href]() {
    return this.href;
  }
};
(svg$.PatternElement.created = function() {
  this[height$35] = null;
  this[patternContentUnits] = null;
  this[patternTransform] = null;
  this[patternUnits] = null;
  this[width$37] = null;
  this[x$30] = null;
  this[y$29] = null;
  this[preserveAspectRatio$2] = null;
  this[viewBox$0] = null;
  this[requiredExtensions$1] = null;
  this[systemLanguage$1] = null;
  this[href$13] = null;
  svg$.PatternElement.__proto__.created.call(this);
}).prototype = svg$.PatternElement.prototype;
dart.addTypeTests(svg$.PatternElement);
const height$35 = Symbol("PatternElement.height");
const patternContentUnits = Symbol("PatternElement.patternContentUnits");
const patternTransform = Symbol("PatternElement.patternTransform");
const patternUnits = Symbol("PatternElement.patternUnits");
const width$37 = Symbol("PatternElement.width");
const x$30 = Symbol("PatternElement.x");
const y$29 = Symbol("PatternElement.y");
const preserveAspectRatio$2 = Symbol("PatternElement.preserveAspectRatio");
const viewBox$0 = Symbol("PatternElement.viewBox");
const requiredExtensions$1 = Symbol("PatternElement.requiredExtensions");
const systemLanguage$1 = Symbol("PatternElement.systemLanguage");
const href$13 = Symbol("PatternElement.href");
svg$.PatternElement[dart.implements] = () => [svg$.FitToViewBox, svg$.UriReference, svg$.Tests];
dart.setLibraryUri(svg$.PatternElement, "dart:svg");
dart.setFieldSignature(svg$.PatternElement, () => ({
  __proto__: dart.getFields(svg$.PatternElement.__proto__),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$patternContentUnits]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$patternTransform]: dart.finalFieldType(svg$.AnimatedTransformList),
  [$patternUnits]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength),
  [$preserveAspectRatio]: dart.finalFieldType(svg$.AnimatedPreserveAspectRatio),
  [$viewBox]: dart.finalFieldType(svg$.AnimatedRect),
  [$requiredExtensions]: dart.finalFieldType(svg$.StringList),
  [$systemLanguage]: dart.finalFieldType(svg$.StringList),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.registerExtension("SVGPatternElement", svg$.PatternElement);
svg$.Point = class Point extends _interceptors.Interceptor {
  get [$x]() {
    return this.x;
  }
  set [$x](value) {
    this.x = value;
  }
  get [$y]() {
    return this.y;
  }
  set [$y](value) {
    this.y = value;
  }
  [$matrixTransform](...args) {
    return this.matrixTransform.apply(this, args);
  }
};
dart.addTypeTests(svg$.Point);
const x$31 = Symbol("Point.x");
const y$30 = Symbol("Point.y");
dart.setMethodSignature(svg$.Point, () => ({
  __proto__: dart.getMethods(svg$.Point.__proto__),
  [$matrixTransform]: dart.fnType(svg$.Point, [svg$.Matrix])
}));
dart.setLibraryUri(svg$.Point, "dart:svg");
dart.setFieldSignature(svg$.Point, () => ({
  __proto__: dart.getFields(svg$.Point.__proto__),
  [$x]: dart.fieldType(core.num),
  [$y]: dart.fieldType(core.num)
}));
dart.registerExtension("SVGPoint", svg$.Point);
svg$.PointList = class PointList extends _interceptors.Interceptor {
  get [$length]() {
    return this.length;
  }
  get [$numberOfItems]() {
    return this.numberOfItems;
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [$appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [$initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [$insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [$removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [$replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
dart.addTypeTests(svg$.PointList);
const length$17 = Symbol("PointList.length");
const numberOfItems$0 = Symbol("PointList.numberOfItems");
dart.setMethodSignature(svg$.PointList, () => ({
  __proto__: dart.getMethods(svg$.PointList.__proto__),
  [__setter__$]: dart.fnType(dart.void, [core.int, svg$.Point]),
  [$appendItem]: dart.fnType(svg$.Point, [svg$.Point]),
  [$clear]: dart.fnType(dart.void, []),
  [$getItem]: dart.fnType(svg$.Point, [core.int]),
  [$initialize]: dart.fnType(svg$.Point, [svg$.Point]),
  [$insertItemBefore]: dart.fnType(svg$.Point, [svg$.Point, core.int]),
  [$removeItem]: dart.fnType(svg$.Point, [core.int]),
  [$replaceItem]: dart.fnType(svg$.Point, [svg$.Point, core.int])
}));
dart.setLibraryUri(svg$.PointList, "dart:svg");
dart.setFieldSignature(svg$.PointList, () => ({
  __proto__: dart.getFields(svg$.PointList.__proto__),
  [$length]: dart.finalFieldType(core.int),
  [$numberOfItems]: dart.finalFieldType(core.int)
}));
dart.registerExtension("SVGPointList", svg$.PointList);
svg$.PolygonElement = class PolygonElement extends svg$.GeometryElement {
  static new() {
    return svg$.PolygonElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polygon"));
  }
  get [$animatedPoints]() {
    return this.animatedPoints;
  }
  get [$points]() {
    return this.points;
  }
};
(svg$.PolygonElement.created = function() {
  this[animatedPoints] = null;
  this[points] = null;
  svg$.PolygonElement.__proto__.created.call(this);
}).prototype = svg$.PolygonElement.prototype;
dart.addTypeTests(svg$.PolygonElement);
const animatedPoints = Symbol("PolygonElement.animatedPoints");
const points = Symbol("PolygonElement.points");
dart.setLibraryUri(svg$.PolygonElement, "dart:svg");
dart.setFieldSignature(svg$.PolygonElement, () => ({
  __proto__: dart.getFields(svg$.PolygonElement.__proto__),
  [$animatedPoints]: dart.finalFieldType(svg$.PointList),
  [$points]: dart.finalFieldType(svg$.PointList)
}));
dart.registerExtension("SVGPolygonElement", svg$.PolygonElement);
svg$.PolylineElement = class PolylineElement extends svg$.GeometryElement {
  static new() {
    return svg$.PolylineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polyline"));
  }
  get [$animatedPoints]() {
    return this.animatedPoints;
  }
  get [$points]() {
    return this.points;
  }
};
(svg$.PolylineElement.created = function() {
  this[animatedPoints$] = null;
  this[points$] = null;
  svg$.PolylineElement.__proto__.created.call(this);
}).prototype = svg$.PolylineElement.prototype;
dart.addTypeTests(svg$.PolylineElement);
const animatedPoints$ = Symbol("PolylineElement.animatedPoints");
const points$ = Symbol("PolylineElement.points");
dart.setLibraryUri(svg$.PolylineElement, "dart:svg");
dart.setFieldSignature(svg$.PolylineElement, () => ({
  __proto__: dart.getFields(svg$.PolylineElement.__proto__),
  [$animatedPoints]: dart.finalFieldType(svg$.PointList),
  [$points]: dart.finalFieldType(svg$.PointList)
}));
dart.registerExtension("SVGPolylineElement", svg$.PolylineElement);
svg$.PreserveAspectRatio = class PreserveAspectRatio extends _interceptors.Interceptor {
  get [$align]() {
    return this.align;
  }
  set [$align](value) {
    this.align = value;
  }
  get [$meetOrSlice]() {
    return this.meetOrSlice;
  }
  set [$meetOrSlice](value) {
    this.meetOrSlice = value;
  }
};
dart.addTypeTests(svg$.PreserveAspectRatio);
const align$ = Symbol("PreserveAspectRatio.align");
const meetOrSlice = Symbol("PreserveAspectRatio.meetOrSlice");
dart.setLibraryUri(svg$.PreserveAspectRatio, "dart:svg");
dart.setFieldSignature(svg$.PreserveAspectRatio, () => ({
  __proto__: dart.getFields(svg$.PreserveAspectRatio.__proto__),
  [$align]: dart.fieldType(core.int),
  [$meetOrSlice]: dart.fieldType(core.int)
}));
dart.defineLazy(svg$.PreserveAspectRatio, {
  /*svg$.PreserveAspectRatio.SVG_MEETORSLICE_MEET*/get SVG_MEETORSLICE_MEET() {
    return 1;
  },
  /*svg$.PreserveAspectRatio.SVG_MEETORSLICE_SLICE*/get SVG_MEETORSLICE_SLICE() {
    return 2;
  },
  /*svg$.PreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN*/get SVG_MEETORSLICE_UNKNOWN() {
    return 0;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE*/get SVG_PRESERVEASPECTRATIO_NONE() {
    return 1;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN*/get SVG_PRESERVEASPECTRATIO_UNKNOWN() {
    return 0;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX*/get SVG_PRESERVEASPECTRATIO_XMAXYMAX() {
    return 10;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID*/get SVG_PRESERVEASPECTRATIO_XMAXYMID() {
    return 7;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN*/get SVG_PRESERVEASPECTRATIO_XMAXYMIN() {
    return 4;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX*/get SVG_PRESERVEASPECTRATIO_XMIDYMAX() {
    return 9;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID*/get SVG_PRESERVEASPECTRATIO_XMIDYMID() {
    return 6;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN*/get SVG_PRESERVEASPECTRATIO_XMIDYMIN() {
    return 3;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX*/get SVG_PRESERVEASPECTRATIO_XMINYMAX() {
    return 8;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID*/get SVG_PRESERVEASPECTRATIO_XMINYMID() {
    return 5;
  },
  /*svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN*/get SVG_PRESERVEASPECTRATIO_XMINYMIN() {
    return 2;
  }
});
dart.registerExtension("SVGPreserveAspectRatio", svg$.PreserveAspectRatio);
svg$.RadialGradientElement = class RadialGradientElement extends svg$._GradientElement {
  static new() {
    return svg$.RadialGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("radialGradient"));
  }
  get [$cx]() {
    return this.cx;
  }
  get [$cy]() {
    return this.cy;
  }
  get [$fr]() {
    return this.fr;
  }
  get [$fx]() {
    return this.fx;
  }
  get [$fy]() {
    return this.fy;
  }
  get [$r]() {
    return this.r;
  }
};
(svg$.RadialGradientElement.created = function() {
  this[cx$0] = null;
  this[cy$0] = null;
  this[fr] = null;
  this[fx] = null;
  this[fy] = null;
  this[r$] = null;
  svg$.RadialGradientElement.__proto__.created.call(this);
}).prototype = svg$.RadialGradientElement.prototype;
dart.addTypeTests(svg$.RadialGradientElement);
const cx$0 = Symbol("RadialGradientElement.cx");
const cy$0 = Symbol("RadialGradientElement.cy");
const fr = Symbol("RadialGradientElement.fr");
const fx = Symbol("RadialGradientElement.fx");
const fy = Symbol("RadialGradientElement.fy");
const r$ = Symbol("RadialGradientElement.r");
dart.setLibraryUri(svg$.RadialGradientElement, "dart:svg");
dart.setFieldSignature(svg$.RadialGradientElement, () => ({
  __proto__: dart.getFields(svg$.RadialGradientElement.__proto__),
  [$cx]: dart.finalFieldType(svg$.AnimatedLength),
  [$cy]: dart.finalFieldType(svg$.AnimatedLength),
  [$fr]: dart.finalFieldType(svg$.AnimatedLength),
  [$fx]: dart.finalFieldType(svg$.AnimatedLength),
  [$fy]: dart.finalFieldType(svg$.AnimatedLength),
  [$r]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGRadialGradientElement", svg$.RadialGradientElement);
svg$.Rect = class Rect extends _interceptors.Interceptor {
  get [$height]() {
    return this.height;
  }
  set [$height](value) {
    this.height = value;
  }
  get [$width]() {
    return this.width;
  }
  set [$width](value) {
    this.width = value;
  }
  get [$x]() {
    return this.x;
  }
  set [$x](value) {
    this.x = value;
  }
  get [$y]() {
    return this.y;
  }
  set [$y](value) {
    this.y = value;
  }
};
dart.addTypeTests(svg$.Rect);
const height$36 = Symbol("Rect.height");
const width$38 = Symbol("Rect.width");
const x$32 = Symbol("Rect.x");
const y$31 = Symbol("Rect.y");
dart.setLibraryUri(svg$.Rect, "dart:svg");
dart.setFieldSignature(svg$.Rect, () => ({
  __proto__: dart.getFields(svg$.Rect.__proto__),
  [$height]: dart.fieldType(core.num),
  [$width]: dart.fieldType(core.num),
  [$x]: dart.fieldType(core.num),
  [$y]: dart.fieldType(core.num)
}));
dart.registerExtension("SVGRect", svg$.Rect);
svg$.RectElement = class RectElement extends svg$.GeometryElement {
  static new() {
    return svg$.RectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("rect"));
  }
  get [$height]() {
    return this.height;
  }
  get [$rx]() {
    return this.rx;
  }
  get [$ry]() {
    return this.ry;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.RectElement.created = function() {
  this[height$37] = null;
  this[rx$] = null;
  this[ry$] = null;
  this[width$39] = null;
  this[x$33] = null;
  this[y$32] = null;
  svg$.RectElement.__proto__.created.call(this);
}).prototype = svg$.RectElement.prototype;
dart.addTypeTests(svg$.RectElement);
const height$37 = Symbol("RectElement.height");
const rx$ = Symbol("RectElement.rx");
const ry$ = Symbol("RectElement.ry");
const width$39 = Symbol("RectElement.width");
const x$33 = Symbol("RectElement.x");
const y$32 = Symbol("RectElement.y");
dart.setLibraryUri(svg$.RectElement, "dart:svg");
dart.setFieldSignature(svg$.RectElement, () => ({
  __proto__: dart.getFields(svg$.RectElement.__proto__),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$rx]: dart.finalFieldType(svg$.AnimatedLength),
  [$ry]: dart.finalFieldType(svg$.AnimatedLength),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.registerExtension("SVGRectElement", svg$.RectElement);
svg$.ScriptElement = class ScriptElement extends svg$.SvgElement {
  static new() {
    return svg$.ScriptElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("script"));
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  get [$href]() {
    return this.href;
  }
};
(svg$.ScriptElement.created = function() {
  this[type$39] = null;
  this[href$14] = null;
  svg$.ScriptElement.__proto__.created.call(this);
}).prototype = svg$.ScriptElement.prototype;
dart.addTypeTests(svg$.ScriptElement);
const type$39 = Symbol("ScriptElement.type");
const href$14 = Symbol("ScriptElement.href");
svg$.ScriptElement[dart.implements] = () => [svg$.UriReference];
dart.setLibraryUri(svg$.ScriptElement, "dart:svg");
dart.setFieldSignature(svg$.ScriptElement, () => ({
  __proto__: dart.getFields(svg$.ScriptElement.__proto__),
  [$type]: dart.fieldType(core.String),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.registerExtension("SVGScriptElement", svg$.ScriptElement);
svg$.SetElement = class SetElement extends svg$.AnimationElement {
  static new() {
    return svg$.SetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("set"));
  }
  static get supported() {
    return dart.test(svg$.SvgElement.isTagSupported("set")) && svg$.SetElement.is(svg$.SvgElement.tag("set"));
  }
};
(svg$.SetElement.created = function() {
  svg$.SetElement.__proto__.created.call(this);
}).prototype = svg$.SetElement.prototype;
dart.addTypeTests(svg$.SetElement);
dart.setLibraryUri(svg$.SetElement, "dart:svg");
dart.registerExtension("SVGSetElement", svg$.SetElement);
svg$.StopElement = class StopElement extends svg$.SvgElement {
  static new() {
    return svg$.StopElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("stop"));
  }
  get [$gradientOffset]() {
    return this.offset;
  }
};
(svg$.StopElement.created = function() {
  this[gradientOffset] = null;
  svg$.StopElement.__proto__.created.call(this);
}).prototype = svg$.StopElement.prototype;
dart.addTypeTests(svg$.StopElement);
const gradientOffset = Symbol("StopElement.gradientOffset");
dart.setLibraryUri(svg$.StopElement, "dart:svg");
dart.setFieldSignature(svg$.StopElement, () => ({
  __proto__: dart.getFields(svg$.StopElement.__proto__),
  [$gradientOffset]: dart.finalFieldType(svg$.AnimatedNumber)
}));
dart.registerExtension("SVGStopElement", svg$.StopElement);
const Interceptor_ListMixin$$15 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$15.new = function() {
  Interceptor_ListMixin$$15.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$15.prototype;
dart.applyMixin(Interceptor_ListMixin$$15, collection.ListMixin$(core.String));
const Interceptor_ImmutableListMixin$$15 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$15 {};
(Interceptor_ImmutableListMixin$$15.new = function() {
  Interceptor_ImmutableListMixin$$15.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$15.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$15, html$.ImmutableListMixin$(core.String));
svg$.StringList = class StringList extends Interceptor_ImmutableListMixin$$15 {
  get [$length]() {
    return this.length;
  }
  get [$numberOfItems]() {
    return this.numberOfItems;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this.getItem(index);
  }
  [$_set](index, value) {
    core.String._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [$appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [$initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [$insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [$removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [$replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.StringList.prototype[dart.isList] = true;
dart.addTypeTests(svg$.StringList);
const numberOfItems$1 = Symbol("StringList.numberOfItems");
svg$.StringList[dart.implements] = () => [ListOfString()];
dart.setMethodSignature(svg$.StringList, () => ({
  __proto__: dart.getMethods(svg$.StringList.__proto__),
  [$_get]: dart.fnType(core.String, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(core.String, [core.int]),
  [__setter__$]: dart.fnType(dart.void, [core.int, core.String]),
  [$appendItem]: dart.fnType(core.String, [core.String]),
  [$clear]: dart.fnType(dart.void, []),
  [$getItem]: dart.fnType(core.String, [core.int]),
  [$initialize]: dart.fnType(core.String, [core.String]),
  [$insertItemBefore]: dart.fnType(core.String, [core.String, core.int]),
  [$removeItem]: dart.fnType(core.String, [core.int]),
  [$replaceItem]: dart.fnType(core.String, [core.String, core.int])
}));
dart.setGetterSignature(svg$.StringList, () => ({
  __proto__: dart.getGetters(svg$.StringList.__proto__),
  [$length]: core.int,
  [$first]: core.String,
  [$last]: core.String,
  [$single]: core.String
}));
dart.setSetterSignature(svg$.StringList, () => ({
  __proto__: dart.getSetters(svg$.StringList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(svg$.StringList, "dart:svg");
dart.setFieldSignature(svg$.StringList, () => ({
  __proto__: dart.getFields(svg$.StringList.__proto__),
  [$numberOfItems]: dart.finalFieldType(core.int)
}));
dart.registerExtension("SVGStringList", svg$.StringList);
svg$.StyleElement = class StyleElement extends svg$.SvgElement {
  static new() {
    return svg$.StyleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("style"));
  }
  get [$disabled]() {
    return this.disabled;
  }
  set [$disabled](value) {
    this.disabled = value;
  }
  get [$media]() {
    return this.media;
  }
  set [$media](value) {
    this.media = value;
  }
  get [$sheet]() {
    return this.sheet;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
};
(svg$.StyleElement.created = function() {
  this[disabled$10] = null;
  this[media$6] = null;
  this[sheet$1] = null;
  this[type$40] = null;
  svg$.StyleElement.__proto__.created.call(this);
}).prototype = svg$.StyleElement.prototype;
dart.addTypeTests(svg$.StyleElement);
const disabled$10 = Symbol("StyleElement.disabled");
const media$6 = Symbol("StyleElement.media");
const sheet$1 = Symbol("StyleElement.sheet");
const type$40 = Symbol("StyleElement.type");
dart.setLibraryUri(svg$.StyleElement, "dart:svg");
dart.setFieldSignature(svg$.StyleElement, () => ({
  __proto__: dart.getFields(svg$.StyleElement.__proto__),
  [$disabled]: dart.fieldType(core.bool),
  [$media]: dart.fieldType(core.String),
  [$sheet]: dart.finalFieldType(html$.StyleSheet),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("SVGStyleElement", svg$.StyleElement);
const _element$0 = dart.privateName(svg$, "_element");
svg$.AttributeClassSet = class AttributeClassSet extends html_common.CssClassSetImpl {
  readClasses() {
    let classname = this[_element$0][$attributes][$_get]("class");
    if (svg$.AnimatedString.is(classname)) {
      classname = svg$.AnimatedString.as(classname).baseVal;
    }
    let s = new (_IdentityHashSetOfString()).new();
    if (classname == null) {
      return s;
    }
    for (let name of classname[$split](" ")) {
      let trimmed = name[$trim]();
      if (!trimmed[$isEmpty]) {
        s.add(trimmed);
      }
    }
    return s;
  }
  writeClasses(s) {
    this[_element$0][$setAttribute]("class", s.join(" "));
  }
};
(svg$.AttributeClassSet.new = function(element) {
  this[_element$0] = element;
}).prototype = svg$.AttributeClassSet.prototype;
dart.addTypeTests(svg$.AttributeClassSet);
dart.setMethodSignature(svg$.AttributeClassSet, () => ({
  __proto__: dart.getMethods(svg$.AttributeClassSet.__proto__),
  readClasses: dart.fnType(core.Set$(core.String), []),
  writeClasses: dart.fnType(dart.void, [core.Set])
}));
dart.setLibraryUri(svg$.AttributeClassSet, "dart:svg");
dart.setFieldSignature(svg$.AttributeClassSet, () => ({
  __proto__: dart.getFields(svg$.AttributeClassSet.__proto__),
  [_element$0]: dart.finalFieldType(html$.Element)
}));
svg$.SvgSvgElement = class SvgSvgElement extends svg$.GraphicsElement {
  static new() {
    let el = svg$.SvgElement.tag("svg");
    el[$attributes][$_set]("version", "1.1");
    return svg$.SvgSvgElement._check(el);
  }
  get [$currentScale]() {
    return this.currentScale;
  }
  set [$currentScale](value) {
    this.currentScale = value;
  }
  get [$currentTranslate]() {
    return this.currentTranslate;
  }
  get [$height]() {
    return this.height;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  [$animationsPaused](...args) {
    return this.animationsPaused.apply(this, args);
  }
  [$checkEnclosure](...args) {
    return this.checkEnclosure.apply(this, args);
  }
  [$checkIntersection](...args) {
    return this.checkIntersection.apply(this, args);
  }
  [$createSvgAngle](...args) {
    return this.createSVGAngle.apply(this, args);
  }
  [$createSvgLength](...args) {
    return this.createSVGLength.apply(this, args);
  }
  [$createSvgMatrix](...args) {
    return this.createSVGMatrix.apply(this, args);
  }
  [$createSvgNumber](...args) {
    return this.createSVGNumber.apply(this, args);
  }
  [$createSvgPoint](...args) {
    return this.createSVGPoint.apply(this, args);
  }
  [$createSvgRect](...args) {
    return this.createSVGRect.apply(this, args);
  }
  [$createSvgTransform](...args) {
    return this.createSVGTransform.apply(this, args);
  }
  [$createSvgTransformFromMatrix](...args) {
    return this.createSVGTransformFromMatrix.apply(this, args);
  }
  [$deselectAll](...args) {
    return this.deselectAll.apply(this, args);
  }
  [$forceRedraw](...args) {
    return this.forceRedraw.apply(this, args);
  }
  [$getCurrentTime](...args) {
    return this.getCurrentTime.apply(this, args);
  }
  [$getElementById](...args) {
    return this.getElementById.apply(this, args);
  }
  [$getEnclosureList](...args) {
    return this.getEnclosureList.apply(this, args);
  }
  [$getIntersectionList](...args) {
    return this.getIntersectionList.apply(this, args);
  }
  [$pauseAnimations](...args) {
    return this.pauseAnimations.apply(this, args);
  }
  [$setCurrentTime](...args) {
    return this.setCurrentTime.apply(this, args);
  }
  [$suspendRedraw](...args) {
    return this.suspendRedraw.apply(this, args);
  }
  [$unpauseAnimations](...args) {
    return this.unpauseAnimations.apply(this, args);
  }
  [$unsuspendRedraw](...args) {
    return this.unsuspendRedraw.apply(this, args);
  }
  [$unsuspendRedrawAll](...args) {
    return this.unsuspendRedrawAll.apply(this, args);
  }
  get [$preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [$viewBox]() {
    return this.viewBox;
  }
  get [$zoomAndPan]() {
    return this.zoomAndPan;
  }
  set [$zoomAndPan](value) {
    this.zoomAndPan = value;
  }
};
(svg$.SvgSvgElement.created = function() {
  this[currentScale] = null;
  this[currentTranslate] = null;
  this[height$38] = null;
  this[width$40] = null;
  this[x$34] = null;
  this[y$33] = null;
  this[preserveAspectRatio$3] = null;
  this[viewBox$1] = null;
  this[zoomAndPan] = null;
  svg$.SvgSvgElement.__proto__.created.call(this);
}).prototype = svg$.SvgSvgElement.prototype;
dart.addTypeTests(svg$.SvgSvgElement);
const currentScale = Symbol("SvgSvgElement.currentScale");
const currentTranslate = Symbol("SvgSvgElement.currentTranslate");
const height$38 = Symbol("SvgSvgElement.height");
const width$40 = Symbol("SvgSvgElement.width");
const x$34 = Symbol("SvgSvgElement.x");
const y$33 = Symbol("SvgSvgElement.y");
const preserveAspectRatio$3 = Symbol("SvgSvgElement.preserveAspectRatio");
const viewBox$1 = Symbol("SvgSvgElement.viewBox");
const zoomAndPan = Symbol("SvgSvgElement.zoomAndPan");
svg$.SvgSvgElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
dart.setMethodSignature(svg$.SvgSvgElement, () => ({
  __proto__: dart.getMethods(svg$.SvgSvgElement.__proto__),
  [$animationsPaused]: dart.fnType(core.bool, []),
  [$checkEnclosure]: dart.fnType(core.bool, [svg$.SvgElement, svg$.Rect]),
  [$checkIntersection]: dart.fnType(core.bool, [svg$.SvgElement, svg$.Rect]),
  [$createSvgAngle]: dart.fnType(svg$.Angle, []),
  [$createSvgLength]: dart.fnType(svg$.Length, []),
  [$createSvgMatrix]: dart.fnType(svg$.Matrix, []),
  [$createSvgNumber]: dart.fnType(svg$.Number, []),
  [$createSvgPoint]: dart.fnType(svg$.Point, []),
  [$createSvgRect]: dart.fnType(svg$.Rect, []),
  [$createSvgTransform]: dart.fnType(svg$.Transform, []),
  [$createSvgTransformFromMatrix]: dart.fnType(svg$.Transform, [svg$.Matrix]),
  [$deselectAll]: dart.fnType(dart.void, []),
  [$forceRedraw]: dart.fnType(dart.void, []),
  [$getCurrentTime]: dart.fnType(core.double, []),
  [$getElementById]: dart.fnType(html$.Element, [core.String]),
  [$getEnclosureList]: dart.fnType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
  [$getIntersectionList]: dart.fnType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
  [$pauseAnimations]: dart.fnType(dart.void, []),
  [$setCurrentTime]: dart.fnType(dart.void, [core.num]),
  [$suspendRedraw]: dart.fnType(core.int, [core.int]),
  [$unpauseAnimations]: dart.fnType(dart.void, []),
  [$unsuspendRedraw]: dart.fnType(dart.void, [core.int]),
  [$unsuspendRedrawAll]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(svg$.SvgSvgElement, "dart:svg");
dart.setFieldSignature(svg$.SvgSvgElement, () => ({
  __proto__: dart.getFields(svg$.SvgSvgElement.__proto__),
  [$currentScale]: dart.fieldType(core.num),
  [$currentTranslate]: dart.finalFieldType(svg$.Point),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength),
  [$preserveAspectRatio]: dart.finalFieldType(svg$.AnimatedPreserveAspectRatio),
  [$viewBox]: dart.finalFieldType(svg$.AnimatedRect),
  [$zoomAndPan]: dart.fieldType(core.int)
}));
dart.registerExtension("SVGSVGElement", svg$.SvgSvgElement);
svg$.SwitchElement = class SwitchElement extends svg$.GraphicsElement {
  static new() {
    return svg$.SwitchElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("switch"));
  }
};
(svg$.SwitchElement.created = function() {
  svg$.SwitchElement.__proto__.created.call(this);
}).prototype = svg$.SwitchElement.prototype;
dart.addTypeTests(svg$.SwitchElement);
dart.setLibraryUri(svg$.SwitchElement, "dart:svg");
dart.registerExtension("SVGSwitchElement", svg$.SwitchElement);
svg$.SymbolElement = class SymbolElement extends svg$.SvgElement {
  static new() {
    return svg$.SymbolElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("symbol"));
  }
  get [$preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [$viewBox]() {
    return this.viewBox;
  }
};
(svg$.SymbolElement.created = function() {
  this[preserveAspectRatio$4] = null;
  this[viewBox$2] = null;
  svg$.SymbolElement.__proto__.created.call(this);
}).prototype = svg$.SymbolElement.prototype;
dart.addTypeTests(svg$.SymbolElement);
const preserveAspectRatio$4 = Symbol("SymbolElement.preserveAspectRatio");
const viewBox$2 = Symbol("SymbolElement.viewBox");
svg$.SymbolElement[dart.implements] = () => [svg$.FitToViewBox];
dart.setLibraryUri(svg$.SymbolElement, "dart:svg");
dart.setFieldSignature(svg$.SymbolElement, () => ({
  __proto__: dart.getFields(svg$.SymbolElement.__proto__),
  [$preserveAspectRatio]: dart.finalFieldType(svg$.AnimatedPreserveAspectRatio),
  [$viewBox]: dart.finalFieldType(svg$.AnimatedRect)
}));
dart.registerExtension("SVGSymbolElement", svg$.SymbolElement);
svg$.TextContentElement = class TextContentElement extends svg$.GraphicsElement {
  get [$lengthAdjust]() {
    return this.lengthAdjust;
  }
  get [$textLength]() {
    return this.textLength;
  }
  [$getCharNumAtPosition](...args) {
    return this.getCharNumAtPosition.apply(this, args);
  }
  [$getComputedTextLength](...args) {
    return this.getComputedTextLength.apply(this, args);
  }
  [$getEndPositionOfChar](...args) {
    return this.getEndPositionOfChar.apply(this, args);
  }
  [$getExtentOfChar](...args) {
    return this.getExtentOfChar.apply(this, args);
  }
  [$getNumberOfChars](...args) {
    return this.getNumberOfChars.apply(this, args);
  }
  [$getRotationOfChar](...args) {
    return this.getRotationOfChar.apply(this, args);
  }
  [$getStartPositionOfChar](...args) {
    return this.getStartPositionOfChar.apply(this, args);
  }
  [$getSubStringLength](...args) {
    return this.getSubStringLength.apply(this, args);
  }
  [$selectSubString](...args) {
    return this.selectSubString.apply(this, args);
  }
};
(svg$.TextContentElement.created = function() {
  this[lengthAdjust] = null;
  this[textLength$] = null;
  svg$.TextContentElement.__proto__.created.call(this);
}).prototype = svg$.TextContentElement.prototype;
dart.addTypeTests(svg$.TextContentElement);
const lengthAdjust = Symbol("TextContentElement.lengthAdjust");
const textLength$ = Symbol("TextContentElement.textLength");
dart.setMethodSignature(svg$.TextContentElement, () => ({
  __proto__: dart.getMethods(svg$.TextContentElement.__proto__),
  [$getCharNumAtPosition]: dart.fnType(core.int, [svg$.Point]),
  [$getComputedTextLength]: dart.fnType(core.double, []),
  [$getEndPositionOfChar]: dart.fnType(svg$.Point, [core.int]),
  [$getExtentOfChar]: dart.fnType(svg$.Rect, [core.int]),
  [$getNumberOfChars]: dart.fnType(core.int, []),
  [$getRotationOfChar]: dart.fnType(core.double, [core.int]),
  [$getStartPositionOfChar]: dart.fnType(svg$.Point, [core.int]),
  [$getSubStringLength]: dart.fnType(core.double, [core.int, core.int]),
  [$selectSubString]: dart.fnType(dart.void, [core.int, core.int])
}));
dart.setLibraryUri(svg$.TextContentElement, "dart:svg");
dart.setFieldSignature(svg$.TextContentElement, () => ({
  __proto__: dart.getFields(svg$.TextContentElement.__proto__),
  [$lengthAdjust]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$textLength]: dart.finalFieldType(svg$.AnimatedLength)
}));
dart.defineLazy(svg$.TextContentElement, {
  /*svg$.TextContentElement.LENGTHADJUST_SPACING*/get LENGTHADJUST_SPACING() {
    return 1;
  },
  /*svg$.TextContentElement.LENGTHADJUST_SPACINGANDGLYPHS*/get LENGTHADJUST_SPACINGANDGLYPHS() {
    return 2;
  },
  /*svg$.TextContentElement.LENGTHADJUST_UNKNOWN*/get LENGTHADJUST_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGTextContentElement", svg$.TextContentElement);
svg$.TextPositioningElement = class TextPositioningElement extends svg$.TextContentElement {
  get [$dx]() {
    return this.dx;
  }
  get [$dy]() {
    return this.dy;
  }
  get [$rotate]() {
    return this.rotate;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
};
(svg$.TextPositioningElement.created = function() {
  this[dx$] = null;
  this[dy$] = null;
  this[rotate] = null;
  this[x$35] = null;
  this[y$34] = null;
  svg$.TextPositioningElement.__proto__.created.call(this);
}).prototype = svg$.TextPositioningElement.prototype;
dart.addTypeTests(svg$.TextPositioningElement);
const dx$ = Symbol("TextPositioningElement.dx");
const dy$ = Symbol("TextPositioningElement.dy");
const rotate = Symbol("TextPositioningElement.rotate");
const x$35 = Symbol("TextPositioningElement.x");
const y$34 = Symbol("TextPositioningElement.y");
dart.setLibraryUri(svg$.TextPositioningElement, "dart:svg");
dart.setFieldSignature(svg$.TextPositioningElement, () => ({
  __proto__: dart.getFields(svg$.TextPositioningElement.__proto__),
  [$dx]: dart.finalFieldType(svg$.AnimatedLengthList),
  [$dy]: dart.finalFieldType(svg$.AnimatedLengthList),
  [$rotate]: dart.finalFieldType(svg$.AnimatedNumberList),
  [$x]: dart.finalFieldType(svg$.AnimatedLengthList),
  [$y]: dart.finalFieldType(svg$.AnimatedLengthList)
}));
dart.registerExtension("SVGTextPositioningElement", svg$.TextPositioningElement);
svg$.TSpanElement = class TSpanElement extends svg$.TextPositioningElement {
  static new() {
    return svg$.TSpanElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("tspan"));
  }
};
(svg$.TSpanElement.created = function() {
  svg$.TSpanElement.__proto__.created.call(this);
}).prototype = svg$.TSpanElement.prototype;
dart.addTypeTests(svg$.TSpanElement);
dart.setLibraryUri(svg$.TSpanElement, "dart:svg");
dart.registerExtension("SVGTSpanElement", svg$.TSpanElement);
svg$.Tests = class Tests extends _interceptors.Interceptor {
  get requiredExtensions() {
    return this[requiredExtensions$2];
  }
  set requiredExtensions(value) {
    super.requiredExtensions = value;
  }
  get systemLanguage() {
    return this[systemLanguage$2];
  }
  set systemLanguage(value) {
    super.systemLanguage = value;
  }
};
dart.addTypeTests(svg$.Tests);
const requiredExtensions$2 = Symbol("Tests.requiredExtensions");
const systemLanguage$2 = Symbol("Tests.systemLanguage");
dart.setLibraryUri(svg$.Tests, "dart:svg");
dart.setFieldSignature(svg$.Tests, () => ({
  __proto__: dart.getFields(svg$.Tests.__proto__),
  requiredExtensions: dart.finalFieldType(svg$.StringList),
  systemLanguage: dart.finalFieldType(svg$.StringList)
}));
dart.defineExtensionAccessors(svg$.Tests, ['requiredExtensions', 'systemLanguage']);
svg$.TextElement = class TextElement extends svg$.TextPositioningElement {
  static new() {
    return svg$.TextElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("text"));
  }
};
(svg$.TextElement.created = function() {
  svg$.TextElement.__proto__.created.call(this);
}).prototype = svg$.TextElement.prototype;
dart.addTypeTests(svg$.TextElement);
dart.setLibraryUri(svg$.TextElement, "dart:svg");
dart.registerExtension("SVGTextElement", svg$.TextElement);
svg$.TextPathElement = class TextPathElement extends svg$.TextContentElement {
  get [$method]() {
    return this.method;
  }
  get [$spacing]() {
    return this.spacing;
  }
  get [$startOffset]() {
    return this.startOffset;
  }
  get [$href]() {
    return this.href;
  }
};
(svg$.TextPathElement.created = function() {
  this[method$] = null;
  this[spacing] = null;
  this[startOffset$0] = null;
  this[href$15] = null;
  svg$.TextPathElement.__proto__.created.call(this);
}).prototype = svg$.TextPathElement.prototype;
dart.addTypeTests(svg$.TextPathElement);
const method$ = Symbol("TextPathElement.method");
const spacing = Symbol("TextPathElement.spacing");
const startOffset$0 = Symbol("TextPathElement.startOffset");
const href$15 = Symbol("TextPathElement.href");
svg$.TextPathElement[dart.implements] = () => [svg$.UriReference];
dart.setLibraryUri(svg$.TextPathElement, "dart:svg");
dart.setFieldSignature(svg$.TextPathElement, () => ({
  __proto__: dart.getFields(svg$.TextPathElement.__proto__),
  [$method]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$spacing]: dart.finalFieldType(svg$.AnimatedEnumeration),
  [$startOffset]: dart.finalFieldType(svg$.AnimatedLength),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.defineLazy(svg$.TextPathElement, {
  /*svg$.TextPathElement.TEXTPATH_METHODTYPE_ALIGN*/get TEXTPATH_METHODTYPE_ALIGN() {
    return 1;
  },
  /*svg$.TextPathElement.TEXTPATH_METHODTYPE_STRETCH*/get TEXTPATH_METHODTYPE_STRETCH() {
    return 2;
  },
  /*svg$.TextPathElement.TEXTPATH_METHODTYPE_UNKNOWN*/get TEXTPATH_METHODTYPE_UNKNOWN() {
    return 0;
  },
  /*svg$.TextPathElement.TEXTPATH_SPACINGTYPE_AUTO*/get TEXTPATH_SPACINGTYPE_AUTO() {
    return 1;
  },
  /*svg$.TextPathElement.TEXTPATH_SPACINGTYPE_EXACT*/get TEXTPATH_SPACINGTYPE_EXACT() {
    return 2;
  },
  /*svg$.TextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN*/get TEXTPATH_SPACINGTYPE_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGTextPathElement", svg$.TextPathElement);
svg$.TitleElement = class TitleElement extends svg$.SvgElement {
  static new() {
    return svg$.TitleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("title"));
  }
};
(svg$.TitleElement.created = function() {
  svg$.TitleElement.__proto__.created.call(this);
}).prototype = svg$.TitleElement.prototype;
dart.addTypeTests(svg$.TitleElement);
dart.setLibraryUri(svg$.TitleElement, "dart:svg");
dart.registerExtension("SVGTitleElement", svg$.TitleElement);
svg$.Transform = class Transform extends _interceptors.Interceptor {
  get [$angle]() {
    return this.angle;
  }
  get [$matrix]() {
    return this.matrix;
  }
  get [$type]() {
    return this.type;
  }
  [$setMatrix](...args) {
    return this.setMatrix.apply(this, args);
  }
  [$setRotate](...args) {
    return this.setRotate.apply(this, args);
  }
  [$setScale](...args) {
    return this.setScale.apply(this, args);
  }
  [$setSkewX](...args) {
    return this.setSkewX.apply(this, args);
  }
  [$setSkewY](...args) {
    return this.setSkewY.apply(this, args);
  }
  [$setTranslate](...args) {
    return this.setTranslate.apply(this, args);
  }
};
dart.addTypeTests(svg$.Transform);
const angle$0 = Symbol("Transform.angle");
const matrix$ = Symbol("Transform.matrix");
const type$41 = Symbol("Transform.type");
dart.setMethodSignature(svg$.Transform, () => ({
  __proto__: dart.getMethods(svg$.Transform.__proto__),
  [$setMatrix]: dart.fnType(dart.void, [svg$.Matrix]),
  [$setRotate]: dart.fnType(dart.void, [core.num, core.num, core.num]),
  [$setScale]: dart.fnType(dart.void, [core.num, core.num]),
  [$setSkewX]: dart.fnType(dart.void, [core.num]),
  [$setSkewY]: dart.fnType(dart.void, [core.num]),
  [$setTranslate]: dart.fnType(dart.void, [core.num, core.num])
}));
dart.setLibraryUri(svg$.Transform, "dart:svg");
dart.setFieldSignature(svg$.Transform, () => ({
  __proto__: dart.getFields(svg$.Transform.__proto__),
  [$angle]: dart.finalFieldType(core.num),
  [$matrix]: dart.finalFieldType(svg$.Matrix),
  [$type]: dart.finalFieldType(core.int)
}));
dart.defineLazy(svg$.Transform, {
  /*svg$.Transform.SVG_TRANSFORM_MATRIX*/get SVG_TRANSFORM_MATRIX() {
    return 1;
  },
  /*svg$.Transform.SVG_TRANSFORM_ROTATE*/get SVG_TRANSFORM_ROTATE() {
    return 4;
  },
  /*svg$.Transform.SVG_TRANSFORM_SCALE*/get SVG_TRANSFORM_SCALE() {
    return 3;
  },
  /*svg$.Transform.SVG_TRANSFORM_SKEWX*/get SVG_TRANSFORM_SKEWX() {
    return 5;
  },
  /*svg$.Transform.SVG_TRANSFORM_SKEWY*/get SVG_TRANSFORM_SKEWY() {
    return 6;
  },
  /*svg$.Transform.SVG_TRANSFORM_TRANSLATE*/get SVG_TRANSFORM_TRANSLATE() {
    return 2;
  },
  /*svg$.Transform.SVG_TRANSFORM_UNKNOWN*/get SVG_TRANSFORM_UNKNOWN() {
    return 0;
  }
});
dart.registerExtension("SVGTransform", svg$.Transform);
const Interceptor_ListMixin$$16 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$16.new = function() {
  Interceptor_ListMixin$$16.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$16.prototype;
dart.applyMixin(Interceptor_ListMixin$$16, collection.ListMixin$(svg$.Transform));
const Interceptor_ImmutableListMixin$$16 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$16 {};
(Interceptor_ImmutableListMixin$$16.new = function() {
  Interceptor_ImmutableListMixin$$16.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$16.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$16, html$.ImmutableListMixin$(svg$.Transform));
svg$.TransformList = class TransformList extends Interceptor_ImmutableListMixin$$16 {
  get [$length]() {
    return this.length;
  }
  get [$numberOfItems]() {
    return this.numberOfItems;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this.getItem(index);
  }
  [$_set](index, value) {
    svg$.Transform._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [__setter__$](...args) {
    return this.__setter__.apply(this, args);
  }
  [$appendItem](...args) {
    return this.appendItem.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$consolidate](...args) {
    return this.consolidate.apply(this, args);
  }
  [$createSvgTransformFromMatrix](...args) {
    return this.createSVGTransformFromMatrix.apply(this, args);
  }
  [$getItem](...args) {
    return this.getItem.apply(this, args);
  }
  [$initialize](...args) {
    return this.initialize.apply(this, args);
  }
  [$insertItemBefore](...args) {
    return this.insertItemBefore.apply(this, args);
  }
  [$removeItem](...args) {
    return this.removeItem.apply(this, args);
  }
  [$replaceItem](...args) {
    return this.replaceItem.apply(this, args);
  }
};
svg$.TransformList.prototype[dart.isList] = true;
dart.addTypeTests(svg$.TransformList);
const numberOfItems$2 = Symbol("TransformList.numberOfItems");
svg$.TransformList[dart.implements] = () => [ListOfTransform()];
dart.setMethodSignature(svg$.TransformList, () => ({
  __proto__: dart.getMethods(svg$.TransformList.__proto__),
  [$_get]: dart.fnType(svg$.Transform, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(svg$.Transform, [core.int]),
  [__setter__$]: dart.fnType(dart.void, [core.int, svg$.Transform]),
  [$appendItem]: dart.fnType(svg$.Transform, [svg$.Transform]),
  [$clear]: dart.fnType(dart.void, []),
  [$consolidate]: dart.fnType(svg$.Transform, []),
  [$createSvgTransformFromMatrix]: dart.fnType(svg$.Transform, [svg$.Matrix]),
  [$getItem]: dart.fnType(svg$.Transform, [core.int]),
  [$initialize]: dart.fnType(svg$.Transform, [svg$.Transform]),
  [$insertItemBefore]: dart.fnType(svg$.Transform, [svg$.Transform, core.int]),
  [$removeItem]: dart.fnType(svg$.Transform, [core.int]),
  [$replaceItem]: dart.fnType(svg$.Transform, [svg$.Transform, core.int])
}));
dart.setGetterSignature(svg$.TransformList, () => ({
  __proto__: dart.getGetters(svg$.TransformList.__proto__),
  [$length]: core.int,
  [$first]: svg$.Transform,
  [$last]: svg$.Transform,
  [$single]: svg$.Transform
}));
dart.setSetterSignature(svg$.TransformList, () => ({
  __proto__: dart.getSetters(svg$.TransformList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(svg$.TransformList, "dart:svg");
dart.setFieldSignature(svg$.TransformList, () => ({
  __proto__: dart.getFields(svg$.TransformList.__proto__),
  [$numberOfItems]: dart.finalFieldType(core.int)
}));
dart.registerExtension("SVGTransformList", svg$.TransformList);
svg$.UnitTypes = class UnitTypes extends _interceptors.Interceptor {};
dart.addTypeTests(svg$.UnitTypes);
dart.setLibraryUri(svg$.UnitTypes, "dart:svg");
dart.defineLazy(svg$.UnitTypes, {
  /*svg$.UnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX*/get SVG_UNIT_TYPE_OBJECTBOUNDINGBOX() {
    return 2;
  },
  /*svg$.UnitTypes.SVG_UNIT_TYPE_UNKNOWN*/get SVG_UNIT_TYPE_UNKNOWN() {
    return 0;
  },
  /*svg$.UnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE*/get SVG_UNIT_TYPE_USERSPACEONUSE() {
    return 1;
  }
});
dart.registerExtension("SVGUnitTypes", svg$.UnitTypes);
svg$.UriReference = class UriReference extends _interceptors.Interceptor {
  get href() {
    return this[href$16];
  }
  set href(value) {
    super.href = value;
  }
};
dart.addTypeTests(svg$.UriReference);
const href$16 = Symbol("UriReference.href");
dart.setLibraryUri(svg$.UriReference, "dart:svg");
dart.setFieldSignature(svg$.UriReference, () => ({
  __proto__: dart.getFields(svg$.UriReference.__proto__),
  href: dart.finalFieldType(svg$.AnimatedString)
}));
dart.defineExtensionAccessors(svg$.UriReference, ['href']);
svg$.UseElement = class UseElement extends svg$.GraphicsElement {
  static new() {
    return svg$.UseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("use"));
  }
  get [$height]() {
    return this.height;
  }
  get [$width]() {
    return this.width;
  }
  get [$x]() {
    return this.x;
  }
  get [$y]() {
    return this.y;
  }
  get [$href]() {
    return this.href;
  }
};
(svg$.UseElement.created = function() {
  this[height$39] = null;
  this[width$41] = null;
  this[x$36] = null;
  this[y$35] = null;
  this[href$17] = null;
  svg$.UseElement.__proto__.created.call(this);
}).prototype = svg$.UseElement.prototype;
dart.addTypeTests(svg$.UseElement);
const height$39 = Symbol("UseElement.height");
const width$41 = Symbol("UseElement.width");
const x$36 = Symbol("UseElement.x");
const y$35 = Symbol("UseElement.y");
const href$17 = Symbol("UseElement.href");
svg$.UseElement[dart.implements] = () => [svg$.UriReference];
dart.setLibraryUri(svg$.UseElement, "dart:svg");
dart.setFieldSignature(svg$.UseElement, () => ({
  __proto__: dart.getFields(svg$.UseElement.__proto__),
  [$height]: dart.finalFieldType(svg$.AnimatedLength),
  [$width]: dart.finalFieldType(svg$.AnimatedLength),
  [$x]: dart.finalFieldType(svg$.AnimatedLength),
  [$y]: dart.finalFieldType(svg$.AnimatedLength),
  [$href]: dart.finalFieldType(svg$.AnimatedString)
}));
dart.registerExtension("SVGUseElement", svg$.UseElement);
svg$.ViewElement = class ViewElement extends svg$.SvgElement {
  static new() {
    return svg$.ViewElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("view"));
  }
  get [$preserveAspectRatio]() {
    return this.preserveAspectRatio;
  }
  get [$viewBox]() {
    return this.viewBox;
  }
  get [$zoomAndPan]() {
    return this.zoomAndPan;
  }
  set [$zoomAndPan](value) {
    this.zoomAndPan = value;
  }
};
(svg$.ViewElement.created = function() {
  this[preserveAspectRatio$5] = null;
  this[viewBox$3] = null;
  this[zoomAndPan$] = null;
  svg$.ViewElement.__proto__.created.call(this);
}).prototype = svg$.ViewElement.prototype;
dart.addTypeTests(svg$.ViewElement);
const preserveAspectRatio$5 = Symbol("ViewElement.preserveAspectRatio");
const viewBox$3 = Symbol("ViewElement.viewBox");
const zoomAndPan$ = Symbol("ViewElement.zoomAndPan");
svg$.ViewElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
dart.setLibraryUri(svg$.ViewElement, "dart:svg");
dart.setFieldSignature(svg$.ViewElement, () => ({
  __proto__: dart.getFields(svg$.ViewElement.__proto__),
  [$preserveAspectRatio]: dart.finalFieldType(svg$.AnimatedPreserveAspectRatio),
  [$viewBox]: dart.finalFieldType(svg$.AnimatedRect),
  [$zoomAndPan]: dart.fieldType(core.int)
}));
dart.registerExtension("SVGViewElement", svg$.ViewElement);
svg$.ZoomAndPan = class ZoomAndPan extends _interceptors.Interceptor {
  get zoomAndPan() {
    return this[zoomAndPan$0];
  }
  set zoomAndPan(value) {
    this[zoomAndPan$0] = value;
  }
};
dart.addTypeTests(svg$.ZoomAndPan);
const zoomAndPan$0 = Symbol("ZoomAndPan.zoomAndPan");
dart.setLibraryUri(svg$.ZoomAndPan, "dart:svg");
dart.setFieldSignature(svg$.ZoomAndPan, () => ({
  __proto__: dart.getFields(svg$.ZoomAndPan.__proto__),
  zoomAndPan: dart.fieldType(core.int)
}));
dart.defineExtensionAccessors(svg$.ZoomAndPan, ['zoomAndPan']);
dart.defineLazy(svg$.ZoomAndPan, {
  /*svg$.ZoomAndPan.SVG_ZOOMANDPAN_DISABLE*/get SVG_ZOOMANDPAN_DISABLE() {
    return 1;
  },
  /*svg$.ZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY*/get SVG_ZOOMANDPAN_MAGNIFY() {
    return 2;
  },
  /*svg$.ZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN*/get SVG_ZOOMANDPAN_UNKNOWN() {
    return 0;
  }
});
svg$._SVGFEDropShadowElement = class _SVGFEDropShadowElement extends svg$.SvgElement {};
(svg$._SVGFEDropShadowElement.created = function() {
  svg$._SVGFEDropShadowElement.__proto__.created.call(this);
}).prototype = svg$._SVGFEDropShadowElement.prototype;
dart.addTypeTests(svg$._SVGFEDropShadowElement);
svg$._SVGFEDropShadowElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
dart.setLibraryUri(svg$._SVGFEDropShadowElement, "dart:svg");
dart.registerExtension("SVGFEDropShadowElement", svg$._SVGFEDropShadowElement);
svg$._SVGMPathElement = class _SVGMPathElement extends svg$.SvgElement {
  static new() {
    return svg$._SVGMPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mpath"));
  }
};
(svg$._SVGMPathElement.created = function() {
  svg$._SVGMPathElement.__proto__.created.call(this);
}).prototype = svg$._SVGMPathElement.prototype;
dart.addTypeTests(svg$._SVGMPathElement);
svg$._SVGMPathElement[dart.implements] = () => [svg$.UriReference];
dart.setLibraryUri(svg$._SVGMPathElement, "dart:svg");
dart.registerExtension("SVGMPathElement", svg$._SVGMPathElement);
const _connect = dart.privateName(web_audio, "_connect");
web_audio.AudioNode = class AudioNode extends html$.EventTarget {
  get [$channelCount]() {
    return this.channelCount;
  }
  set [$channelCount](value) {
    this.channelCount = value;
  }
  get [$channelCountMode]() {
    return this.channelCountMode;
  }
  set [$channelCountMode](value) {
    this.channelCountMode = value;
  }
  get [$channelInterpretation]() {
    return this.channelInterpretation;
  }
  set [$channelInterpretation](value) {
    this.channelInterpretation = value;
  }
  get [$context]() {
    return this.context;
  }
  get [$numberOfInputs]() {
    return this.numberOfInputs;
  }
  get [$numberOfOutputs]() {
    return this.numberOfOutputs;
  }
  [_connect](...args) {
    return this.connect.apply(this, args);
  }
  [$disconnect](...args) {
    return this.disconnect.apply(this, args);
  }
  [$connectNode](destination, output, input) {
    if (output === void 0) output = 0;
    if (input === void 0) input = 0;
    this[_connect](destination, output, input);
  }
  [$connectParam](destination, output) {
    if (output === void 0) output = 0;
    this[_connect](destination, output);
  }
};
dart.addTypeTests(web_audio.AudioNode);
const channelCount = Symbol("AudioNode.channelCount");
const channelCountMode = Symbol("AudioNode.channelCountMode");
const channelInterpretation = Symbol("AudioNode.channelInterpretation");
const context = Symbol("AudioNode.context");
const numberOfInputs = Symbol("AudioNode.numberOfInputs");
const numberOfOutputs = Symbol("AudioNode.numberOfOutputs");
dart.setMethodSignature(web_audio.AudioNode, () => ({
  __proto__: dart.getMethods(web_audio.AudioNode.__proto__),
  [_connect]: dart.fnType(web_audio.AudioNode, [dart.dynamic], [core.int, core.int]),
  [$disconnect]: dart.fnType(dart.void, [], [dart.dynamic, core.int, core.int]),
  [$connectNode]: dart.fnType(dart.void, [web_audio.AudioNode], [core.int, core.int]),
  [$connectParam]: dart.fnType(dart.void, [web_audio.AudioParam], [core.int])
}));
dart.setLibraryUri(web_audio.AudioNode, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioNode, () => ({
  __proto__: dart.getFields(web_audio.AudioNode.__proto__),
  [$channelCount]: dart.fieldType(core.int),
  [$channelCountMode]: dart.fieldType(core.String),
  [$channelInterpretation]: dart.fieldType(core.String),
  [$context]: dart.finalFieldType(web_audio.BaseAudioContext),
  [$numberOfInputs]: dart.finalFieldType(core.int),
  [$numberOfOutputs]: dart.finalFieldType(core.int)
}));
dart.registerExtension("AudioNode", web_audio.AudioNode);
web_audio.AnalyserNode = class AnalyserNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.AnalyserNode._create_1(context, options_1);
    }
    return web_audio.AnalyserNode._create_2(context);
  }
  static _create_1(context, options) {
    return new AnalyserNode(context, options);
  }
  static _create_2(context) {
    return new AnalyserNode(context);
  }
  get [$fftSize]() {
    return this.fftSize;
  }
  set [$fftSize](value) {
    this.fftSize = value;
  }
  get [$frequencyBinCount]() {
    return this.frequencyBinCount;
  }
  get [$maxDecibels]() {
    return this.maxDecibels;
  }
  set [$maxDecibels](value) {
    this.maxDecibels = value;
  }
  get [$minDecibels]() {
    return this.minDecibels;
  }
  set [$minDecibels](value) {
    this.minDecibels = value;
  }
  get [$smoothingTimeConstant]() {
    return this.smoothingTimeConstant;
  }
  set [$smoothingTimeConstant](value) {
    this.smoothingTimeConstant = value;
  }
  [$getByteFrequencyData](...args) {
    return this.getByteFrequencyData.apply(this, args);
  }
  [$getByteTimeDomainData](...args) {
    return this.getByteTimeDomainData.apply(this, args);
  }
  [$getFloatFrequencyData](...args) {
    return this.getFloatFrequencyData.apply(this, args);
  }
  [$getFloatTimeDomainData](...args) {
    return this.getFloatTimeDomainData.apply(this, args);
  }
};
dart.addTypeTests(web_audio.AnalyserNode);
const fftSize = Symbol("AnalyserNode.fftSize");
const frequencyBinCount = Symbol("AnalyserNode.frequencyBinCount");
const maxDecibels = Symbol("AnalyserNode.maxDecibels");
const minDecibels = Symbol("AnalyserNode.minDecibels");
const smoothingTimeConstant = Symbol("AnalyserNode.smoothingTimeConstant");
dart.setMethodSignature(web_audio.AnalyserNode, () => ({
  __proto__: dart.getMethods(web_audio.AnalyserNode.__proto__),
  [$getByteFrequencyData]: dart.fnType(dart.void, [typed_data.Uint8List]),
  [$getByteTimeDomainData]: dart.fnType(dart.void, [typed_data.Uint8List]),
  [$getFloatFrequencyData]: dart.fnType(dart.void, [typed_data.Float32List]),
  [$getFloatTimeDomainData]: dart.fnType(dart.void, [typed_data.Float32List])
}));
dart.setLibraryUri(web_audio.AnalyserNode, "dart:web_audio");
dart.setFieldSignature(web_audio.AnalyserNode, () => ({
  __proto__: dart.getFields(web_audio.AnalyserNode.__proto__),
  [$fftSize]: dart.fieldType(core.int),
  [$frequencyBinCount]: dart.finalFieldType(core.int),
  [$maxDecibels]: dart.fieldType(core.num),
  [$minDecibels]: dart.fieldType(core.num),
  [$smoothingTimeConstant]: dart.fieldType(core.num)
}));
dart.registerExtension("AnalyserNode", web_audio.AnalyserNode);
dart.registerExtension("RealtimeAnalyserNode", web_audio.AnalyserNode);
web_audio.AudioBuffer = class AudioBuffer$ extends _interceptors.Interceptor {
  static new(options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    return web_audio.AudioBuffer._create_1(options_1);
  }
  static _create_1(options) {
    return new AudioBuffer(options);
  }
  get [$duration]() {
    return this.duration;
  }
  get [$length]() {
    return this.length;
  }
  get [$numberOfChannels]() {
    return this.numberOfChannels;
  }
  get [$sampleRate]() {
    return this.sampleRate;
  }
  [$copyFromChannel](...args) {
    return this.copyFromChannel.apply(this, args);
  }
  [$copyToChannel](...args) {
    return this.copyToChannel.apply(this, args);
  }
  [$getChannelData](...args) {
    return this.getChannelData.apply(this, args);
  }
};
dart.addTypeTests(web_audio.AudioBuffer);
const duration$5 = Symbol("AudioBuffer.duration");
const length$18 = Symbol("AudioBuffer.length");
const numberOfChannels = Symbol("AudioBuffer.numberOfChannels");
const sampleRate = Symbol("AudioBuffer.sampleRate");
dart.setMethodSignature(web_audio.AudioBuffer, () => ({
  __proto__: dart.getMethods(web_audio.AudioBuffer.__proto__),
  [$copyFromChannel]: dart.fnType(dart.void, [typed_data.Float32List, core.int], [core.int]),
  [$copyToChannel]: dart.fnType(dart.void, [typed_data.Float32List, core.int], [core.int]),
  [$getChannelData]: dart.fnType(typed_data.Float32List, [core.int])
}));
dart.setLibraryUri(web_audio.AudioBuffer, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioBuffer, () => ({
  __proto__: dart.getFields(web_audio.AudioBuffer.__proto__),
  [$duration]: dart.finalFieldType(core.num),
  [$length]: dart.finalFieldType(core.int),
  [$numberOfChannels]: dart.finalFieldType(core.int),
  [$sampleRate]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AudioBuffer", web_audio.AudioBuffer);
web_audio.AudioScheduledSourceNode = class AudioScheduledSourceNode extends web_audio.AudioNode {
  [$start2](...args) {
    return this.start.apply(this, args);
  }
  [$stop](...args) {
    return this.stop.apply(this, args);
  }
  get [$onEnded]() {
    return web_audio.AudioScheduledSourceNode.endedEvent.forTarget(this);
  }
};
dart.addTypeTests(web_audio.AudioScheduledSourceNode);
dart.setMethodSignature(web_audio.AudioScheduledSourceNode, () => ({
  __proto__: dart.getMethods(web_audio.AudioScheduledSourceNode.__proto__),
  [$start2]: dart.fnType(dart.void, [], [core.num]),
  [$stop]: dart.fnType(dart.void, [], [core.num])
}));
dart.setGetterSignature(web_audio.AudioScheduledSourceNode, () => ({
  __proto__: dart.getGetters(web_audio.AudioScheduledSourceNode.__proto__),
  [$onEnded]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(web_audio.AudioScheduledSourceNode, "dart:web_audio");
dart.defineLazy(web_audio.AudioScheduledSourceNode, {
  /*web_audio.AudioScheduledSourceNode.endedEvent*/get endedEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("ended"));
  }
});
dart.registerExtension("AudioScheduledSourceNode", web_audio.AudioScheduledSourceNode);
web_audio.AudioBufferSourceNode = class AudioBufferSourceNode$ extends web_audio.AudioScheduledSourceNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.AudioBufferSourceNode._create_1(context, options_1);
    }
    return web_audio.AudioBufferSourceNode._create_2(context);
  }
  static _create_1(context, options) {
    return new AudioBufferSourceNode(context, options);
  }
  static _create_2(context) {
    return new AudioBufferSourceNode(context);
  }
  get [$buffer]() {
    return this.buffer;
  }
  set [$buffer](value) {
    this.buffer = value;
  }
  get [$detune]() {
    return this.detune;
  }
  get [$loop]() {
    return this.loop;
  }
  set [$loop](value) {
    this.loop = value;
  }
  get [$loopEnd]() {
    return this.loopEnd;
  }
  set [$loopEnd](value) {
    this.loopEnd = value;
  }
  get [$loopStart]() {
    return this.loopStart;
  }
  set [$loopStart](value) {
    this.loopStart = value;
  }
  get [$playbackRate]() {
    return this.playbackRate;
  }
  [$start](...args) {
    return this.start.apply(this, args);
  }
};
dart.addTypeTests(web_audio.AudioBufferSourceNode);
const buffer = Symbol("AudioBufferSourceNode.buffer");
const detune = Symbol("AudioBufferSourceNode.detune");
const loop$ = Symbol("AudioBufferSourceNode.loop");
const loopEnd = Symbol("AudioBufferSourceNode.loopEnd");
const loopStart = Symbol("AudioBufferSourceNode.loopStart");
const playbackRate$0 = Symbol("AudioBufferSourceNode.playbackRate");
dart.setMethodSignature(web_audio.AudioBufferSourceNode, () => ({
  __proto__: dart.getMethods(web_audio.AudioBufferSourceNode.__proto__),
  [$start]: dart.fnType(dart.void, [], [core.num, core.num, core.num])
}));
dart.setLibraryUri(web_audio.AudioBufferSourceNode, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioBufferSourceNode, () => ({
  __proto__: dart.getFields(web_audio.AudioBufferSourceNode.__proto__),
  [$buffer]: dart.fieldType(web_audio.AudioBuffer),
  [$detune]: dart.finalFieldType(web_audio.AudioParam),
  [$loop]: dart.fieldType(core.bool),
  [$loopEnd]: dart.fieldType(core.num),
  [$loopStart]: dart.fieldType(core.num),
  [$playbackRate]: dart.finalFieldType(web_audio.AudioParam)
}));
dart.registerExtension("AudioBufferSourceNode", web_audio.AudioBufferSourceNode);
const _getOutputTimestamp_1 = dart.privateName(web_audio, "_getOutputTimestamp_1");
const _decodeAudioData = dart.privateName(web_audio, "_decodeAudioData");
const _createPeriodicWave_1 = dart.privateName(web_audio, "_createPeriodicWave_1");
const _createPeriodicWave_2 = dart.privateName(web_audio, "_createPeriodicWave_2");
web_audio.BaseAudioContext = class BaseAudioContext extends html$.EventTarget {
  get [$currentTime]() {
    return this.currentTime;
  }
  get [$destination]() {
    return this.destination;
  }
  get [$listener]() {
    return this.listener;
  }
  get [$sampleRate]() {
    return this.sampleRate;
  }
  get [$state]() {
    return this.state;
  }
  [$createAnalyser](...args) {
    return this.createAnalyser.apply(this, args);
  }
  [$createBiquadFilter](...args) {
    return this.createBiquadFilter.apply(this, args);
  }
  [$createBuffer](...args) {
    return this.createBuffer.apply(this, args);
  }
  [$createBufferSource](...args) {
    return this.createBufferSource.apply(this, args);
  }
  [$createChannelMerger](...args) {
    return this.createChannelMerger.apply(this, args);
  }
  [$createChannelSplitter](...args) {
    return this.createChannelSplitter.apply(this, args);
  }
  [$createConstantSource](...args) {
    return this.createConstantSource.apply(this, args);
  }
  [$createConvolver](...args) {
    return this.createConvolver.apply(this, args);
  }
  [$createDelay](...args) {
    return this.createDelay.apply(this, args);
  }
  [$createDynamicsCompressor](...args) {
    return this.createDynamicsCompressor.apply(this, args);
  }
  [$createGain](...args) {
    return this.createGain.apply(this, args);
  }
  [$createIirFilter](...args) {
    return this.createIIRFilter.apply(this, args);
  }
  [$createMediaElementSource](...args) {
    return this.createMediaElementSource.apply(this, args);
  }
  [$createMediaStreamDestination](...args) {
    return this.createMediaStreamDestination.apply(this, args);
  }
  [$createMediaStreamSource](...args) {
    return this.createMediaStreamSource.apply(this, args);
  }
  [$createOscillator](...args) {
    return this.createOscillator.apply(this, args);
  }
  [$createPanner](...args) {
    return this.createPanner.apply(this, args);
  }
  [$createPeriodicWave](real, imag, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_createPeriodicWave_1](real, imag, options_1);
    }
    return this[_createPeriodicWave_2](real, imag);
  }
  [_createPeriodicWave_1](...args) {
    return this.createPeriodicWave.apply(this, args);
  }
  [_createPeriodicWave_2](...args) {
    return this.createPeriodicWave.apply(this, args);
  }
  [$createScriptProcessor](...args) {
    return this.createScriptProcessor.apply(this, args);
  }
  [$createStereoPanner](...args) {
    return this.createStereoPanner.apply(this, args);
  }
  [$createWaveShaper](...args) {
    return this.createWaveShaper.apply(this, args);
  }
  [$decodeAudioData](audioData, successCallback, errorCallback) {
    if (successCallback === void 0) successCallback = null;
    if (errorCallback === void 0) errorCallback = null;
    return html$.promiseToFuture(web_audio.AudioBuffer, this.decodeAudioData(audioData, successCallback, errorCallback));
  }
  [$resume]() {
    return html$.promiseToFuture(dart.dynamic, this.resume());
  }
};
dart.addTypeTests(web_audio.BaseAudioContext);
const currentTime$2 = Symbol("BaseAudioContext.currentTime");
const destination = Symbol("BaseAudioContext.destination");
const listener = Symbol("BaseAudioContext.listener");
const sampleRate$ = Symbol("BaseAudioContext.sampleRate");
const state$6 = Symbol("BaseAudioContext.state");
dart.setMethodSignature(web_audio.BaseAudioContext, () => ({
  __proto__: dart.getMethods(web_audio.BaseAudioContext.__proto__),
  [$createAnalyser]: dart.fnType(web_audio.AnalyserNode, []),
  [$createBiquadFilter]: dart.fnType(web_audio.BiquadFilterNode, []),
  [$createBuffer]: dart.fnType(web_audio.AudioBuffer, [core.int, core.int, core.num]),
  [$createBufferSource]: dart.fnType(web_audio.AudioBufferSourceNode, []),
  [$createChannelMerger]: dart.fnType(web_audio.ChannelMergerNode, [], [core.int]),
  [$createChannelSplitter]: dart.fnType(web_audio.ChannelSplitterNode, [], [core.int]),
  [$createConstantSource]: dart.fnType(web_audio.ConstantSourceNode, []),
  [$createConvolver]: dart.fnType(web_audio.ConvolverNode, []),
  [$createDelay]: dart.fnType(web_audio.DelayNode, [], [core.num]),
  [$createDynamicsCompressor]: dart.fnType(web_audio.DynamicsCompressorNode, []),
  [$createGain]: dart.fnType(web_audio.GainNode, []),
  [$createIirFilter]: dart.fnType(web_audio.IirFilterNode, [core.List$(core.num), core.List$(core.num)]),
  [$createMediaElementSource]: dart.fnType(web_audio.MediaElementAudioSourceNode, [html$.MediaElement]),
  [$createMediaStreamDestination]: dart.fnType(web_audio.MediaStreamAudioDestinationNode, []),
  [$createMediaStreamSource]: dart.fnType(web_audio.MediaStreamAudioSourceNode, [html$.MediaStream]),
  [$createOscillator]: dart.fnType(web_audio.OscillatorNode, []),
  [$createPanner]: dart.fnType(web_audio.PannerNode, []),
  [$createPeriodicWave]: dart.fnType(web_audio.PeriodicWave, [core.List$(core.num), core.List$(core.num)], [core.Map]),
  [_createPeriodicWave_1]: dart.fnType(web_audio.PeriodicWave, [core.List$(core.num), core.List$(core.num), dart.dynamic]),
  [_createPeriodicWave_2]: dart.fnType(web_audio.PeriodicWave, [core.List$(core.num), core.List$(core.num)]),
  [$createScriptProcessor]: dart.fnType(web_audio.ScriptProcessorNode, [], [core.int, core.int, core.int]),
  [$createStereoPanner]: dart.fnType(web_audio.StereoPannerNode, []),
  [$createWaveShaper]: dart.fnType(web_audio.WaveShaperNode, []),
  [$decodeAudioData]: dart.fnType(async.Future$(web_audio.AudioBuffer), [typed_data.ByteBuffer], [dart.fnType(dart.void, [web_audio.AudioBuffer]), dart.fnType(dart.void, [html$.DomException])]),
  [$resume]: dart.fnType(async.Future, [])
}));
dart.setLibraryUri(web_audio.BaseAudioContext, "dart:web_audio");
dart.setFieldSignature(web_audio.BaseAudioContext, () => ({
  __proto__: dart.getFields(web_audio.BaseAudioContext.__proto__),
  [$currentTime]: dart.finalFieldType(core.num),
  [$destination]: dart.finalFieldType(web_audio.AudioDestinationNode),
  [$listener]: dart.finalFieldType(web_audio.AudioListener),
  [$sampleRate]: dart.finalFieldType(core.num),
  [$state]: dart.finalFieldType(core.String)
}));
dart.registerExtension("BaseAudioContext", web_audio.BaseAudioContext);
web_audio.AudioContext = class AudioContext extends web_audio.BaseAudioContext {
  static get supported() {
    return !!(window.AudioContext || window.webkitAudioContext);
  }
  get [$baseLatency]() {
    return this.baseLatency;
  }
  [$close]() {
    return html$.promiseToFuture(dart.dynamic, this.close());
  }
  [$getOutputTimestamp]() {
    return html_common.convertNativeToDart_Dictionary(this[_getOutputTimestamp_1]());
  }
  [_getOutputTimestamp_1](...args) {
    return this.getOutputTimestamp.apply(this, args);
  }
  [$suspend]() {
    return html$.promiseToFuture(dart.dynamic, this.suspend());
  }
  static new() {
    return new (window.AudioContext || window.webkitAudioContext)();
  }
  [$createGain]() {
    if (this.createGain !== undefined) {
      return this.createGain();
    } else {
      return this.createGainNode();
    }
  }
  [$createScriptProcessor](bufferSize, numberOfInputChannels, numberOfOutputChannels) {
    if (bufferSize === void 0) bufferSize = null;
    if (numberOfInputChannels === void 0) numberOfInputChannels = null;
    if (numberOfOutputChannels === void 0) numberOfOutputChannels = null;
    let func = this.createScriptProcessor || this.createJavaScriptNode;
    if (numberOfOutputChannels != null) {
      return func.call(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
    } else if (numberOfInputChannels != null) {
      return func.call(this, bufferSize, numberOfInputChannels);
    } else if (bufferSize != null) {
      return func.call(this, bufferSize);
    } else {
      return func.call(this);
    }
  }
  [_decodeAudioData](...args) {
    return this.decodeAudioData.apply(this, args);
  }
  [$decodeAudioData](audioData, successCallback, errorCallback) {
    if (successCallback === void 0) successCallback = null;
    if (errorCallback === void 0) errorCallback = null;
    if (successCallback != null && errorCallback != null) {
      return FutureOfAudioBuffer()._check(this[_decodeAudioData](audioData, successCallback, errorCallback));
    }
    let completer = CompleterOfAudioBuffer().new();
    this[_decodeAudioData](audioData, dart.fn(value => {
      completer.complete(value);
    }, AudioBufferToNull()), dart.fn(error => {
      if (error == null) {
        completer.completeError("");
      } else {
        completer.completeError(error);
      }
    }, DomExceptionToNull()));
    return completer.future;
  }
};
dart.addTypeTests(web_audio.AudioContext);
const baseLatency = Symbol("AudioContext.baseLatency");
dart.setMethodSignature(web_audio.AudioContext, () => ({
  __proto__: dart.getMethods(web_audio.AudioContext.__proto__),
  [$close]: dart.fnType(async.Future, []),
  [$getOutputTimestamp]: dart.fnType(core.Map, []),
  [_getOutputTimestamp_1]: dart.fnType(dart.dynamic, []),
  [$suspend]: dart.fnType(async.Future, []),
  [_decodeAudioData]: dart.fnType(async.Future, [typed_data.ByteBuffer], [dart.fnType(dart.void, [web_audio.AudioBuffer]), dart.fnType(dart.void, [html$.DomException])])
}));
dart.setLibraryUri(web_audio.AudioContext, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioContext, () => ({
  __proto__: dart.getFields(web_audio.AudioContext.__proto__),
  [$baseLatency]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AudioContext", web_audio.AudioContext);
dart.registerExtension("webkitAudioContext", web_audio.AudioContext);
web_audio.AudioDestinationNode = class AudioDestinationNode extends web_audio.AudioNode {
  get [$maxChannelCount]() {
    return this.maxChannelCount;
  }
};
dart.addTypeTests(web_audio.AudioDestinationNode);
const maxChannelCount = Symbol("AudioDestinationNode.maxChannelCount");
dart.setLibraryUri(web_audio.AudioDestinationNode, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioDestinationNode, () => ({
  __proto__: dart.getFields(web_audio.AudioDestinationNode.__proto__),
  [$maxChannelCount]: dart.finalFieldType(core.int)
}));
dart.registerExtension("AudioDestinationNode", web_audio.AudioDestinationNode);
web_audio.AudioListener = class AudioListener extends _interceptors.Interceptor {
  get [$forwardX]() {
    return this.forwardX;
  }
  get [$forwardY]() {
    return this.forwardY;
  }
  get [$forwardZ]() {
    return this.forwardZ;
  }
  get [$positionX]() {
    return this.positionX;
  }
  get [$positionY]() {
    return this.positionY;
  }
  get [$positionZ]() {
    return this.positionZ;
  }
  get [$upX]() {
    return this.upX;
  }
  get [$upY]() {
    return this.upY;
  }
  get [$upZ]() {
    return this.upZ;
  }
  [$setOrientation](...args) {
    return this.setOrientation.apply(this, args);
  }
  [$setPosition](...args) {
    return this.setPosition.apply(this, args);
  }
};
dart.addTypeTests(web_audio.AudioListener);
const forwardX = Symbol("AudioListener.forwardX");
const forwardY = Symbol("AudioListener.forwardY");
const forwardZ = Symbol("AudioListener.forwardZ");
const positionX$ = Symbol("AudioListener.positionX");
const positionY$ = Symbol("AudioListener.positionY");
const positionZ = Symbol("AudioListener.positionZ");
const upX = Symbol("AudioListener.upX");
const upY = Symbol("AudioListener.upY");
const upZ = Symbol("AudioListener.upZ");
dart.setMethodSignature(web_audio.AudioListener, () => ({
  __proto__: dart.getMethods(web_audio.AudioListener.__proto__),
  [$setOrientation]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
  [$setPosition]: dart.fnType(dart.void, [core.num, core.num, core.num])
}));
dart.setLibraryUri(web_audio.AudioListener, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioListener, () => ({
  __proto__: dart.getFields(web_audio.AudioListener.__proto__),
  [$forwardX]: dart.finalFieldType(web_audio.AudioParam),
  [$forwardY]: dart.finalFieldType(web_audio.AudioParam),
  [$forwardZ]: dart.finalFieldType(web_audio.AudioParam),
  [$positionX]: dart.finalFieldType(web_audio.AudioParam),
  [$positionY]: dart.finalFieldType(web_audio.AudioParam),
  [$positionZ]: dart.finalFieldType(web_audio.AudioParam),
  [$upX]: dart.finalFieldType(web_audio.AudioParam),
  [$upY]: dart.finalFieldType(web_audio.AudioParam),
  [$upZ]: dart.finalFieldType(web_audio.AudioParam)
}));
dart.registerExtension("AudioListener", web_audio.AudioListener);
web_audio.AudioParam = class AudioParam extends _interceptors.Interceptor {
  get [$defaultValue]() {
    return this.defaultValue;
  }
  get [$maxValue]() {
    return this.maxValue;
  }
  get [$minValue]() {
    return this.minValue;
  }
  get [$value]() {
    return this.value;
  }
  set [$value](value) {
    this.value = value;
  }
  [$cancelAndHoldAtTime](...args) {
    return this.cancelAndHoldAtTime.apply(this, args);
  }
  [$cancelScheduledValues](...args) {
    return this.cancelScheduledValues.apply(this, args);
  }
  [$exponentialRampToValueAtTime](...args) {
    return this.exponentialRampToValueAtTime.apply(this, args);
  }
  [$linearRampToValueAtTime](...args) {
    return this.linearRampToValueAtTime.apply(this, args);
  }
  [$setTargetAtTime](...args) {
    return this.setTargetAtTime.apply(this, args);
  }
  [$setValueAtTime](...args) {
    return this.setValueAtTime.apply(this, args);
  }
  [$setValueCurveAtTime](...args) {
    return this.setValueCurveAtTime.apply(this, args);
  }
};
dart.addTypeTests(web_audio.AudioParam);
const defaultValue$3 = Symbol("AudioParam.defaultValue");
const maxValue = Symbol("AudioParam.maxValue");
const minValue = Symbol("AudioParam.minValue");
const value$21 = Symbol("AudioParam.value");
dart.setMethodSignature(web_audio.AudioParam, () => ({
  __proto__: dart.getMethods(web_audio.AudioParam.__proto__),
  [$cancelAndHoldAtTime]: dart.fnType(web_audio.AudioParam, [core.num]),
  [$cancelScheduledValues]: dart.fnType(web_audio.AudioParam, [core.num]),
  [$exponentialRampToValueAtTime]: dart.fnType(web_audio.AudioParam, [core.num, core.num]),
  [$linearRampToValueAtTime]: dart.fnType(web_audio.AudioParam, [core.num, core.num]),
  [$setTargetAtTime]: dart.fnType(web_audio.AudioParam, [core.num, core.num, core.num]),
  [$setValueAtTime]: dart.fnType(web_audio.AudioParam, [core.num, core.num]),
  [$setValueCurveAtTime]: dart.fnType(web_audio.AudioParam, [core.List$(core.num), core.num, core.num])
}));
dart.setLibraryUri(web_audio.AudioParam, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioParam, () => ({
  __proto__: dart.getFields(web_audio.AudioParam.__proto__),
  [$defaultValue]: dart.finalFieldType(core.num),
  [$maxValue]: dart.finalFieldType(core.num),
  [$minValue]: dart.finalFieldType(core.num),
  [$value]: dart.fieldType(core.num)
}));
dart.registerExtension("AudioParam", web_audio.AudioParam);
const _getItem$ = dart.privateName(web_audio, "_getItem");
const Interceptor_MapMixin$$2 = class Interceptor_MapMixin extends _interceptors.Interceptor {};
(Interceptor_MapMixin$$2.new = function() {
  Interceptor_MapMixin$$2.__proto__.new.call(this);
}).prototype = Interceptor_MapMixin$$2.prototype;
dart.applyMixin(Interceptor_MapMixin$$2, collection.MapMixin$(core.String, dart.dynamic));
web_audio.AudioParamMap = class AudioParamMap extends Interceptor_MapMixin$$2 {
  [_getItem$](key) {
    return html_common.convertNativeToDart_Dictionary(this.get(key));
  }
  [$addAll](other) {
    MapOfString$dynamic()._check(other);
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$containsValue](value) {
    return this[$values][$any](dart.fn(e => dart.equals(e, value), MapTobool()));
  }
  [$containsKey](key) {
    return this[_getItem$](core.String._check(key)) != null;
  }
  [$_get](key) {
    return this[_getItem$](core.String._check(key));
  }
  [$forEach](f) {
    let entries = this.entries();
    while (true) {
      let entry = entries.next();
      if (entry.done) return;
      f(entry.value[0], html_common.convertNativeToDart_Dictionary(entry.value[1]));
    }
  }
  get [$keys]() {
    let keys = JSArrayOfString().of([]);
    this[$forEach](dart.fn((k, v) => keys[$add](k), StringAnddynamicTovoid()));
    return keys;
  }
  get [$values]() {
    let values = JSArrayOfMap().of([]);
    this[$forEach](dart.fn((k, v) => values[$add](core.Map._check(v)), StringAnddynamicTovoid()));
    return values;
  }
  get [$length]() {
    return this.size;
  }
  get [$isEmpty]() {
    return this[$length] === 0;
  }
  get [$isNotEmpty]() {
    return !dart.test(this[$isEmpty]);
  }
  [$_set](key, value) {
    core.String._check(key);
    dart.throw(new core.UnsupportedError.new("Not supported"));
    return value;
  }
  [$putIfAbsent](key, ifAbsent) {
    core.String._check(key);
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$remove](key) {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
  [$clear]() {
    dart.throw(new core.UnsupportedError.new("Not supported"));
  }
};
dart.addTypeTests(web_audio.AudioParamMap);
dart.setMethodSignature(web_audio.AudioParamMap, () => ({
  __proto__: dart.getMethods(web_audio.AudioParamMap.__proto__),
  [_getItem$]: dart.fnType(core.Map, [core.String]),
  [$addAll]: dart.fnType(dart.void, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [dart.dynamic]),
  [$containsKey]: dart.fnType(core.bool, [dart.dynamic]),
  [$_get]: dart.fnType(core.Map, [dart.dynamic]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, dart.dynamic])]),
  [$_set]: dart.fnType(dart.void, [core.Object, dart.dynamic]),
  [$putIfAbsent]: dart.fnType(dart.dynamic, [core.Object, dart.fnType(dart.dynamic, [])]),
  [$remove]: dart.fnType(core.String, [dart.dynamic]),
  [$clear]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(web_audio.AudioParamMap, () => ({
  __proto__: dart.getGetters(web_audio.AudioParamMap.__proto__),
  [$keys]: core.Iterable$(core.String),
  [$values]: core.Iterable$(core.Map),
  [$length]: core.int,
  [$isEmpty]: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setLibraryUri(web_audio.AudioParamMap, "dart:web_audio");
dart.registerExtension("AudioParamMap", web_audio.AudioParamMap);
web_audio.AudioProcessingEvent = class AudioProcessingEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return web_audio.AudioProcessingEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new AudioProcessingEvent(type, eventInitDict);
  }
  get [$inputBuffer]() {
    return this.inputBuffer;
  }
  get [$outputBuffer]() {
    return this.outputBuffer;
  }
  get [$playbackTime]() {
    return this.playbackTime;
  }
};
dart.addTypeTests(web_audio.AudioProcessingEvent);
const inputBuffer = Symbol("AudioProcessingEvent.inputBuffer");
const outputBuffer = Symbol("AudioProcessingEvent.outputBuffer");
const playbackTime = Symbol("AudioProcessingEvent.playbackTime");
dart.setLibraryUri(web_audio.AudioProcessingEvent, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioProcessingEvent, () => ({
  __proto__: dart.getFields(web_audio.AudioProcessingEvent.__proto__),
  [$inputBuffer]: dart.finalFieldType(web_audio.AudioBuffer),
  [$outputBuffer]: dart.finalFieldType(web_audio.AudioBuffer),
  [$playbackTime]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AudioProcessingEvent", web_audio.AudioProcessingEvent);
web_audio.AudioTrack = class AudioTrack extends _interceptors.Interceptor {
  get [$enabled]() {
    return this.enabled;
  }
  set [$enabled](value) {
    this.enabled = value;
  }
  get [$id]() {
    return this.id;
  }
  get [$kind]() {
    return this.kind;
  }
  get [$label]() {
    return this.label;
  }
  get [$language]() {
    return this.language;
  }
  get [$sourceBuffer]() {
    return this.sourceBuffer;
  }
};
dart.addTypeTests(web_audio.AudioTrack);
const enabled$ = Symbol("AudioTrack.enabled");
const id$18 = Symbol("AudioTrack.id");
const kind$4 = Symbol("AudioTrack.kind");
const label$8 = Symbol("AudioTrack.label");
const language$2 = Symbol("AudioTrack.language");
const sourceBuffer$ = Symbol("AudioTrack.sourceBuffer");
dart.setLibraryUri(web_audio.AudioTrack, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioTrack, () => ({
  __proto__: dart.getFields(web_audio.AudioTrack.__proto__),
  [$enabled]: dart.fieldType(core.bool),
  [$id]: dart.finalFieldType(core.String),
  [$kind]: dart.finalFieldType(core.String),
  [$label]: dart.finalFieldType(core.String),
  [$language]: dart.finalFieldType(core.String),
  [$sourceBuffer]: dart.finalFieldType(html$.SourceBuffer)
}));
dart.registerExtension("AudioTrack", web_audio.AudioTrack);
const __getter__$ = dart.privateName(web_audio, "__getter__");
web_audio.AudioTrackList = class AudioTrackList extends html$.EventTarget {
  get [$length]() {
    return this.length;
  }
  [__getter__$](...args) {
    return this.__getter__.apply(this, args);
  }
  [$getTrackById](...args) {
    return this.getTrackById.apply(this, args);
  }
  get [$onChange]() {
    return web_audio.AudioTrackList.changeEvent.forTarget(this);
  }
};
dart.addTypeTests(web_audio.AudioTrackList);
const length$19 = Symbol("AudioTrackList.length");
dart.setMethodSignature(web_audio.AudioTrackList, () => ({
  __proto__: dart.getMethods(web_audio.AudioTrackList.__proto__),
  [__getter__$]: dart.fnType(web_audio.AudioTrack, [core.int]),
  [$getTrackById]: dart.fnType(web_audio.AudioTrack, [core.String])
}));
dart.setGetterSignature(web_audio.AudioTrackList, () => ({
  __proto__: dart.getGetters(web_audio.AudioTrackList.__proto__),
  [$onChange]: async.Stream$(html$.Event)
}));
dart.setLibraryUri(web_audio.AudioTrackList, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioTrackList, () => ({
  __proto__: dart.getFields(web_audio.AudioTrackList.__proto__),
  [$length]: dart.finalFieldType(core.int)
}));
dart.defineLazy(web_audio.AudioTrackList, {
  /*web_audio.AudioTrackList.changeEvent*/get changeEvent() {
    return dart.const(new (EventStreamProviderOfEvent()).new("change"));
  }
});
dart.registerExtension("AudioTrackList", web_audio.AudioTrackList);
web_audio.AudioWorkletGlobalScope = class AudioWorkletGlobalScope extends html$.WorkletGlobalScope {
  get [$currentTime]() {
    return this.currentTime;
  }
  get [$sampleRate]() {
    return this.sampleRate;
  }
  [$registerProcessor](...args) {
    return this.registerProcessor.apply(this, args);
  }
};
dart.addTypeTests(web_audio.AudioWorkletGlobalScope);
const currentTime$3 = Symbol("AudioWorkletGlobalScope.currentTime");
const sampleRate$0 = Symbol("AudioWorkletGlobalScope.sampleRate");
dart.setMethodSignature(web_audio.AudioWorkletGlobalScope, () => ({
  __proto__: dart.getMethods(web_audio.AudioWorkletGlobalScope.__proto__),
  [$registerProcessor]: dart.fnType(dart.void, [core.String, core.Object])
}));
dart.setLibraryUri(web_audio.AudioWorkletGlobalScope, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioWorkletGlobalScope, () => ({
  __proto__: dart.getFields(web_audio.AudioWorkletGlobalScope.__proto__),
  [$currentTime]: dart.finalFieldType(core.num),
  [$sampleRate]: dart.finalFieldType(core.num)
}));
dart.registerExtension("AudioWorkletGlobalScope", web_audio.AudioWorkletGlobalScope);
web_audio.AudioWorkletNode = class AudioWorkletNode$ extends web_audio.AudioNode {
  static new(context, name, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.AudioWorkletNode._create_1(context, name, options_1);
    }
    return web_audio.AudioWorkletNode._create_2(context, name);
  }
  static _create_1(context, name, options) {
    return new AudioWorkletNode(context, name, options);
  }
  static _create_2(context, name) {
    return new AudioWorkletNode(context, name);
  }
  get [$parameters]() {
    return this.parameters;
  }
};
dart.addTypeTests(web_audio.AudioWorkletNode);
const parameters = Symbol("AudioWorkletNode.parameters");
dart.setLibraryUri(web_audio.AudioWorkletNode, "dart:web_audio");
dart.setFieldSignature(web_audio.AudioWorkletNode, () => ({
  __proto__: dart.getFields(web_audio.AudioWorkletNode.__proto__),
  [$parameters]: dart.finalFieldType(web_audio.AudioParamMap)
}));
dart.registerExtension("AudioWorkletNode", web_audio.AudioWorkletNode);
web_audio.AudioWorkletProcessor = class AudioWorkletProcessor extends _interceptors.Interceptor {};
dart.addTypeTests(web_audio.AudioWorkletProcessor);
dart.setLibraryUri(web_audio.AudioWorkletProcessor, "dart:web_audio");
dart.registerExtension("AudioWorkletProcessor", web_audio.AudioWorkletProcessor);
web_audio.BiquadFilterNode = class BiquadFilterNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.BiquadFilterNode._create_1(context, options_1);
    }
    return web_audio.BiquadFilterNode._create_2(context);
  }
  static _create_1(context, options) {
    return new BiquadFilterNode(context, options);
  }
  static _create_2(context) {
    return new BiquadFilterNode(context);
  }
  get [$Q]() {
    return this.Q;
  }
  get [$detune]() {
    return this.detune;
  }
  get [$frequency]() {
    return this.frequency;
  }
  get [$gain]() {
    return this.gain;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  [$getFrequencyResponse](...args) {
    return this.getFrequencyResponse.apply(this, args);
  }
};
dart.addTypeTests(web_audio.BiquadFilterNode);
const Q = Symbol("BiquadFilterNode.Q");
const detune$ = Symbol("BiquadFilterNode.detune");
const frequency = Symbol("BiquadFilterNode.frequency");
const gain = Symbol("BiquadFilterNode.gain");
const type$42 = Symbol("BiquadFilterNode.type");
dart.setMethodSignature(web_audio.BiquadFilterNode, () => ({
  __proto__: dart.getMethods(web_audio.BiquadFilterNode.__proto__),
  [$getFrequencyResponse]: dart.fnType(dart.void, [typed_data.Float32List, typed_data.Float32List, typed_data.Float32List])
}));
dart.setLibraryUri(web_audio.BiquadFilterNode, "dart:web_audio");
dart.setFieldSignature(web_audio.BiquadFilterNode, () => ({
  __proto__: dart.getFields(web_audio.BiquadFilterNode.__proto__),
  [$Q]: dart.finalFieldType(web_audio.AudioParam),
  [$detune]: dart.finalFieldType(web_audio.AudioParam),
  [$frequency]: dart.finalFieldType(web_audio.AudioParam),
  [$gain]: dart.finalFieldType(web_audio.AudioParam),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("BiquadFilterNode", web_audio.BiquadFilterNode);
web_audio.ChannelMergerNode = class ChannelMergerNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.ChannelMergerNode._create_1(context, options_1);
    }
    return web_audio.ChannelMergerNode._create_2(context);
  }
  static _create_1(context, options) {
    return new ChannelMergerNode(context, options);
  }
  static _create_2(context) {
    return new ChannelMergerNode(context);
  }
};
dart.addTypeTests(web_audio.ChannelMergerNode);
dart.setLibraryUri(web_audio.ChannelMergerNode, "dart:web_audio");
dart.registerExtension("ChannelMergerNode", web_audio.ChannelMergerNode);
dart.registerExtension("AudioChannelMerger", web_audio.ChannelMergerNode);
web_audio.ChannelSplitterNode = class ChannelSplitterNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.ChannelSplitterNode._create_1(context, options_1);
    }
    return web_audio.ChannelSplitterNode._create_2(context);
  }
  static _create_1(context, options) {
    return new ChannelSplitterNode(context, options);
  }
  static _create_2(context) {
    return new ChannelSplitterNode(context);
  }
};
dart.addTypeTests(web_audio.ChannelSplitterNode);
dart.setLibraryUri(web_audio.ChannelSplitterNode, "dart:web_audio");
dart.registerExtension("ChannelSplitterNode", web_audio.ChannelSplitterNode);
dart.registerExtension("AudioChannelSplitter", web_audio.ChannelSplitterNode);
web_audio.ConstantSourceNode = class ConstantSourceNode$ extends web_audio.AudioScheduledSourceNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.ConstantSourceNode._create_1(context, options_1);
    }
    return web_audio.ConstantSourceNode._create_2(context);
  }
  static _create_1(context, options) {
    return new ConstantSourceNode(context, options);
  }
  static _create_2(context) {
    return new ConstantSourceNode(context);
  }
  get [$offset]() {
    return this.offset;
  }
};
dart.addTypeTests(web_audio.ConstantSourceNode);
const offset$0 = Symbol("ConstantSourceNode.offset");
dart.setLibraryUri(web_audio.ConstantSourceNode, "dart:web_audio");
dart.setFieldSignature(web_audio.ConstantSourceNode, () => ({
  __proto__: dart.getFields(web_audio.ConstantSourceNode.__proto__),
  [$offset]: dart.finalFieldType(web_audio.AudioParam)
}));
dart.registerExtension("ConstantSourceNode", web_audio.ConstantSourceNode);
web_audio.ConvolverNode = class ConvolverNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.ConvolverNode._create_1(context, options_1);
    }
    return web_audio.ConvolverNode._create_2(context);
  }
  static _create_1(context, options) {
    return new ConvolverNode(context, options);
  }
  static _create_2(context) {
    return new ConvolverNode(context);
  }
  get [$buffer]() {
    return this.buffer;
  }
  set [$buffer](value) {
    this.buffer = value;
  }
  get [$normalize]() {
    return this.normalize;
  }
  set [$normalize](value) {
    this.normalize = value;
  }
};
dart.addTypeTests(web_audio.ConvolverNode);
const buffer$ = Symbol("ConvolverNode.buffer");
const normalize = Symbol("ConvolverNode.normalize");
dart.setLibraryUri(web_audio.ConvolverNode, "dart:web_audio");
dart.setFieldSignature(web_audio.ConvolverNode, () => ({
  __proto__: dart.getFields(web_audio.ConvolverNode.__proto__),
  [$buffer]: dart.fieldType(web_audio.AudioBuffer),
  [$normalize]: dart.fieldType(core.bool)
}));
dart.registerExtension("ConvolverNode", web_audio.ConvolverNode);
web_audio.DelayNode = class DelayNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.DelayNode._create_1(context, options_1);
    }
    return web_audio.DelayNode._create_2(context);
  }
  static _create_1(context, options) {
    return new DelayNode(context, options);
  }
  static _create_2(context) {
    return new DelayNode(context);
  }
  get [$delayTime]() {
    return this.delayTime;
  }
};
dart.addTypeTests(web_audio.DelayNode);
const delayTime = Symbol("DelayNode.delayTime");
dart.setLibraryUri(web_audio.DelayNode, "dart:web_audio");
dart.setFieldSignature(web_audio.DelayNode, () => ({
  __proto__: dart.getFields(web_audio.DelayNode.__proto__),
  [$delayTime]: dart.finalFieldType(web_audio.AudioParam)
}));
dart.registerExtension("DelayNode", web_audio.DelayNode);
web_audio.DynamicsCompressorNode = class DynamicsCompressorNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.DynamicsCompressorNode._create_1(context, options_1);
    }
    return web_audio.DynamicsCompressorNode._create_2(context);
  }
  static _create_1(context, options) {
    return new DynamicsCompressorNode(context, options);
  }
  static _create_2(context) {
    return new DynamicsCompressorNode(context);
  }
  get [$attack]() {
    return this.attack;
  }
  get [$knee]() {
    return this.knee;
  }
  get [$ratio]() {
    return this.ratio;
  }
  get [$reduction]() {
    return this.reduction;
  }
  get [$release]() {
    return this.release;
  }
  get [$threshold]() {
    return this.threshold;
  }
};
dart.addTypeTests(web_audio.DynamicsCompressorNode);
const attack = Symbol("DynamicsCompressorNode.attack");
const knee = Symbol("DynamicsCompressorNode.knee");
const ratio = Symbol("DynamicsCompressorNode.ratio");
const reduction = Symbol("DynamicsCompressorNode.reduction");
const release = Symbol("DynamicsCompressorNode.release");
const threshold = Symbol("DynamicsCompressorNode.threshold");
dart.setLibraryUri(web_audio.DynamicsCompressorNode, "dart:web_audio");
dart.setFieldSignature(web_audio.DynamicsCompressorNode, () => ({
  __proto__: dart.getFields(web_audio.DynamicsCompressorNode.__proto__),
  [$attack]: dart.finalFieldType(web_audio.AudioParam),
  [$knee]: dart.finalFieldType(web_audio.AudioParam),
  [$ratio]: dart.finalFieldType(web_audio.AudioParam),
  [$reduction]: dart.finalFieldType(core.num),
  [$release]: dart.finalFieldType(web_audio.AudioParam),
  [$threshold]: dart.finalFieldType(web_audio.AudioParam)
}));
dart.registerExtension("DynamicsCompressorNode", web_audio.DynamicsCompressorNode);
web_audio.GainNode = class GainNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.GainNode._create_1(context, options_1);
    }
    return web_audio.GainNode._create_2(context);
  }
  static _create_1(context, options) {
    return new GainNode(context, options);
  }
  static _create_2(context) {
    return new GainNode(context);
  }
  get [$gain]() {
    return this.gain;
  }
};
dart.addTypeTests(web_audio.GainNode);
const gain$ = Symbol("GainNode.gain");
dart.setLibraryUri(web_audio.GainNode, "dart:web_audio");
dart.setFieldSignature(web_audio.GainNode, () => ({
  __proto__: dart.getFields(web_audio.GainNode.__proto__),
  [$gain]: dart.finalFieldType(web_audio.AudioParam)
}));
dart.registerExtension("GainNode", web_audio.GainNode);
dart.registerExtension("AudioGainNode", web_audio.GainNode);
web_audio.IirFilterNode = class IirFilterNode extends web_audio.AudioNode {
  static new(context, options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    return web_audio.IirFilterNode._create_1(context, options_1);
  }
  static _create_1(context, options) {
    return new IIRFilterNode(context, options);
  }
  [$getFrequencyResponse](...args) {
    return this.getFrequencyResponse.apply(this, args);
  }
};
dart.addTypeTests(web_audio.IirFilterNode);
dart.setMethodSignature(web_audio.IirFilterNode, () => ({
  __proto__: dart.getMethods(web_audio.IirFilterNode.__proto__),
  [$getFrequencyResponse]: dart.fnType(dart.void, [typed_data.Float32List, typed_data.Float32List, typed_data.Float32List])
}));
dart.setLibraryUri(web_audio.IirFilterNode, "dart:web_audio");
dart.registerExtension("IIRFilterNode", web_audio.IirFilterNode);
web_audio.MediaElementAudioSourceNode = class MediaElementAudioSourceNode$ extends web_audio.AudioNode {
  static new(context, options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    return web_audio.MediaElementAudioSourceNode._create_1(context, options_1);
  }
  static _create_1(context, options) {
    return new MediaElementAudioSourceNode(context, options);
  }
  get [$mediaElement]() {
    return this.mediaElement;
  }
};
dart.addTypeTests(web_audio.MediaElementAudioSourceNode);
const mediaElement = Symbol("MediaElementAudioSourceNode.mediaElement");
dart.setLibraryUri(web_audio.MediaElementAudioSourceNode, "dart:web_audio");
dart.setFieldSignature(web_audio.MediaElementAudioSourceNode, () => ({
  __proto__: dart.getFields(web_audio.MediaElementAudioSourceNode.__proto__),
  [$mediaElement]: dart.finalFieldType(html$.MediaElement)
}));
dart.registerExtension("MediaElementAudioSourceNode", web_audio.MediaElementAudioSourceNode);
web_audio.MediaStreamAudioDestinationNode = class MediaStreamAudioDestinationNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.MediaStreamAudioDestinationNode._create_1(context, options_1);
    }
    return web_audio.MediaStreamAudioDestinationNode._create_2(context);
  }
  static _create_1(context, options) {
    return new MediaStreamAudioDestinationNode(context, options);
  }
  static _create_2(context) {
    return new MediaStreamAudioDestinationNode(context);
  }
  get [$stream]() {
    return this.stream;
  }
};
dart.addTypeTests(web_audio.MediaStreamAudioDestinationNode);
const stream$0 = Symbol("MediaStreamAudioDestinationNode.stream");
dart.setLibraryUri(web_audio.MediaStreamAudioDestinationNode, "dart:web_audio");
dart.setFieldSignature(web_audio.MediaStreamAudioDestinationNode, () => ({
  __proto__: dart.getFields(web_audio.MediaStreamAudioDestinationNode.__proto__),
  [$stream]: dart.finalFieldType(html$.MediaStream)
}));
dart.registerExtension("MediaStreamAudioDestinationNode", web_audio.MediaStreamAudioDestinationNode);
web_audio.MediaStreamAudioSourceNode = class MediaStreamAudioSourceNode$ extends web_audio.AudioNode {
  static new(context, options) {
    let options_1 = html_common.convertDartToNative_Dictionary(options);
    return web_audio.MediaStreamAudioSourceNode._create_1(context, options_1);
  }
  static _create_1(context, options) {
    return new MediaStreamAudioSourceNode(context, options);
  }
  get [$mediaStream]() {
    return this.mediaStream;
  }
};
dart.addTypeTests(web_audio.MediaStreamAudioSourceNode);
const mediaStream = Symbol("MediaStreamAudioSourceNode.mediaStream");
dart.setLibraryUri(web_audio.MediaStreamAudioSourceNode, "dart:web_audio");
dart.setFieldSignature(web_audio.MediaStreamAudioSourceNode, () => ({
  __proto__: dart.getFields(web_audio.MediaStreamAudioSourceNode.__proto__),
  [$mediaStream]: dart.finalFieldType(html$.MediaStream)
}));
dart.registerExtension("MediaStreamAudioSourceNode", web_audio.MediaStreamAudioSourceNode);
web_audio.OfflineAudioCompletionEvent = class OfflineAudioCompletionEvent$ extends html$.Event {
  static new(type, eventInitDict) {
    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
    return web_audio.OfflineAudioCompletionEvent._create_1(type, eventInitDict_1);
  }
  static _create_1(type, eventInitDict) {
    return new OfflineAudioCompletionEvent(type, eventInitDict);
  }
  get [$renderedBuffer]() {
    return this.renderedBuffer;
  }
};
dart.addTypeTests(web_audio.OfflineAudioCompletionEvent);
const renderedBuffer = Symbol("OfflineAudioCompletionEvent.renderedBuffer");
dart.setLibraryUri(web_audio.OfflineAudioCompletionEvent, "dart:web_audio");
dart.setFieldSignature(web_audio.OfflineAudioCompletionEvent, () => ({
  __proto__: dart.getFields(web_audio.OfflineAudioCompletionEvent.__proto__),
  [$renderedBuffer]: dart.finalFieldType(web_audio.AudioBuffer)
}));
dart.registerExtension("OfflineAudioCompletionEvent", web_audio.OfflineAudioCompletionEvent);
web_audio.OfflineAudioContext = class OfflineAudioContext$ extends web_audio.BaseAudioContext {
  static new(numberOfChannels_OR_options, numberOfFrames, sampleRate) {
    if (numberOfFrames === void 0) numberOfFrames = null;
    if (sampleRate === void 0) sampleRate = null;
    if (typeof sampleRate == 'number' && core.int.is(numberOfFrames) && core.int.is(numberOfChannels_OR_options)) {
      return web_audio.OfflineAudioContext._create_1(numberOfChannels_OR_options, numberOfFrames, sampleRate);
    }
    if (core.Map.is(numberOfChannels_OR_options) && numberOfFrames == null && sampleRate == null) {
      let options_1 = html_common.convertDartToNative_Dictionary(numberOfChannels_OR_options);
      return web_audio.OfflineAudioContext._create_2(options_1);
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  static _create_1(numberOfChannels_OR_options, numberOfFrames, sampleRate) {
    return new OfflineAudioContext(numberOfChannels_OR_options, numberOfFrames, sampleRate);
  }
  static _create_2(numberOfChannels_OR_options) {
    return new OfflineAudioContext(numberOfChannels_OR_options);
  }
  get [$length]() {
    return this.length;
  }
  [$startRendering]() {
    return html$.promiseToFuture(web_audio.AudioBuffer, this.startRendering());
  }
  [$suspendFor](suspendTime) {
    return html$.promiseToFuture(dart.dynamic, this.suspendFor(suspendTime));
  }
};
dart.addTypeTests(web_audio.OfflineAudioContext);
const length$20 = Symbol("OfflineAudioContext.length");
dart.setMethodSignature(web_audio.OfflineAudioContext, () => ({
  __proto__: dart.getMethods(web_audio.OfflineAudioContext.__proto__),
  [$startRendering]: dart.fnType(async.Future$(web_audio.AudioBuffer), []),
  [$suspendFor]: dart.fnType(async.Future, [core.num])
}));
dart.setLibraryUri(web_audio.OfflineAudioContext, "dart:web_audio");
dart.setFieldSignature(web_audio.OfflineAudioContext, () => ({
  __proto__: dart.getFields(web_audio.OfflineAudioContext.__proto__),
  [$length]: dart.finalFieldType(core.int)
}));
dart.registerExtension("OfflineAudioContext", web_audio.OfflineAudioContext);
web_audio.OscillatorNode = class OscillatorNode$ extends web_audio.AudioScheduledSourceNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.OscillatorNode._create_1(context, options_1);
    }
    return web_audio.OscillatorNode._create_2(context);
  }
  static _create_1(context, options) {
    return new OscillatorNode(context, options);
  }
  static _create_2(context) {
    return new OscillatorNode(context);
  }
  get [$detune]() {
    return this.detune;
  }
  get [$frequency]() {
    return this.frequency;
  }
  get [$type]() {
    return this.type;
  }
  set [$type](value) {
    this.type = value;
  }
  [$setPeriodicWave](...args) {
    return this.setPeriodicWave.apply(this, args);
  }
};
dart.addTypeTests(web_audio.OscillatorNode);
const detune$0 = Symbol("OscillatorNode.detune");
const frequency$ = Symbol("OscillatorNode.frequency");
const type$43 = Symbol("OscillatorNode.type");
dart.setMethodSignature(web_audio.OscillatorNode, () => ({
  __proto__: dart.getMethods(web_audio.OscillatorNode.__proto__),
  [$setPeriodicWave]: dart.fnType(dart.void, [web_audio.PeriodicWave])
}));
dart.setLibraryUri(web_audio.OscillatorNode, "dart:web_audio");
dart.setFieldSignature(web_audio.OscillatorNode, () => ({
  __proto__: dart.getFields(web_audio.OscillatorNode.__proto__),
  [$detune]: dart.finalFieldType(web_audio.AudioParam),
  [$frequency]: dart.finalFieldType(web_audio.AudioParam),
  [$type]: dart.fieldType(core.String)
}));
dart.registerExtension("OscillatorNode", web_audio.OscillatorNode);
dart.registerExtension("Oscillator", web_audio.OscillatorNode);
web_audio.PannerNode = class PannerNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.PannerNode._create_1(context, options_1);
    }
    return web_audio.PannerNode._create_2(context);
  }
  static _create_1(context, options) {
    return new PannerNode(context, options);
  }
  static _create_2(context) {
    return new PannerNode(context);
  }
  get [$coneInnerAngle]() {
    return this.coneInnerAngle;
  }
  set [$coneInnerAngle](value) {
    this.coneInnerAngle = value;
  }
  get [$coneOuterAngle]() {
    return this.coneOuterAngle;
  }
  set [$coneOuterAngle](value) {
    this.coneOuterAngle = value;
  }
  get [$coneOuterGain]() {
    return this.coneOuterGain;
  }
  set [$coneOuterGain](value) {
    this.coneOuterGain = value;
  }
  get [$distanceModel]() {
    return this.distanceModel;
  }
  set [$distanceModel](value) {
    this.distanceModel = value;
  }
  get [$maxDistance]() {
    return this.maxDistance;
  }
  set [$maxDistance](value) {
    this.maxDistance = value;
  }
  get [$orientationX]() {
    return this.orientationX;
  }
  get [$orientationY]() {
    return this.orientationY;
  }
  get [$orientationZ]() {
    return this.orientationZ;
  }
  get [$panningModel]() {
    return this.panningModel;
  }
  set [$panningModel](value) {
    this.panningModel = value;
  }
  get [$positionX]() {
    return this.positionX;
  }
  get [$positionY]() {
    return this.positionY;
  }
  get [$positionZ]() {
    return this.positionZ;
  }
  get [$refDistance]() {
    return this.refDistance;
  }
  set [$refDistance](value) {
    this.refDistance = value;
  }
  get [$rolloffFactor]() {
    return this.rolloffFactor;
  }
  set [$rolloffFactor](value) {
    this.rolloffFactor = value;
  }
  [$setOrientation](...args) {
    return this.setOrientation.apply(this, args);
  }
  [$setPosition](...args) {
    return this.setPosition.apply(this, args);
  }
};
dart.addTypeTests(web_audio.PannerNode);
const coneInnerAngle = Symbol("PannerNode.coneInnerAngle");
const coneOuterAngle = Symbol("PannerNode.coneOuterAngle");
const coneOuterGain = Symbol("PannerNode.coneOuterGain");
const distanceModel = Symbol("PannerNode.distanceModel");
const maxDistance = Symbol("PannerNode.maxDistance");
const orientationX = Symbol("PannerNode.orientationX");
const orientationY = Symbol("PannerNode.orientationY");
const orientationZ = Symbol("PannerNode.orientationZ");
const panningModel = Symbol("PannerNode.panningModel");
const positionX$0 = Symbol("PannerNode.positionX");
const positionY$0 = Symbol("PannerNode.positionY");
const positionZ$ = Symbol("PannerNode.positionZ");
const refDistance = Symbol("PannerNode.refDistance");
const rolloffFactor = Symbol("PannerNode.rolloffFactor");
dart.setMethodSignature(web_audio.PannerNode, () => ({
  __proto__: dart.getMethods(web_audio.PannerNode.__proto__),
  [$setOrientation]: dart.fnType(dart.void, [core.num, core.num, core.num]),
  [$setPosition]: dart.fnType(dart.void, [core.num, core.num, core.num])
}));
dart.setLibraryUri(web_audio.PannerNode, "dart:web_audio");
dart.setFieldSignature(web_audio.PannerNode, () => ({
  __proto__: dart.getFields(web_audio.PannerNode.__proto__),
  [$coneInnerAngle]: dart.fieldType(core.num),
  [$coneOuterAngle]: dart.fieldType(core.num),
  [$coneOuterGain]: dart.fieldType(core.num),
  [$distanceModel]: dart.fieldType(core.String),
  [$maxDistance]: dart.fieldType(core.num),
  [$orientationX]: dart.finalFieldType(web_audio.AudioParam),
  [$orientationY]: dart.finalFieldType(web_audio.AudioParam),
  [$orientationZ]: dart.finalFieldType(web_audio.AudioParam),
  [$panningModel]: dart.fieldType(core.String),
  [$positionX]: dart.finalFieldType(web_audio.AudioParam),
  [$positionY]: dart.finalFieldType(web_audio.AudioParam),
  [$positionZ]: dart.finalFieldType(web_audio.AudioParam),
  [$refDistance]: dart.fieldType(core.num),
  [$rolloffFactor]: dart.fieldType(core.num)
}));
dart.registerExtension("PannerNode", web_audio.PannerNode);
dart.registerExtension("AudioPannerNode", web_audio.PannerNode);
dart.registerExtension("webkitAudioPannerNode", web_audio.PannerNode);
web_audio.PeriodicWave = class PeriodicWave$ extends _interceptors.Interceptor {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.PeriodicWave._create_1(context, options_1);
    }
    return web_audio.PeriodicWave._create_2(context);
  }
  static _create_1(context, options) {
    return new PeriodicWave(context, options);
  }
  static _create_2(context) {
    return new PeriodicWave(context);
  }
};
dart.addTypeTests(web_audio.PeriodicWave);
dart.setLibraryUri(web_audio.PeriodicWave, "dart:web_audio");
dart.registerExtension("PeriodicWave", web_audio.PeriodicWave);
web_audio.ScriptProcessorNode = class ScriptProcessorNode extends web_audio.AudioNode {
  get [$bufferSize]() {
    return this.bufferSize;
  }
  [$setEventListener](...args) {
    return this.setEventListener.apply(this, args);
  }
  get [$onAudioProcess]() {
    return web_audio.ScriptProcessorNode.audioProcessEvent.forTarget(this);
  }
};
dart.addTypeTests(web_audio.ScriptProcessorNode);
const bufferSize = Symbol("ScriptProcessorNode.bufferSize");
dart.setMethodSignature(web_audio.ScriptProcessorNode, () => ({
  __proto__: dart.getMethods(web_audio.ScriptProcessorNode.__proto__),
  [$setEventListener]: dart.fnType(dart.void, [dart.fnType(dart.dynamic, [html$.Event])])
}));
dart.setGetterSignature(web_audio.ScriptProcessorNode, () => ({
  __proto__: dart.getGetters(web_audio.ScriptProcessorNode.__proto__),
  [$onAudioProcess]: async.Stream$(web_audio.AudioProcessingEvent)
}));
dart.setLibraryUri(web_audio.ScriptProcessorNode, "dart:web_audio");
dart.setFieldSignature(web_audio.ScriptProcessorNode, () => ({
  __proto__: dart.getFields(web_audio.ScriptProcessorNode.__proto__),
  [$bufferSize]: dart.finalFieldType(core.int)
}));
dart.defineLazy(web_audio.ScriptProcessorNode, {
  /*web_audio.ScriptProcessorNode.audioProcessEvent*/get audioProcessEvent() {
    return dart.const(new (EventStreamProviderOfAudioProcessingEvent()).new("audioprocess"));
  }
});
dart.registerExtension("ScriptProcessorNode", web_audio.ScriptProcessorNode);
dart.registerExtension("JavaScriptAudioNode", web_audio.ScriptProcessorNode);
web_audio.StereoPannerNode = class StereoPannerNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.StereoPannerNode._create_1(context, options_1);
    }
    return web_audio.StereoPannerNode._create_2(context);
  }
  static _create_1(context, options) {
    return new StereoPannerNode(context, options);
  }
  static _create_2(context) {
    return new StereoPannerNode(context);
  }
  get [$pan]() {
    return this.pan;
  }
};
dart.addTypeTests(web_audio.StereoPannerNode);
const pan = Symbol("StereoPannerNode.pan");
dart.setLibraryUri(web_audio.StereoPannerNode, "dart:web_audio");
dart.setFieldSignature(web_audio.StereoPannerNode, () => ({
  __proto__: dart.getFields(web_audio.StereoPannerNode.__proto__),
  [$pan]: dart.finalFieldType(web_audio.AudioParam)
}));
dart.registerExtension("StereoPannerNode", web_audio.StereoPannerNode);
web_audio.WaveShaperNode = class WaveShaperNode$ extends web_audio.AudioNode {
  static new(context, options) {
    if (options === void 0) options = null;
    if (options != null) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return web_audio.WaveShaperNode._create_1(context, options_1);
    }
    return web_audio.WaveShaperNode._create_2(context);
  }
  static _create_1(context, options) {
    return new WaveShaperNode(context, options);
  }
  static _create_2(context) {
    return new WaveShaperNode(context);
  }
  get [$curve]() {
    return this.curve;
  }
  set [$curve](value) {
    this.curve = value;
  }
  get [$oversample]() {
    return this.oversample;
  }
  set [$oversample](value) {
    this.oversample = value;
  }
};
dart.addTypeTests(web_audio.WaveShaperNode);
const curve = Symbol("WaveShaperNode.curve");
const oversample = Symbol("WaveShaperNode.oversample");
dart.setLibraryUri(web_audio.WaveShaperNode, "dart:web_audio");
dart.setFieldSignature(web_audio.WaveShaperNode, () => ({
  __proto__: dart.getFields(web_audio.WaveShaperNode.__proto__),
  [$curve]: dart.fieldType(typed_data.Float32List),
  [$oversample]: dart.fieldType(core.String)
}));
dart.registerExtension("WaveShaperNode", web_audio.WaveShaperNode);
web_gl.ActiveInfo = class ActiveInfo extends _interceptors.Interceptor {
  get [$name]() {
    return this.name;
  }
  get [$size]() {
    return this.size;
  }
  get [$type]() {
    return this.type;
  }
};
dart.addTypeTests(web_gl.ActiveInfo);
const name$40 = Symbol("ActiveInfo.name");
const size$7 = Symbol("ActiveInfo.size");
const type$44 = Symbol("ActiveInfo.type");
dart.setLibraryUri(web_gl.ActiveInfo, "dart:web_gl");
dart.setFieldSignature(web_gl.ActiveInfo, () => ({
  __proto__: dart.getFields(web_gl.ActiveInfo.__proto__),
  [$name]: dart.finalFieldType(core.String),
  [$size]: dart.finalFieldType(core.int),
  [$type]: dart.finalFieldType(core.int)
}));
dart.registerExtension("WebGLActiveInfo", web_gl.ActiveInfo);
web_gl.AngleInstancedArrays = class AngleInstancedArrays extends _interceptors.Interceptor {
  [$drawArraysInstancedAngle](...args) {
    return this.drawArraysInstancedANGLE.apply(this, args);
  }
  [$drawElementsInstancedAngle](...args) {
    return this.drawElementsInstancedANGLE.apply(this, args);
  }
  [$vertexAttribDivisorAngle](...args) {
    return this.vertexAttribDivisorANGLE.apply(this, args);
  }
};
dart.addTypeTests(web_gl.AngleInstancedArrays);
dart.setMethodSignature(web_gl.AngleInstancedArrays, () => ({
  __proto__: dart.getMethods(web_gl.AngleInstancedArrays.__proto__),
  [$drawArraysInstancedAngle]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$drawElementsInstancedAngle]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
  [$vertexAttribDivisorAngle]: dart.fnType(dart.void, [core.int, core.int])
}));
dart.setLibraryUri(web_gl.AngleInstancedArrays, "dart:web_gl");
dart.defineLazy(web_gl.AngleInstancedArrays, {
  /*web_gl.AngleInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE*/get VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE() {
    return 35070;
  }
});
dart.registerExtension("ANGLEInstancedArrays", web_gl.AngleInstancedArrays);
dart.registerExtension("ANGLE_instanced_arrays", web_gl.AngleInstancedArrays);
web_gl.Buffer = class Buffer extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.Buffer);
dart.setLibraryUri(web_gl.Buffer, "dart:web_gl");
dart.registerExtension("WebGLBuffer", web_gl.Buffer);
web_gl.Canvas = class Canvas extends _interceptors.Interceptor {
  get [$canvas]() {
    return this.canvas;
  }
  get [$offscreenCanvas]() {
    return this.canvas;
  }
};
dart.addTypeTests(web_gl.Canvas);
const canvas$2 = Symbol("Canvas.canvas");
const offscreenCanvas = Symbol("Canvas.offscreenCanvas");
dart.setLibraryUri(web_gl.Canvas, "dart:web_gl");
dart.setFieldSignature(web_gl.Canvas, () => ({
  __proto__: dart.getFields(web_gl.Canvas.__proto__),
  [$canvas]: dart.finalFieldType(html$.CanvasElement),
  [$offscreenCanvas]: dart.finalFieldType(html$.OffscreenCanvas)
}));
dart.registerExtension("WebGLCanvas", web_gl.Canvas);
web_gl.ColorBufferFloat = class ColorBufferFloat extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.ColorBufferFloat);
dart.setLibraryUri(web_gl.ColorBufferFloat, "dart:web_gl");
dart.registerExtension("WebGLColorBufferFloat", web_gl.ColorBufferFloat);
web_gl.CompressedTextureAstc = class CompressedTextureAstc extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.CompressedTextureAstc);
dart.setLibraryUri(web_gl.CompressedTextureAstc, "dart:web_gl");
dart.defineLazy(web_gl.CompressedTextureAstc, {
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_10x10_KHR*/get COMPRESSED_RGBA_ASTC_10x10_KHR() {
    return 37819;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_10x5_KHR*/get COMPRESSED_RGBA_ASTC_10x5_KHR() {
    return 37816;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_10x6_KHR*/get COMPRESSED_RGBA_ASTC_10x6_KHR() {
    return 37817;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_10x8_KHR*/get COMPRESSED_RGBA_ASTC_10x8_KHR() {
    return 37818;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_12x10_KHR*/get COMPRESSED_RGBA_ASTC_12x10_KHR() {
    return 37820;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_12x12_KHR*/get COMPRESSED_RGBA_ASTC_12x12_KHR() {
    return 37821;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_4x4_KHR*/get COMPRESSED_RGBA_ASTC_4x4_KHR() {
    return 37808;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_5x4_KHR*/get COMPRESSED_RGBA_ASTC_5x4_KHR() {
    return 37809;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_5x5_KHR*/get COMPRESSED_RGBA_ASTC_5x5_KHR() {
    return 37810;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_6x5_KHR*/get COMPRESSED_RGBA_ASTC_6x5_KHR() {
    return 37811;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_6x6_KHR*/get COMPRESSED_RGBA_ASTC_6x6_KHR() {
    return 37812;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_8x5_KHR*/get COMPRESSED_RGBA_ASTC_8x5_KHR() {
    return 37813;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_8x6_KHR*/get COMPRESSED_RGBA_ASTC_8x6_KHR() {
    return 37814;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_RGBA_ASTC_8x8_KHR*/get COMPRESSED_RGBA_ASTC_8x8_KHR() {
    return 37815;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR() {
    return 37851;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR() {
    return 37848;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR() {
    return 37849;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR() {
    return 37850;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR() {
    return 37852;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR() {
    return 37853;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR() {
    return 37840;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR() {
    return 37841;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR() {
    return 37842;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR() {
    return 37843;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR() {
    return 37844;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR() {
    return 37845;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR() {
    return 37846;
  },
  /*web_gl.CompressedTextureAstc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR*/get COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR() {
    return 37847;
  }
});
dart.registerExtension("WebGLCompressedTextureASTC", web_gl.CompressedTextureAstc);
web_gl.CompressedTextureAtc = class CompressedTextureAtc extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.CompressedTextureAtc);
dart.setLibraryUri(web_gl.CompressedTextureAtc, "dart:web_gl");
dart.defineLazy(web_gl.CompressedTextureAtc, {
  /*web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL*/get COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL() {
    return 35987;
  },
  /*web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL*/get COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL() {
    return 34798;
  },
  /*web_gl.CompressedTextureAtc.COMPRESSED_RGB_ATC_WEBGL*/get COMPRESSED_RGB_ATC_WEBGL() {
    return 35986;
  }
});
dart.registerExtension("WebGLCompressedTextureATC", web_gl.CompressedTextureAtc);
dart.registerExtension("WEBGL_compressed_texture_atc", web_gl.CompressedTextureAtc);
web_gl.CompressedTextureETC1 = class CompressedTextureETC1 extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.CompressedTextureETC1);
dart.setLibraryUri(web_gl.CompressedTextureETC1, "dart:web_gl");
dart.defineLazy(web_gl.CompressedTextureETC1, {
  /*web_gl.CompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL*/get COMPRESSED_RGB_ETC1_WEBGL() {
    return 36196;
  }
});
dart.registerExtension("WebGLCompressedTextureETC1", web_gl.CompressedTextureETC1);
dart.registerExtension("WEBGL_compressed_texture_etc1", web_gl.CompressedTextureETC1);
web_gl.CompressedTextureEtc = class CompressedTextureEtc extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.CompressedTextureEtc);
dart.setLibraryUri(web_gl.CompressedTextureEtc, "dart:web_gl");
dart.defineLazy(web_gl.CompressedTextureEtc, {
  /*web_gl.CompressedTextureEtc.COMPRESSED_R11_EAC*/get COMPRESSED_R11_EAC() {
    return 37488;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_RG11_EAC*/get COMPRESSED_RG11_EAC() {
    return 37490;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_RGB8_ETC2*/get COMPRESSED_RGB8_ETC2() {
    return 37492;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2*/get COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2() {
    return 37494;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_RGBA8_ETC2_EAC*/get COMPRESSED_RGBA8_ETC2_EAC() {
    return 37496;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_SIGNED_R11_EAC*/get COMPRESSED_SIGNED_R11_EAC() {
    return 37489;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_SIGNED_RG11_EAC*/get COMPRESSED_SIGNED_RG11_EAC() {
    return 37491;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC*/get COMPRESSED_SRGB8_ALPHA8_ETC2_EAC() {
    return 37497;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_SRGB8_ETC2*/get COMPRESSED_SRGB8_ETC2() {
    return 37493;
  },
  /*web_gl.CompressedTextureEtc.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2*/get COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2() {
    return 37495;
  }
});
dart.registerExtension("WebGLCompressedTextureETC", web_gl.CompressedTextureEtc);
web_gl.CompressedTexturePvrtc = class CompressedTexturePvrtc extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.CompressedTexturePvrtc);
dart.setLibraryUri(web_gl.CompressedTexturePvrtc, "dart:web_gl");
dart.defineLazy(web_gl.CompressedTexturePvrtc, {
  /*web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG*/get COMPRESSED_RGBA_PVRTC_2BPPV1_IMG() {
    return 35843;
  },
  /*web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG*/get COMPRESSED_RGBA_PVRTC_4BPPV1_IMG() {
    return 35842;
  },
  /*web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_2BPPV1_IMG*/get COMPRESSED_RGB_PVRTC_2BPPV1_IMG() {
    return 35841;
  },
  /*web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG*/get COMPRESSED_RGB_PVRTC_4BPPV1_IMG() {
    return 35840;
  }
});
dart.registerExtension("WebGLCompressedTexturePVRTC", web_gl.CompressedTexturePvrtc);
dart.registerExtension("WEBGL_compressed_texture_pvrtc", web_gl.CompressedTexturePvrtc);
web_gl.CompressedTextureS3TC = class CompressedTextureS3TC extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.CompressedTextureS3TC);
dart.setLibraryUri(web_gl.CompressedTextureS3TC, "dart:web_gl");
dart.defineLazy(web_gl.CompressedTextureS3TC, {
  /*web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT*/get COMPRESSED_RGBA_S3TC_DXT1_EXT() {
    return 33777;
  },
  /*web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT*/get COMPRESSED_RGBA_S3TC_DXT3_EXT() {
    return 33778;
  },
  /*web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT*/get COMPRESSED_RGBA_S3TC_DXT5_EXT() {
    return 33779;
  },
  /*web_gl.CompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT*/get COMPRESSED_RGB_S3TC_DXT1_EXT() {
    return 33776;
  }
});
dart.registerExtension("WebGLCompressedTextureS3TC", web_gl.CompressedTextureS3TC);
dart.registerExtension("WEBGL_compressed_texture_s3tc", web_gl.CompressedTextureS3TC);
web_gl.CompressedTextureS3TCsRgb = class CompressedTextureS3TCsRgb extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.CompressedTextureS3TCsRgb);
dart.setLibraryUri(web_gl.CompressedTextureS3TCsRgb, "dart:web_gl");
dart.defineLazy(web_gl.CompressedTextureS3TCsRgb, {
  /*web_gl.CompressedTextureS3TCsRgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT*/get COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT() {
    return 35917;
  },
  /*web_gl.CompressedTextureS3TCsRgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT*/get COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT() {
    return 35918;
  },
  /*web_gl.CompressedTextureS3TCsRgb.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT*/get COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT() {
    return 35919;
  },
  /*web_gl.CompressedTextureS3TCsRgb.COMPRESSED_SRGB_S3TC_DXT1_EXT*/get COMPRESSED_SRGB_S3TC_DXT1_EXT() {
    return 35916;
  }
});
dart.registerExtension("WebGLCompressedTextureS3TCsRGB", web_gl.CompressedTextureS3TCsRgb);
web_gl.ContextEvent = class ContextEvent extends html$.Event {
  static new(type, eventInit) {
    if (eventInit === void 0) eventInit = null;
    if (eventInit != null) {
      let eventInit_1 = html_common.convertDartToNative_Dictionary(eventInit);
      return web_gl.ContextEvent._create_1(type, eventInit_1);
    }
    return web_gl.ContextEvent._create_2(type);
  }
  static _create_1(type, eventInit) {
    return new WebGLContextEvent(type, eventInit);
  }
  static _create_2(type) {
    return new WebGLContextEvent(type);
  }
  get [$statusMessage]() {
    return this.statusMessage;
  }
};
dart.addTypeTests(web_gl.ContextEvent);
const statusMessage = Symbol("ContextEvent.statusMessage");
dart.setLibraryUri(web_gl.ContextEvent, "dart:web_gl");
dart.setFieldSignature(web_gl.ContextEvent, () => ({
  __proto__: dart.getFields(web_gl.ContextEvent.__proto__),
  [$statusMessage]: dart.finalFieldType(core.String)
}));
dart.registerExtension("WebGLContextEvent", web_gl.ContextEvent);
web_gl.DebugRendererInfo = class DebugRendererInfo extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.DebugRendererInfo);
dart.setLibraryUri(web_gl.DebugRendererInfo, "dart:web_gl");
dart.defineLazy(web_gl.DebugRendererInfo, {
  /*web_gl.DebugRendererInfo.UNMASKED_RENDERER_WEBGL*/get UNMASKED_RENDERER_WEBGL() {
    return 37446;
  },
  /*web_gl.DebugRendererInfo.UNMASKED_VENDOR_WEBGL*/get UNMASKED_VENDOR_WEBGL() {
    return 37445;
  }
});
dart.registerExtension("WebGLDebugRendererInfo", web_gl.DebugRendererInfo);
dart.registerExtension("WEBGL_debug_renderer_info", web_gl.DebugRendererInfo);
web_gl.DebugShaders = class DebugShaders extends _interceptors.Interceptor {
  [$getTranslatedShaderSource](...args) {
    return this.getTranslatedShaderSource.apply(this, args);
  }
};
dart.addTypeTests(web_gl.DebugShaders);
dart.setMethodSignature(web_gl.DebugShaders, () => ({
  __proto__: dart.getMethods(web_gl.DebugShaders.__proto__),
  [$getTranslatedShaderSource]: dart.fnType(core.String, [web_gl.Shader])
}));
dart.setLibraryUri(web_gl.DebugShaders, "dart:web_gl");
dart.registerExtension("WebGLDebugShaders", web_gl.DebugShaders);
dart.registerExtension("WEBGL_debug_shaders", web_gl.DebugShaders);
web_gl.DepthTexture = class DepthTexture extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.DepthTexture);
dart.setLibraryUri(web_gl.DepthTexture, "dart:web_gl");
dart.defineLazy(web_gl.DepthTexture, {
  /*web_gl.DepthTexture.UNSIGNED_INT_24_8_WEBGL*/get UNSIGNED_INT_24_8_WEBGL() {
    return 34042;
  }
});
dart.registerExtension("WebGLDepthTexture", web_gl.DepthTexture);
dart.registerExtension("WEBGL_depth_texture", web_gl.DepthTexture);
web_gl.DrawBuffers = class DrawBuffers extends _interceptors.Interceptor {
  [$drawBuffersWebgl](...args) {
    return this.drawBuffersWEBGL.apply(this, args);
  }
};
dart.addTypeTests(web_gl.DrawBuffers);
dart.setMethodSignature(web_gl.DrawBuffers, () => ({
  __proto__: dart.getMethods(web_gl.DrawBuffers.__proto__),
  [$drawBuffersWebgl]: dart.fnType(dart.void, [core.List$(core.int)])
}));
dart.setLibraryUri(web_gl.DrawBuffers, "dart:web_gl");
dart.registerExtension("WebGLDrawBuffers", web_gl.DrawBuffers);
dart.registerExtension("WEBGL_draw_buffers", web_gl.DrawBuffers);
web_gl.EXTsRgb = class EXTsRgb extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.EXTsRgb);
dart.setLibraryUri(web_gl.EXTsRgb, "dart:web_gl");
dart.defineLazy(web_gl.EXTsRgb, {
  /*web_gl.EXTsRgb.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT*/get FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT() {
    return 33296;
  },
  /*web_gl.EXTsRgb.SRGB8_ALPHA8_EXT*/get SRGB8_ALPHA8_EXT() {
    return 35907;
  },
  /*web_gl.EXTsRgb.SRGB_ALPHA_EXT*/get SRGB_ALPHA_EXT() {
    return 35906;
  },
  /*web_gl.EXTsRgb.SRGB_EXT*/get SRGB_EXT() {
    return 35904;
  }
});
dart.registerExtension("EXTsRGB", web_gl.EXTsRgb);
dart.registerExtension("EXT_sRGB", web_gl.EXTsRgb);
web_gl.ExtBlendMinMax = class ExtBlendMinMax extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.ExtBlendMinMax);
dart.setLibraryUri(web_gl.ExtBlendMinMax, "dart:web_gl");
dart.defineLazy(web_gl.ExtBlendMinMax, {
  /*web_gl.ExtBlendMinMax.MAX_EXT*/get MAX_EXT() {
    return 32776;
  },
  /*web_gl.ExtBlendMinMax.MIN_EXT*/get MIN_EXT() {
    return 32775;
  }
});
dart.registerExtension("EXTBlendMinMax", web_gl.ExtBlendMinMax);
dart.registerExtension("EXT_blend_minmax", web_gl.ExtBlendMinMax);
web_gl.ExtColorBufferFloat = class ExtColorBufferFloat extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.ExtColorBufferFloat);
dart.setLibraryUri(web_gl.ExtColorBufferFloat, "dart:web_gl");
dart.registerExtension("EXTColorBufferFloat", web_gl.ExtColorBufferFloat);
web_gl.ExtColorBufferHalfFloat = class ExtColorBufferHalfFloat extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.ExtColorBufferHalfFloat);
dart.setLibraryUri(web_gl.ExtColorBufferHalfFloat, "dart:web_gl");
dart.registerExtension("EXTColorBufferHalfFloat", web_gl.ExtColorBufferHalfFloat);
web_gl.ExtDisjointTimerQuery = class ExtDisjointTimerQuery extends _interceptors.Interceptor {
  [$beginQueryExt](...args) {
    return this.beginQueryEXT.apply(this, args);
  }
  [$createQueryExt](...args) {
    return this.createQueryEXT.apply(this, args);
  }
  [$deleteQueryExt](...args) {
    return this.deleteQueryEXT.apply(this, args);
  }
  [$endQueryExt](...args) {
    return this.endQueryEXT.apply(this, args);
  }
  [$getQueryExt](...args) {
    return this.getQueryEXT.apply(this, args);
  }
  [$getQueryObjectExt](...args) {
    return this.getQueryObjectEXT.apply(this, args);
  }
  [$isQueryExt](...args) {
    return this.isQueryEXT.apply(this, args);
  }
  [$queryCounterExt](...args) {
    return this.queryCounterEXT.apply(this, args);
  }
};
dart.addTypeTests(web_gl.ExtDisjointTimerQuery);
dart.setMethodSignature(web_gl.ExtDisjointTimerQuery, () => ({
  __proto__: dart.getMethods(web_gl.ExtDisjointTimerQuery.__proto__),
  [$beginQueryExt]: dart.fnType(dart.void, [core.int, web_gl.TimerQueryExt]),
  [$createQueryExt]: dart.fnType(web_gl.TimerQueryExt, []),
  [$deleteQueryExt]: dart.fnType(dart.void, [web_gl.TimerQueryExt]),
  [$endQueryExt]: dart.fnType(dart.void, [core.int]),
  [$getQueryExt]: dart.fnType(core.Object, [core.int, core.int]),
  [$getQueryObjectExt]: dart.fnType(core.Object, [web_gl.TimerQueryExt, core.int]),
  [$isQueryExt]: dart.fnType(core.bool, [web_gl.TimerQueryExt]),
  [$queryCounterExt]: dart.fnType(dart.void, [web_gl.TimerQueryExt, core.int])
}));
dart.setLibraryUri(web_gl.ExtDisjointTimerQuery, "dart:web_gl");
dart.defineLazy(web_gl.ExtDisjointTimerQuery, {
  /*web_gl.ExtDisjointTimerQuery.CURRENT_QUERY_EXT*/get CURRENT_QUERY_EXT() {
    return 34917;
  },
  /*web_gl.ExtDisjointTimerQuery.GPU_DISJOINT_EXT*/get GPU_DISJOINT_EXT() {
    return 36795;
  },
  /*web_gl.ExtDisjointTimerQuery.QUERY_COUNTER_BITS_EXT*/get QUERY_COUNTER_BITS_EXT() {
    return 34916;
  },
  /*web_gl.ExtDisjointTimerQuery.QUERY_RESULT_AVAILABLE_EXT*/get QUERY_RESULT_AVAILABLE_EXT() {
    return 34919;
  },
  /*web_gl.ExtDisjointTimerQuery.QUERY_RESULT_EXT*/get QUERY_RESULT_EXT() {
    return 34918;
  },
  /*web_gl.ExtDisjointTimerQuery.TIMESTAMP_EXT*/get TIMESTAMP_EXT() {
    return 36392;
  },
  /*web_gl.ExtDisjointTimerQuery.TIME_ELAPSED_EXT*/get TIME_ELAPSED_EXT() {
    return 35007;
  }
});
dart.registerExtension("EXTDisjointTimerQuery", web_gl.ExtDisjointTimerQuery);
web_gl.ExtDisjointTimerQueryWebGL2 = class ExtDisjointTimerQueryWebGL2 extends _interceptors.Interceptor {
  [$queryCounterExt](...args) {
    return this.queryCounterEXT.apply(this, args);
  }
};
dart.addTypeTests(web_gl.ExtDisjointTimerQueryWebGL2);
dart.setMethodSignature(web_gl.ExtDisjointTimerQueryWebGL2, () => ({
  __proto__: dart.getMethods(web_gl.ExtDisjointTimerQueryWebGL2.__proto__),
  [$queryCounterExt]: dart.fnType(dart.void, [web_gl.Query, core.int])
}));
dart.setLibraryUri(web_gl.ExtDisjointTimerQueryWebGL2, "dart:web_gl");
dart.defineLazy(web_gl.ExtDisjointTimerQueryWebGL2, {
  /*web_gl.ExtDisjointTimerQueryWebGL2.GPU_DISJOINT_EXT*/get GPU_DISJOINT_EXT() {
    return 36795;
  },
  /*web_gl.ExtDisjointTimerQueryWebGL2.QUERY_COUNTER_BITS_EXT*/get QUERY_COUNTER_BITS_EXT() {
    return 34916;
  },
  /*web_gl.ExtDisjointTimerQueryWebGL2.TIMESTAMP_EXT*/get TIMESTAMP_EXT() {
    return 36392;
  },
  /*web_gl.ExtDisjointTimerQueryWebGL2.TIME_ELAPSED_EXT*/get TIME_ELAPSED_EXT() {
    return 35007;
  }
});
dart.registerExtension("EXTDisjointTimerQueryWebGL2", web_gl.ExtDisjointTimerQueryWebGL2);
web_gl.ExtFragDepth = class ExtFragDepth extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.ExtFragDepth);
dart.setLibraryUri(web_gl.ExtFragDepth, "dart:web_gl");
dart.registerExtension("EXTFragDepth", web_gl.ExtFragDepth);
dart.registerExtension("EXT_frag_depth", web_gl.ExtFragDepth);
web_gl.ExtShaderTextureLod = class ExtShaderTextureLod extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.ExtShaderTextureLod);
dart.setLibraryUri(web_gl.ExtShaderTextureLod, "dart:web_gl");
dart.registerExtension("EXTShaderTextureLOD", web_gl.ExtShaderTextureLod);
dart.registerExtension("EXT_shader_texture_lod", web_gl.ExtShaderTextureLod);
web_gl.ExtTextureFilterAnisotropic = class ExtTextureFilterAnisotropic extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.ExtTextureFilterAnisotropic);
dart.setLibraryUri(web_gl.ExtTextureFilterAnisotropic, "dart:web_gl");
dart.defineLazy(web_gl.ExtTextureFilterAnisotropic, {
  /*web_gl.ExtTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT*/get MAX_TEXTURE_MAX_ANISOTROPY_EXT() {
    return 34047;
  },
  /*web_gl.ExtTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT*/get TEXTURE_MAX_ANISOTROPY_EXT() {
    return 34046;
  }
});
dart.registerExtension("EXTTextureFilterAnisotropic", web_gl.ExtTextureFilterAnisotropic);
dart.registerExtension("EXT_texture_filter_anisotropic", web_gl.ExtTextureFilterAnisotropic);
web_gl.Framebuffer = class Framebuffer extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.Framebuffer);
dart.setLibraryUri(web_gl.Framebuffer, "dart:web_gl");
dart.registerExtension("WebGLFramebuffer", web_gl.Framebuffer);
web_gl.GetBufferSubDataAsync = class GetBufferSubDataAsync extends _interceptors.Interceptor {
  [$getBufferSubDataAsync](target, srcByteOffset, dstData, dstOffset, length) {
    if (dstOffset === void 0) dstOffset = null;
    if (length === void 0) length = null;
    return html$.promiseToFuture(dart.dynamic, this.getBufferSubDataAsync(target, srcByteOffset, dstData, dstOffset, length));
  }
};
dart.addTypeTests(web_gl.GetBufferSubDataAsync);
dart.setMethodSignature(web_gl.GetBufferSubDataAsync, () => ({
  __proto__: dart.getMethods(web_gl.GetBufferSubDataAsync.__proto__),
  [$getBufferSubDataAsync]: dart.fnType(async.Future, [core.int, core.int, typed_data.TypedData], [core.int, core.int])
}));
dart.setLibraryUri(web_gl.GetBufferSubDataAsync, "dart:web_gl");
dart.registerExtension("WebGLGetBufferSubDataAsync", web_gl.GetBufferSubDataAsync);
web_gl.LoseContext = class LoseContext extends _interceptors.Interceptor {
  [$loseContext](...args) {
    return this.loseContext.apply(this, args);
  }
  [$restoreContext](...args) {
    return this.restoreContext.apply(this, args);
  }
};
dart.addTypeTests(web_gl.LoseContext);
dart.setMethodSignature(web_gl.LoseContext, () => ({
  __proto__: dart.getMethods(web_gl.LoseContext.__proto__),
  [$loseContext]: dart.fnType(dart.void, []),
  [$restoreContext]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(web_gl.LoseContext, "dart:web_gl");
dart.registerExtension("WebGLLoseContext", web_gl.LoseContext);
dart.registerExtension("WebGLExtensionLoseContext", web_gl.LoseContext);
dart.registerExtension("WEBGL_lose_context", web_gl.LoseContext);
web_gl.OesElementIndexUint = class OesElementIndexUint extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.OesElementIndexUint);
dart.setLibraryUri(web_gl.OesElementIndexUint, "dart:web_gl");
dart.registerExtension("OESElementIndexUint", web_gl.OesElementIndexUint);
dart.registerExtension("OES_element_index_uint", web_gl.OesElementIndexUint);
web_gl.OesStandardDerivatives = class OesStandardDerivatives extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.OesStandardDerivatives);
dart.setLibraryUri(web_gl.OesStandardDerivatives, "dart:web_gl");
dart.defineLazy(web_gl.OesStandardDerivatives, {
  /*web_gl.OesStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES*/get FRAGMENT_SHADER_DERIVATIVE_HINT_OES() {
    return 35723;
  }
});
dart.registerExtension("OESStandardDerivatives", web_gl.OesStandardDerivatives);
dart.registerExtension("OES_standard_derivatives", web_gl.OesStandardDerivatives);
web_gl.OesTextureFloat = class OesTextureFloat extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.OesTextureFloat);
dart.setLibraryUri(web_gl.OesTextureFloat, "dart:web_gl");
dart.registerExtension("OESTextureFloat", web_gl.OesTextureFloat);
dart.registerExtension("OES_texture_float", web_gl.OesTextureFloat);
web_gl.OesTextureFloatLinear = class OesTextureFloatLinear extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.OesTextureFloatLinear);
dart.setLibraryUri(web_gl.OesTextureFloatLinear, "dart:web_gl");
dart.registerExtension("OESTextureFloatLinear", web_gl.OesTextureFloatLinear);
dart.registerExtension("OES_texture_float_linear", web_gl.OesTextureFloatLinear);
web_gl.OesTextureHalfFloat = class OesTextureHalfFloat extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.OesTextureHalfFloat);
dart.setLibraryUri(web_gl.OesTextureHalfFloat, "dart:web_gl");
dart.defineLazy(web_gl.OesTextureHalfFloat, {
  /*web_gl.OesTextureHalfFloat.HALF_FLOAT_OES*/get HALF_FLOAT_OES() {
    return 36193;
  }
});
dart.registerExtension("OESTextureHalfFloat", web_gl.OesTextureHalfFloat);
dart.registerExtension("OES_texture_half_float", web_gl.OesTextureHalfFloat);
web_gl.OesTextureHalfFloatLinear = class OesTextureHalfFloatLinear extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.OesTextureHalfFloatLinear);
dart.setLibraryUri(web_gl.OesTextureHalfFloatLinear, "dart:web_gl");
dart.registerExtension("OESTextureHalfFloatLinear", web_gl.OesTextureHalfFloatLinear);
dart.registerExtension("OES_texture_half_float_linear", web_gl.OesTextureHalfFloatLinear);
web_gl.OesVertexArrayObject = class OesVertexArrayObject extends _interceptors.Interceptor {
  [$bindVertexArray](...args) {
    return this.bindVertexArrayOES.apply(this, args);
  }
  [$createVertexArray](...args) {
    return this.createVertexArrayOES.apply(this, args);
  }
  [$deleteVertexArray](...args) {
    return this.deleteVertexArrayOES.apply(this, args);
  }
  [$isVertexArray](...args) {
    return this.isVertexArrayOES.apply(this, args);
  }
};
dart.addTypeTests(web_gl.OesVertexArrayObject);
dart.setMethodSignature(web_gl.OesVertexArrayObject, () => ({
  __proto__: dart.getMethods(web_gl.OesVertexArrayObject.__proto__),
  [$bindVertexArray]: dart.fnType(dart.void, [web_gl.VertexArrayObjectOes]),
  [$createVertexArray]: dart.fnType(web_gl.VertexArrayObjectOes, []),
  [$deleteVertexArray]: dart.fnType(dart.void, [web_gl.VertexArrayObjectOes]),
  [$isVertexArray]: dart.fnType(core.bool, [web_gl.VertexArrayObjectOes])
}));
dart.setLibraryUri(web_gl.OesVertexArrayObject, "dart:web_gl");
dart.defineLazy(web_gl.OesVertexArrayObject, {
  /*web_gl.OesVertexArrayObject.VERTEX_ARRAY_BINDING_OES*/get VERTEX_ARRAY_BINDING_OES() {
    return 34229;
  }
});
dart.registerExtension("OESVertexArrayObject", web_gl.OesVertexArrayObject);
dart.registerExtension("OES_vertex_array_object", web_gl.OesVertexArrayObject);
web_gl.Program = class Program extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.Program);
dart.setLibraryUri(web_gl.Program, "dart:web_gl");
dart.registerExtension("WebGLProgram", web_gl.Program);
web_gl.Query = class Query extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.Query);
dart.setLibraryUri(web_gl.Query, "dart:web_gl");
dart.registerExtension("WebGLQuery", web_gl.Query);
web_gl.Renderbuffer = class Renderbuffer extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.Renderbuffer);
dart.setLibraryUri(web_gl.Renderbuffer, "dart:web_gl");
dart.registerExtension("WebGLRenderbuffer", web_gl.Renderbuffer);
const _getContextAttributes_1$ = dart.privateName(web_gl, "_getContextAttributes_1");
const _readPixels = dart.privateName(web_gl, "_readPixels");
const _texImage2D_1 = dart.privateName(web_gl, "_texImage2D_1");
const _texImage2D_2 = dart.privateName(web_gl, "_texImage2D_2");
const _texImage2D_3 = dart.privateName(web_gl, "_texImage2D_3");
const _texImage2D_4 = dart.privateName(web_gl, "_texImage2D_4");
const _texImage2D_5 = dart.privateName(web_gl, "_texImage2D_5");
const _texImage2D_6 = dart.privateName(web_gl, "_texImage2D_6");
const _texSubImage2D_1 = dart.privateName(web_gl, "_texSubImage2D_1");
const _texSubImage2D_2 = dart.privateName(web_gl, "_texSubImage2D_2");
const _texSubImage2D_3 = dart.privateName(web_gl, "_texSubImage2D_3");
const _texSubImage2D_4 = dart.privateName(web_gl, "_texSubImage2D_4");
const _texSubImage2D_5 = dart.privateName(web_gl, "_texSubImage2D_5");
const _texSubImage2D_6 = dart.privateName(web_gl, "_texSubImage2D_6");
web_gl.RenderingContext = class RenderingContext extends _interceptors.Interceptor {
  static get supported() {
    return !!window.WebGLRenderingContext;
  }
  get [$canvas]() {
    return this.canvas;
  }
  get [$drawingBufferHeight]() {
    return this.drawingBufferHeight;
  }
  get [$drawingBufferWidth]() {
    return this.drawingBufferWidth;
  }
  [$activeTexture](...args) {
    return this.activeTexture.apply(this, args);
  }
  [$attachShader](...args) {
    return this.attachShader.apply(this, args);
  }
  [$bindAttribLocation](...args) {
    return this.bindAttribLocation.apply(this, args);
  }
  [$bindBuffer](...args) {
    return this.bindBuffer.apply(this, args);
  }
  [$bindFramebuffer](...args) {
    return this.bindFramebuffer.apply(this, args);
  }
  [$bindRenderbuffer](...args) {
    return this.bindRenderbuffer.apply(this, args);
  }
  [$bindTexture](...args) {
    return this.bindTexture.apply(this, args);
  }
  [$blendColor](...args) {
    return this.blendColor.apply(this, args);
  }
  [$blendEquation](...args) {
    return this.blendEquation.apply(this, args);
  }
  [$blendEquationSeparate](...args) {
    return this.blendEquationSeparate.apply(this, args);
  }
  [$blendFunc](...args) {
    return this.blendFunc.apply(this, args);
  }
  [$blendFuncSeparate](...args) {
    return this.blendFuncSeparate.apply(this, args);
  }
  [$bufferData](...args) {
    return this.bufferData.apply(this, args);
  }
  [$bufferSubData](...args) {
    return this.bufferSubData.apply(this, args);
  }
  [$checkFramebufferStatus](...args) {
    return this.checkFramebufferStatus.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$clearColor](...args) {
    return this.clearColor.apply(this, args);
  }
  [$clearDepth](...args) {
    return this.clearDepth.apply(this, args);
  }
  [$clearStencil](...args) {
    return this.clearStencil.apply(this, args);
  }
  [$colorMask](...args) {
    return this.colorMask.apply(this, args);
  }
  [$commit]() {
    return html$.promiseToFuture(dart.dynamic, this.commit());
  }
  [$compileShader](...args) {
    return this.compileShader.apply(this, args);
  }
  [$compressedTexImage2D](...args) {
    return this.compressedTexImage2D.apply(this, args);
  }
  [$compressedTexSubImage2D](...args) {
    return this.compressedTexSubImage2D.apply(this, args);
  }
  [$copyTexImage2D](...args) {
    return this.copyTexImage2D.apply(this, args);
  }
  [$copyTexSubImage2D](...args) {
    return this.copyTexSubImage2D.apply(this, args);
  }
  [$createBuffer](...args) {
    return this.createBuffer.apply(this, args);
  }
  [$createFramebuffer](...args) {
    return this.createFramebuffer.apply(this, args);
  }
  [$createProgram](...args) {
    return this.createProgram.apply(this, args);
  }
  [$createRenderbuffer](...args) {
    return this.createRenderbuffer.apply(this, args);
  }
  [$createShader](...args) {
    return this.createShader.apply(this, args);
  }
  [$createTexture](...args) {
    return this.createTexture.apply(this, args);
  }
  [$cullFace](...args) {
    return this.cullFace.apply(this, args);
  }
  [$deleteBuffer](...args) {
    return this.deleteBuffer.apply(this, args);
  }
  [$deleteFramebuffer](...args) {
    return this.deleteFramebuffer.apply(this, args);
  }
  [$deleteProgram](...args) {
    return this.deleteProgram.apply(this, args);
  }
  [$deleteRenderbuffer](...args) {
    return this.deleteRenderbuffer.apply(this, args);
  }
  [$deleteShader](...args) {
    return this.deleteShader.apply(this, args);
  }
  [$deleteTexture](...args) {
    return this.deleteTexture.apply(this, args);
  }
  [$depthFunc](...args) {
    return this.depthFunc.apply(this, args);
  }
  [$depthMask](...args) {
    return this.depthMask.apply(this, args);
  }
  [$depthRange](...args) {
    return this.depthRange.apply(this, args);
  }
  [$detachShader](...args) {
    return this.detachShader.apply(this, args);
  }
  [$disable](...args) {
    return this.disable.apply(this, args);
  }
  [$disableVertexAttribArray](...args) {
    return this.disableVertexAttribArray.apply(this, args);
  }
  [$drawArrays](...args) {
    return this.drawArrays.apply(this, args);
  }
  [$drawElements](...args) {
    return this.drawElements.apply(this, args);
  }
  [$enable](...args) {
    return this.enable.apply(this, args);
  }
  [$enableVertexAttribArray](...args) {
    return this.enableVertexAttribArray.apply(this, args);
  }
  [$finish](...args) {
    return this.finish.apply(this, args);
  }
  [$flush](...args) {
    return this.flush.apply(this, args);
  }
  [$framebufferRenderbuffer](...args) {
    return this.framebufferRenderbuffer.apply(this, args);
  }
  [$framebufferTexture2D](...args) {
    return this.framebufferTexture2D.apply(this, args);
  }
  [$frontFace](...args) {
    return this.frontFace.apply(this, args);
  }
  [$generateMipmap](...args) {
    return this.generateMipmap.apply(this, args);
  }
  [$getActiveAttrib](...args) {
    return this.getActiveAttrib.apply(this, args);
  }
  [$getActiveUniform](...args) {
    return this.getActiveUniform.apply(this, args);
  }
  [$getAttachedShaders](...args) {
    return this.getAttachedShaders.apply(this, args);
  }
  [$getAttribLocation](...args) {
    return this.getAttribLocation.apply(this, args);
  }
  [$getBufferParameter](...args) {
    return this.getBufferParameter.apply(this, args);
  }
  [$getContextAttributes]() {
    return html_common.convertNativeToDart_Dictionary(this[_getContextAttributes_1$]());
  }
  [_getContextAttributes_1$](...args) {
    return this.getContextAttributes.apply(this, args);
  }
  [$getError](...args) {
    return this.getError.apply(this, args);
  }
  [$getExtension](...args) {
    return this.getExtension.apply(this, args);
  }
  [$getFramebufferAttachmentParameter](...args) {
    return this.getFramebufferAttachmentParameter.apply(this, args);
  }
  [$getParameter](...args) {
    return this.getParameter.apply(this, args);
  }
  [$getProgramInfoLog](...args) {
    return this.getProgramInfoLog.apply(this, args);
  }
  [$getProgramParameter](...args) {
    return this.getProgramParameter.apply(this, args);
  }
  [$getRenderbufferParameter](...args) {
    return this.getRenderbufferParameter.apply(this, args);
  }
  [$getShaderInfoLog](...args) {
    return this.getShaderInfoLog.apply(this, args);
  }
  [$getShaderParameter](...args) {
    return this.getShaderParameter.apply(this, args);
  }
  [$getShaderPrecisionFormat](...args) {
    return this.getShaderPrecisionFormat.apply(this, args);
  }
  [$getShaderSource](...args) {
    return this.getShaderSource.apply(this, args);
  }
  [$getSupportedExtensions](...args) {
    return this.getSupportedExtensions.apply(this, args);
  }
  [$getTexParameter](...args) {
    return this.getTexParameter.apply(this, args);
  }
  [$getUniform](...args) {
    return this.getUniform.apply(this, args);
  }
  [$getUniformLocation](...args) {
    return this.getUniformLocation.apply(this, args);
  }
  [$getVertexAttrib](...args) {
    return this.getVertexAttrib.apply(this, args);
  }
  [$getVertexAttribOffset](...args) {
    return this.getVertexAttribOffset.apply(this, args);
  }
  [$hint](...args) {
    return this.hint.apply(this, args);
  }
  [$isBuffer](...args) {
    return this.isBuffer.apply(this, args);
  }
  [$isContextLost](...args) {
    return this.isContextLost.apply(this, args);
  }
  [$isEnabled](...args) {
    return this.isEnabled.apply(this, args);
  }
  [$isFramebuffer](...args) {
    return this.isFramebuffer.apply(this, args);
  }
  [$isProgram](...args) {
    return this.isProgram.apply(this, args);
  }
  [$isRenderbuffer](...args) {
    return this.isRenderbuffer.apply(this, args);
  }
  [$isShader](...args) {
    return this.isShader.apply(this, args);
  }
  [$isTexture](...args) {
    return this.isTexture.apply(this, args);
  }
  [$lineWidth](...args) {
    return this.lineWidth.apply(this, args);
  }
  [$linkProgram](...args) {
    return this.linkProgram.apply(this, args);
  }
  [$pixelStorei](...args) {
    return this.pixelStorei.apply(this, args);
  }
  [$polygonOffset](...args) {
    return this.polygonOffset.apply(this, args);
  }
  [_readPixels](...args) {
    return this.readPixels.apply(this, args);
  }
  [$renderbufferStorage](...args) {
    return this.renderbufferStorage.apply(this, args);
  }
  [$sampleCoverage](...args) {
    return this.sampleCoverage.apply(this, args);
  }
  [$scissor](...args) {
    return this.scissor.apply(this, args);
  }
  [$shaderSource](...args) {
    return this.shaderSource.apply(this, args);
  }
  [$stencilFunc](...args) {
    return this.stencilFunc.apply(this, args);
  }
  [$stencilFuncSeparate](...args) {
    return this.stencilFuncSeparate.apply(this, args);
  }
  [$stencilMask](...args) {
    return this.stencilMask.apply(this, args);
  }
  [$stencilMaskSeparate](...args) {
    return this.stencilMaskSeparate.apply(this, args);
  }
  [$stencilOp](...args) {
    return this.stencilOp.apply(this, args);
  }
  [$stencilOpSeparate](...args) {
    return this.stencilOpSeparate.apply(this, args);
  }
  [$texImage2D](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
    if (format === void 0) format = null;
    if (type === void 0) type = null;
    if (pixels === void 0) pixels = null;
    if (type != null && format != null && core.int.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video)) {
      this[_texImage2D_1](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
      return;
    }
    if (html$.ImageData.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      let pixels_1 = html_common.convertDartToNative_ImageData(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      this[_texImage2D_2](target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
      return;
    }
    if (html$.ImageElement.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_3](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.CanvasElement.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_4](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.VideoElement.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_5](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.ImageBitmap.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_6](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_texImage2D_1](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_2](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_3](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_4](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_5](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_6](...args) {
    return this.texImage2D.apply(this, args);
  }
  [$texParameterf](...args) {
    return this.texParameterf.apply(this, args);
  }
  [$texParameteri](...args) {
    return this.texParameteri.apply(this, args);
  }
  [$texSubImage2D](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
    if (type === void 0) type = null;
    if (pixels === void 0) pixels = null;
    if (type != null && core.int.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video)) {
      this[_texSubImage2D_1](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
      return;
    }
    if (html$.ImageData.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      let pixels_1 = html_common.convertDartToNative_ImageData(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      this[_texSubImage2D_2](target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
      return;
    }
    if (html$.ImageElement.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_3](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.CanvasElement.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_4](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.VideoElement.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_5](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.ImageBitmap.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_6](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_texSubImage2D_1](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_2](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_3](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_4](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_5](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_6](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [$uniform1f](...args) {
    return this.uniform1f.apply(this, args);
  }
  [$uniform1fv](...args) {
    return this.uniform1fv.apply(this, args);
  }
  [$uniform1i](...args) {
    return this.uniform1i.apply(this, args);
  }
  [$uniform1iv](...args) {
    return this.uniform1iv.apply(this, args);
  }
  [$uniform2f](...args) {
    return this.uniform2f.apply(this, args);
  }
  [$uniform2fv](...args) {
    return this.uniform2fv.apply(this, args);
  }
  [$uniform2i](...args) {
    return this.uniform2i.apply(this, args);
  }
  [$uniform2iv](...args) {
    return this.uniform2iv.apply(this, args);
  }
  [$uniform3f](...args) {
    return this.uniform3f.apply(this, args);
  }
  [$uniform3fv](...args) {
    return this.uniform3fv.apply(this, args);
  }
  [$uniform3i](...args) {
    return this.uniform3i.apply(this, args);
  }
  [$uniform3iv](...args) {
    return this.uniform3iv.apply(this, args);
  }
  [$uniform4f](...args) {
    return this.uniform4f.apply(this, args);
  }
  [$uniform4fv](...args) {
    return this.uniform4fv.apply(this, args);
  }
  [$uniform4i](...args) {
    return this.uniform4i.apply(this, args);
  }
  [$uniform4iv](...args) {
    return this.uniform4iv.apply(this, args);
  }
  [$uniformMatrix2fv](...args) {
    return this.uniformMatrix2fv.apply(this, args);
  }
  [$uniformMatrix3fv](...args) {
    return this.uniformMatrix3fv.apply(this, args);
  }
  [$uniformMatrix4fv](...args) {
    return this.uniformMatrix4fv.apply(this, args);
  }
  [$useProgram](...args) {
    return this.useProgram.apply(this, args);
  }
  [$validateProgram](...args) {
    return this.validateProgram.apply(this, args);
  }
  [$vertexAttrib1f](...args) {
    return this.vertexAttrib1f.apply(this, args);
  }
  [$vertexAttrib1fv](...args) {
    return this.vertexAttrib1fv.apply(this, args);
  }
  [$vertexAttrib2f](...args) {
    return this.vertexAttrib2f.apply(this, args);
  }
  [$vertexAttrib2fv](...args) {
    return this.vertexAttrib2fv.apply(this, args);
  }
  [$vertexAttrib3f](...args) {
    return this.vertexAttrib3f.apply(this, args);
  }
  [$vertexAttrib3fv](...args) {
    return this.vertexAttrib3fv.apply(this, args);
  }
  [$vertexAttrib4f](...args) {
    return this.vertexAttrib4f.apply(this, args);
  }
  [$vertexAttrib4fv](...args) {
    return this.vertexAttrib4fv.apply(this, args);
  }
  [$vertexAttribPointer](...args) {
    return this.vertexAttribPointer.apply(this, args);
  }
  [$viewport](...args) {
    return this.viewport.apply(this, args);
  }
  [$readPixels](x, y, width, height, format, type, pixels) {
    this[_readPixels](x, y, width, height, format, type, pixels);
  }
  [$texImage2DUntyped](targetTexture, levelOfDetail, internalFormat, format, type, data) {
    this[$texImage2D](targetTexture, levelOfDetail, internalFormat, format, type, data);
  }
  [$texImage2DTyped](targetTexture, levelOfDetail, internalFormat, width, height, border, format, type, data) {
    this[$texImage2D](targetTexture, levelOfDetail, internalFormat, width, height, border, format, type, data);
  }
  [$texSubImage2DUntyped](targetTexture, levelOfDetail, xOffset, yOffset, format, type, data) {
    this[$texSubImage2D](targetTexture, levelOfDetail, xOffset, yOffset, format, type, data);
  }
  [$texSubImage2DTyped](targetTexture, levelOfDetail, xOffset, yOffset, width, height, border, format, type, data) {
    this[$texSubImage2D](targetTexture, levelOfDetail, xOffset, yOffset, width, height, format, type, data);
  }
  [$bufferDataTyped](target, data, usage) {
    this.bufferData(target, data, usage);
  }
  [$bufferSubDataTyped](target, offset, data) {
    this.bufferSubData(target, offset, data);
  }
};
dart.addTypeTests(web_gl.RenderingContext);
const canvas$3 = Symbol("RenderingContext.canvas");
const drawingBufferHeight = Symbol("RenderingContext.drawingBufferHeight");
const drawingBufferWidth = Symbol("RenderingContext.drawingBufferWidth");
web_gl.RenderingContext[dart.implements] = () => [html$.CanvasRenderingContext];
dart.setMethodSignature(web_gl.RenderingContext, () => ({
  __proto__: dart.getMethods(web_gl.RenderingContext.__proto__),
  [$activeTexture]: dart.fnType(dart.void, [core.int]),
  [$attachShader]: dart.fnType(dart.void, [web_gl.Program, web_gl.Shader]),
  [$bindAttribLocation]: dart.fnType(dart.void, [web_gl.Program, core.int, core.String]),
  [$bindBuffer]: dart.fnType(dart.void, [core.int, web_gl.Buffer]),
  [$bindFramebuffer]: dart.fnType(dart.void, [core.int, web_gl.Framebuffer]),
  [$bindRenderbuffer]: dart.fnType(dart.void, [core.int, web_gl.Renderbuffer]),
  [$bindTexture]: dart.fnType(dart.void, [core.int, web_gl.Texture]),
  [$blendColor]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$blendEquation]: dart.fnType(dart.void, [core.int]),
  [$blendEquationSeparate]: dart.fnType(dart.void, [core.int, core.int]),
  [$blendFunc]: dart.fnType(dart.void, [core.int, core.int]),
  [$blendFuncSeparate]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$bufferData]: dart.fnType(dart.void, [core.int, dart.dynamic, core.int]),
  [$bufferSubData]: dart.fnType(dart.void, [core.int, core.int, dart.dynamic]),
  [$checkFramebufferStatus]: dart.fnType(core.int, [core.int]),
  [$clear]: dart.fnType(dart.void, [core.int]),
  [$clearColor]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$clearDepth]: dart.fnType(dart.void, [core.num]),
  [$clearStencil]: dart.fnType(dart.void, [core.int]),
  [$colorMask]: dart.fnType(dart.void, [core.bool, core.bool, core.bool, core.bool]),
  [$commit]: dart.fnType(async.Future, []),
  [$compileShader]: dart.fnType(dart.void, [web_gl.Shader]),
  [$compressedTexImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$compressedTexSubImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$copyTexImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$copyTexSubImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$createBuffer]: dart.fnType(web_gl.Buffer, []),
  [$createFramebuffer]: dart.fnType(web_gl.Framebuffer, []),
  [$createProgram]: dart.fnType(web_gl.Program, []),
  [$createRenderbuffer]: dart.fnType(web_gl.Renderbuffer, []),
  [$createShader]: dart.fnType(web_gl.Shader, [core.int]),
  [$createTexture]: dart.fnType(web_gl.Texture, []),
  [$cullFace]: dart.fnType(dart.void, [core.int]),
  [$deleteBuffer]: dart.fnType(dart.void, [web_gl.Buffer]),
  [$deleteFramebuffer]: dart.fnType(dart.void, [web_gl.Framebuffer]),
  [$deleteProgram]: dart.fnType(dart.void, [web_gl.Program]),
  [$deleteRenderbuffer]: dart.fnType(dart.void, [web_gl.Renderbuffer]),
  [$deleteShader]: dart.fnType(dart.void, [web_gl.Shader]),
  [$deleteTexture]: dart.fnType(dart.void, [web_gl.Texture]),
  [$depthFunc]: dart.fnType(dart.void, [core.int]),
  [$depthMask]: dart.fnType(dart.void, [core.bool]),
  [$depthRange]: dart.fnType(dart.void, [core.num, core.num]),
  [$detachShader]: dart.fnType(dart.void, [web_gl.Program, web_gl.Shader]),
  [$disable]: dart.fnType(dart.void, [core.int]),
  [$disableVertexAttribArray]: dart.fnType(dart.void, [core.int]),
  [$drawArrays]: dart.fnType(dart.void, [core.int, core.int, core.int]),
  [$drawElements]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$enable]: dart.fnType(dart.void, [core.int]),
  [$enableVertexAttribArray]: dart.fnType(dart.void, [core.int]),
  [$finish]: dart.fnType(dart.void, []),
  [$flush]: dart.fnType(dart.void, []),
  [$framebufferRenderbuffer]: dart.fnType(dart.void, [core.int, core.int, core.int, web_gl.Renderbuffer]),
  [$framebufferTexture2D]: dart.fnType(dart.void, [core.int, core.int, core.int, web_gl.Texture, core.int]),
  [$frontFace]: dart.fnType(dart.void, [core.int]),
  [$generateMipmap]: dart.fnType(dart.void, [core.int]),
  [$getActiveAttrib]: dart.fnType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
  [$getActiveUniform]: dart.fnType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
  [$getAttachedShaders]: dart.fnType(core.List$(web_gl.Shader), [web_gl.Program]),
  [$getAttribLocation]: dart.fnType(core.int, [web_gl.Program, core.String]),
  [$getBufferParameter]: dart.fnType(core.Object, [core.int, core.int]),
  [$getContextAttributes]: dart.fnType(core.Map, []),
  [_getContextAttributes_1$]: dart.fnType(dart.dynamic, []),
  [$getError]: dart.fnType(core.int, []),
  [$getExtension]: dart.fnType(core.Object, [core.String]),
  [$getFramebufferAttachmentParameter]: dart.fnType(core.Object, [core.int, core.int, core.int]),
  [$getParameter]: dart.fnType(core.Object, [core.int]),
  [$getProgramInfoLog]: dart.fnType(core.String, [web_gl.Program]),
  [$getProgramParameter]: dart.fnType(core.Object, [web_gl.Program, core.int]),
  [$getRenderbufferParameter]: dart.fnType(core.Object, [core.int, core.int]),
  [$getShaderInfoLog]: dart.fnType(core.String, [web_gl.Shader]),
  [$getShaderParameter]: dart.fnType(core.Object, [web_gl.Shader, core.int]),
  [$getShaderPrecisionFormat]: dart.fnType(web_gl.ShaderPrecisionFormat, [core.int, core.int]),
  [$getShaderSource]: dart.fnType(core.String, [web_gl.Shader]),
  [$getSupportedExtensions]: dart.fnType(core.List$(core.String), []),
  [$getTexParameter]: dart.fnType(core.Object, [core.int, core.int]),
  [$getUniform]: dart.fnType(core.Object, [web_gl.Program, web_gl.UniformLocation]),
  [$getUniformLocation]: dart.fnType(web_gl.UniformLocation, [web_gl.Program, core.String]),
  [$getVertexAttrib]: dart.fnType(core.Object, [core.int, core.int]),
  [$getVertexAttribOffset]: dart.fnType(core.int, [core.int, core.int]),
  [$hint]: dart.fnType(dart.void, [core.int, core.int]),
  [$isBuffer]: dart.fnType(core.bool, [web_gl.Buffer]),
  [$isContextLost]: dart.fnType(core.bool, []),
  [$isEnabled]: dart.fnType(core.bool, [core.int]),
  [$isFramebuffer]: dart.fnType(core.bool, [web_gl.Framebuffer]),
  [$isProgram]: dart.fnType(core.bool, [web_gl.Program]),
  [$isRenderbuffer]: dart.fnType(core.bool, [web_gl.Renderbuffer]),
  [$isShader]: dart.fnType(core.bool, [web_gl.Shader]),
  [$isTexture]: dart.fnType(core.bool, [web_gl.Texture]),
  [$lineWidth]: dart.fnType(dart.void, [core.num]),
  [$linkProgram]: dart.fnType(dart.void, [web_gl.Program]),
  [$pixelStorei]: dart.fnType(dart.void, [core.int, core.int]),
  [$polygonOffset]: dart.fnType(dart.void, [core.num, core.num]),
  [_readPixels]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$renderbufferStorage]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$sampleCoverage]: dart.fnType(dart.void, [core.num, core.bool]),
  [$scissor]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$shaderSource]: dart.fnType(dart.void, [web_gl.Shader, core.String]),
  [$stencilFunc]: dart.fnType(dart.void, [core.int, core.int, core.int]),
  [$stencilFuncSeparate]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$stencilMask]: dart.fnType(dart.void, [core.int]),
  [$stencilMaskSeparate]: dart.fnType(dart.void, [core.int, core.int]),
  [$stencilOp]: dart.fnType(dart.void, [core.int, core.int, core.int]),
  [$stencilOpSeparate]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$texImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, core.int, typed_data.TypedData]),
  [_texImage2D_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, dart.dynamic, typed_data.TypedData]),
  [_texImage2D_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_texImage2D_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
  [_texImage2D_4]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
  [_texImage2D_5]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
  [_texImage2D_6]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageBitmap]),
  [$texParameterf]: dart.fnType(dart.void, [core.int, core.int, core.num]),
  [$texParameteri]: dart.fnType(dart.void, [core.int, core.int, core.int]),
  [$texSubImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, typed_data.TypedData]),
  [_texSubImage2D_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, typed_data.TypedData]),
  [_texSubImage2D_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_texSubImage2D_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
  [_texSubImage2D_4]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
  [_texSubImage2D_5]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
  [_texSubImage2D_6]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageBitmap]),
  [$uniform1f]: dart.fnType(dart.void, [web_gl.UniformLocation, core.num]),
  [$uniform1fv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform1i]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int]),
  [$uniform1iv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform2f]: dart.fnType(dart.void, [web_gl.UniformLocation, core.num, core.num]),
  [$uniform2fv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform2i]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int]),
  [$uniform2iv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform3f]: dart.fnType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num]),
  [$uniform3fv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform3i]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int]),
  [$uniform3iv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform4f]: dart.fnType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num, core.num]),
  [$uniform4fv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform4i]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int, core.int]),
  [$uniform4iv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniformMatrix2fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic]),
  [$uniformMatrix3fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic]),
  [$uniformMatrix4fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic]),
  [$useProgram]: dart.fnType(dart.void, [web_gl.Program]),
  [$validateProgram]: dart.fnType(dart.void, [web_gl.Program]),
  [$vertexAttrib1f]: dart.fnType(dart.void, [core.int, core.num]),
  [$vertexAttrib1fv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttrib2f]: dart.fnType(dart.void, [core.int, core.num, core.num]),
  [$vertexAttrib2fv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttrib3f]: dart.fnType(dart.void, [core.int, core.num, core.num, core.num]),
  [$vertexAttrib3fv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttrib4f]: dart.fnType(dart.void, [core.int, core.num, core.num, core.num, core.num]),
  [$vertexAttrib4fv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttribPointer]: dart.fnType(dart.void, [core.int, core.int, core.int, core.bool, core.int, core.int]),
  [$viewport]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$readPixels]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$texImage2DUntyped]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
  [$texImage2DTyped]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$texSubImage2DUntyped]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
  [$texSubImage2DTyped]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$bufferDataTyped]: dart.fnType(dart.void, [core.int, typed_data.TypedData, core.int]),
  [$bufferSubDataTyped]: dart.fnType(dart.void, [core.int, core.int, typed_data.TypedData])
}));
dart.setLibraryUri(web_gl.RenderingContext, "dart:web_gl");
dart.setFieldSignature(web_gl.RenderingContext, () => ({
  __proto__: dart.getFields(web_gl.RenderingContext.__proto__),
  [$canvas]: dart.finalFieldType(html$.CanvasElement),
  [$drawingBufferHeight]: dart.finalFieldType(core.int),
  [$drawingBufferWidth]: dart.finalFieldType(core.int)
}));
dart.registerExtension("WebGLRenderingContext", web_gl.RenderingContext);
const _getUniformIndices_1 = dart.privateName(web_gl, "_getUniformIndices_1");
const _texImage2D2_1 = dart.privateName(web_gl, "_texImage2D2_1");
const _texImage2D2_2 = dart.privateName(web_gl, "_texImage2D2_2");
const _texImage2D2_3 = dart.privateName(web_gl, "_texImage2D2_3");
const _texImage2D2_4 = dart.privateName(web_gl, "_texImage2D2_4");
const _texImage2D2_5 = dart.privateName(web_gl, "_texImage2D2_5");
const _texImage2D2_6 = dart.privateName(web_gl, "_texImage2D2_6");
const _texImage2D2_7 = dart.privateName(web_gl, "_texImage2D2_7");
const _texImage3D_1 = dart.privateName(web_gl, "_texImage3D_1");
const _texImage3D_2 = dart.privateName(web_gl, "_texImage3D_2");
const _texImage3D_3 = dart.privateName(web_gl, "_texImage3D_3");
const _texImage3D_4 = dart.privateName(web_gl, "_texImage3D_4");
const _texImage3D_5 = dart.privateName(web_gl, "_texImage3D_5");
const _texImage3D_6 = dart.privateName(web_gl, "_texImage3D_6");
const _texImage3D_7 = dart.privateName(web_gl, "_texImage3D_7");
const _texImage3D_8 = dart.privateName(web_gl, "_texImage3D_8");
const _texSubImage2D2_1 = dart.privateName(web_gl, "_texSubImage2D2_1");
const _texSubImage2D2_2 = dart.privateName(web_gl, "_texSubImage2D2_2");
const _texSubImage2D2_3 = dart.privateName(web_gl, "_texSubImage2D2_3");
const _texSubImage2D2_4 = dart.privateName(web_gl, "_texSubImage2D2_4");
const _texSubImage2D2_5 = dart.privateName(web_gl, "_texSubImage2D2_5");
const _texSubImage2D2_6 = dart.privateName(web_gl, "_texSubImage2D2_6");
const _texSubImage2D2_7 = dart.privateName(web_gl, "_texSubImage2D2_7");
const _texSubImage3D_1 = dart.privateName(web_gl, "_texSubImage3D_1");
const _texSubImage3D_2 = dart.privateName(web_gl, "_texSubImage3D_2");
const _texSubImage3D_3 = dart.privateName(web_gl, "_texSubImage3D_3");
const _texSubImage3D_4 = dart.privateName(web_gl, "_texSubImage3D_4");
const _texSubImage3D_5 = dart.privateName(web_gl, "_texSubImage3D_5");
const _texSubImage3D_6 = dart.privateName(web_gl, "_texSubImage3D_6");
const _texSubImage3D_7 = dart.privateName(web_gl, "_texSubImage3D_7");
const _texSubImage3D_8 = dart.privateName(web_gl, "_texSubImage3D_8");
const _transformFeedbackVaryings_1 = dart.privateName(web_gl, "_transformFeedbackVaryings_1");
web_gl.RenderingContext2 = class RenderingContext2 extends _interceptors.Interceptor {
  get [$canvas]() {
    return this.canvas;
  }
  [$beginQuery](...args) {
    return this.beginQuery.apply(this, args);
  }
  [$beginTransformFeedback](...args) {
    return this.beginTransformFeedback.apply(this, args);
  }
  [$bindBufferBase](...args) {
    return this.bindBufferBase.apply(this, args);
  }
  [$bindBufferRange](...args) {
    return this.bindBufferRange.apply(this, args);
  }
  [$bindSampler](...args) {
    return this.bindSampler.apply(this, args);
  }
  [$bindTransformFeedback](...args) {
    return this.bindTransformFeedback.apply(this, args);
  }
  [$bindVertexArray](...args) {
    return this.bindVertexArray.apply(this, args);
  }
  [$blitFramebuffer](...args) {
    return this.blitFramebuffer.apply(this, args);
  }
  [$bufferData2](...args) {
    return this.bufferData.apply(this, args);
  }
  [$bufferSubData2](...args) {
    return this.bufferSubData.apply(this, args);
  }
  [$clearBufferfi](...args) {
    return this.clearBufferfi.apply(this, args);
  }
  [$clearBufferfv](...args) {
    return this.clearBufferfv.apply(this, args);
  }
  [$clearBufferiv](...args) {
    return this.clearBufferiv.apply(this, args);
  }
  [$clearBufferuiv](...args) {
    return this.clearBufferuiv.apply(this, args);
  }
  [$clientWaitSync](...args) {
    return this.clientWaitSync.apply(this, args);
  }
  [$compressedTexImage2D2](...args) {
    return this.compressedTexImage2D.apply(this, args);
  }
  [$compressedTexImage2D3](...args) {
    return this.compressedTexImage2D.apply(this, args);
  }
  [$compressedTexImage3D](...args) {
    return this.compressedTexImage3D.apply(this, args);
  }
  [$compressedTexImage3D2](...args) {
    return this.compressedTexImage3D.apply(this, args);
  }
  [$compressedTexSubImage2D2](...args) {
    return this.compressedTexSubImage2D.apply(this, args);
  }
  [$compressedTexSubImage2D3](...args) {
    return this.compressedTexSubImage2D.apply(this, args);
  }
  [$compressedTexSubImage3D](...args) {
    return this.compressedTexSubImage3D.apply(this, args);
  }
  [$compressedTexSubImage3D2](...args) {
    return this.compressedTexSubImage3D.apply(this, args);
  }
  [$copyBufferSubData](...args) {
    return this.copyBufferSubData.apply(this, args);
  }
  [$copyTexSubImage3D](...args) {
    return this.copyTexSubImage3D.apply(this, args);
  }
  [$createQuery](...args) {
    return this.createQuery.apply(this, args);
  }
  [$createSampler](...args) {
    return this.createSampler.apply(this, args);
  }
  [$createTransformFeedback](...args) {
    return this.createTransformFeedback.apply(this, args);
  }
  [$createVertexArray](...args) {
    return this.createVertexArray.apply(this, args);
  }
  [$deleteQuery](...args) {
    return this.deleteQuery.apply(this, args);
  }
  [$deleteSampler](...args) {
    return this.deleteSampler.apply(this, args);
  }
  [$deleteSync](...args) {
    return this.deleteSync.apply(this, args);
  }
  [$deleteTransformFeedback](...args) {
    return this.deleteTransformFeedback.apply(this, args);
  }
  [$deleteVertexArray](...args) {
    return this.deleteVertexArray.apply(this, args);
  }
  [$drawArraysInstanced](...args) {
    return this.drawArraysInstanced.apply(this, args);
  }
  [$drawBuffers](...args) {
    return this.drawBuffers.apply(this, args);
  }
  [$drawElementsInstanced](...args) {
    return this.drawElementsInstanced.apply(this, args);
  }
  [$drawRangeElements](...args) {
    return this.drawRangeElements.apply(this, args);
  }
  [$endQuery](...args) {
    return this.endQuery.apply(this, args);
  }
  [$endTransformFeedback](...args) {
    return this.endTransformFeedback.apply(this, args);
  }
  [$fenceSync](...args) {
    return this.fenceSync.apply(this, args);
  }
  [$framebufferTextureLayer](...args) {
    return this.framebufferTextureLayer.apply(this, args);
  }
  [$getActiveUniformBlockName](...args) {
    return this.getActiveUniformBlockName.apply(this, args);
  }
  [$getActiveUniformBlockParameter](...args) {
    return this.getActiveUniformBlockParameter.apply(this, args);
  }
  [$getActiveUniforms](...args) {
    return this.getActiveUniforms.apply(this, args);
  }
  [$getBufferSubData](...args) {
    return this.getBufferSubData.apply(this, args);
  }
  [$getFragDataLocation](...args) {
    return this.getFragDataLocation.apply(this, args);
  }
  [$getIndexedParameter](...args) {
    return this.getIndexedParameter.apply(this, args);
  }
  [$getInternalformatParameter](...args) {
    return this.getInternalformatParameter.apply(this, args);
  }
  [$getQuery](...args) {
    return this.getQuery.apply(this, args);
  }
  [$getQueryParameter](...args) {
    return this.getQueryParameter.apply(this, args);
  }
  [$getSamplerParameter](...args) {
    return this.getSamplerParameter.apply(this, args);
  }
  [$getSyncParameter](...args) {
    return this.getSyncParameter.apply(this, args);
  }
  [$getTransformFeedbackVarying](...args) {
    return this.getTransformFeedbackVarying.apply(this, args);
  }
  [$getUniformBlockIndex](...args) {
    return this.getUniformBlockIndex.apply(this, args);
  }
  [$getUniformIndices](program, uniformNames) {
    let uniformNames_1 = html_common.convertDartToNative_StringArray(uniformNames);
    return this[_getUniformIndices_1](program, uniformNames_1);
  }
  [_getUniformIndices_1](...args) {
    return this.getUniformIndices.apply(this, args);
  }
  [$invalidateFramebuffer](...args) {
    return this.invalidateFramebuffer.apply(this, args);
  }
  [$invalidateSubFramebuffer](...args) {
    return this.invalidateSubFramebuffer.apply(this, args);
  }
  [$isQuery](...args) {
    return this.isQuery.apply(this, args);
  }
  [$isSampler](...args) {
    return this.isSampler.apply(this, args);
  }
  [$isSync](...args) {
    return this.isSync.apply(this, args);
  }
  [$isTransformFeedback](...args) {
    return this.isTransformFeedback.apply(this, args);
  }
  [$isVertexArray](...args) {
    return this.isVertexArray.apply(this, args);
  }
  [$pauseTransformFeedback](...args) {
    return this.pauseTransformFeedback.apply(this, args);
  }
  [$readBuffer](...args) {
    return this.readBuffer.apply(this, args);
  }
  [$readPixels2](...args) {
    return this.readPixels.apply(this, args);
  }
  [$renderbufferStorageMultisample](...args) {
    return this.renderbufferStorageMultisample.apply(this, args);
  }
  [$resumeTransformFeedback](...args) {
    return this.resumeTransformFeedback.apply(this, args);
  }
  [$samplerParameterf](...args) {
    return this.samplerParameterf.apply(this, args);
  }
  [$samplerParameteri](...args) {
    return this.samplerParameteri.apply(this, args);
  }
  [$texImage2D2](target, level, internalformat, width, height, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video, srcOffset) {
    if (srcOffset === void 0) srcOffset = null;
    if (core.int.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texImage2D2_1](target, level, internalformat, width, height, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (html$.ImageData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      let data_1 = html_common.convertDartToNative_ImageData(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      this[_texImage2D2_2](target, level, internalformat, width, height, border, format, type, data_1);
      return;
    }
    if (html$.ImageElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texImage2D2_3](target, level, internalformat, width, height, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (html$.CanvasElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texImage2D2_4](target, level, internalformat, width, height, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (html$.VideoElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texImage2D2_5](target, level, internalformat, width, height, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (html$.ImageBitmap.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texImage2D2_6](target, level, internalformat, width, height, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (srcOffset != null && typed_data.TypedData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video)) {
      this[_texImage2D2_7](target, level, internalformat, width, height, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video, srcOffset);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_texImage2D2_1](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D2_2](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D2_3](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D2_4](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D2_5](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D2_6](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D2_7](...args) {
    return this.texImage2D.apply(this, args);
  }
  [$texImage3D](target, level, internalformat, width, height, depth, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video, srcOffset) {
    if (srcOffset === void 0) srcOffset = null;
    if (core.int.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texImage3D_1](target, level, internalformat, width, height, depth, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (html$.ImageData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      let data_1 = html_common.convertDartToNative_ImageData(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      this[_texImage3D_2](target, level, internalformat, width, height, depth, border, format, type, data_1);
      return;
    }
    if (html$.ImageElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texImage3D_3](target, level, internalformat, width, height, depth, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (html$.CanvasElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texImage3D_4](target, level, internalformat, width, height, depth, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (html$.VideoElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texImage3D_5](target, level, internalformat, width, height, depth, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (html$.ImageBitmap.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texImage3D_6](target, level, internalformat, width, height, depth, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if ((typed_data.TypedData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) || bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video == null) && srcOffset == null) {
      this[_texImage3D_7](target, level, internalformat, width, height, depth, border, format, type, typed_data.TypedData._check(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video));
      return;
    }
    if (srcOffset != null && typed_data.TypedData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video)) {
      this[_texImage3D_8](target, level, internalformat, width, height, depth, border, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video, srcOffset);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_texImage3D_1](...args) {
    return this.texImage3D.apply(this, args);
  }
  [_texImage3D_2](...args) {
    return this.texImage3D.apply(this, args);
  }
  [_texImage3D_3](...args) {
    return this.texImage3D.apply(this, args);
  }
  [_texImage3D_4](...args) {
    return this.texImage3D.apply(this, args);
  }
  [_texImage3D_5](...args) {
    return this.texImage3D.apply(this, args);
  }
  [_texImage3D_6](...args) {
    return this.texImage3D.apply(this, args);
  }
  [_texImage3D_7](...args) {
    return this.texImage3D.apply(this, args);
  }
  [_texImage3D_8](...args) {
    return this.texImage3D.apply(this, args);
  }
  [$texStorage2D](...args) {
    return this.texStorage2D.apply(this, args);
  }
  [$texStorage3D](...args) {
    return this.texStorage3D.apply(this, args);
  }
  [$texSubImage2D2](target, level, xoffset, yoffset, width, height, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video, srcOffset) {
    if (srcOffset === void 0) srcOffset = null;
    if (core.int.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texSubImage2D2_1](target, level, xoffset, yoffset, width, height, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (html$.ImageData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      let data_1 = html_common.convertDartToNative_ImageData(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      this[_texSubImage2D2_2](target, level, xoffset, yoffset, width, height, format, type, data_1);
      return;
    }
    if (html$.ImageElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texSubImage2D2_3](target, level, xoffset, yoffset, width, height, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (html$.CanvasElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texSubImage2D2_4](target, level, xoffset, yoffset, width, height, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (html$.VideoElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texSubImage2D2_5](target, level, xoffset, yoffset, width, height, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (html$.ImageBitmap.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video) && srcOffset == null) {
      this[_texSubImage2D2_6](target, level, xoffset, yoffset, width, height, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video);
      return;
    }
    if (srcOffset != null && typed_data.TypedData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video)) {
      this[_texSubImage2D2_7](target, level, xoffset, yoffset, width, height, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_srcData_OR_video, srcOffset);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_texSubImage2D2_1](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D2_2](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D2_3](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D2_4](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D2_5](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D2_6](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D2_7](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [$texSubImage3D](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video, srcOffset) {
    if (srcOffset === void 0) srcOffset = null;
    if (core.int.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texSubImage3D_1](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (html$.ImageData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      let data_1 = html_common.convertDartToNative_ImageData(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      this[_texSubImage3D_2](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data_1);
      return;
    }
    if (html$.ImageElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texSubImage3D_3](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (html$.CanvasElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texSubImage3D_4](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (html$.VideoElement.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texSubImage3D_5](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (html$.ImageBitmap.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texSubImage3D_6](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (typed_data.TypedData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video) && srcOffset == null) {
      this[_texSubImage3D_7](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video);
      return;
    }
    if (srcOffset != null && typed_data.TypedData.is(bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video)) {
      this[_texSubImage3D_8](target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bitmap_OR_canvas_OR_data_OR_image_OR_offset_OR_pixels_OR_video, srcOffset);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_texSubImage3D_1](...args) {
    return this.texSubImage3D.apply(this, args);
  }
  [_texSubImage3D_2](...args) {
    return this.texSubImage3D.apply(this, args);
  }
  [_texSubImage3D_3](...args) {
    return this.texSubImage3D.apply(this, args);
  }
  [_texSubImage3D_4](...args) {
    return this.texSubImage3D.apply(this, args);
  }
  [_texSubImage3D_5](...args) {
    return this.texSubImage3D.apply(this, args);
  }
  [_texSubImage3D_6](...args) {
    return this.texSubImage3D.apply(this, args);
  }
  [_texSubImage3D_7](...args) {
    return this.texSubImage3D.apply(this, args);
  }
  [_texSubImage3D_8](...args) {
    return this.texSubImage3D.apply(this, args);
  }
  [$transformFeedbackVaryings](program, varyings, bufferMode) {
    let varyings_1 = html_common.convertDartToNative_StringArray(varyings);
    this[_transformFeedbackVaryings_1](program, varyings_1, bufferMode);
    return;
  }
  [_transformFeedbackVaryings_1](...args) {
    return this.transformFeedbackVaryings.apply(this, args);
  }
  [$uniform1fv2](...args) {
    return this.uniform1fv.apply(this, args);
  }
  [$uniform1iv2](...args) {
    return this.uniform1iv.apply(this, args);
  }
  [$uniform1ui](...args) {
    return this.uniform1ui.apply(this, args);
  }
  [$uniform1uiv](...args) {
    return this.uniform1uiv.apply(this, args);
  }
  [$uniform2fv2](...args) {
    return this.uniform2fv.apply(this, args);
  }
  [$uniform2iv2](...args) {
    return this.uniform2iv.apply(this, args);
  }
  [$uniform2ui](...args) {
    return this.uniform2ui.apply(this, args);
  }
  [$uniform2uiv](...args) {
    return this.uniform2uiv.apply(this, args);
  }
  [$uniform3fv2](...args) {
    return this.uniform3fv.apply(this, args);
  }
  [$uniform3iv2](...args) {
    return this.uniform3iv.apply(this, args);
  }
  [$uniform3ui](...args) {
    return this.uniform3ui.apply(this, args);
  }
  [$uniform3uiv](...args) {
    return this.uniform3uiv.apply(this, args);
  }
  [$uniform4fv2](...args) {
    return this.uniform4fv.apply(this, args);
  }
  [$uniform4iv2](...args) {
    return this.uniform4iv.apply(this, args);
  }
  [$uniform4ui](...args) {
    return this.uniform4ui.apply(this, args);
  }
  [$uniform4uiv](...args) {
    return this.uniform4uiv.apply(this, args);
  }
  [$uniformBlockBinding](...args) {
    return this.uniformBlockBinding.apply(this, args);
  }
  [$uniformMatrix2fv2](...args) {
    return this.uniformMatrix2fv.apply(this, args);
  }
  [$uniformMatrix2x3fv](...args) {
    return this.uniformMatrix2x3fv.apply(this, args);
  }
  [$uniformMatrix2x4fv](...args) {
    return this.uniformMatrix2x4fv.apply(this, args);
  }
  [$uniformMatrix3fv2](...args) {
    return this.uniformMatrix3fv.apply(this, args);
  }
  [$uniformMatrix3x2fv](...args) {
    return this.uniformMatrix3x2fv.apply(this, args);
  }
  [$uniformMatrix3x4fv](...args) {
    return this.uniformMatrix3x4fv.apply(this, args);
  }
  [$uniformMatrix4fv2](...args) {
    return this.uniformMatrix4fv.apply(this, args);
  }
  [$uniformMatrix4x2fv](...args) {
    return this.uniformMatrix4x2fv.apply(this, args);
  }
  [$uniformMatrix4x3fv](...args) {
    return this.uniformMatrix4x3fv.apply(this, args);
  }
  [$vertexAttribDivisor](...args) {
    return this.vertexAttribDivisor.apply(this, args);
  }
  [$vertexAttribI4i](...args) {
    return this.vertexAttribI4i.apply(this, args);
  }
  [$vertexAttribI4iv](...args) {
    return this.vertexAttribI4iv.apply(this, args);
  }
  [$vertexAttribI4ui](...args) {
    return this.vertexAttribI4ui.apply(this, args);
  }
  [$vertexAttribI4uiv](...args) {
    return this.vertexAttribI4uiv.apply(this, args);
  }
  [$vertexAttribIPointer](...args) {
    return this.vertexAttribIPointer.apply(this, args);
  }
  [$waitSync](...args) {
    return this.waitSync.apply(this, args);
  }
  get [$drawingBufferHeight]() {
    return this.drawingBufferHeight;
  }
  get [$drawingBufferWidth]() {
    return this.drawingBufferWidth;
  }
  [$activeTexture](...args) {
    return this.activeTexture.apply(this, args);
  }
  [$attachShader](...args) {
    return this.attachShader.apply(this, args);
  }
  [$bindAttribLocation](...args) {
    return this.bindAttribLocation.apply(this, args);
  }
  [$bindBuffer](...args) {
    return this.bindBuffer.apply(this, args);
  }
  [$bindFramebuffer](...args) {
    return this.bindFramebuffer.apply(this, args);
  }
  [$bindRenderbuffer](...args) {
    return this.bindRenderbuffer.apply(this, args);
  }
  [$bindTexture](...args) {
    return this.bindTexture.apply(this, args);
  }
  [$blendColor](...args) {
    return this.blendColor.apply(this, args);
  }
  [$blendEquation](...args) {
    return this.blendEquation.apply(this, args);
  }
  [$blendEquationSeparate](...args) {
    return this.blendEquationSeparate.apply(this, args);
  }
  [$blendFunc](...args) {
    return this.blendFunc.apply(this, args);
  }
  [$blendFuncSeparate](...args) {
    return this.blendFuncSeparate.apply(this, args);
  }
  [$bufferData](...args) {
    return this.bufferData.apply(this, args);
  }
  [$bufferSubData](...args) {
    return this.bufferSubData.apply(this, args);
  }
  [$checkFramebufferStatus](...args) {
    return this.checkFramebufferStatus.apply(this, args);
  }
  [$clear](...args) {
    return this.clear.apply(this, args);
  }
  [$clearColor](...args) {
    return this.clearColor.apply(this, args);
  }
  [$clearDepth](...args) {
    return this.clearDepth.apply(this, args);
  }
  [$clearStencil](...args) {
    return this.clearStencil.apply(this, args);
  }
  [$colorMask](...args) {
    return this.colorMask.apply(this, args);
  }
  [$commit]() {
    return html$.promiseToFuture(dart.dynamic, this.commit());
  }
  [$compileShader](...args) {
    return this.compileShader.apply(this, args);
  }
  [$compressedTexImage2D](...args) {
    return this.compressedTexImage2D.apply(this, args);
  }
  [$compressedTexSubImage2D](...args) {
    return this.compressedTexSubImage2D.apply(this, args);
  }
  [$copyTexImage2D](...args) {
    return this.copyTexImage2D.apply(this, args);
  }
  [$copyTexSubImage2D](...args) {
    return this.copyTexSubImage2D.apply(this, args);
  }
  [$createBuffer](...args) {
    return this.createBuffer.apply(this, args);
  }
  [$createFramebuffer](...args) {
    return this.createFramebuffer.apply(this, args);
  }
  [$createProgram](...args) {
    return this.createProgram.apply(this, args);
  }
  [$createRenderbuffer](...args) {
    return this.createRenderbuffer.apply(this, args);
  }
  [$createShader](...args) {
    return this.createShader.apply(this, args);
  }
  [$createTexture](...args) {
    return this.createTexture.apply(this, args);
  }
  [$cullFace](...args) {
    return this.cullFace.apply(this, args);
  }
  [$deleteBuffer](...args) {
    return this.deleteBuffer.apply(this, args);
  }
  [$deleteFramebuffer](...args) {
    return this.deleteFramebuffer.apply(this, args);
  }
  [$deleteProgram](...args) {
    return this.deleteProgram.apply(this, args);
  }
  [$deleteRenderbuffer](...args) {
    return this.deleteRenderbuffer.apply(this, args);
  }
  [$deleteShader](...args) {
    return this.deleteShader.apply(this, args);
  }
  [$deleteTexture](...args) {
    return this.deleteTexture.apply(this, args);
  }
  [$depthFunc](...args) {
    return this.depthFunc.apply(this, args);
  }
  [$depthMask](...args) {
    return this.depthMask.apply(this, args);
  }
  [$depthRange](...args) {
    return this.depthRange.apply(this, args);
  }
  [$detachShader](...args) {
    return this.detachShader.apply(this, args);
  }
  [$disable](...args) {
    return this.disable.apply(this, args);
  }
  [$disableVertexAttribArray](...args) {
    return this.disableVertexAttribArray.apply(this, args);
  }
  [$drawArrays](...args) {
    return this.drawArrays.apply(this, args);
  }
  [$drawElements](...args) {
    return this.drawElements.apply(this, args);
  }
  [$enable](...args) {
    return this.enable.apply(this, args);
  }
  [$enableVertexAttribArray](...args) {
    return this.enableVertexAttribArray.apply(this, args);
  }
  [$finish](...args) {
    return this.finish.apply(this, args);
  }
  [$flush](...args) {
    return this.flush.apply(this, args);
  }
  [$framebufferRenderbuffer](...args) {
    return this.framebufferRenderbuffer.apply(this, args);
  }
  [$framebufferTexture2D](...args) {
    return this.framebufferTexture2D.apply(this, args);
  }
  [$frontFace](...args) {
    return this.frontFace.apply(this, args);
  }
  [$generateMipmap](...args) {
    return this.generateMipmap.apply(this, args);
  }
  [$getActiveAttrib](...args) {
    return this.getActiveAttrib.apply(this, args);
  }
  [$getActiveUniform](...args) {
    return this.getActiveUniform.apply(this, args);
  }
  [$getAttachedShaders](...args) {
    return this.getAttachedShaders.apply(this, args);
  }
  [$getAttribLocation](...args) {
    return this.getAttribLocation.apply(this, args);
  }
  [$getBufferParameter](...args) {
    return this.getBufferParameter.apply(this, args);
  }
  [$getContextAttributes]() {
    return html_common.convertNativeToDart_Dictionary(this[_getContextAttributes_1$]());
  }
  [_getContextAttributes_1$](...args) {
    return this.getContextAttributes.apply(this, args);
  }
  [$getError](...args) {
    return this.getError.apply(this, args);
  }
  [$getExtension](...args) {
    return this.getExtension.apply(this, args);
  }
  [$getFramebufferAttachmentParameter](...args) {
    return this.getFramebufferAttachmentParameter.apply(this, args);
  }
  [$getParameter](...args) {
    return this.getParameter.apply(this, args);
  }
  [$getProgramInfoLog](...args) {
    return this.getProgramInfoLog.apply(this, args);
  }
  [$getProgramParameter](...args) {
    return this.getProgramParameter.apply(this, args);
  }
  [$getRenderbufferParameter](...args) {
    return this.getRenderbufferParameter.apply(this, args);
  }
  [$getShaderInfoLog](...args) {
    return this.getShaderInfoLog.apply(this, args);
  }
  [$getShaderParameter](...args) {
    return this.getShaderParameter.apply(this, args);
  }
  [$getShaderPrecisionFormat](...args) {
    return this.getShaderPrecisionFormat.apply(this, args);
  }
  [$getShaderSource](...args) {
    return this.getShaderSource.apply(this, args);
  }
  [$getSupportedExtensions](...args) {
    return this.getSupportedExtensions.apply(this, args);
  }
  [$getTexParameter](...args) {
    return this.getTexParameter.apply(this, args);
  }
  [$getUniform](...args) {
    return this.getUniform.apply(this, args);
  }
  [$getUniformLocation](...args) {
    return this.getUniformLocation.apply(this, args);
  }
  [$getVertexAttrib](...args) {
    return this.getVertexAttrib.apply(this, args);
  }
  [$getVertexAttribOffset](...args) {
    return this.getVertexAttribOffset.apply(this, args);
  }
  [$hint](...args) {
    return this.hint.apply(this, args);
  }
  [$isBuffer](...args) {
    return this.isBuffer.apply(this, args);
  }
  [$isContextLost](...args) {
    return this.isContextLost.apply(this, args);
  }
  [$isEnabled](...args) {
    return this.isEnabled.apply(this, args);
  }
  [$isFramebuffer](...args) {
    return this.isFramebuffer.apply(this, args);
  }
  [$isProgram](...args) {
    return this.isProgram.apply(this, args);
  }
  [$isRenderbuffer](...args) {
    return this.isRenderbuffer.apply(this, args);
  }
  [$isShader](...args) {
    return this.isShader.apply(this, args);
  }
  [$isTexture](...args) {
    return this.isTexture.apply(this, args);
  }
  [$lineWidth](...args) {
    return this.lineWidth.apply(this, args);
  }
  [$linkProgram](...args) {
    return this.linkProgram.apply(this, args);
  }
  [$pixelStorei](...args) {
    return this.pixelStorei.apply(this, args);
  }
  [$polygonOffset](...args) {
    return this.polygonOffset.apply(this, args);
  }
  [_readPixels](...args) {
    return this.readPixels.apply(this, args);
  }
  [$renderbufferStorage](...args) {
    return this.renderbufferStorage.apply(this, args);
  }
  [$sampleCoverage](...args) {
    return this.sampleCoverage.apply(this, args);
  }
  [$scissor](...args) {
    return this.scissor.apply(this, args);
  }
  [$shaderSource](...args) {
    return this.shaderSource.apply(this, args);
  }
  [$stencilFunc](...args) {
    return this.stencilFunc.apply(this, args);
  }
  [$stencilFuncSeparate](...args) {
    return this.stencilFuncSeparate.apply(this, args);
  }
  [$stencilMask](...args) {
    return this.stencilMask.apply(this, args);
  }
  [$stencilMaskSeparate](...args) {
    return this.stencilMaskSeparate.apply(this, args);
  }
  [$stencilOp](...args) {
    return this.stencilOp.apply(this, args);
  }
  [$stencilOpSeparate](...args) {
    return this.stencilOpSeparate.apply(this, args);
  }
  [$texImage2D](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
    if (format === void 0) format = null;
    if (type === void 0) type = null;
    if (pixels === void 0) pixels = null;
    if (type != null && format != null && core.int.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video)) {
      this[_texImage2D_1](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
      return;
    }
    if (html$.ImageData.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      let pixels_1 = html_common.convertDartToNative_ImageData(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      this[_texImage2D_2](target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
      return;
    }
    if (html$.ImageElement.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_3](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.CanvasElement.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_4](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.VideoElement.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_5](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.ImageBitmap.is(bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
      this[_texImage2D_6](target, level, internalformat, format_OR_width, height_OR_type, bitmap_OR_border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_texImage2D_1](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_2](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_3](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_4](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_5](...args) {
    return this.texImage2D.apply(this, args);
  }
  [_texImage2D_6](...args) {
    return this.texImage2D.apply(this, args);
  }
  [$texParameterf](...args) {
    return this.texParameterf.apply(this, args);
  }
  [$texParameteri](...args) {
    return this.texParameteri.apply(this, args);
  }
  [$texSubImage2D](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
    if (type === void 0) type = null;
    if (pixels === void 0) pixels = null;
    if (type != null && core.int.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video)) {
      this[_texSubImage2D_1](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
      return;
    }
    if (html$.ImageData.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      let pixels_1 = html_common.convertDartToNative_ImageData(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      this[_texSubImage2D_2](target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
      return;
    }
    if (html$.ImageElement.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_3](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.CanvasElement.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_4](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.VideoElement.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_5](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if (html$.ImageBitmap.is(bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
      this[_texSubImage2D_6](target, level, xoffset, yoffset, format_OR_width, height_OR_type, bitmap_OR_canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    dart.throw(new core.ArgumentError.new("Incorrect number or type of arguments"));
  }
  [_texSubImage2D_1](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_2](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_3](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_4](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_5](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [_texSubImage2D_6](...args) {
    return this.texSubImage2D.apply(this, args);
  }
  [$uniform1f](...args) {
    return this.uniform1f.apply(this, args);
  }
  [$uniform1fv](...args) {
    return this.uniform1fv.apply(this, args);
  }
  [$uniform1i](...args) {
    return this.uniform1i.apply(this, args);
  }
  [$uniform1iv](...args) {
    return this.uniform1iv.apply(this, args);
  }
  [$uniform2f](...args) {
    return this.uniform2f.apply(this, args);
  }
  [$uniform2fv](...args) {
    return this.uniform2fv.apply(this, args);
  }
  [$uniform2i](...args) {
    return this.uniform2i.apply(this, args);
  }
  [$uniform2iv](...args) {
    return this.uniform2iv.apply(this, args);
  }
  [$uniform3f](...args) {
    return this.uniform3f.apply(this, args);
  }
  [$uniform3fv](...args) {
    return this.uniform3fv.apply(this, args);
  }
  [$uniform3i](...args) {
    return this.uniform3i.apply(this, args);
  }
  [$uniform3iv](...args) {
    return this.uniform3iv.apply(this, args);
  }
  [$uniform4f](...args) {
    return this.uniform4f.apply(this, args);
  }
  [$uniform4fv](...args) {
    return this.uniform4fv.apply(this, args);
  }
  [$uniform4i](...args) {
    return this.uniform4i.apply(this, args);
  }
  [$uniform4iv](...args) {
    return this.uniform4iv.apply(this, args);
  }
  [$uniformMatrix2fv](...args) {
    return this.uniformMatrix2fv.apply(this, args);
  }
  [$uniformMatrix3fv](...args) {
    return this.uniformMatrix3fv.apply(this, args);
  }
  [$uniformMatrix4fv](...args) {
    return this.uniformMatrix4fv.apply(this, args);
  }
  [$useProgram](...args) {
    return this.useProgram.apply(this, args);
  }
  [$validateProgram](...args) {
    return this.validateProgram.apply(this, args);
  }
  [$vertexAttrib1f](...args) {
    return this.vertexAttrib1f.apply(this, args);
  }
  [$vertexAttrib1fv](...args) {
    return this.vertexAttrib1fv.apply(this, args);
  }
  [$vertexAttrib2f](...args) {
    return this.vertexAttrib2f.apply(this, args);
  }
  [$vertexAttrib2fv](...args) {
    return this.vertexAttrib2fv.apply(this, args);
  }
  [$vertexAttrib3f](...args) {
    return this.vertexAttrib3f.apply(this, args);
  }
  [$vertexAttrib3fv](...args) {
    return this.vertexAttrib3fv.apply(this, args);
  }
  [$vertexAttrib4f](...args) {
    return this.vertexAttrib4f.apply(this, args);
  }
  [$vertexAttrib4fv](...args) {
    return this.vertexAttrib4fv.apply(this, args);
  }
  [$vertexAttribPointer](...args) {
    return this.vertexAttribPointer.apply(this, args);
  }
  [$viewport](...args) {
    return this.viewport.apply(this, args);
  }
  [$readPixels](x, y, width, height, format, type, pixels) {
    this[_readPixels](x, y, width, height, format, type, pixels);
  }
};
dart.addTypeTests(web_gl.RenderingContext2);
const canvas$4 = Symbol("RenderingContext2.canvas");
const drawingBufferHeight$ = Symbol("RenderingContext2.drawingBufferHeight");
const drawingBufferWidth$ = Symbol("RenderingContext2.drawingBufferWidth");
web_gl.RenderingContext2[dart.implements] = () => [web_gl._WebGL2RenderingContextBase, web_gl._WebGLRenderingContextBase];
dart.setMethodSignature(web_gl.RenderingContext2, () => ({
  __proto__: dart.getMethods(web_gl.RenderingContext2.__proto__),
  [$beginQuery]: dart.fnType(dart.void, [core.int, web_gl.Query]),
  [$beginTransformFeedback]: dart.fnType(dart.void, [core.int]),
  [$bindBufferBase]: dart.fnType(dart.void, [core.int, core.int, web_gl.Buffer]),
  [$bindBufferRange]: dart.fnType(dart.void, [core.int, core.int, web_gl.Buffer, core.int, core.int]),
  [$bindSampler]: dart.fnType(dart.void, [core.int, web_gl.Sampler]),
  [$bindTransformFeedback]: dart.fnType(dart.void, [core.int, web_gl.TransformFeedback]),
  [$bindVertexArray]: dart.fnType(dart.void, [web_gl.VertexArrayObject]),
  [$blitFramebuffer]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$bufferData2]: dart.fnType(dart.void, [core.int, typed_data.TypedData, core.int, core.int], [core.int]),
  [$bufferSubData2]: dart.fnType(dart.void, [core.int, core.int, typed_data.TypedData, core.int], [core.int]),
  [$clearBufferfi]: dart.fnType(dart.void, [core.int, core.int, core.num, core.int]),
  [$clearBufferfv]: dart.fnType(dart.void, [core.int, core.int, dart.dynamic], [core.int]),
  [$clearBufferiv]: dart.fnType(dart.void, [core.int, core.int, dart.dynamic], [core.int]),
  [$clearBufferuiv]: dart.fnType(dart.void, [core.int, core.int, dart.dynamic], [core.int]),
  [$clientWaitSync]: dart.fnType(core.int, [web_gl.Sync, core.int, core.int]),
  [$compressedTexImage2D2]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData, core.int], [core.int]),
  [$compressedTexImage2D3]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$compressedTexImage3D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData], [core.int, core.int]),
  [$compressedTexImage3D2]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$compressedTexSubImage2D2]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData, core.int], [core.int]),
  [$compressedTexSubImage2D3]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$compressedTexSubImage3D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData], [core.int, core.int]),
  [$compressedTexSubImage3D2]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$copyBufferSubData]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
  [$copyTexSubImage3D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$createQuery]: dart.fnType(web_gl.Query, []),
  [$createSampler]: dart.fnType(web_gl.Sampler, []),
  [$createTransformFeedback]: dart.fnType(web_gl.TransformFeedback, []),
  [$createVertexArray]: dart.fnType(web_gl.VertexArrayObject, []),
  [$deleteQuery]: dart.fnType(dart.void, [web_gl.Query]),
  [$deleteSampler]: dart.fnType(dart.void, [web_gl.Sampler]),
  [$deleteSync]: dart.fnType(dart.void, [web_gl.Sync]),
  [$deleteTransformFeedback]: dart.fnType(dart.void, [web_gl.TransformFeedback]),
  [$deleteVertexArray]: dart.fnType(dart.void, [web_gl.VertexArrayObject]),
  [$drawArraysInstanced]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$drawBuffers]: dart.fnType(dart.void, [core.List$(core.int)]),
  [$drawElementsInstanced]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
  [$drawRangeElements]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int]),
  [$endQuery]: dart.fnType(dart.void, [core.int]),
  [$endTransformFeedback]: dart.fnType(dart.void, []),
  [$fenceSync]: dart.fnType(web_gl.Sync, [core.int, core.int]),
  [$framebufferTextureLayer]: dart.fnType(dart.void, [core.int, core.int, web_gl.Texture, core.int, core.int]),
  [$getActiveUniformBlockName]: dart.fnType(core.String, [web_gl.Program, core.int]),
  [$getActiveUniformBlockParameter]: dart.fnType(core.Object, [web_gl.Program, core.int, core.int]),
  [$getActiveUniforms]: dart.fnType(core.Object, [web_gl.Program, core.List$(core.int), core.int]),
  [$getBufferSubData]: dart.fnType(dart.void, [core.int, core.int, typed_data.TypedData], [core.int, core.int]),
  [$getFragDataLocation]: dart.fnType(core.int, [web_gl.Program, core.String]),
  [$getIndexedParameter]: dart.fnType(core.Object, [core.int, core.int]),
  [$getInternalformatParameter]: dart.fnType(core.Object, [core.int, core.int, core.int]),
  [$getQuery]: dart.fnType(core.Object, [core.int, core.int]),
  [$getQueryParameter]: dart.fnType(core.Object, [web_gl.Query, core.int]),
  [$getSamplerParameter]: dart.fnType(core.Object, [web_gl.Sampler, core.int]),
  [$getSyncParameter]: dart.fnType(core.Object, [web_gl.Sync, core.int]),
  [$getTransformFeedbackVarying]: dart.fnType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
  [$getUniformBlockIndex]: dart.fnType(core.int, [web_gl.Program, core.String]),
  [$getUniformIndices]: dart.fnType(core.List$(core.int), [web_gl.Program, core.List$(core.String)]),
  [_getUniformIndices_1]: dart.fnType(core.List$(core.int), [web_gl.Program, core.List]),
  [$invalidateFramebuffer]: dart.fnType(dart.void, [core.int, core.List$(core.int)]),
  [$invalidateSubFramebuffer]: dart.fnType(dart.void, [core.int, core.List$(core.int), core.int, core.int, core.int, core.int]),
  [$isQuery]: dart.fnType(core.bool, [web_gl.Query]),
  [$isSampler]: dart.fnType(core.bool, [web_gl.Sampler]),
  [$isSync]: dart.fnType(core.bool, [web_gl.Sync]),
  [$isTransformFeedback]: dart.fnType(core.bool, [web_gl.TransformFeedback]),
  [$isVertexArray]: dart.fnType(core.bool, [web_gl.VertexArrayObject]),
  [$pauseTransformFeedback]: dart.fnType(dart.void, []),
  [$readBuffer]: dart.fnType(dart.void, [core.int]),
  [$readPixels2]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int]),
  [$renderbufferStorageMultisample]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
  [$resumeTransformFeedback]: dart.fnType(dart.void, []),
  [$samplerParameterf]: dart.fnType(dart.void, [web_gl.Sampler, core.int, core.num]),
  [$samplerParameteri]: dart.fnType(dart.void, [web_gl.Sampler, core.int, core.int]),
  [$texImage2D2]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int]),
  [_texImage2D2_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int]),
  [_texImage2D2_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_texImage2D2_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
  [_texImage2D2_4]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
  [_texImage2D2_5]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
  [_texImage2D2_6]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageBitmap]),
  [_texImage2D2_7]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, typed_data.TypedData, dart.dynamic]),
  [$texImage3D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int]),
  [_texImage3D_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int]),
  [_texImage3D_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_texImage3D_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
  [_texImage3D_4]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
  [_texImage3D_5]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
  [_texImage3D_6]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageBitmap]),
  [_texImage3D_7]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, typed_data.TypedData]),
  [_texImage3D_8]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, typed_data.TypedData, dart.dynamic]),
  [$texStorage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
  [$texStorage3D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int]),
  [$texSubImage2D2]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int]),
  [_texSubImage2D2_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int]),
  [_texSubImage2D2_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_texSubImage2D2_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
  [_texSubImage2D2_4]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
  [_texSubImage2D2_5]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
  [_texSubImage2D2_6]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageBitmap]),
  [_texSubImage2D2_7]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, typed_data.TypedData, dart.dynamic]),
  [$texSubImage3D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int]),
  [_texSubImage3D_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int]),
  [_texSubImage3D_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_texSubImage3D_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
  [_texSubImage3D_4]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
  [_texSubImage3D_5]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
  [_texSubImage3D_6]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageBitmap]),
  [_texSubImage3D_7]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, typed_data.TypedData]),
  [_texSubImage3D_8]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, typed_data.TypedData, dart.dynamic]),
  [$transformFeedbackVaryings]: dart.fnType(dart.void, [web_gl.Program, core.List$(core.String), core.int]),
  [_transformFeedbackVaryings_1]: dart.fnType(dart.void, [web_gl.Program, core.List, dart.dynamic]),
  [$uniform1fv2]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic, core.int], [core.int]),
  [$uniform1iv2]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic, core.int], [core.int]),
  [$uniform1ui]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int]),
  [$uniform1uiv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic], [core.int, core.int]),
  [$uniform2fv2]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic, core.int], [core.int]),
  [$uniform2iv2]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic, core.int], [core.int]),
  [$uniform2ui]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int]),
  [$uniform2uiv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic], [core.int, core.int]),
  [$uniform3fv2]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic, core.int], [core.int]),
  [$uniform3iv2]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic, core.int], [core.int]),
  [$uniform3ui]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int]),
  [$uniform3uiv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic], [core.int, core.int]),
  [$uniform4fv2]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic, core.int], [core.int]),
  [$uniform4iv2]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic, core.int], [core.int]),
  [$uniform4ui]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int, core.int]),
  [$uniform4uiv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic], [core.int, core.int]),
  [$uniformBlockBinding]: dart.fnType(dart.void, [web_gl.Program, core.int, core.int]),
  [$uniformMatrix2fv2]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic, core.int], [core.int]),
  [$uniformMatrix2x3fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic], [core.int, core.int]),
  [$uniformMatrix2x4fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic], [core.int, core.int]),
  [$uniformMatrix3fv2]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic, core.int], [core.int]),
  [$uniformMatrix3x2fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic], [core.int, core.int]),
  [$uniformMatrix3x4fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic], [core.int, core.int]),
  [$uniformMatrix4fv2]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic, core.int], [core.int]),
  [$uniformMatrix4x2fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic], [core.int, core.int]),
  [$uniformMatrix4x3fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic], [core.int, core.int]),
  [$vertexAttribDivisor]: dart.fnType(dart.void, [core.int, core.int]),
  [$vertexAttribI4i]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
  [$vertexAttribI4iv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttribI4ui]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
  [$vertexAttribI4uiv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttribIPointer]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
  [$waitSync]: dart.fnType(dart.void, [web_gl.Sync, core.int, core.int]),
  [$activeTexture]: dart.fnType(dart.void, [core.int]),
  [$attachShader]: dart.fnType(dart.void, [web_gl.Program, web_gl.Shader]),
  [$bindAttribLocation]: dart.fnType(dart.void, [web_gl.Program, core.int, core.String]),
  [$bindBuffer]: dart.fnType(dart.void, [core.int, web_gl.Buffer]),
  [$bindFramebuffer]: dart.fnType(dart.void, [core.int, web_gl.Framebuffer]),
  [$bindRenderbuffer]: dart.fnType(dart.void, [core.int, web_gl.Renderbuffer]),
  [$bindTexture]: dart.fnType(dart.void, [core.int, web_gl.Texture]),
  [$blendColor]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$blendEquation]: dart.fnType(dart.void, [core.int]),
  [$blendEquationSeparate]: dart.fnType(dart.void, [core.int, core.int]),
  [$blendFunc]: dart.fnType(dart.void, [core.int, core.int]),
  [$blendFuncSeparate]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$bufferData]: dart.fnType(dart.void, [core.int, dart.dynamic, core.int]),
  [$bufferSubData]: dart.fnType(dart.void, [core.int, core.int, dart.dynamic]),
  [$checkFramebufferStatus]: dart.fnType(core.int, [core.int]),
  [$clear]: dart.fnType(dart.void, [core.int]),
  [$clearColor]: dart.fnType(dart.void, [core.num, core.num, core.num, core.num]),
  [$clearDepth]: dart.fnType(dart.void, [core.num]),
  [$clearStencil]: dart.fnType(dart.void, [core.int]),
  [$colorMask]: dart.fnType(dart.void, [core.bool, core.bool, core.bool, core.bool]),
  [$commit]: dart.fnType(async.Future, []),
  [$compileShader]: dart.fnType(dart.void, [web_gl.Shader]),
  [$compressedTexImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$compressedTexSubImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$copyTexImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$copyTexSubImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
  [$createBuffer]: dart.fnType(web_gl.Buffer, []),
  [$createFramebuffer]: dart.fnType(web_gl.Framebuffer, []),
  [$createProgram]: dart.fnType(web_gl.Program, []),
  [$createRenderbuffer]: dart.fnType(web_gl.Renderbuffer, []),
  [$createShader]: dart.fnType(web_gl.Shader, [core.int]),
  [$createTexture]: dart.fnType(web_gl.Texture, []),
  [$cullFace]: dart.fnType(dart.void, [core.int]),
  [$deleteBuffer]: dart.fnType(dart.void, [web_gl.Buffer]),
  [$deleteFramebuffer]: dart.fnType(dart.void, [web_gl.Framebuffer]),
  [$deleteProgram]: dart.fnType(dart.void, [web_gl.Program]),
  [$deleteRenderbuffer]: dart.fnType(dart.void, [web_gl.Renderbuffer]),
  [$deleteShader]: dart.fnType(dart.void, [web_gl.Shader]),
  [$deleteTexture]: dart.fnType(dart.void, [web_gl.Texture]),
  [$depthFunc]: dart.fnType(dart.void, [core.int]),
  [$depthMask]: dart.fnType(dart.void, [core.bool]),
  [$depthRange]: dart.fnType(dart.void, [core.num, core.num]),
  [$detachShader]: dart.fnType(dart.void, [web_gl.Program, web_gl.Shader]),
  [$disable]: dart.fnType(dart.void, [core.int]),
  [$disableVertexAttribArray]: dart.fnType(dart.void, [core.int]),
  [$drawArrays]: dart.fnType(dart.void, [core.int, core.int, core.int]),
  [$drawElements]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$enable]: dart.fnType(dart.void, [core.int]),
  [$enableVertexAttribArray]: dart.fnType(dart.void, [core.int]),
  [$finish]: dart.fnType(dart.void, []),
  [$flush]: dart.fnType(dart.void, []),
  [$framebufferRenderbuffer]: dart.fnType(dart.void, [core.int, core.int, core.int, web_gl.Renderbuffer]),
  [$framebufferTexture2D]: dart.fnType(dart.void, [core.int, core.int, core.int, web_gl.Texture, core.int]),
  [$frontFace]: dart.fnType(dart.void, [core.int]),
  [$generateMipmap]: dart.fnType(dart.void, [core.int]),
  [$getActiveAttrib]: dart.fnType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
  [$getActiveUniform]: dart.fnType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
  [$getAttachedShaders]: dart.fnType(core.List$(web_gl.Shader), [web_gl.Program]),
  [$getAttribLocation]: dart.fnType(core.int, [web_gl.Program, core.String]),
  [$getBufferParameter]: dart.fnType(core.Object, [core.int, core.int]),
  [$getContextAttributes]: dart.fnType(core.Map, []),
  [_getContextAttributes_1$]: dart.fnType(dart.dynamic, []),
  [$getError]: dart.fnType(core.int, []),
  [$getExtension]: dart.fnType(core.Object, [core.String]),
  [$getFramebufferAttachmentParameter]: dart.fnType(core.Object, [core.int, core.int, core.int]),
  [$getParameter]: dart.fnType(core.Object, [core.int]),
  [$getProgramInfoLog]: dart.fnType(core.String, [web_gl.Program]),
  [$getProgramParameter]: dart.fnType(core.Object, [web_gl.Program, core.int]),
  [$getRenderbufferParameter]: dart.fnType(core.Object, [core.int, core.int]),
  [$getShaderInfoLog]: dart.fnType(core.String, [web_gl.Shader]),
  [$getShaderParameter]: dart.fnType(core.Object, [web_gl.Shader, core.int]),
  [$getShaderPrecisionFormat]: dart.fnType(web_gl.ShaderPrecisionFormat, [core.int, core.int]),
  [$getShaderSource]: dart.fnType(core.String, [web_gl.Shader]),
  [$getSupportedExtensions]: dart.fnType(core.List$(core.String), []),
  [$getTexParameter]: dart.fnType(core.Object, [core.int, core.int]),
  [$getUniform]: dart.fnType(core.Object, [web_gl.Program, web_gl.UniformLocation]),
  [$getUniformLocation]: dart.fnType(web_gl.UniformLocation, [web_gl.Program, core.String]),
  [$getVertexAttrib]: dart.fnType(core.Object, [core.int, core.int]),
  [$getVertexAttribOffset]: dart.fnType(core.int, [core.int, core.int]),
  [$hint]: dart.fnType(dart.void, [core.int, core.int]),
  [$isBuffer]: dart.fnType(core.bool, [web_gl.Buffer]),
  [$isContextLost]: dart.fnType(core.bool, []),
  [$isEnabled]: dart.fnType(core.bool, [core.int]),
  [$isFramebuffer]: dart.fnType(core.bool, [web_gl.Framebuffer]),
  [$isProgram]: dart.fnType(core.bool, [web_gl.Program]),
  [$isRenderbuffer]: dart.fnType(core.bool, [web_gl.Renderbuffer]),
  [$isShader]: dart.fnType(core.bool, [web_gl.Shader]),
  [$isTexture]: dart.fnType(core.bool, [web_gl.Texture]),
  [$lineWidth]: dart.fnType(dart.void, [core.num]),
  [$linkProgram]: dart.fnType(dart.void, [web_gl.Program]),
  [$pixelStorei]: dart.fnType(dart.void, [core.int, core.int]),
  [$polygonOffset]: dart.fnType(dart.void, [core.num, core.num]),
  [_readPixels]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
  [$renderbufferStorage]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$sampleCoverage]: dart.fnType(dart.void, [core.num, core.bool]),
  [$scissor]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$shaderSource]: dart.fnType(dart.void, [web_gl.Shader, core.String]),
  [$stencilFunc]: dart.fnType(dart.void, [core.int, core.int, core.int]),
  [$stencilFuncSeparate]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$stencilMask]: dart.fnType(dart.void, [core.int]),
  [$stencilMaskSeparate]: dart.fnType(dart.void, [core.int, core.int]),
  [$stencilOp]: dart.fnType(dart.void, [core.int, core.int, core.int]),
  [$stencilOpSeparate]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$texImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, core.int, typed_data.TypedData]),
  [_texImage2D_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, dart.dynamic, typed_data.TypedData]),
  [_texImage2D_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_texImage2D_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
  [_texImage2D_4]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
  [_texImage2D_5]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
  [_texImage2D_6]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageBitmap]),
  [$texParameterf]: dart.fnType(dart.void, [core.int, core.int, core.num]),
  [$texParameteri]: dart.fnType(dart.void, [core.int, core.int, core.int]),
  [$texSubImage2D]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, typed_data.TypedData]),
  [_texSubImage2D_1]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, typed_data.TypedData]),
  [_texSubImage2D_2]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
  [_texSubImage2D_3]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
  [_texSubImage2D_4]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
  [_texSubImage2D_5]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
  [_texSubImage2D_6]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageBitmap]),
  [$uniform1f]: dart.fnType(dart.void, [web_gl.UniformLocation, core.num]),
  [$uniform1fv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform1i]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int]),
  [$uniform1iv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform2f]: dart.fnType(dart.void, [web_gl.UniformLocation, core.num, core.num]),
  [$uniform2fv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform2i]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int]),
  [$uniform2iv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform3f]: dart.fnType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num]),
  [$uniform3fv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform3i]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int]),
  [$uniform3iv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform4f]: dart.fnType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num, core.num]),
  [$uniform4fv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniform4i]: dart.fnType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int, core.int]),
  [$uniform4iv]: dart.fnType(dart.void, [web_gl.UniformLocation, dart.dynamic]),
  [$uniformMatrix2fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic]),
  [$uniformMatrix3fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic]),
  [$uniformMatrix4fv]: dart.fnType(dart.void, [web_gl.UniformLocation, core.bool, dart.dynamic]),
  [$useProgram]: dart.fnType(dart.void, [web_gl.Program]),
  [$validateProgram]: dart.fnType(dart.void, [web_gl.Program]),
  [$vertexAttrib1f]: dart.fnType(dart.void, [core.int, core.num]),
  [$vertexAttrib1fv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttrib2f]: dart.fnType(dart.void, [core.int, core.num, core.num]),
  [$vertexAttrib2fv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttrib3f]: dart.fnType(dart.void, [core.int, core.num, core.num, core.num]),
  [$vertexAttrib3fv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttrib4f]: dart.fnType(dart.void, [core.int, core.num, core.num, core.num, core.num]),
  [$vertexAttrib4fv]: dart.fnType(dart.void, [core.int, dart.dynamic]),
  [$vertexAttribPointer]: dart.fnType(dart.void, [core.int, core.int, core.int, core.bool, core.int, core.int]),
  [$viewport]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int]),
  [$readPixels]: dart.fnType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData])
}));
dart.setLibraryUri(web_gl.RenderingContext2, "dart:web_gl");
dart.setFieldSignature(web_gl.RenderingContext2, () => ({
  __proto__: dart.getFields(web_gl.RenderingContext2.__proto__),
  [$canvas]: dart.finalFieldType(web_gl.Canvas),
  [$drawingBufferHeight]: dart.finalFieldType(core.int),
  [$drawingBufferWidth]: dart.finalFieldType(core.int)
}));
dart.registerExtension("WebGL2RenderingContext", web_gl.RenderingContext2);
web_gl.Sampler = class Sampler extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.Sampler);
dart.setLibraryUri(web_gl.Sampler, "dart:web_gl");
dart.registerExtension("WebGLSampler", web_gl.Sampler);
web_gl.Shader = class Shader extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.Shader);
dart.setLibraryUri(web_gl.Shader, "dart:web_gl");
dart.registerExtension("WebGLShader", web_gl.Shader);
web_gl.ShaderPrecisionFormat = class ShaderPrecisionFormat extends _interceptors.Interceptor {
  get [$precision]() {
    return this.precision;
  }
  get [$rangeMax]() {
    return this.rangeMax;
  }
  get [$rangeMin]() {
    return this.rangeMin;
  }
};
dart.addTypeTests(web_gl.ShaderPrecisionFormat);
const precision = Symbol("ShaderPrecisionFormat.precision");
const rangeMax = Symbol("ShaderPrecisionFormat.rangeMax");
const rangeMin = Symbol("ShaderPrecisionFormat.rangeMin");
dart.setLibraryUri(web_gl.ShaderPrecisionFormat, "dart:web_gl");
dart.setFieldSignature(web_gl.ShaderPrecisionFormat, () => ({
  __proto__: dart.getFields(web_gl.ShaderPrecisionFormat.__proto__),
  [$precision]: dart.finalFieldType(core.int),
  [$rangeMax]: dart.finalFieldType(core.int),
  [$rangeMin]: dart.finalFieldType(core.int)
}));
dart.registerExtension("WebGLShaderPrecisionFormat", web_gl.ShaderPrecisionFormat);
web_gl.Sync = class Sync extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.Sync);
dart.setLibraryUri(web_gl.Sync, "dart:web_gl");
dart.registerExtension("WebGLSync", web_gl.Sync);
web_gl.Texture = class Texture extends _interceptors.Interceptor {
  get [$lastUploadedVideoFrameWasSkipped]() {
    return this.lastUploadedVideoFrameWasSkipped;
  }
  get [$lastUploadedVideoHeight]() {
    return this.lastUploadedVideoHeight;
  }
  get [$lastUploadedVideoTimestamp]() {
    return this.lastUploadedVideoTimestamp;
  }
  get [$lastUploadedVideoWidth]() {
    return this.lastUploadedVideoWidth;
  }
};
dart.addTypeTests(web_gl.Texture);
const lastUploadedVideoFrameWasSkipped = Symbol("Texture.lastUploadedVideoFrameWasSkipped");
const lastUploadedVideoHeight = Symbol("Texture.lastUploadedVideoHeight");
const lastUploadedVideoTimestamp = Symbol("Texture.lastUploadedVideoTimestamp");
const lastUploadedVideoWidth = Symbol("Texture.lastUploadedVideoWidth");
dart.setLibraryUri(web_gl.Texture, "dart:web_gl");
dart.setFieldSignature(web_gl.Texture, () => ({
  __proto__: dart.getFields(web_gl.Texture.__proto__),
  [$lastUploadedVideoFrameWasSkipped]: dart.finalFieldType(core.bool),
  [$lastUploadedVideoHeight]: dart.finalFieldType(core.int),
  [$lastUploadedVideoTimestamp]: dart.finalFieldType(core.num),
  [$lastUploadedVideoWidth]: dart.finalFieldType(core.int)
}));
dart.registerExtension("WebGLTexture", web_gl.Texture);
web_gl.TimerQueryExt = class TimerQueryExt extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.TimerQueryExt);
dart.setLibraryUri(web_gl.TimerQueryExt, "dart:web_gl");
dart.registerExtension("WebGLTimerQueryEXT", web_gl.TimerQueryExt);
web_gl.TransformFeedback = class TransformFeedback extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.TransformFeedback);
dart.setLibraryUri(web_gl.TransformFeedback, "dart:web_gl");
dart.registerExtension("WebGLTransformFeedback", web_gl.TransformFeedback);
web_gl.UniformLocation = class UniformLocation extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.UniformLocation);
dart.setLibraryUri(web_gl.UniformLocation, "dart:web_gl");
dart.registerExtension("WebGLUniformLocation", web_gl.UniformLocation);
web_gl.VertexArrayObject = class VertexArrayObject extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.VertexArrayObject);
dart.setLibraryUri(web_gl.VertexArrayObject, "dart:web_gl");
dart.registerExtension("WebGLVertexArrayObject", web_gl.VertexArrayObject);
web_gl.VertexArrayObjectOes = class VertexArrayObjectOes extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl.VertexArrayObjectOes);
dart.setLibraryUri(web_gl.VertexArrayObjectOes, "dart:web_gl");
dart.registerExtension("WebGLVertexArrayObjectOES", web_gl.VertexArrayObjectOes);
web_gl.WebGL = class WebGL extends core.Object {};
(web_gl.WebGL[dart.mixinNew] = function() {
}).prototype = web_gl.WebGL.prototype;
dart.addTypeTests(web_gl.WebGL);
dart.setLibraryUri(web_gl.WebGL, "dart:web_gl");
dart.defineLazy(web_gl.WebGL, {
  /*web_gl.WebGL.ACTIVE_ATTRIBUTES*/get ACTIVE_ATTRIBUTES() {
    return 35721;
  },
  /*web_gl.WebGL.ACTIVE_TEXTURE*/get ACTIVE_TEXTURE() {
    return 34016;
  },
  /*web_gl.WebGL.ACTIVE_UNIFORMS*/get ACTIVE_UNIFORMS() {
    return 35718;
  },
  /*web_gl.WebGL.ACTIVE_UNIFORM_BLOCKS*/get ACTIVE_UNIFORM_BLOCKS() {
    return 35382;
  },
  /*web_gl.WebGL.ALIASED_LINE_WIDTH_RANGE*/get ALIASED_LINE_WIDTH_RANGE() {
    return 33902;
  },
  /*web_gl.WebGL.ALIASED_POINT_SIZE_RANGE*/get ALIASED_POINT_SIZE_RANGE() {
    return 33901;
  },
  /*web_gl.WebGL.ALPHA*/get ALPHA() {
    return 6406;
  },
  /*web_gl.WebGL.ALPHA_BITS*/get ALPHA_BITS() {
    return 3413;
  },
  /*web_gl.WebGL.ALREADY_SIGNALED*/get ALREADY_SIGNALED() {
    return 37146;
  },
  /*web_gl.WebGL.ALWAYS*/get ALWAYS() {
    return 519;
  },
  /*web_gl.WebGL.ANY_SAMPLES_PASSED*/get ANY_SAMPLES_PASSED() {
    return 35887;
  },
  /*web_gl.WebGL.ANY_SAMPLES_PASSED_CONSERVATIVE*/get ANY_SAMPLES_PASSED_CONSERVATIVE() {
    return 36202;
  },
  /*web_gl.WebGL.ARRAY_BUFFER*/get ARRAY_BUFFER() {
    return 34962;
  },
  /*web_gl.WebGL.ARRAY_BUFFER_BINDING*/get ARRAY_BUFFER_BINDING() {
    return 34964;
  },
  /*web_gl.WebGL.ATTACHED_SHADERS*/get ATTACHED_SHADERS() {
    return 35717;
  },
  /*web_gl.WebGL.BACK*/get BACK() {
    return 1029;
  },
  /*web_gl.WebGL.BLEND*/get BLEND() {
    return 3042;
  },
  /*web_gl.WebGL.BLEND_COLOR*/get BLEND_COLOR() {
    return 32773;
  },
  /*web_gl.WebGL.BLEND_DST_ALPHA*/get BLEND_DST_ALPHA() {
    return 32970;
  },
  /*web_gl.WebGL.BLEND_DST_RGB*/get BLEND_DST_RGB() {
    return 32968;
  },
  /*web_gl.WebGL.BLEND_EQUATION*/get BLEND_EQUATION() {
    return 32777;
  },
  /*web_gl.WebGL.BLEND_EQUATION_ALPHA*/get BLEND_EQUATION_ALPHA() {
    return 34877;
  },
  /*web_gl.WebGL.BLEND_EQUATION_RGB*/get BLEND_EQUATION_RGB() {
    return 32777;
  },
  /*web_gl.WebGL.BLEND_SRC_ALPHA*/get BLEND_SRC_ALPHA() {
    return 32971;
  },
  /*web_gl.WebGL.BLEND_SRC_RGB*/get BLEND_SRC_RGB() {
    return 32969;
  },
  /*web_gl.WebGL.BLUE_BITS*/get BLUE_BITS() {
    return 3412;
  },
  /*web_gl.WebGL.BOOL*/get BOOL() {
    return 35670;
  },
  /*web_gl.WebGL.BOOL_VEC2*/get BOOL_VEC2() {
    return 35671;
  },
  /*web_gl.WebGL.BOOL_VEC3*/get BOOL_VEC3() {
    return 35672;
  },
  /*web_gl.WebGL.BOOL_VEC4*/get BOOL_VEC4() {
    return 35673;
  },
  /*web_gl.WebGL.BROWSER_DEFAULT_WEBGL*/get BROWSER_DEFAULT_WEBGL() {
    return 37444;
  },
  /*web_gl.WebGL.BUFFER_SIZE*/get BUFFER_SIZE() {
    return 34660;
  },
  /*web_gl.WebGL.BUFFER_USAGE*/get BUFFER_USAGE() {
    return 34661;
  },
  /*web_gl.WebGL.BYTE*/get BYTE() {
    return 5120;
  },
  /*web_gl.WebGL.CCW*/get CCW() {
    return 2305;
  },
  /*web_gl.WebGL.CLAMP_TO_EDGE*/get CLAMP_TO_EDGE() {
    return 33071;
  },
  /*web_gl.WebGL.COLOR*/get COLOR() {
    return 6144;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT0*/get COLOR_ATTACHMENT0() {
    return 36064;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT0_WEBGL*/get COLOR_ATTACHMENT0_WEBGL() {
    return 36064;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT1*/get COLOR_ATTACHMENT1() {
    return 36065;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT10*/get COLOR_ATTACHMENT10() {
    return 36074;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT10_WEBGL*/get COLOR_ATTACHMENT10_WEBGL() {
    return 36074;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT11*/get COLOR_ATTACHMENT11() {
    return 36075;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT11_WEBGL*/get COLOR_ATTACHMENT11_WEBGL() {
    return 36075;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT12*/get COLOR_ATTACHMENT12() {
    return 36076;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT12_WEBGL*/get COLOR_ATTACHMENT12_WEBGL() {
    return 36076;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT13*/get COLOR_ATTACHMENT13() {
    return 36077;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT13_WEBGL*/get COLOR_ATTACHMENT13_WEBGL() {
    return 36077;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT14*/get COLOR_ATTACHMENT14() {
    return 36078;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT14_WEBGL*/get COLOR_ATTACHMENT14_WEBGL() {
    return 36078;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT15*/get COLOR_ATTACHMENT15() {
    return 36079;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT15_WEBGL*/get COLOR_ATTACHMENT15_WEBGL() {
    return 36079;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT1_WEBGL*/get COLOR_ATTACHMENT1_WEBGL() {
    return 36065;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT2*/get COLOR_ATTACHMENT2() {
    return 36066;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT2_WEBGL*/get COLOR_ATTACHMENT2_WEBGL() {
    return 36066;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT3*/get COLOR_ATTACHMENT3() {
    return 36067;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT3_WEBGL*/get COLOR_ATTACHMENT3_WEBGL() {
    return 36067;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT4*/get COLOR_ATTACHMENT4() {
    return 36068;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT4_WEBGL*/get COLOR_ATTACHMENT4_WEBGL() {
    return 36068;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT5*/get COLOR_ATTACHMENT5() {
    return 36069;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT5_WEBGL*/get COLOR_ATTACHMENT5_WEBGL() {
    return 36069;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT6*/get COLOR_ATTACHMENT6() {
    return 36070;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT6_WEBGL*/get COLOR_ATTACHMENT6_WEBGL() {
    return 36070;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT7*/get COLOR_ATTACHMENT7() {
    return 36071;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT7_WEBGL*/get COLOR_ATTACHMENT7_WEBGL() {
    return 36071;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT8*/get COLOR_ATTACHMENT8() {
    return 36072;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT8_WEBGL*/get COLOR_ATTACHMENT8_WEBGL() {
    return 36072;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT9*/get COLOR_ATTACHMENT9() {
    return 36073;
  },
  /*web_gl.WebGL.COLOR_ATTACHMENT9_WEBGL*/get COLOR_ATTACHMENT9_WEBGL() {
    return 36073;
  },
  /*web_gl.WebGL.COLOR_BUFFER_BIT*/get COLOR_BUFFER_BIT() {
    return 16384;
  },
  /*web_gl.WebGL.COLOR_CLEAR_VALUE*/get COLOR_CLEAR_VALUE() {
    return 3106;
  },
  /*web_gl.WebGL.COLOR_WRITEMASK*/get COLOR_WRITEMASK() {
    return 3107;
  },
  /*web_gl.WebGL.COMPARE_REF_TO_TEXTURE*/get COMPARE_REF_TO_TEXTURE() {
    return 34894;
  },
  /*web_gl.WebGL.COMPILE_STATUS*/get COMPILE_STATUS() {
    return 35713;
  },
  /*web_gl.WebGL.COMPRESSED_TEXTURE_FORMATS*/get COMPRESSED_TEXTURE_FORMATS() {
    return 34467;
  },
  /*web_gl.WebGL.CONDITION_SATISFIED*/get CONDITION_SATISFIED() {
    return 37148;
  },
  /*web_gl.WebGL.CONSTANT_ALPHA*/get CONSTANT_ALPHA() {
    return 32771;
  },
  /*web_gl.WebGL.CONSTANT_COLOR*/get CONSTANT_COLOR() {
    return 32769;
  },
  /*web_gl.WebGL.CONTEXT_LOST_WEBGL*/get CONTEXT_LOST_WEBGL() {
    return 37442;
  },
  /*web_gl.WebGL.COPY_READ_BUFFER*/get COPY_READ_BUFFER() {
    return 36662;
  },
  /*web_gl.WebGL.COPY_READ_BUFFER_BINDING*/get COPY_READ_BUFFER_BINDING() {
    return 36662;
  },
  /*web_gl.WebGL.COPY_WRITE_BUFFER*/get COPY_WRITE_BUFFER() {
    return 36663;
  },
  /*web_gl.WebGL.COPY_WRITE_BUFFER_BINDING*/get COPY_WRITE_BUFFER_BINDING() {
    return 36663;
  },
  /*web_gl.WebGL.CULL_FACE*/get CULL_FACE() {
    return 2884;
  },
  /*web_gl.WebGL.CULL_FACE_MODE*/get CULL_FACE_MODE() {
    return 2885;
  },
  /*web_gl.WebGL.CURRENT_PROGRAM*/get CURRENT_PROGRAM() {
    return 35725;
  },
  /*web_gl.WebGL.CURRENT_QUERY*/get CURRENT_QUERY() {
    return 34917;
  },
  /*web_gl.WebGL.CURRENT_VERTEX_ATTRIB*/get CURRENT_VERTEX_ATTRIB() {
    return 34342;
  },
  /*web_gl.WebGL.CW*/get CW() {
    return 2304;
  },
  /*web_gl.WebGL.DECR*/get DECR() {
    return 7683;
  },
  /*web_gl.WebGL.DECR_WRAP*/get DECR_WRAP() {
    return 34056;
  },
  /*web_gl.WebGL.DELETE_STATUS*/get DELETE_STATUS() {
    return 35712;
  },
  /*web_gl.WebGL.DEPTH*/get DEPTH() {
    return 6145;
  },
  /*web_gl.WebGL.DEPTH24_STENCIL8*/get DEPTH24_STENCIL8() {
    return 35056;
  },
  /*web_gl.WebGL.DEPTH32F_STENCIL8*/get DEPTH32F_STENCIL8() {
    return 36013;
  },
  /*web_gl.WebGL.DEPTH_ATTACHMENT*/get DEPTH_ATTACHMENT() {
    return 36096;
  },
  /*web_gl.WebGL.DEPTH_BITS*/get DEPTH_BITS() {
    return 3414;
  },
  /*web_gl.WebGL.DEPTH_BUFFER_BIT*/get DEPTH_BUFFER_BIT() {
    return 256;
  },
  /*web_gl.WebGL.DEPTH_CLEAR_VALUE*/get DEPTH_CLEAR_VALUE() {
    return 2931;
  },
  /*web_gl.WebGL.DEPTH_COMPONENT*/get DEPTH_COMPONENT() {
    return 6402;
  },
  /*web_gl.WebGL.DEPTH_COMPONENT16*/get DEPTH_COMPONENT16() {
    return 33189;
  },
  /*web_gl.WebGL.DEPTH_COMPONENT24*/get DEPTH_COMPONENT24() {
    return 33190;
  },
  /*web_gl.WebGL.DEPTH_COMPONENT32F*/get DEPTH_COMPONENT32F() {
    return 36012;
  },
  /*web_gl.WebGL.DEPTH_FUNC*/get DEPTH_FUNC() {
    return 2932;
  },
  /*web_gl.WebGL.DEPTH_RANGE*/get DEPTH_RANGE() {
    return 2928;
  },
  /*web_gl.WebGL.DEPTH_STENCIL*/get DEPTH_STENCIL() {
    return 34041;
  },
  /*web_gl.WebGL.DEPTH_STENCIL_ATTACHMENT*/get DEPTH_STENCIL_ATTACHMENT() {
    return 33306;
  },
  /*web_gl.WebGL.DEPTH_TEST*/get DEPTH_TEST() {
    return 2929;
  },
  /*web_gl.WebGL.DEPTH_WRITEMASK*/get DEPTH_WRITEMASK() {
    return 2930;
  },
  /*web_gl.WebGL.DITHER*/get DITHER() {
    return 3024;
  },
  /*web_gl.WebGL.DONT_CARE*/get DONT_CARE() {
    return 4352;
  },
  /*web_gl.WebGL.DRAW_BUFFER0*/get DRAW_BUFFER0() {
    return 34853;
  },
  /*web_gl.WebGL.DRAW_BUFFER0_WEBGL*/get DRAW_BUFFER0_WEBGL() {
    return 34853;
  },
  /*web_gl.WebGL.DRAW_BUFFER1*/get DRAW_BUFFER1() {
    return 34854;
  },
  /*web_gl.WebGL.DRAW_BUFFER10*/get DRAW_BUFFER10() {
    return 34863;
  },
  /*web_gl.WebGL.DRAW_BUFFER10_WEBGL*/get DRAW_BUFFER10_WEBGL() {
    return 34863;
  },
  /*web_gl.WebGL.DRAW_BUFFER11*/get DRAW_BUFFER11() {
    return 34864;
  },
  /*web_gl.WebGL.DRAW_BUFFER11_WEBGL*/get DRAW_BUFFER11_WEBGL() {
    return 34864;
  },
  /*web_gl.WebGL.DRAW_BUFFER12*/get DRAW_BUFFER12() {
    return 34865;
  },
  /*web_gl.WebGL.DRAW_BUFFER12_WEBGL*/get DRAW_BUFFER12_WEBGL() {
    return 34865;
  },
  /*web_gl.WebGL.DRAW_BUFFER13*/get DRAW_BUFFER13() {
    return 34866;
  },
  /*web_gl.WebGL.DRAW_BUFFER13_WEBGL*/get DRAW_BUFFER13_WEBGL() {
    return 34866;
  },
  /*web_gl.WebGL.DRAW_BUFFER14*/get DRAW_BUFFER14() {
    return 34867;
  },
  /*web_gl.WebGL.DRAW_BUFFER14_WEBGL*/get DRAW_BUFFER14_WEBGL() {
    return 34867;
  },
  /*web_gl.WebGL.DRAW_BUFFER15*/get DRAW_BUFFER15() {
    return 34868;
  },
  /*web_gl.WebGL.DRAW_BUFFER15_WEBGL*/get DRAW_BUFFER15_WEBGL() {
    return 34868;
  },
  /*web_gl.WebGL.DRAW_BUFFER1_WEBGL*/get DRAW_BUFFER1_WEBGL() {
    return 34854;
  },
  /*web_gl.WebGL.DRAW_BUFFER2*/get DRAW_BUFFER2() {
    return 34855;
  },
  /*web_gl.WebGL.DRAW_BUFFER2_WEBGL*/get DRAW_BUFFER2_WEBGL() {
    return 34855;
  },
  /*web_gl.WebGL.DRAW_BUFFER3*/get DRAW_BUFFER3() {
    return 34856;
  },
  /*web_gl.WebGL.DRAW_BUFFER3_WEBGL*/get DRAW_BUFFER3_WEBGL() {
    return 34856;
  },
  /*web_gl.WebGL.DRAW_BUFFER4*/get DRAW_BUFFER4() {
    return 34857;
  },
  /*web_gl.WebGL.DRAW_BUFFER4_WEBGL*/get DRAW_BUFFER4_WEBGL() {
    return 34857;
  },
  /*web_gl.WebGL.DRAW_BUFFER5*/get DRAW_BUFFER5() {
    return 34858;
  },
  /*web_gl.WebGL.DRAW_BUFFER5_WEBGL*/get DRAW_BUFFER5_WEBGL() {
    return 34858;
  },
  /*web_gl.WebGL.DRAW_BUFFER6*/get DRAW_BUFFER6() {
    return 34859;
  },
  /*web_gl.WebGL.DRAW_BUFFER6_WEBGL*/get DRAW_BUFFER6_WEBGL() {
    return 34859;
  },
  /*web_gl.WebGL.DRAW_BUFFER7*/get DRAW_BUFFER7() {
    return 34860;
  },
  /*web_gl.WebGL.DRAW_BUFFER7_WEBGL*/get DRAW_BUFFER7_WEBGL() {
    return 34860;
  },
  /*web_gl.WebGL.DRAW_BUFFER8*/get DRAW_BUFFER8() {
    return 34861;
  },
  /*web_gl.WebGL.DRAW_BUFFER8_WEBGL*/get DRAW_BUFFER8_WEBGL() {
    return 34861;
  },
  /*web_gl.WebGL.DRAW_BUFFER9*/get DRAW_BUFFER9() {
    return 34862;
  },
  /*web_gl.WebGL.DRAW_BUFFER9_WEBGL*/get DRAW_BUFFER9_WEBGL() {
    return 34862;
  },
  /*web_gl.WebGL.DRAW_FRAMEBUFFER*/get DRAW_FRAMEBUFFER() {
    return 36009;
  },
  /*web_gl.WebGL.DRAW_FRAMEBUFFER_BINDING*/get DRAW_FRAMEBUFFER_BINDING() {
    return 36006;
  },
  /*web_gl.WebGL.DST_ALPHA*/get DST_ALPHA() {
    return 772;
  },
  /*web_gl.WebGL.DST_COLOR*/get DST_COLOR() {
    return 774;
  },
  /*web_gl.WebGL.DYNAMIC_COPY*/get DYNAMIC_COPY() {
    return 35050;
  },
  /*web_gl.WebGL.DYNAMIC_DRAW*/get DYNAMIC_DRAW() {
    return 35048;
  },
  /*web_gl.WebGL.DYNAMIC_READ*/get DYNAMIC_READ() {
    return 35049;
  },
  /*web_gl.WebGL.ELEMENT_ARRAY_BUFFER*/get ELEMENT_ARRAY_BUFFER() {
    return 34963;
  },
  /*web_gl.WebGL.ELEMENT_ARRAY_BUFFER_BINDING*/get ELEMENT_ARRAY_BUFFER_BINDING() {
    return 34965;
  },
  /*web_gl.WebGL.EQUAL*/get EQUAL() {
    return 514;
  },
  /*web_gl.WebGL.FASTEST*/get FASTEST() {
    return 4353;
  },
  /*web_gl.WebGL.FLOAT*/get FLOAT() {
    return 5126;
  },
  /*web_gl.WebGL.FLOAT_32_UNSIGNED_INT_24_8_REV*/get FLOAT_32_UNSIGNED_INT_24_8_REV() {
    return 36269;
  },
  /*web_gl.WebGL.FLOAT_MAT2*/get FLOAT_MAT2() {
    return 35674;
  },
  /*web_gl.WebGL.FLOAT_MAT2x3*/get FLOAT_MAT2x3() {
    return 35685;
  },
  /*web_gl.WebGL.FLOAT_MAT2x4*/get FLOAT_MAT2x4() {
    return 35686;
  },
  /*web_gl.WebGL.FLOAT_MAT3*/get FLOAT_MAT3() {
    return 35675;
  },
  /*web_gl.WebGL.FLOAT_MAT3x2*/get FLOAT_MAT3x2() {
    return 35687;
  },
  /*web_gl.WebGL.FLOAT_MAT3x4*/get FLOAT_MAT3x4() {
    return 35688;
  },
  /*web_gl.WebGL.FLOAT_MAT4*/get FLOAT_MAT4() {
    return 35676;
  },
  /*web_gl.WebGL.FLOAT_MAT4x2*/get FLOAT_MAT4x2() {
    return 35689;
  },
  /*web_gl.WebGL.FLOAT_MAT4x3*/get FLOAT_MAT4x3() {
    return 35690;
  },
  /*web_gl.WebGL.FLOAT_VEC2*/get FLOAT_VEC2() {
    return 35664;
  },
  /*web_gl.WebGL.FLOAT_VEC3*/get FLOAT_VEC3() {
    return 35665;
  },
  /*web_gl.WebGL.FLOAT_VEC4*/get FLOAT_VEC4() {
    return 35666;
  },
  /*web_gl.WebGL.FRAGMENT_SHADER*/get FRAGMENT_SHADER() {
    return 35632;
  },
  /*web_gl.WebGL.FRAGMENT_SHADER_DERIVATIVE_HINT*/get FRAGMENT_SHADER_DERIVATIVE_HINT() {
    return 35723;
  },
  /*web_gl.WebGL.FRAMEBUFFER*/get FRAMEBUFFER() {
    return 36160;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE*/get FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE() {
    return 33301;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE*/get FRAMEBUFFER_ATTACHMENT_BLUE_SIZE() {
    return 33300;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING*/get FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING() {
    return 33296;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE*/get FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE() {
    return 33297;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE*/get FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE() {
    return 33302;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE*/get FRAMEBUFFER_ATTACHMENT_GREEN_SIZE() {
    return 33299;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME*/get FRAMEBUFFER_ATTACHMENT_OBJECT_NAME() {
    return 36049;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE*/get FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE() {
    return 36048;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_RED_SIZE*/get FRAMEBUFFER_ATTACHMENT_RED_SIZE() {
    return 33298;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE*/get FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE() {
    return 33303;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE*/get FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE() {
    return 36051;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER*/get FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER() {
    return 36052;
  },
  /*web_gl.WebGL.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL*/get FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL() {
    return 36050;
  },
  /*web_gl.WebGL.FRAMEBUFFER_BINDING*/get FRAMEBUFFER_BINDING() {
    return 36006;
  },
  /*web_gl.WebGL.FRAMEBUFFER_COMPLETE*/get FRAMEBUFFER_COMPLETE() {
    return 36053;
  },
  /*web_gl.WebGL.FRAMEBUFFER_DEFAULT*/get FRAMEBUFFER_DEFAULT() {
    return 33304;
  },
  /*web_gl.WebGL.FRAMEBUFFER_INCOMPLETE_ATTACHMENT*/get FRAMEBUFFER_INCOMPLETE_ATTACHMENT() {
    return 36054;
  },
  /*web_gl.WebGL.FRAMEBUFFER_INCOMPLETE_DIMENSIONS*/get FRAMEBUFFER_INCOMPLETE_DIMENSIONS() {
    return 36057;
  },
  /*web_gl.WebGL.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT*/get FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT() {
    return 36055;
  },
  /*web_gl.WebGL.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE*/get FRAMEBUFFER_INCOMPLETE_MULTISAMPLE() {
    return 36182;
  },
  /*web_gl.WebGL.FRAMEBUFFER_UNSUPPORTED*/get FRAMEBUFFER_UNSUPPORTED() {
    return 36061;
  },
  /*web_gl.WebGL.FRONT*/get FRONT() {
    return 1028;
  },
  /*web_gl.WebGL.FRONT_AND_BACK*/get FRONT_AND_BACK() {
    return 1032;
  },
  /*web_gl.WebGL.FRONT_FACE*/get FRONT_FACE() {
    return 2886;
  },
  /*web_gl.WebGL.FUNC_ADD*/get FUNC_ADD() {
    return 32774;
  },
  /*web_gl.WebGL.FUNC_REVERSE_SUBTRACT*/get FUNC_REVERSE_SUBTRACT() {
    return 32779;
  },
  /*web_gl.WebGL.FUNC_SUBTRACT*/get FUNC_SUBTRACT() {
    return 32778;
  },
  /*web_gl.WebGL.GENERATE_MIPMAP_HINT*/get GENERATE_MIPMAP_HINT() {
    return 33170;
  },
  /*web_gl.WebGL.GEQUAL*/get GEQUAL() {
    return 518;
  },
  /*web_gl.WebGL.GREATER*/get GREATER() {
    return 516;
  },
  /*web_gl.WebGL.GREEN_BITS*/get GREEN_BITS() {
    return 3411;
  },
  /*web_gl.WebGL.HALF_FLOAT*/get HALF_FLOAT() {
    return 5131;
  },
  /*web_gl.WebGL.HIGH_FLOAT*/get HIGH_FLOAT() {
    return 36338;
  },
  /*web_gl.WebGL.HIGH_INT*/get HIGH_INT() {
    return 36341;
  },
  /*web_gl.WebGL.IMPLEMENTATION_COLOR_READ_FORMAT*/get IMPLEMENTATION_COLOR_READ_FORMAT() {
    return 35739;
  },
  /*web_gl.WebGL.IMPLEMENTATION_COLOR_READ_TYPE*/get IMPLEMENTATION_COLOR_READ_TYPE() {
    return 35738;
  },
  /*web_gl.WebGL.INCR*/get INCR() {
    return 7682;
  },
  /*web_gl.WebGL.INCR_WRAP*/get INCR_WRAP() {
    return 34055;
  },
  /*web_gl.WebGL.INT*/get INT() {
    return 5124;
  },
  /*web_gl.WebGL.INTERLEAVED_ATTRIBS*/get INTERLEAVED_ATTRIBS() {
    return 35980;
  },
  /*web_gl.WebGL.INT_2_10_10_10_REV*/get INT_2_10_10_10_REV() {
    return 36255;
  },
  /*web_gl.WebGL.INT_SAMPLER_2D*/get INT_SAMPLER_2D() {
    return 36298;
  },
  /*web_gl.WebGL.INT_SAMPLER_2D_ARRAY*/get INT_SAMPLER_2D_ARRAY() {
    return 36303;
  },
  /*web_gl.WebGL.INT_SAMPLER_3D*/get INT_SAMPLER_3D() {
    return 36299;
  },
  /*web_gl.WebGL.INT_SAMPLER_CUBE*/get INT_SAMPLER_CUBE() {
    return 36300;
  },
  /*web_gl.WebGL.INT_VEC2*/get INT_VEC2() {
    return 35667;
  },
  /*web_gl.WebGL.INT_VEC3*/get INT_VEC3() {
    return 35668;
  },
  /*web_gl.WebGL.INT_VEC4*/get INT_VEC4() {
    return 35669;
  },
  /*web_gl.WebGL.INVALID_ENUM*/get INVALID_ENUM() {
    return 1280;
  },
  /*web_gl.WebGL.INVALID_FRAMEBUFFER_OPERATION*/get INVALID_FRAMEBUFFER_OPERATION() {
    return 1286;
  },
  /*web_gl.WebGL.INVALID_INDEX*/get INVALID_INDEX() {
    return 4294967295;
  },
  /*web_gl.WebGL.INVALID_OPERATION*/get INVALID_OPERATION() {
    return 1282;
  },
  /*web_gl.WebGL.INVALID_VALUE*/get INVALID_VALUE() {
    return 1281;
  },
  /*web_gl.WebGL.INVERT*/get INVERT() {
    return 5386;
  },
  /*web_gl.WebGL.KEEP*/get KEEP() {
    return 7680;
  },
  /*web_gl.WebGL.LEQUAL*/get LEQUAL() {
    return 515;
  },
  /*web_gl.WebGL.LESS*/get LESS() {
    return 513;
  },
  /*web_gl.WebGL.LINEAR*/get LINEAR() {
    return 9729;
  },
  /*web_gl.WebGL.LINEAR_MIPMAP_LINEAR*/get LINEAR_MIPMAP_LINEAR() {
    return 9987;
  },
  /*web_gl.WebGL.LINEAR_MIPMAP_NEAREST*/get LINEAR_MIPMAP_NEAREST() {
    return 9985;
  },
  /*web_gl.WebGL.LINES*/get LINES() {
    return 1;
  },
  /*web_gl.WebGL.LINE_LOOP*/get LINE_LOOP() {
    return 2;
  },
  /*web_gl.WebGL.LINE_STRIP*/get LINE_STRIP() {
    return 3;
  },
  /*web_gl.WebGL.LINE_WIDTH*/get LINE_WIDTH() {
    return 2849;
  },
  /*web_gl.WebGL.LINK_STATUS*/get LINK_STATUS() {
    return 35714;
  },
  /*web_gl.WebGL.LOW_FLOAT*/get LOW_FLOAT() {
    return 36336;
  },
  /*web_gl.WebGL.LOW_INT*/get LOW_INT() {
    return 36339;
  },
  /*web_gl.WebGL.LUMINANCE*/get LUMINANCE() {
    return 6409;
  },
  /*web_gl.WebGL.LUMINANCE_ALPHA*/get LUMINANCE_ALPHA() {
    return 6410;
  },
  /*web_gl.WebGL.MAX*/get MAX() {
    return 32776;
  },
  /*web_gl.WebGL.MAX_3D_TEXTURE_SIZE*/get MAX_3D_TEXTURE_SIZE() {
    return 32883;
  },
  /*web_gl.WebGL.MAX_ARRAY_TEXTURE_LAYERS*/get MAX_ARRAY_TEXTURE_LAYERS() {
    return 35071;
  },
  /*web_gl.WebGL.MAX_CLIENT_WAIT_TIMEOUT_WEBGL*/get MAX_CLIENT_WAIT_TIMEOUT_WEBGL() {
    return 37447;
  },
  /*web_gl.WebGL.MAX_COLOR_ATTACHMENTS*/get MAX_COLOR_ATTACHMENTS() {
    return 36063;
  },
  /*web_gl.WebGL.MAX_COLOR_ATTACHMENTS_WEBGL*/get MAX_COLOR_ATTACHMENTS_WEBGL() {
    return 36063;
  },
  /*web_gl.WebGL.MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS*/get MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS() {
    return 35379;
  },
  /*web_gl.WebGL.MAX_COMBINED_TEXTURE_IMAGE_UNITS*/get MAX_COMBINED_TEXTURE_IMAGE_UNITS() {
    return 35661;
  },
  /*web_gl.WebGL.MAX_COMBINED_UNIFORM_BLOCKS*/get MAX_COMBINED_UNIFORM_BLOCKS() {
    return 35374;
  },
  /*web_gl.WebGL.MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS*/get MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS() {
    return 35377;
  },
  /*web_gl.WebGL.MAX_CUBE_MAP_TEXTURE_SIZE*/get MAX_CUBE_MAP_TEXTURE_SIZE() {
    return 34076;
  },
  /*web_gl.WebGL.MAX_DRAW_BUFFERS*/get MAX_DRAW_BUFFERS() {
    return 34852;
  },
  /*web_gl.WebGL.MAX_DRAW_BUFFERS_WEBGL*/get MAX_DRAW_BUFFERS_WEBGL() {
    return 34852;
  },
  /*web_gl.WebGL.MAX_ELEMENTS_INDICES*/get MAX_ELEMENTS_INDICES() {
    return 33001;
  },
  /*web_gl.WebGL.MAX_ELEMENTS_VERTICES*/get MAX_ELEMENTS_VERTICES() {
    return 33000;
  },
  /*web_gl.WebGL.MAX_ELEMENT_INDEX*/get MAX_ELEMENT_INDEX() {
    return 36203;
  },
  /*web_gl.WebGL.MAX_FRAGMENT_INPUT_COMPONENTS*/get MAX_FRAGMENT_INPUT_COMPONENTS() {
    return 37157;
  },
  /*web_gl.WebGL.MAX_FRAGMENT_UNIFORM_BLOCKS*/get MAX_FRAGMENT_UNIFORM_BLOCKS() {
    return 35373;
  },
  /*web_gl.WebGL.MAX_FRAGMENT_UNIFORM_COMPONENTS*/get MAX_FRAGMENT_UNIFORM_COMPONENTS() {
    return 35657;
  },
  /*web_gl.WebGL.MAX_FRAGMENT_UNIFORM_VECTORS*/get MAX_FRAGMENT_UNIFORM_VECTORS() {
    return 36349;
  },
  /*web_gl.WebGL.MAX_PROGRAM_TEXEL_OFFSET*/get MAX_PROGRAM_TEXEL_OFFSET() {
    return 35077;
  },
  /*web_gl.WebGL.MAX_RENDERBUFFER_SIZE*/get MAX_RENDERBUFFER_SIZE() {
    return 34024;
  },
  /*web_gl.WebGL.MAX_SAMPLES*/get MAX_SAMPLES() {
    return 36183;
  },
  /*web_gl.WebGL.MAX_SERVER_WAIT_TIMEOUT*/get MAX_SERVER_WAIT_TIMEOUT() {
    return 37137;
  },
  /*web_gl.WebGL.MAX_TEXTURE_IMAGE_UNITS*/get MAX_TEXTURE_IMAGE_UNITS() {
    return 34930;
  },
  /*web_gl.WebGL.MAX_TEXTURE_LOD_BIAS*/get MAX_TEXTURE_LOD_BIAS() {
    return 34045;
  },
  /*web_gl.WebGL.MAX_TEXTURE_SIZE*/get MAX_TEXTURE_SIZE() {
    return 3379;
  },
  /*web_gl.WebGL.MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS*/get MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS() {
    return 35978;
  },
  /*web_gl.WebGL.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS*/get MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS() {
    return 35979;
  },
  /*web_gl.WebGL.MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS*/get MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS() {
    return 35968;
  },
  /*web_gl.WebGL.MAX_UNIFORM_BLOCK_SIZE*/get MAX_UNIFORM_BLOCK_SIZE() {
    return 35376;
  },
  /*web_gl.WebGL.MAX_UNIFORM_BUFFER_BINDINGS*/get MAX_UNIFORM_BUFFER_BINDINGS() {
    return 35375;
  },
  /*web_gl.WebGL.MAX_VARYING_COMPONENTS*/get MAX_VARYING_COMPONENTS() {
    return 35659;
  },
  /*web_gl.WebGL.MAX_VARYING_VECTORS*/get MAX_VARYING_VECTORS() {
    return 36348;
  },
  /*web_gl.WebGL.MAX_VERTEX_ATTRIBS*/get MAX_VERTEX_ATTRIBS() {
    return 34921;
  },
  /*web_gl.WebGL.MAX_VERTEX_OUTPUT_COMPONENTS*/get MAX_VERTEX_OUTPUT_COMPONENTS() {
    return 37154;
  },
  /*web_gl.WebGL.MAX_VERTEX_TEXTURE_IMAGE_UNITS*/get MAX_VERTEX_TEXTURE_IMAGE_UNITS() {
    return 35660;
  },
  /*web_gl.WebGL.MAX_VERTEX_UNIFORM_BLOCKS*/get MAX_VERTEX_UNIFORM_BLOCKS() {
    return 35371;
  },
  /*web_gl.WebGL.MAX_VERTEX_UNIFORM_COMPONENTS*/get MAX_VERTEX_UNIFORM_COMPONENTS() {
    return 35658;
  },
  /*web_gl.WebGL.MAX_VERTEX_UNIFORM_VECTORS*/get MAX_VERTEX_UNIFORM_VECTORS() {
    return 36347;
  },
  /*web_gl.WebGL.MAX_VIEWPORT_DIMS*/get MAX_VIEWPORT_DIMS() {
    return 3386;
  },
  /*web_gl.WebGL.MEDIUM_FLOAT*/get MEDIUM_FLOAT() {
    return 36337;
  },
  /*web_gl.WebGL.MEDIUM_INT*/get MEDIUM_INT() {
    return 36340;
  },
  /*web_gl.WebGL.MIN*/get MIN() {
    return 32775;
  },
  /*web_gl.WebGL.MIN_PROGRAM_TEXEL_OFFSET*/get MIN_PROGRAM_TEXEL_OFFSET() {
    return 35076;
  },
  /*web_gl.WebGL.MIRRORED_REPEAT*/get MIRRORED_REPEAT() {
    return 33648;
  },
  /*web_gl.WebGL.NEAREST*/get NEAREST() {
    return 9728;
  },
  /*web_gl.WebGL.NEAREST_MIPMAP_LINEAR*/get NEAREST_MIPMAP_LINEAR() {
    return 9986;
  },
  /*web_gl.WebGL.NEAREST_MIPMAP_NEAREST*/get NEAREST_MIPMAP_NEAREST() {
    return 9984;
  },
  /*web_gl.WebGL.NEVER*/get NEVER() {
    return 512;
  },
  /*web_gl.WebGL.NICEST*/get NICEST() {
    return 4354;
  },
  /*web_gl.WebGL.NONE*/get NONE() {
    return 0;
  },
  /*web_gl.WebGL.NOTEQUAL*/get NOTEQUAL() {
    return 517;
  },
  /*web_gl.WebGL.NO_ERROR*/get NO_ERROR() {
    return 0;
  },
  /*web_gl.WebGL.OBJECT_TYPE*/get OBJECT_TYPE() {
    return 37138;
  },
  /*web_gl.WebGL.ONE*/get ONE() {
    return 1;
  },
  /*web_gl.WebGL.ONE_MINUS_CONSTANT_ALPHA*/get ONE_MINUS_CONSTANT_ALPHA() {
    return 32772;
  },
  /*web_gl.WebGL.ONE_MINUS_CONSTANT_COLOR*/get ONE_MINUS_CONSTANT_COLOR() {
    return 32770;
  },
  /*web_gl.WebGL.ONE_MINUS_DST_ALPHA*/get ONE_MINUS_DST_ALPHA() {
    return 773;
  },
  /*web_gl.WebGL.ONE_MINUS_DST_COLOR*/get ONE_MINUS_DST_COLOR() {
    return 775;
  },
  /*web_gl.WebGL.ONE_MINUS_SRC_ALPHA*/get ONE_MINUS_SRC_ALPHA() {
    return 771;
  },
  /*web_gl.WebGL.ONE_MINUS_SRC_COLOR*/get ONE_MINUS_SRC_COLOR() {
    return 769;
  },
  /*web_gl.WebGL.OUT_OF_MEMORY*/get OUT_OF_MEMORY() {
    return 1285;
  },
  /*web_gl.WebGL.PACK_ALIGNMENT*/get PACK_ALIGNMENT() {
    return 3333;
  },
  /*web_gl.WebGL.PACK_ROW_LENGTH*/get PACK_ROW_LENGTH() {
    return 3330;
  },
  /*web_gl.WebGL.PACK_SKIP_PIXELS*/get PACK_SKIP_PIXELS() {
    return 3332;
  },
  /*web_gl.WebGL.PACK_SKIP_ROWS*/get PACK_SKIP_ROWS() {
    return 3331;
  },
  /*web_gl.WebGL.PIXEL_PACK_BUFFER*/get PIXEL_PACK_BUFFER() {
    return 35051;
  },
  /*web_gl.WebGL.PIXEL_PACK_BUFFER_BINDING*/get PIXEL_PACK_BUFFER_BINDING() {
    return 35053;
  },
  /*web_gl.WebGL.PIXEL_UNPACK_BUFFER*/get PIXEL_UNPACK_BUFFER() {
    return 35052;
  },
  /*web_gl.WebGL.PIXEL_UNPACK_BUFFER_BINDING*/get PIXEL_UNPACK_BUFFER_BINDING() {
    return 35055;
  },
  /*web_gl.WebGL.POINTS*/get POINTS() {
    return 0;
  },
  /*web_gl.WebGL.POLYGON_OFFSET_FACTOR*/get POLYGON_OFFSET_FACTOR() {
    return 32824;
  },
  /*web_gl.WebGL.POLYGON_OFFSET_FILL*/get POLYGON_OFFSET_FILL() {
    return 32823;
  },
  /*web_gl.WebGL.POLYGON_OFFSET_UNITS*/get POLYGON_OFFSET_UNITS() {
    return 10752;
  },
  /*web_gl.WebGL.QUERY_RESULT*/get QUERY_RESULT() {
    return 34918;
  },
  /*web_gl.WebGL.QUERY_RESULT_AVAILABLE*/get QUERY_RESULT_AVAILABLE() {
    return 34919;
  },
  /*web_gl.WebGL.R11F_G11F_B10F*/get R11F_G11F_B10F() {
    return 35898;
  },
  /*web_gl.WebGL.R16F*/get R16F() {
    return 33325;
  },
  /*web_gl.WebGL.R16I*/get R16I() {
    return 33331;
  },
  /*web_gl.WebGL.R16UI*/get R16UI() {
    return 33332;
  },
  /*web_gl.WebGL.R32F*/get R32F() {
    return 33326;
  },
  /*web_gl.WebGL.R32I*/get R32I() {
    return 33333;
  },
  /*web_gl.WebGL.R32UI*/get R32UI() {
    return 33334;
  },
  /*web_gl.WebGL.R8*/get R8() {
    return 33321;
  },
  /*web_gl.WebGL.R8I*/get R8I() {
    return 33329;
  },
  /*web_gl.WebGL.R8UI*/get R8UI() {
    return 33330;
  },
  /*web_gl.WebGL.R8_SNORM*/get R8_SNORM() {
    return 36756;
  },
  /*web_gl.WebGL.RASTERIZER_DISCARD*/get RASTERIZER_DISCARD() {
    return 35977;
  },
  /*web_gl.WebGL.READ_BUFFER*/get READ_BUFFER() {
    return 3074;
  },
  /*web_gl.WebGL.READ_FRAMEBUFFER*/get READ_FRAMEBUFFER() {
    return 36008;
  },
  /*web_gl.WebGL.READ_FRAMEBUFFER_BINDING*/get READ_FRAMEBUFFER_BINDING() {
    return 36010;
  },
  /*web_gl.WebGL.RED*/get RED() {
    return 6403;
  },
  /*web_gl.WebGL.RED_BITS*/get RED_BITS() {
    return 3410;
  },
  /*web_gl.WebGL.RED_INTEGER*/get RED_INTEGER() {
    return 36244;
  },
  /*web_gl.WebGL.RENDERBUFFER*/get RENDERBUFFER() {
    return 36161;
  },
  /*web_gl.WebGL.RENDERBUFFER_ALPHA_SIZE*/get RENDERBUFFER_ALPHA_SIZE() {
    return 36179;
  },
  /*web_gl.WebGL.RENDERBUFFER_BINDING*/get RENDERBUFFER_BINDING() {
    return 36007;
  },
  /*web_gl.WebGL.RENDERBUFFER_BLUE_SIZE*/get RENDERBUFFER_BLUE_SIZE() {
    return 36178;
  },
  /*web_gl.WebGL.RENDERBUFFER_DEPTH_SIZE*/get RENDERBUFFER_DEPTH_SIZE() {
    return 36180;
  },
  /*web_gl.WebGL.RENDERBUFFER_GREEN_SIZE*/get RENDERBUFFER_GREEN_SIZE() {
    return 36177;
  },
  /*web_gl.WebGL.RENDERBUFFER_HEIGHT*/get RENDERBUFFER_HEIGHT() {
    return 36163;
  },
  /*web_gl.WebGL.RENDERBUFFER_INTERNAL_FORMAT*/get RENDERBUFFER_INTERNAL_FORMAT() {
    return 36164;
  },
  /*web_gl.WebGL.RENDERBUFFER_RED_SIZE*/get RENDERBUFFER_RED_SIZE() {
    return 36176;
  },
  /*web_gl.WebGL.RENDERBUFFER_SAMPLES*/get RENDERBUFFER_SAMPLES() {
    return 36011;
  },
  /*web_gl.WebGL.RENDERBUFFER_STENCIL_SIZE*/get RENDERBUFFER_STENCIL_SIZE() {
    return 36181;
  },
  /*web_gl.WebGL.RENDERBUFFER_WIDTH*/get RENDERBUFFER_WIDTH() {
    return 36162;
  },
  /*web_gl.WebGL.RENDERER*/get RENDERER() {
    return 7937;
  },
  /*web_gl.WebGL.REPEAT*/get REPEAT() {
    return 10497;
  },
  /*web_gl.WebGL.REPLACE*/get REPLACE() {
    return 7681;
  },
  /*web_gl.WebGL.RG*/get RG() {
    return 33319;
  },
  /*web_gl.WebGL.RG16F*/get RG16F() {
    return 33327;
  },
  /*web_gl.WebGL.RG16I*/get RG16I() {
    return 33337;
  },
  /*web_gl.WebGL.RG16UI*/get RG16UI() {
    return 33338;
  },
  /*web_gl.WebGL.RG32F*/get RG32F() {
    return 33328;
  },
  /*web_gl.WebGL.RG32I*/get RG32I() {
    return 33339;
  },
  /*web_gl.WebGL.RG32UI*/get RG32UI() {
    return 33340;
  },
  /*web_gl.WebGL.RG8*/get RG8() {
    return 33323;
  },
  /*web_gl.WebGL.RG8I*/get RG8I() {
    return 33335;
  },
  /*web_gl.WebGL.RG8UI*/get RG8UI() {
    return 33336;
  },
  /*web_gl.WebGL.RG8_SNORM*/get RG8_SNORM() {
    return 36757;
  },
  /*web_gl.WebGL.RGB*/get RGB() {
    return 6407;
  },
  /*web_gl.WebGL.RGB10_A2*/get RGB10_A2() {
    return 32857;
  },
  /*web_gl.WebGL.RGB10_A2UI*/get RGB10_A2UI() {
    return 36975;
  },
  /*web_gl.WebGL.RGB16F*/get RGB16F() {
    return 34843;
  },
  /*web_gl.WebGL.RGB16I*/get RGB16I() {
    return 36233;
  },
  /*web_gl.WebGL.RGB16UI*/get RGB16UI() {
    return 36215;
  },
  /*web_gl.WebGL.RGB32F*/get RGB32F() {
    return 34837;
  },
  /*web_gl.WebGL.RGB32I*/get RGB32I() {
    return 36227;
  },
  /*web_gl.WebGL.RGB32UI*/get RGB32UI() {
    return 36209;
  },
  /*web_gl.WebGL.RGB565*/get RGB565() {
    return 36194;
  },
  /*web_gl.WebGL.RGB5_A1*/get RGB5_A1() {
    return 32855;
  },
  /*web_gl.WebGL.RGB8*/get RGB8() {
    return 32849;
  },
  /*web_gl.WebGL.RGB8I*/get RGB8I() {
    return 36239;
  },
  /*web_gl.WebGL.RGB8UI*/get RGB8UI() {
    return 36221;
  },
  /*web_gl.WebGL.RGB8_SNORM*/get RGB8_SNORM() {
    return 36758;
  },
  /*web_gl.WebGL.RGB9_E5*/get RGB9_E5() {
    return 35901;
  },
  /*web_gl.WebGL.RGBA*/get RGBA() {
    return 6408;
  },
  /*web_gl.WebGL.RGBA16F*/get RGBA16F() {
    return 34842;
  },
  /*web_gl.WebGL.RGBA16I*/get RGBA16I() {
    return 36232;
  },
  /*web_gl.WebGL.RGBA16UI*/get RGBA16UI() {
    return 36214;
  },
  /*web_gl.WebGL.RGBA32F*/get RGBA32F() {
    return 34836;
  },
  /*web_gl.WebGL.RGBA32I*/get RGBA32I() {
    return 36226;
  },
  /*web_gl.WebGL.RGBA32UI*/get RGBA32UI() {
    return 36208;
  },
  /*web_gl.WebGL.RGBA4*/get RGBA4() {
    return 32854;
  },
  /*web_gl.WebGL.RGBA8*/get RGBA8() {
    return 32856;
  },
  /*web_gl.WebGL.RGBA8I*/get RGBA8I() {
    return 36238;
  },
  /*web_gl.WebGL.RGBA8UI*/get RGBA8UI() {
    return 36220;
  },
  /*web_gl.WebGL.RGBA8_SNORM*/get RGBA8_SNORM() {
    return 36759;
  },
  /*web_gl.WebGL.RGBA_INTEGER*/get RGBA_INTEGER() {
    return 36249;
  },
  /*web_gl.WebGL.RGB_INTEGER*/get RGB_INTEGER() {
    return 36248;
  },
  /*web_gl.WebGL.RG_INTEGER*/get RG_INTEGER() {
    return 33320;
  },
  /*web_gl.WebGL.SAMPLER_2D*/get SAMPLER_2D() {
    return 35678;
  },
  /*web_gl.WebGL.SAMPLER_2D_ARRAY*/get SAMPLER_2D_ARRAY() {
    return 36289;
  },
  /*web_gl.WebGL.SAMPLER_2D_ARRAY_SHADOW*/get SAMPLER_2D_ARRAY_SHADOW() {
    return 36292;
  },
  /*web_gl.WebGL.SAMPLER_2D_SHADOW*/get SAMPLER_2D_SHADOW() {
    return 35682;
  },
  /*web_gl.WebGL.SAMPLER_3D*/get SAMPLER_3D() {
    return 35679;
  },
  /*web_gl.WebGL.SAMPLER_BINDING*/get SAMPLER_BINDING() {
    return 35097;
  },
  /*web_gl.WebGL.SAMPLER_CUBE*/get SAMPLER_CUBE() {
    return 35680;
  },
  /*web_gl.WebGL.SAMPLER_CUBE_SHADOW*/get SAMPLER_CUBE_SHADOW() {
    return 36293;
  },
  /*web_gl.WebGL.SAMPLES*/get SAMPLES() {
    return 32937;
  },
  /*web_gl.WebGL.SAMPLE_ALPHA_TO_COVERAGE*/get SAMPLE_ALPHA_TO_COVERAGE() {
    return 32926;
  },
  /*web_gl.WebGL.SAMPLE_BUFFERS*/get SAMPLE_BUFFERS() {
    return 32936;
  },
  /*web_gl.WebGL.SAMPLE_COVERAGE*/get SAMPLE_COVERAGE() {
    return 32928;
  },
  /*web_gl.WebGL.SAMPLE_COVERAGE_INVERT*/get SAMPLE_COVERAGE_INVERT() {
    return 32939;
  },
  /*web_gl.WebGL.SAMPLE_COVERAGE_VALUE*/get SAMPLE_COVERAGE_VALUE() {
    return 32938;
  },
  /*web_gl.WebGL.SCISSOR_BOX*/get SCISSOR_BOX() {
    return 3088;
  },
  /*web_gl.WebGL.SCISSOR_TEST*/get SCISSOR_TEST() {
    return 3089;
  },
  /*web_gl.WebGL.SEPARATE_ATTRIBS*/get SEPARATE_ATTRIBS() {
    return 35981;
  },
  /*web_gl.WebGL.SHADER_TYPE*/get SHADER_TYPE() {
    return 35663;
  },
  /*web_gl.WebGL.SHADING_LANGUAGE_VERSION*/get SHADING_LANGUAGE_VERSION() {
    return 35724;
  },
  /*web_gl.WebGL.SHORT*/get SHORT() {
    return 5122;
  },
  /*web_gl.WebGL.SIGNALED*/get SIGNALED() {
    return 37145;
  },
  /*web_gl.WebGL.SIGNED_NORMALIZED*/get SIGNED_NORMALIZED() {
    return 36764;
  },
  /*web_gl.WebGL.SRC_ALPHA*/get SRC_ALPHA() {
    return 770;
  },
  /*web_gl.WebGL.SRC_ALPHA_SATURATE*/get SRC_ALPHA_SATURATE() {
    return 776;
  },
  /*web_gl.WebGL.SRC_COLOR*/get SRC_COLOR() {
    return 768;
  },
  /*web_gl.WebGL.SRGB*/get SRGB() {
    return 35904;
  },
  /*web_gl.WebGL.SRGB8*/get SRGB8() {
    return 35905;
  },
  /*web_gl.WebGL.SRGB8_ALPHA8*/get SRGB8_ALPHA8() {
    return 35907;
  },
  /*web_gl.WebGL.STATIC_COPY*/get STATIC_COPY() {
    return 35046;
  },
  /*web_gl.WebGL.STATIC_DRAW*/get STATIC_DRAW() {
    return 35044;
  },
  /*web_gl.WebGL.STATIC_READ*/get STATIC_READ() {
    return 35045;
  },
  /*web_gl.WebGL.STENCIL*/get STENCIL() {
    return 6146;
  },
  /*web_gl.WebGL.STENCIL_ATTACHMENT*/get STENCIL_ATTACHMENT() {
    return 36128;
  },
  /*web_gl.WebGL.STENCIL_BACK_FAIL*/get STENCIL_BACK_FAIL() {
    return 34817;
  },
  /*web_gl.WebGL.STENCIL_BACK_FUNC*/get STENCIL_BACK_FUNC() {
    return 34816;
  },
  /*web_gl.WebGL.STENCIL_BACK_PASS_DEPTH_FAIL*/get STENCIL_BACK_PASS_DEPTH_FAIL() {
    return 34818;
  },
  /*web_gl.WebGL.STENCIL_BACK_PASS_DEPTH_PASS*/get STENCIL_BACK_PASS_DEPTH_PASS() {
    return 34819;
  },
  /*web_gl.WebGL.STENCIL_BACK_REF*/get STENCIL_BACK_REF() {
    return 36003;
  },
  /*web_gl.WebGL.STENCIL_BACK_VALUE_MASK*/get STENCIL_BACK_VALUE_MASK() {
    return 36004;
  },
  /*web_gl.WebGL.STENCIL_BACK_WRITEMASK*/get STENCIL_BACK_WRITEMASK() {
    return 36005;
  },
  /*web_gl.WebGL.STENCIL_BITS*/get STENCIL_BITS() {
    return 3415;
  },
  /*web_gl.WebGL.STENCIL_BUFFER_BIT*/get STENCIL_BUFFER_BIT() {
    return 1024;
  },
  /*web_gl.WebGL.STENCIL_CLEAR_VALUE*/get STENCIL_CLEAR_VALUE() {
    return 2961;
  },
  /*web_gl.WebGL.STENCIL_FAIL*/get STENCIL_FAIL() {
    return 2964;
  },
  /*web_gl.WebGL.STENCIL_FUNC*/get STENCIL_FUNC() {
    return 2962;
  },
  /*web_gl.WebGL.STENCIL_INDEX8*/get STENCIL_INDEX8() {
    return 36168;
  },
  /*web_gl.WebGL.STENCIL_PASS_DEPTH_FAIL*/get STENCIL_PASS_DEPTH_FAIL() {
    return 2965;
  },
  /*web_gl.WebGL.STENCIL_PASS_DEPTH_PASS*/get STENCIL_PASS_DEPTH_PASS() {
    return 2966;
  },
  /*web_gl.WebGL.STENCIL_REF*/get STENCIL_REF() {
    return 2967;
  },
  /*web_gl.WebGL.STENCIL_TEST*/get STENCIL_TEST() {
    return 2960;
  },
  /*web_gl.WebGL.STENCIL_VALUE_MASK*/get STENCIL_VALUE_MASK() {
    return 2963;
  },
  /*web_gl.WebGL.STENCIL_WRITEMASK*/get STENCIL_WRITEMASK() {
    return 2968;
  },
  /*web_gl.WebGL.STREAM_COPY*/get STREAM_COPY() {
    return 35042;
  },
  /*web_gl.WebGL.STREAM_DRAW*/get STREAM_DRAW() {
    return 35040;
  },
  /*web_gl.WebGL.STREAM_READ*/get STREAM_READ() {
    return 35041;
  },
  /*web_gl.WebGL.SUBPIXEL_BITS*/get SUBPIXEL_BITS() {
    return 3408;
  },
  /*web_gl.WebGL.SYNC_CONDITION*/get SYNC_CONDITION() {
    return 37139;
  },
  /*web_gl.WebGL.SYNC_FENCE*/get SYNC_FENCE() {
    return 37142;
  },
  /*web_gl.WebGL.SYNC_FLAGS*/get SYNC_FLAGS() {
    return 37141;
  },
  /*web_gl.WebGL.SYNC_FLUSH_COMMANDS_BIT*/get SYNC_FLUSH_COMMANDS_BIT() {
    return 1;
  },
  /*web_gl.WebGL.SYNC_GPU_COMMANDS_COMPLETE*/get SYNC_GPU_COMMANDS_COMPLETE() {
    return 37143;
  },
  /*web_gl.WebGL.SYNC_STATUS*/get SYNC_STATUS() {
    return 37140;
  },
  /*web_gl.WebGL.TEXTURE*/get TEXTURE() {
    return 5890;
  },
  /*web_gl.WebGL.TEXTURE0*/get TEXTURE0() {
    return 33984;
  },
  /*web_gl.WebGL.TEXTURE1*/get TEXTURE1() {
    return 33985;
  },
  /*web_gl.WebGL.TEXTURE10*/get TEXTURE10() {
    return 33994;
  },
  /*web_gl.WebGL.TEXTURE11*/get TEXTURE11() {
    return 33995;
  },
  /*web_gl.WebGL.TEXTURE12*/get TEXTURE12() {
    return 33996;
  },
  /*web_gl.WebGL.TEXTURE13*/get TEXTURE13() {
    return 33997;
  },
  /*web_gl.WebGL.TEXTURE14*/get TEXTURE14() {
    return 33998;
  },
  /*web_gl.WebGL.TEXTURE15*/get TEXTURE15() {
    return 33999;
  },
  /*web_gl.WebGL.TEXTURE16*/get TEXTURE16() {
    return 34000;
  },
  /*web_gl.WebGL.TEXTURE17*/get TEXTURE17() {
    return 34001;
  },
  /*web_gl.WebGL.TEXTURE18*/get TEXTURE18() {
    return 34002;
  },
  /*web_gl.WebGL.TEXTURE19*/get TEXTURE19() {
    return 34003;
  },
  /*web_gl.WebGL.TEXTURE2*/get TEXTURE2() {
    return 33986;
  },
  /*web_gl.WebGL.TEXTURE20*/get TEXTURE20() {
    return 34004;
  },
  /*web_gl.WebGL.TEXTURE21*/get TEXTURE21() {
    return 34005;
  },
  /*web_gl.WebGL.TEXTURE22*/get TEXTURE22() {
    return 34006;
  },
  /*web_gl.WebGL.TEXTURE23*/get TEXTURE23() {
    return 34007;
  },
  /*web_gl.WebGL.TEXTURE24*/get TEXTURE24() {
    return 34008;
  },
  /*web_gl.WebGL.TEXTURE25*/get TEXTURE25() {
    return 34009;
  },
  /*web_gl.WebGL.TEXTURE26*/get TEXTURE26() {
    return 34010;
  },
  /*web_gl.WebGL.TEXTURE27*/get TEXTURE27() {
    return 34011;
  },
  /*web_gl.WebGL.TEXTURE28*/get TEXTURE28() {
    return 34012;
  },
  /*web_gl.WebGL.TEXTURE29*/get TEXTURE29() {
    return 34013;
  },
  /*web_gl.WebGL.TEXTURE3*/get TEXTURE3() {
    return 33987;
  },
  /*web_gl.WebGL.TEXTURE30*/get TEXTURE30() {
    return 34014;
  },
  /*web_gl.WebGL.TEXTURE31*/get TEXTURE31() {
    return 34015;
  },
  /*web_gl.WebGL.TEXTURE4*/get TEXTURE4() {
    return 33988;
  },
  /*web_gl.WebGL.TEXTURE5*/get TEXTURE5() {
    return 33989;
  },
  /*web_gl.WebGL.TEXTURE6*/get TEXTURE6() {
    return 33990;
  },
  /*web_gl.WebGL.TEXTURE7*/get TEXTURE7() {
    return 33991;
  },
  /*web_gl.WebGL.TEXTURE8*/get TEXTURE8() {
    return 33992;
  },
  /*web_gl.WebGL.TEXTURE9*/get TEXTURE9() {
    return 33993;
  },
  /*web_gl.WebGL.TEXTURE_2D*/get TEXTURE_2D() {
    return 3553;
  },
  /*web_gl.WebGL.TEXTURE_2D_ARRAY*/get TEXTURE_2D_ARRAY() {
    return 35866;
  },
  /*web_gl.WebGL.TEXTURE_3D*/get TEXTURE_3D() {
    return 32879;
  },
  /*web_gl.WebGL.TEXTURE_BASE_LEVEL*/get TEXTURE_BASE_LEVEL() {
    return 33084;
  },
  /*web_gl.WebGL.TEXTURE_BINDING_2D*/get TEXTURE_BINDING_2D() {
    return 32873;
  },
  /*web_gl.WebGL.TEXTURE_BINDING_2D_ARRAY*/get TEXTURE_BINDING_2D_ARRAY() {
    return 35869;
  },
  /*web_gl.WebGL.TEXTURE_BINDING_3D*/get TEXTURE_BINDING_3D() {
    return 32874;
  },
  /*web_gl.WebGL.TEXTURE_BINDING_CUBE_MAP*/get TEXTURE_BINDING_CUBE_MAP() {
    return 34068;
  },
  /*web_gl.WebGL.TEXTURE_COMPARE_FUNC*/get TEXTURE_COMPARE_FUNC() {
    return 34893;
  },
  /*web_gl.WebGL.TEXTURE_COMPARE_MODE*/get TEXTURE_COMPARE_MODE() {
    return 34892;
  },
  /*web_gl.WebGL.TEXTURE_CUBE_MAP*/get TEXTURE_CUBE_MAP() {
    return 34067;
  },
  /*web_gl.WebGL.TEXTURE_CUBE_MAP_NEGATIVE_X*/get TEXTURE_CUBE_MAP_NEGATIVE_X() {
    return 34070;
  },
  /*web_gl.WebGL.TEXTURE_CUBE_MAP_NEGATIVE_Y*/get TEXTURE_CUBE_MAP_NEGATIVE_Y() {
    return 34072;
  },
  /*web_gl.WebGL.TEXTURE_CUBE_MAP_NEGATIVE_Z*/get TEXTURE_CUBE_MAP_NEGATIVE_Z() {
    return 34074;
  },
  /*web_gl.WebGL.TEXTURE_CUBE_MAP_POSITIVE_X*/get TEXTURE_CUBE_MAP_POSITIVE_X() {
    return 34069;
  },
  /*web_gl.WebGL.TEXTURE_CUBE_MAP_POSITIVE_Y*/get TEXTURE_CUBE_MAP_POSITIVE_Y() {
    return 34071;
  },
  /*web_gl.WebGL.TEXTURE_CUBE_MAP_POSITIVE_Z*/get TEXTURE_CUBE_MAP_POSITIVE_Z() {
    return 34073;
  },
  /*web_gl.WebGL.TEXTURE_IMMUTABLE_FORMAT*/get TEXTURE_IMMUTABLE_FORMAT() {
    return 37167;
  },
  /*web_gl.WebGL.TEXTURE_IMMUTABLE_LEVELS*/get TEXTURE_IMMUTABLE_LEVELS() {
    return 33503;
  },
  /*web_gl.WebGL.TEXTURE_MAG_FILTER*/get TEXTURE_MAG_FILTER() {
    return 10240;
  },
  /*web_gl.WebGL.TEXTURE_MAX_LEVEL*/get TEXTURE_MAX_LEVEL() {
    return 33085;
  },
  /*web_gl.WebGL.TEXTURE_MAX_LOD*/get TEXTURE_MAX_LOD() {
    return 33083;
  },
  /*web_gl.WebGL.TEXTURE_MIN_FILTER*/get TEXTURE_MIN_FILTER() {
    return 10241;
  },
  /*web_gl.WebGL.TEXTURE_MIN_LOD*/get TEXTURE_MIN_LOD() {
    return 33082;
  },
  /*web_gl.WebGL.TEXTURE_WRAP_R*/get TEXTURE_WRAP_R() {
    return 32882;
  },
  /*web_gl.WebGL.TEXTURE_WRAP_S*/get TEXTURE_WRAP_S() {
    return 10242;
  },
  /*web_gl.WebGL.TEXTURE_WRAP_T*/get TEXTURE_WRAP_T() {
    return 10243;
  },
  /*web_gl.WebGL.TIMEOUT_EXPIRED*/get TIMEOUT_EXPIRED() {
    return 37147;
  },
  /*web_gl.WebGL.TIMEOUT_IGNORED*/get TIMEOUT_IGNORED() {
    return -1;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK*/get TRANSFORM_FEEDBACK() {
    return 36386;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_ACTIVE*/get TRANSFORM_FEEDBACK_ACTIVE() {
    return 36388;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_BINDING*/get TRANSFORM_FEEDBACK_BINDING() {
    return 36389;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_BUFFER*/get TRANSFORM_FEEDBACK_BUFFER() {
    return 35982;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_BUFFER_BINDING*/get TRANSFORM_FEEDBACK_BUFFER_BINDING() {
    return 35983;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_BUFFER_MODE*/get TRANSFORM_FEEDBACK_BUFFER_MODE() {
    return 35967;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_BUFFER_SIZE*/get TRANSFORM_FEEDBACK_BUFFER_SIZE() {
    return 35973;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_BUFFER_START*/get TRANSFORM_FEEDBACK_BUFFER_START() {
    return 35972;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_PAUSED*/get TRANSFORM_FEEDBACK_PAUSED() {
    return 36387;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN*/get TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN() {
    return 35976;
  },
  /*web_gl.WebGL.TRANSFORM_FEEDBACK_VARYINGS*/get TRANSFORM_FEEDBACK_VARYINGS() {
    return 35971;
  },
  /*web_gl.WebGL.TRIANGLES*/get TRIANGLES() {
    return 4;
  },
  /*web_gl.WebGL.TRIANGLE_FAN*/get TRIANGLE_FAN() {
    return 6;
  },
  /*web_gl.WebGL.TRIANGLE_STRIP*/get TRIANGLE_STRIP() {
    return 5;
  },
  /*web_gl.WebGL.UNIFORM_ARRAY_STRIDE*/get UNIFORM_ARRAY_STRIDE() {
    return 35388;
  },
  /*web_gl.WebGL.UNIFORM_BLOCK_ACTIVE_UNIFORMS*/get UNIFORM_BLOCK_ACTIVE_UNIFORMS() {
    return 35394;
  },
  /*web_gl.WebGL.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES*/get UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES() {
    return 35395;
  },
  /*web_gl.WebGL.UNIFORM_BLOCK_BINDING*/get UNIFORM_BLOCK_BINDING() {
    return 35391;
  },
  /*web_gl.WebGL.UNIFORM_BLOCK_DATA_SIZE*/get UNIFORM_BLOCK_DATA_SIZE() {
    return 35392;
  },
  /*web_gl.WebGL.UNIFORM_BLOCK_INDEX*/get UNIFORM_BLOCK_INDEX() {
    return 35386;
  },
  /*web_gl.WebGL.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER*/get UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER() {
    return 35398;
  },
  /*web_gl.WebGL.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER*/get UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER() {
    return 35396;
  },
  /*web_gl.WebGL.UNIFORM_BUFFER*/get UNIFORM_BUFFER() {
    return 35345;
  },
  /*web_gl.WebGL.UNIFORM_BUFFER_BINDING*/get UNIFORM_BUFFER_BINDING() {
    return 35368;
  },
  /*web_gl.WebGL.UNIFORM_BUFFER_OFFSET_ALIGNMENT*/get UNIFORM_BUFFER_OFFSET_ALIGNMENT() {
    return 35380;
  },
  /*web_gl.WebGL.UNIFORM_BUFFER_SIZE*/get UNIFORM_BUFFER_SIZE() {
    return 35370;
  },
  /*web_gl.WebGL.UNIFORM_BUFFER_START*/get UNIFORM_BUFFER_START() {
    return 35369;
  },
  /*web_gl.WebGL.UNIFORM_IS_ROW_MAJOR*/get UNIFORM_IS_ROW_MAJOR() {
    return 35390;
  },
  /*web_gl.WebGL.UNIFORM_MATRIX_STRIDE*/get UNIFORM_MATRIX_STRIDE() {
    return 35389;
  },
  /*web_gl.WebGL.UNIFORM_OFFSET*/get UNIFORM_OFFSET() {
    return 35387;
  },
  /*web_gl.WebGL.UNIFORM_SIZE*/get UNIFORM_SIZE() {
    return 35384;
  },
  /*web_gl.WebGL.UNIFORM_TYPE*/get UNIFORM_TYPE() {
    return 35383;
  },
  /*web_gl.WebGL.UNPACK_ALIGNMENT*/get UNPACK_ALIGNMENT() {
    return 3317;
  },
  /*web_gl.WebGL.UNPACK_COLORSPACE_CONVERSION_WEBGL*/get UNPACK_COLORSPACE_CONVERSION_WEBGL() {
    return 37443;
  },
  /*web_gl.WebGL.UNPACK_FLIP_Y_WEBGL*/get UNPACK_FLIP_Y_WEBGL() {
    return 37440;
  },
  /*web_gl.WebGL.UNPACK_IMAGE_HEIGHT*/get UNPACK_IMAGE_HEIGHT() {
    return 32878;
  },
  /*web_gl.WebGL.UNPACK_PREMULTIPLY_ALPHA_WEBGL*/get UNPACK_PREMULTIPLY_ALPHA_WEBGL() {
    return 37441;
  },
  /*web_gl.WebGL.UNPACK_ROW_LENGTH*/get UNPACK_ROW_LENGTH() {
    return 3314;
  },
  /*web_gl.WebGL.UNPACK_SKIP_IMAGES*/get UNPACK_SKIP_IMAGES() {
    return 32877;
  },
  /*web_gl.WebGL.UNPACK_SKIP_PIXELS*/get UNPACK_SKIP_PIXELS() {
    return 3316;
  },
  /*web_gl.WebGL.UNPACK_SKIP_ROWS*/get UNPACK_SKIP_ROWS() {
    return 3315;
  },
  /*web_gl.WebGL.UNSIGNALED*/get UNSIGNALED() {
    return 37144;
  },
  /*web_gl.WebGL.UNSIGNED_BYTE*/get UNSIGNED_BYTE() {
    return 5121;
  },
  /*web_gl.WebGL.UNSIGNED_INT*/get UNSIGNED_INT() {
    return 5125;
  },
  /*web_gl.WebGL.UNSIGNED_INT_10F_11F_11F_REV*/get UNSIGNED_INT_10F_11F_11F_REV() {
    return 35899;
  },
  /*web_gl.WebGL.UNSIGNED_INT_24_8*/get UNSIGNED_INT_24_8() {
    return 34042;
  },
  /*web_gl.WebGL.UNSIGNED_INT_2_10_10_10_REV*/get UNSIGNED_INT_2_10_10_10_REV() {
    return 33640;
  },
  /*web_gl.WebGL.UNSIGNED_INT_5_9_9_9_REV*/get UNSIGNED_INT_5_9_9_9_REV() {
    return 35902;
  },
  /*web_gl.WebGL.UNSIGNED_INT_SAMPLER_2D*/get UNSIGNED_INT_SAMPLER_2D() {
    return 36306;
  },
  /*web_gl.WebGL.UNSIGNED_INT_SAMPLER_2D_ARRAY*/get UNSIGNED_INT_SAMPLER_2D_ARRAY() {
    return 36311;
  },
  /*web_gl.WebGL.UNSIGNED_INT_SAMPLER_3D*/get UNSIGNED_INT_SAMPLER_3D() {
    return 36307;
  },
  /*web_gl.WebGL.UNSIGNED_INT_SAMPLER_CUBE*/get UNSIGNED_INT_SAMPLER_CUBE() {
    return 36308;
  },
  /*web_gl.WebGL.UNSIGNED_INT_VEC2*/get UNSIGNED_INT_VEC2() {
    return 36294;
  },
  /*web_gl.WebGL.UNSIGNED_INT_VEC3*/get UNSIGNED_INT_VEC3() {
    return 36295;
  },
  /*web_gl.WebGL.UNSIGNED_INT_VEC4*/get UNSIGNED_INT_VEC4() {
    return 36296;
  },
  /*web_gl.WebGL.UNSIGNED_NORMALIZED*/get UNSIGNED_NORMALIZED() {
    return 35863;
  },
  /*web_gl.WebGL.UNSIGNED_SHORT*/get UNSIGNED_SHORT() {
    return 5123;
  },
  /*web_gl.WebGL.UNSIGNED_SHORT_4_4_4_4*/get UNSIGNED_SHORT_4_4_4_4() {
    return 32819;
  },
  /*web_gl.WebGL.UNSIGNED_SHORT_5_5_5_1*/get UNSIGNED_SHORT_5_5_5_1() {
    return 32820;
  },
  /*web_gl.WebGL.UNSIGNED_SHORT_5_6_5*/get UNSIGNED_SHORT_5_6_5() {
    return 33635;
  },
  /*web_gl.WebGL.VALIDATE_STATUS*/get VALIDATE_STATUS() {
    return 35715;
  },
  /*web_gl.WebGL.VENDOR*/get VENDOR() {
    return 7936;
  },
  /*web_gl.WebGL.VERSION*/get VERSION() {
    return 7938;
  },
  /*web_gl.WebGL.VERTEX_ARRAY_BINDING*/get VERTEX_ARRAY_BINDING() {
    return 34229;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING*/get VERTEX_ATTRIB_ARRAY_BUFFER_BINDING() {
    return 34975;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_DIVISOR*/get VERTEX_ATTRIB_ARRAY_DIVISOR() {
    return 35070;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_ENABLED*/get VERTEX_ATTRIB_ARRAY_ENABLED() {
    return 34338;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_INTEGER*/get VERTEX_ATTRIB_ARRAY_INTEGER() {
    return 35069;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_NORMALIZED*/get VERTEX_ATTRIB_ARRAY_NORMALIZED() {
    return 34922;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_POINTER*/get VERTEX_ATTRIB_ARRAY_POINTER() {
    return 34373;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_SIZE*/get VERTEX_ATTRIB_ARRAY_SIZE() {
    return 34339;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_STRIDE*/get VERTEX_ATTRIB_ARRAY_STRIDE() {
    return 34340;
  },
  /*web_gl.WebGL.VERTEX_ATTRIB_ARRAY_TYPE*/get VERTEX_ATTRIB_ARRAY_TYPE() {
    return 34341;
  },
  /*web_gl.WebGL.VERTEX_SHADER*/get VERTEX_SHADER() {
    return 35633;
  },
  /*web_gl.WebGL.VIEWPORT*/get VIEWPORT() {
    return 2978;
  },
  /*web_gl.WebGL.WAIT_FAILED*/get WAIT_FAILED() {
    return 37149;
  },
  /*web_gl.WebGL.ZERO*/get ZERO() {
    return 0;
  }
});
dart.registerExtension("WebGL", web_gl.WebGL);
web_gl._WebGL2RenderingContextBase = class _WebGL2RenderingContextBase extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl._WebGL2RenderingContextBase);
web_gl._WebGL2RenderingContextBase[dart.implements] = () => [web_gl._WebGLRenderingContextBase];
dart.setLibraryUri(web_gl._WebGL2RenderingContextBase, "dart:web_gl");
dart.registerExtension("WebGL2RenderingContextBase", web_gl._WebGL2RenderingContextBase);
web_gl._WebGLRenderingContextBase = class _WebGLRenderingContextBase extends _interceptors.Interceptor {};
dart.addTypeTests(web_gl._WebGLRenderingContextBase);
dart.setLibraryUri(web_gl._WebGLRenderingContextBase, "dart:web_gl");
const _changeVersion = dart.privateName(web_sql, "_changeVersion");
const _readTransaction = dart.privateName(web_sql, "_readTransaction");
web_sql.SqlDatabase = class SqlDatabase extends _interceptors.Interceptor {
  static get supported() {
    return !!window.openDatabase;
  }
  get [$version]() {
    return this.version;
  }
  [_changeVersion](...args) {
    return this.changeVersion.apply(this, args);
  }
  [$changeVersion](oldVersion, newVersion) {
    let completer = CompleterOfSqlTransaction().new();
    this[_changeVersion](oldVersion, newVersion, dart.fn(value => {
      completer.complete(value);
    }, SqlTransactionToNull()), dart.fn(error => {
      completer.completeError(error);
    }, SqlErrorToNull()));
    return completer.future;
  }
  [_readTransaction](...args) {
    return this.readTransaction.apply(this, args);
  }
  [$readTransaction]() {
    let completer = CompleterOfSqlTransaction().new();
    this[_readTransaction](dart.fn(value => {
      completer.complete(value);
    }, SqlTransactionToNull()), dart.fn(error => {
      completer.completeError(error);
    }, SqlErrorToNull()));
    return completer.future;
  }
  [$transaction](...args) {
    return this.transaction.apply(this, args);
  }
  [$transaction_future]() {
    let completer = CompleterOfSqlTransaction().new();
    this.transaction(dart.fn(value => {
      _js_helper.applyExtension("SQLTransaction", value);
      completer.complete(value);
    }, SqlTransactionToNull()), dart.fn(error => {
      completer.completeError(error);
    }, SqlErrorToNull()));
    return completer.future;
  }
};
dart.addTypeTests(web_sql.SqlDatabase);
const version$1 = Symbol("SqlDatabase.version");
dart.setMethodSignature(web_sql.SqlDatabase, () => ({
  __proto__: dart.getMethods(web_sql.SqlDatabase.__proto__),
  [_changeVersion]: dart.fnType(dart.void, [core.String, core.String], [dart.fnType(dart.void, [web_sql.SqlTransaction]), dart.fnType(dart.void, [web_sql.SqlError]), dart.fnType(dart.void, [])]),
  [$changeVersion]: dart.fnType(async.Future$(web_sql.SqlTransaction), [core.String, core.String]),
  [_readTransaction]: dart.fnType(dart.void, [dart.fnType(dart.void, [web_sql.SqlTransaction])], [dart.fnType(dart.void, [web_sql.SqlError]), dart.fnType(dart.void, [])]),
  [$readTransaction]: dart.fnType(async.Future$(web_sql.SqlTransaction), []),
  [$transaction]: dart.fnType(dart.void, [dart.fnType(dart.void, [web_sql.SqlTransaction])], [dart.fnType(dart.void, [web_sql.SqlError]), dart.fnType(dart.void, [])]),
  [$transaction_future]: dart.fnType(async.Future$(web_sql.SqlTransaction), [])
}));
dart.setLibraryUri(web_sql.SqlDatabase, "dart:web_sql");
dart.setFieldSignature(web_sql.SqlDatabase, () => ({
  __proto__: dart.getFields(web_sql.SqlDatabase.__proto__),
  [$version]: dart.finalFieldType(core.String)
}));
dart.registerExtension("Database", web_sql.SqlDatabase);
web_sql.SqlError = class SqlError extends _interceptors.Interceptor {
  get [$code]() {
    return this.code;
  }
  get [$message]() {
    return this.message;
  }
};
dart.addTypeTests(web_sql.SqlError);
const code$2 = Symbol("SqlError.code");
const message$28 = Symbol("SqlError.message");
dart.setLibraryUri(web_sql.SqlError, "dart:web_sql");
dart.setFieldSignature(web_sql.SqlError, () => ({
  __proto__: dart.getFields(web_sql.SqlError.__proto__),
  [$code]: dart.finalFieldType(core.int),
  [$message]: dart.finalFieldType(core.String)
}));
dart.defineLazy(web_sql.SqlError, {
  /*web_sql.SqlError.CONSTRAINT_ERR*/get CONSTRAINT_ERR() {
    return 6;
  },
  /*web_sql.SqlError.DATABASE_ERR*/get DATABASE_ERR() {
    return 1;
  },
  /*web_sql.SqlError.QUOTA_ERR*/get QUOTA_ERR() {
    return 4;
  },
  /*web_sql.SqlError.SYNTAX_ERR*/get SYNTAX_ERR() {
    return 5;
  },
  /*web_sql.SqlError.TIMEOUT_ERR*/get TIMEOUT_ERR() {
    return 7;
  },
  /*web_sql.SqlError.TOO_LARGE_ERR*/get TOO_LARGE_ERR() {
    return 3;
  },
  /*web_sql.SqlError.UNKNOWN_ERR*/get UNKNOWN_ERR() {
    return 0;
  },
  /*web_sql.SqlError.VERSION_ERR*/get VERSION_ERR() {
    return 2;
  }
});
dart.registerExtension("SQLError", web_sql.SqlError);
web_sql.SqlResultSet = class SqlResultSet extends _interceptors.Interceptor {
  get [$insertId]() {
    return this.insertId;
  }
  get [$rows]() {
    return this.rows;
  }
  get [$rowsAffected]() {
    return this.rowsAffected;
  }
};
dart.addTypeTests(web_sql.SqlResultSet);
const insertId = Symbol("SqlResultSet.insertId");
const rows$ = Symbol("SqlResultSet.rows");
const rowsAffected = Symbol("SqlResultSet.rowsAffected");
dart.setLibraryUri(web_sql.SqlResultSet, "dart:web_sql");
dart.setFieldSignature(web_sql.SqlResultSet, () => ({
  __proto__: dart.getFields(web_sql.SqlResultSet.__proto__),
  [$insertId]: dart.finalFieldType(core.int),
  [$rows]: dart.finalFieldType(web_sql.SqlResultSetRowList),
  [$rowsAffected]: dart.finalFieldType(core.int)
}));
dart.registerExtension("SQLResultSet", web_sql.SqlResultSet);
const _item_1 = dart.privateName(web_sql, "_item_1");
const Interceptor_ListMixin$$17 = class Interceptor_ListMixin extends _interceptors.Interceptor {};
(Interceptor_ListMixin$$17.new = function() {
  Interceptor_ListMixin$$17.__proto__.new.call(this);
}).prototype = Interceptor_ListMixin$$17.prototype;
dart.applyMixin(Interceptor_ListMixin$$17, collection.ListMixin$(core.Map));
const Interceptor_ImmutableListMixin$$17 = class Interceptor_ImmutableListMixin extends Interceptor_ListMixin$$17 {};
(Interceptor_ImmutableListMixin$$17.new = function() {
  Interceptor_ImmutableListMixin$$17.__proto__.new.call(this);
}).prototype = Interceptor_ImmutableListMixin$$17.prototype;
dart.applyMixin(Interceptor_ImmutableListMixin$$17, html$.ImmutableListMixin$(core.Map));
web_sql.SqlResultSetRowList = class SqlResultSetRowList extends Interceptor_ImmutableListMixin$$17 {
  get [$length]() {
    return this.length;
  }
  [$_get](index) {
    if (index >>> 0 !== index || index >= this[$length]) dart.throw(core.RangeError.index(index, this));
    return this[$item](index);
  }
  [$_set](index, value) {
    core.Map._check(value);
    dart.throw(new core.UnsupportedError.new("Cannot assign element of immutable List."));
    return value;
  }
  set [$length](value) {
    dart.throw(new core.UnsupportedError.new("Cannot resize immutable List."));
  }
  get [$first]() {
    if (dart.notNull(this[$length]) > 0) {
      return this[0];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$first](value) {
    super[$first] = value;
  }
  get [$last]() {
    let len = this[$length];
    if (dart.notNull(len) > 0) {
      return this[dart.notNull(len) - 1];
    }
    dart.throw(new core.StateError.new("No elements"));
  }
  set [$last](value) {
    super[$last] = value;
  }
  get [$single]() {
    let len = this[$length];
    if (len === 1) {
      return this[0];
    }
    if (len === 0) dart.throw(new core.StateError.new("No elements"));
    dart.throw(new core.StateError.new("More than one element"));
  }
  [$elementAt](index) {
    return this[$_get](index);
  }
  [$item](index) {
    return html_common.convertNativeToDart_Dictionary(this[_item_1](index));
  }
  [_item_1](...args) {
    return this.item.apply(this, args);
  }
};
web_sql.SqlResultSetRowList.prototype[dart.isList] = true;
dart.addTypeTests(web_sql.SqlResultSetRowList);
web_sql.SqlResultSetRowList[dart.implements] = () => [ListOfMap()];
dart.setMethodSignature(web_sql.SqlResultSetRowList, () => ({
  __proto__: dart.getMethods(web_sql.SqlResultSetRowList.__proto__),
  [$_get]: dart.fnType(core.Map, [core.int]),
  [$_set]: dart.fnType(dart.void, [core.int, core.Object]),
  [$elementAt]: dart.fnType(core.Map, [core.int]),
  [$item]: dart.fnType(core.Map, [core.int]),
  [_item_1]: dart.fnType(dart.dynamic, [dart.dynamic])
}));
dart.setGetterSignature(web_sql.SqlResultSetRowList, () => ({
  __proto__: dart.getGetters(web_sql.SqlResultSetRowList.__proto__),
  [$length]: core.int,
  [$first]: core.Map,
  [$last]: core.Map,
  [$single]: core.Map
}));
dart.setSetterSignature(web_sql.SqlResultSetRowList, () => ({
  __proto__: dart.getSetters(web_sql.SqlResultSetRowList.__proto__),
  [$length]: core.int
}));
dart.setLibraryUri(web_sql.SqlResultSetRowList, "dart:web_sql");
dart.registerExtension("SQLResultSetRowList", web_sql.SqlResultSetRowList);
const _executeSql = dart.privateName(web_sql, "_executeSql");
web_sql.SqlTransaction = class SqlTransaction extends _interceptors.Interceptor {
  [_executeSql](...args) {
    return this.executeSql.apply(this, args);
  }
  [$executeSql](sqlStatement, arguments$0) {
    if (arguments$0 === void 0) arguments$0 = null;
    let completer = CompleterOfSqlResultSet().new();
    this[_executeSql](sqlStatement, arguments$0, dart.fn((transaction, resultSet) => {
      _js_helper.applyExtension("SQLResultSet", resultSet);
      _js_helper.applyExtension("SQLResultSetRowList", resultSet.rows);
      completer.complete(resultSet);
    }, SqlTransactionAndSqlResultSetToNull()), dart.fn((transaction, error) => {
      completer.completeError(error);
    }, SqlTransactionAndSqlErrorToNull()));
    return completer.future;
  }
};
dart.addTypeTests(web_sql.SqlTransaction);
dart.setMethodSignature(web_sql.SqlTransaction, () => ({
  __proto__: dart.getMethods(web_sql.SqlTransaction.__proto__),
  [_executeSql]: dart.fnType(dart.void, [core.String], [core.List, dart.fnType(dart.void, [web_sql.SqlTransaction, web_sql.SqlResultSet]), dart.fnType(dart.void, [web_sql.SqlTransaction, web_sql.SqlError])]),
  [$executeSql]: dart.fnType(async.Future$(web_sql.SqlResultSet), [core.String], [core.List])
}));
dart.setLibraryUri(web_sql.SqlTransaction, "dart:web_sql");
dart.registerExtension("SQLTransaction", web_sql.SqlTransaction);
_http.HttpServer = class HttpServer extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return _http._HttpServer.bind(address, port, backlog, v6Only, shared);
  }
  static bindSecure(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return _http._HttpServer.bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared);
  }
  static listenOn(serverSocket) {
    return new _http._HttpServer.listenOn(serverSocket);
  }
};
(_http.HttpServer[dart.mixinNew] = function() {
  this.serverHeader = null;
  this.autoCompress = null;
  this.idleTimeout = null;
}).prototype = _http.HttpServer.prototype;
_http.HttpServer.prototype[dart.isStream] = true;
dart.addTypeTests(_http.HttpServer);
_http.HttpServer[dart.implements] = () => [StreamOfHttpRequest()];
dart.setLibraryUri(_http.HttpServer, "dart:_http");
dart.setFieldSignature(_http.HttpServer, () => ({
  __proto__: dart.getFields(_http.HttpServer.__proto__),
  serverHeader: dart.fieldType(core.String),
  autoCompress: dart.fieldType(core.bool),
  idleTimeout: dart.fieldType(core.Duration)
}));
_http.HttpConnectionsInfo = class HttpConnectionsInfo extends core.Object {};
(_http.HttpConnectionsInfo.new = function() {
  this.total = 0;
  this.active = 0;
  this.idle = 0;
  this.closing = 0;
}).prototype = _http.HttpConnectionsInfo.prototype;
dart.addTypeTests(_http.HttpConnectionsInfo);
dart.setLibraryUri(_http.HttpConnectionsInfo, "dart:_http");
dart.setFieldSignature(_http.HttpConnectionsInfo, () => ({
  __proto__: dart.getFields(_http.HttpConnectionsInfo.__proto__),
  total: dart.fieldType(core.int),
  active: dart.fieldType(core.int),
  idle: dart.fieldType(core.int),
  closing: dart.fieldType(core.int)
}));
_http.HttpHeaders = class HttpHeaders extends core.Object {};
(_http.HttpHeaders.new = function() {
  this.date = null;
  this.expires = null;
  this.ifModifiedSince = null;
  this.host = null;
  this.port = null;
  this.contentType = null;
  this.contentLength = null;
  this.persistentConnection = null;
  this.chunkedTransferEncoding = null;
}).prototype = _http.HttpHeaders.prototype;
dart.addTypeTests(_http.HttpHeaders);
dart.setLibraryUri(_http.HttpHeaders, "dart:_http");
dart.setFieldSignature(_http.HttpHeaders, () => ({
  __proto__: dart.getFields(_http.HttpHeaders.__proto__),
  date: dart.fieldType(core.DateTime),
  expires: dart.fieldType(core.DateTime),
  ifModifiedSince: dart.fieldType(core.DateTime),
  host: dart.fieldType(core.String),
  port: dart.fieldType(core.int),
  contentType: dart.fieldType(_http.ContentType),
  contentLength: dart.fieldType(core.int),
  persistentConnection: dart.fieldType(core.bool),
  chunkedTransferEncoding: dart.fieldType(core.bool)
}));
dart.defineLazy(_http.HttpHeaders, {
  /*_http.HttpHeaders.acceptHeader*/get acceptHeader() {
    return "accept";
  },
  /*_http.HttpHeaders.acceptCharsetHeader*/get acceptCharsetHeader() {
    return "accept-charset";
  },
  /*_http.HttpHeaders.acceptEncodingHeader*/get acceptEncodingHeader() {
    return "accept-encoding";
  },
  /*_http.HttpHeaders.acceptLanguageHeader*/get acceptLanguageHeader() {
    return "accept-language";
  },
  /*_http.HttpHeaders.acceptRangesHeader*/get acceptRangesHeader() {
    return "accept-ranges";
  },
  /*_http.HttpHeaders.ageHeader*/get ageHeader() {
    return "age";
  },
  /*_http.HttpHeaders.allowHeader*/get allowHeader() {
    return "allow";
  },
  /*_http.HttpHeaders.authorizationHeader*/get authorizationHeader() {
    return "authorization";
  },
  /*_http.HttpHeaders.cacheControlHeader*/get cacheControlHeader() {
    return "cache-control";
  },
  /*_http.HttpHeaders.connectionHeader*/get connectionHeader() {
    return "connection";
  },
  /*_http.HttpHeaders.contentEncodingHeader*/get contentEncodingHeader() {
    return "content-encoding";
  },
  /*_http.HttpHeaders.contentLanguageHeader*/get contentLanguageHeader() {
    return "content-language";
  },
  /*_http.HttpHeaders.contentLengthHeader*/get contentLengthHeader() {
    return "content-length";
  },
  /*_http.HttpHeaders.contentLocationHeader*/get contentLocationHeader() {
    return "content-location";
  },
  /*_http.HttpHeaders.contentMD5Header*/get contentMD5Header() {
    return "content-md5";
  },
  /*_http.HttpHeaders.contentRangeHeader*/get contentRangeHeader() {
    return "content-range";
  },
  /*_http.HttpHeaders.contentTypeHeader*/get contentTypeHeader() {
    return "content-type";
  },
  /*_http.HttpHeaders.dateHeader*/get dateHeader() {
    return "date";
  },
  /*_http.HttpHeaders.etagHeader*/get etagHeader() {
    return "etag";
  },
  /*_http.HttpHeaders.expectHeader*/get expectHeader() {
    return "expect";
  },
  /*_http.HttpHeaders.expiresHeader*/get expiresHeader() {
    return "expires";
  },
  /*_http.HttpHeaders.fromHeader*/get fromHeader() {
    return "from";
  },
  /*_http.HttpHeaders.hostHeader*/get hostHeader() {
    return "host";
  },
  /*_http.HttpHeaders.ifMatchHeader*/get ifMatchHeader() {
    return "if-match";
  },
  /*_http.HttpHeaders.ifModifiedSinceHeader*/get ifModifiedSinceHeader() {
    return "if-modified-since";
  },
  /*_http.HttpHeaders.ifNoneMatchHeader*/get ifNoneMatchHeader() {
    return "if-none-match";
  },
  /*_http.HttpHeaders.ifRangeHeader*/get ifRangeHeader() {
    return "if-range";
  },
  /*_http.HttpHeaders.ifUnmodifiedSinceHeader*/get ifUnmodifiedSinceHeader() {
    return "if-unmodified-since";
  },
  /*_http.HttpHeaders.lastModifiedHeader*/get lastModifiedHeader() {
    return "last-modified";
  },
  /*_http.HttpHeaders.locationHeader*/get locationHeader() {
    return "location";
  },
  /*_http.HttpHeaders.maxForwardsHeader*/get maxForwardsHeader() {
    return "max-forwards";
  },
  /*_http.HttpHeaders.pragmaHeader*/get pragmaHeader() {
    return "pragma";
  },
  /*_http.HttpHeaders.proxyAuthenticateHeader*/get proxyAuthenticateHeader() {
    return "proxy-authenticate";
  },
  /*_http.HttpHeaders.proxyAuthorizationHeader*/get proxyAuthorizationHeader() {
    return "proxy-authorization";
  },
  /*_http.HttpHeaders.rangeHeader*/get rangeHeader() {
    return "range";
  },
  /*_http.HttpHeaders.refererHeader*/get refererHeader() {
    return "referer";
  },
  /*_http.HttpHeaders.retryAfterHeader*/get retryAfterHeader() {
    return "retry-after";
  },
  /*_http.HttpHeaders.serverHeader*/get serverHeader() {
    return "server";
  },
  /*_http.HttpHeaders.teHeader*/get teHeader() {
    return "te";
  },
  /*_http.HttpHeaders.trailerHeader*/get trailerHeader() {
    return "trailer";
  },
  /*_http.HttpHeaders.transferEncodingHeader*/get transferEncodingHeader() {
    return "transfer-encoding";
  },
  /*_http.HttpHeaders.upgradeHeader*/get upgradeHeader() {
    return "upgrade";
  },
  /*_http.HttpHeaders.userAgentHeader*/get userAgentHeader() {
    return "user-agent";
  },
  /*_http.HttpHeaders.varyHeader*/get varyHeader() {
    return "vary";
  },
  /*_http.HttpHeaders.viaHeader*/get viaHeader() {
    return "via";
  },
  /*_http.HttpHeaders.warningHeader*/get warningHeader() {
    return "warning";
  },
  /*_http.HttpHeaders.wwwAuthenticateHeader*/get wwwAuthenticateHeader() {
    return "www-authenticate";
  },
  /*_http.HttpHeaders.ACCEPT*/get ACCEPT() {
    return "accept";
  },
  /*_http.HttpHeaders.ACCEPT_CHARSET*/get ACCEPT_CHARSET() {
    return "accept-charset";
  },
  /*_http.HttpHeaders.ACCEPT_ENCODING*/get ACCEPT_ENCODING() {
    return "accept-encoding";
  },
  /*_http.HttpHeaders.ACCEPT_LANGUAGE*/get ACCEPT_LANGUAGE() {
    return "accept-language";
  },
  /*_http.HttpHeaders.ACCEPT_RANGES*/get ACCEPT_RANGES() {
    return "accept-ranges";
  },
  /*_http.HttpHeaders.AGE*/get AGE() {
    return "age";
  },
  /*_http.HttpHeaders.ALLOW*/get ALLOW() {
    return "allow";
  },
  /*_http.HttpHeaders.AUTHORIZATION*/get AUTHORIZATION() {
    return "authorization";
  },
  /*_http.HttpHeaders.CACHE_CONTROL*/get CACHE_CONTROL() {
    return "cache-control";
  },
  /*_http.HttpHeaders.CONNECTION*/get CONNECTION() {
    return "connection";
  },
  /*_http.HttpHeaders.CONTENT_ENCODING*/get CONTENT_ENCODING() {
    return "content-encoding";
  },
  /*_http.HttpHeaders.CONTENT_LANGUAGE*/get CONTENT_LANGUAGE() {
    return "content-language";
  },
  /*_http.HttpHeaders.CONTENT_LENGTH*/get CONTENT_LENGTH() {
    return "content-length";
  },
  /*_http.HttpHeaders.CONTENT_LOCATION*/get CONTENT_LOCATION() {
    return "content-location";
  },
  /*_http.HttpHeaders.CONTENT_MD5*/get CONTENT_MD5() {
    return "content-md5";
  },
  /*_http.HttpHeaders.CONTENT_RANGE*/get CONTENT_RANGE() {
    return "content-range";
  },
  /*_http.HttpHeaders.CONTENT_TYPE*/get CONTENT_TYPE() {
    return "content-type";
  },
  /*_http.HttpHeaders.DATE*/get DATE() {
    return "date";
  },
  /*_http.HttpHeaders.ETAG*/get ETAG() {
    return "etag";
  },
  /*_http.HttpHeaders.EXPECT*/get EXPECT() {
    return "expect";
  },
  /*_http.HttpHeaders.EXPIRES*/get EXPIRES() {
    return "expires";
  },
  /*_http.HttpHeaders.FROM*/get FROM() {
    return "from";
  },
  /*_http.HttpHeaders.HOST*/get HOST() {
    return "host";
  },
  /*_http.HttpHeaders.IF_MATCH*/get IF_MATCH() {
    return "if-match";
  },
  /*_http.HttpHeaders.IF_MODIFIED_SINCE*/get IF_MODIFIED_SINCE() {
    return "if-modified-since";
  },
  /*_http.HttpHeaders.IF_NONE_MATCH*/get IF_NONE_MATCH() {
    return "if-none-match";
  },
  /*_http.HttpHeaders.IF_RANGE*/get IF_RANGE() {
    return "if-range";
  },
  /*_http.HttpHeaders.IF_UNMODIFIED_SINCE*/get IF_UNMODIFIED_SINCE() {
    return "if-unmodified-since";
  },
  /*_http.HttpHeaders.LAST_MODIFIED*/get LAST_MODIFIED() {
    return "last-modified";
  },
  /*_http.HttpHeaders.LOCATION*/get LOCATION() {
    return "location";
  },
  /*_http.HttpHeaders.MAX_FORWARDS*/get MAX_FORWARDS() {
    return "max-forwards";
  },
  /*_http.HttpHeaders.PRAGMA*/get PRAGMA() {
    return "pragma";
  },
  /*_http.HttpHeaders.PROXY_AUTHENTICATE*/get PROXY_AUTHENTICATE() {
    return "proxy-authenticate";
  },
  /*_http.HttpHeaders.PROXY_AUTHORIZATION*/get PROXY_AUTHORIZATION() {
    return "proxy-authorization";
  },
  /*_http.HttpHeaders.RANGE*/get RANGE() {
    return "range";
  },
  /*_http.HttpHeaders.REFERER*/get REFERER() {
    return "referer";
  },
  /*_http.HttpHeaders.RETRY_AFTER*/get RETRY_AFTER() {
    return "retry-after";
  },
  /*_http.HttpHeaders.SERVER*/get SERVER() {
    return "server";
  },
  /*_http.HttpHeaders.TE*/get TE() {
    return "te";
  },
  /*_http.HttpHeaders.TRAILER*/get TRAILER() {
    return "trailer";
  },
  /*_http.HttpHeaders.TRANSFER_ENCODING*/get TRANSFER_ENCODING() {
    return "transfer-encoding";
  },
  /*_http.HttpHeaders.UPGRADE*/get UPGRADE() {
    return "upgrade";
  },
  /*_http.HttpHeaders.USER_AGENT*/get USER_AGENT() {
    return "user-agent";
  },
  /*_http.HttpHeaders.VARY*/get VARY() {
    return "vary";
  },
  /*_http.HttpHeaders.VIA*/get VIA() {
    return "via";
  },
  /*_http.HttpHeaders.WARNING*/get WARNING() {
    return "warning";
  },
  /*_http.HttpHeaders.WWW_AUTHENTICATE*/get WWW_AUTHENTICATE() {
    return "www-authenticate";
  },
  /*_http.HttpHeaders.cookieHeader*/get cookieHeader() {
    return "cookie";
  },
  /*_http.HttpHeaders.setCookieHeader*/get setCookieHeader() {
    return "set-cookie";
  },
  /*_http.HttpHeaders.COOKIE*/get COOKIE() {
    return "cookie";
  },
  /*_http.HttpHeaders.SET_COOKIE*/get SET_COOKIE() {
    return "set-cookie";
  },
  /*_http.HttpHeaders.generalHeaders*/get generalHeaders() {
    return dart.constList(["cache-control", "connection", "date", "pragma", "trailer", "transfer-encoding", "upgrade", "via", "warning"], core.String);
  },
  /*_http.HttpHeaders.GENERAL_HEADERS*/get GENERAL_HEADERS() {
    return _http.HttpHeaders.generalHeaders;
  },
  /*_http.HttpHeaders.entityHeaders*/get entityHeaders() {
    return dart.constList(["allow", "content-encoding", "content-language", "content-length", "content-location", "content-md5", "content-range", "content-type", "expires", "last-modified"], core.String);
  },
  /*_http.HttpHeaders.ENTITY_HEADERS*/get ENTITY_HEADERS() {
    return _http.HttpHeaders.entityHeaders;
  },
  /*_http.HttpHeaders.responseHeaders*/get responseHeaders() {
    return dart.constList(["accept-ranges", "age", "etag", "location", "proxy-authenticate", "retry-after", "server", "vary", "www-authenticate"], core.String);
  },
  /*_http.HttpHeaders.RESPONSE_HEADERS*/get RESPONSE_HEADERS() {
    return _http.HttpHeaders.responseHeaders;
  },
  /*_http.HttpHeaders.requestHeaders*/get requestHeaders() {
    return dart.constList(["accept", "accept-charset", "accept-encoding", "accept-language", "authorization", "expect", "from", "host", "if-match", "if-modified-since", "if-none-match", "if-range", "if-unmodified-since", "max-forwards", "proxy-authorization", "range", "referer", "te", "user-agent"], core.String);
  },
  /*_http.HttpHeaders.REQUEST_HEADERS*/get REQUEST_HEADERS() {
    return _http.HttpHeaders.requestHeaders;
  }
});
_http.HeaderValue = class HeaderValue extends core.Object {
  static new(value, parameters) {
    if (value === void 0) value = "";
    if (parameters === void 0) parameters = null;
    return new _http._HeaderValue.new(value, parameters);
  }
  static parse(value, opts) {
    let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
    let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
    let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
    return _http._HeaderValue.parse(value, {parameterSeparator: parameterSeparator, valueSeparator: valueSeparator, preserveBackslash: preserveBackslash});
  }
};
(_http.HeaderValue[dart.mixinNew] = function() {
}).prototype = _http.HeaderValue.prototype;
dart.addTypeTests(_http.HeaderValue);
dart.setLibraryUri(_http.HeaderValue, "dart:_http");
_http.HttpSession = class HttpSession extends core.Object {};
(_http.HttpSession.new = function() {
}).prototype = _http.HttpSession.prototype;
_http.HttpSession.prototype[dart.isMap] = true;
dart.addTypeTests(_http.HttpSession);
_http.HttpSession[dart.implements] = () => [core.Map];
dart.setLibraryUri(_http.HttpSession, "dart:_http");
_http.ContentType = class ContentType extends core.Object {
  static new(primaryType, subType, opts) {
    let charset = opts && 'charset' in opts ? opts.charset : null;
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    return new _http._ContentType.new(primaryType, subType, charset, parameters);
  }
  static parse(value) {
    return _http._ContentType.parse(value);
  }
};
(_http.ContentType[dart.mixinNew] = function() {
}).prototype = _http.ContentType.prototype;
dart.addTypeTests(_http.ContentType);
_http.ContentType[dart.implements] = () => [_http.HeaderValue];
dart.setLibraryUri(_http.ContentType, "dart:_http");
dart.defineLazy(_http.ContentType, {
  /*_http.ContentType.text*/get text() {
    return _http.ContentType.new("text", "plain", {charset: "utf-8"});
  },
  /*_http.ContentType.TEXT*/get TEXT() {
    return _http.ContentType.text;
  },
  /*_http.ContentType.html*/get html() {
    return _http.ContentType.new("text", "html", {charset: "utf-8"});
  },
  /*_http.ContentType.HTML*/get HTML() {
    return _http.ContentType.html;
  },
  /*_http.ContentType.json*/get json() {
    return _http.ContentType.new("application", "json", {charset: "utf-8"});
  },
  /*_http.ContentType.JSON*/get JSON() {
    return _http.ContentType.json;
  },
  /*_http.ContentType.binary*/get binary() {
    return _http.ContentType.new("application", "octet-stream");
  },
  /*_http.ContentType.BINARY*/get BINARY() {
    return _http.ContentType.binary;
  }
});
_http.Cookie = class Cookie extends core.Object {
  static new(name, value) {
    if (name === void 0) name = null;
    if (value === void 0) value = null;
    return new _http._Cookie.new(name, value);
  }
  static fromSetCookieValue(value) {
    return new _http._Cookie.fromSetCookieValue(value);
  }
};
(_http.Cookie[dart.mixinNew] = function() {
  this.name = null;
  this.value = null;
  this.expires = null;
  this.maxAge = null;
  this.domain = null;
  this.path = null;
  this.secure = null;
  this.httpOnly = null;
}).prototype = _http.Cookie.prototype;
dart.addTypeTests(_http.Cookie);
dart.setLibraryUri(_http.Cookie, "dart:_http");
dart.setFieldSignature(_http.Cookie, () => ({
  __proto__: dart.getFields(_http.Cookie.__proto__),
  name: dart.fieldType(core.String),
  value: dart.fieldType(core.String),
  expires: dart.fieldType(core.DateTime),
  maxAge: dart.fieldType(core.int),
  domain: dart.fieldType(core.String),
  path: dart.fieldType(core.String),
  secure: dart.fieldType(core.bool),
  httpOnly: dart.fieldType(core.bool)
}));
_http.HttpRequest = class HttpRequest extends core.Object {};
(_http.HttpRequest.new = function() {
}).prototype = _http.HttpRequest.prototype;
_http.HttpRequest.prototype[dart.isStream] = true;
dart.addTypeTests(_http.HttpRequest);
_http.HttpRequest[dart.implements] = () => [StreamOfListOfint()];
dart.setLibraryUri(_http.HttpRequest, "dart:_http");
_http.HttpResponse = class HttpResponse extends core.Object {};
(_http.HttpResponse.new = function() {
  this.contentLength = null;
  this.statusCode = null;
  this.reasonPhrase = null;
  this.persistentConnection = null;
  this.deadline = null;
  this.bufferOutput = null;
}).prototype = _http.HttpResponse.prototype;
dart.addTypeTests(_http.HttpResponse);
_http.HttpResponse[dart.implements] = () => [io.IOSink];
dart.setLibraryUri(_http.HttpResponse, "dart:_http");
dart.setFieldSignature(_http.HttpResponse, () => ({
  __proto__: dart.getFields(_http.HttpResponse.__proto__),
  contentLength: dart.fieldType(core.int),
  statusCode: dart.fieldType(core.int),
  reasonPhrase: dart.fieldType(core.String),
  persistentConnection: dart.fieldType(core.bool),
  deadline: dart.fieldType(core.Duration),
  bufferOutput: dart.fieldType(core.bool)
}));
_http.HttpClient = class HttpClient extends core.Object {
  static new(opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let overrides = _http.HttpOverrides.current;
    if (overrides == null) {
      return new _http._HttpClient.new(context);
    }
    return overrides.createHttpClient(context);
  }
  static findProxyFromEnvironment(url, opts) {
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let overrides = _http.HttpOverrides.current;
    if (overrides == null) {
      return _http._HttpClient._findProxyFromEnvironment(url, environment);
    }
    return overrides.findProxyFromEnvironment(url, environment);
  }
};
(_http.HttpClient[dart.mixinNew] = function() {
  this.idleTimeout = null;
  this.connectionTimeout = null;
  this.maxConnectionsPerHost = null;
  this.autoUncompress = null;
  this.userAgent = null;
}).prototype = _http.HttpClient.prototype;
dart.addTypeTests(_http.HttpClient);
dart.setLibraryUri(_http.HttpClient, "dart:_http");
dart.setFieldSignature(_http.HttpClient, () => ({
  __proto__: dart.getFields(_http.HttpClient.__proto__),
  idleTimeout: dart.fieldType(core.Duration),
  connectionTimeout: dart.fieldType(core.Duration),
  maxConnectionsPerHost: dart.fieldType(core.int),
  autoUncompress: dart.fieldType(core.bool),
  userAgent: dart.fieldType(core.String)
}));
dart.defineLazy(_http.HttpClient, {
  /*_http.HttpClient.defaultHttpPort*/get defaultHttpPort() {
    return 80;
  },
  /*_http.HttpClient.DEFAULT_HTTP_PORT*/get DEFAULT_HTTP_PORT() {
    return 80;
  },
  /*_http.HttpClient.defaultHttpsPort*/get defaultHttpsPort() {
    return 443;
  },
  /*_http.HttpClient.DEFAULT_HTTPS_PORT*/get DEFAULT_HTTPS_PORT() {
    return 443;
  }
});
_http.HttpClientRequest = class HttpClientRequest extends core.Object {};
(_http.HttpClientRequest.new = function() {
  this.persistentConnection = null;
  this.followRedirects = null;
  this.maxRedirects = null;
  this.contentLength = null;
  this.bufferOutput = null;
}).prototype = _http.HttpClientRequest.prototype;
dart.addTypeTests(_http.HttpClientRequest);
_http.HttpClientRequest[dart.implements] = () => [io.IOSink];
dart.setLibraryUri(_http.HttpClientRequest, "dart:_http");
dart.setFieldSignature(_http.HttpClientRequest, () => ({
  __proto__: dart.getFields(_http.HttpClientRequest.__proto__),
  persistentConnection: dart.fieldType(core.bool),
  followRedirects: dart.fieldType(core.bool),
  maxRedirects: dart.fieldType(core.int),
  contentLength: dart.fieldType(core.int),
  bufferOutput: dart.fieldType(core.bool)
}));
_http.HttpClientResponse = class HttpClientResponse extends core.Object {};
(_http.HttpClientResponse.new = function() {
}).prototype = _http.HttpClientResponse.prototype;
_http.HttpClientResponse.prototype[dart.isStream] = true;
dart.addTypeTests(_http.HttpClientResponse);
_http.HttpClientResponse[dart.implements] = () => [StreamOfListOfint()];
dart.setLibraryUri(_http.HttpClientResponse, "dart:_http");
_http.HttpClientResponseCompressionState = class HttpClientResponseCompressionState extends core.Object {
  toString() {
    return {
      0: "HttpClientResponseCompressionState.notCompressed",
      1: "HttpClientResponseCompressionState.decompressed",
      2: "HttpClientResponseCompressionState.compressed"
    }[this.index];
  }
};
(_http.HttpClientResponseCompressionState.new = function(x) {
  this.index = x;
}).prototype = _http.HttpClientResponseCompressionState.prototype;
dart.addTypeTests(_http.HttpClientResponseCompressionState);
dart.setLibraryUri(_http.HttpClientResponseCompressionState, "dart:_http");
dart.setFieldSignature(_http.HttpClientResponseCompressionState, () => ({
  __proto__: dart.getFields(_http.HttpClientResponseCompressionState.__proto__),
  index: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(_http.HttpClientResponseCompressionState, ['toString']);
_http.HttpClientResponseCompressionState.notCompressed = dart.const(new _http.HttpClientResponseCompressionState.new(0));
_http.HttpClientResponseCompressionState.decompressed = dart.const(new _http.HttpClientResponseCompressionState.new(1));
_http.HttpClientResponseCompressionState.compressed = dart.const(new _http.HttpClientResponseCompressionState.new(2));
_http.HttpClientResponseCompressionState.values = dart.constList([_http.HttpClientResponseCompressionState.notCompressed, _http.HttpClientResponseCompressionState.decompressed, _http.HttpClientResponseCompressionState.compressed], _http.HttpClientResponseCompressionState);
_http.HttpClientCredentials = class HttpClientCredentials extends core.Object {};
(_http.HttpClientCredentials.new = function() {
}).prototype = _http.HttpClientCredentials.prototype;
dart.addTypeTests(_http.HttpClientCredentials);
dart.setLibraryUri(_http.HttpClientCredentials, "dart:_http");
_http.HttpClientBasicCredentials = class HttpClientBasicCredentials extends _http.HttpClientCredentials {
  static new(username, password) {
    return new _http._HttpClientBasicCredentials.new(username, password);
  }
};
dart.addTypeTests(_http.HttpClientBasicCredentials);
dart.setLibraryUri(_http.HttpClientBasicCredentials, "dart:_http");
_http.HttpClientDigestCredentials = class HttpClientDigestCredentials extends _http.HttpClientCredentials {
  static new(username, password) {
    return new _http._HttpClientDigestCredentials.new(username, password);
  }
};
dart.addTypeTests(_http.HttpClientDigestCredentials);
dart.setLibraryUri(_http.HttpClientDigestCredentials, "dart:_http");
_http.HttpConnectionInfo = class HttpConnectionInfo extends core.Object {};
(_http.HttpConnectionInfo.new = function() {
}).prototype = _http.HttpConnectionInfo.prototype;
dart.addTypeTests(_http.HttpConnectionInfo);
dart.setLibraryUri(_http.HttpConnectionInfo, "dart:_http");
_http.RedirectInfo = class RedirectInfo extends core.Object {};
(_http.RedirectInfo.new = function() {
}).prototype = _http.RedirectInfo.prototype;
dart.addTypeTests(_http.RedirectInfo);
dart.setLibraryUri(_http.RedirectInfo, "dart:_http");
_http.DetachedSocket = class DetachedSocket extends core.Object {};
(_http.DetachedSocket.new = function() {
}).prototype = _http.DetachedSocket.prototype;
dart.addTypeTests(_http.DetachedSocket);
dart.setLibraryUri(_http.DetachedSocket, "dart:_http");
_http.HttpException = class HttpException extends core.Object {
  toString() {
    let b = new core.StringBuffer.new();
    b.write("HttpException: ");
    b.write(this.message);
    if (this.uri != null) {
      b.write(", uri = " + dart.str(this.uri));
    }
    return b.toString();
  }
};
(_http.HttpException.new = function(message, opts) {
  let uri = opts && 'uri' in opts ? opts.uri : null;
  this.message = message;
  this.uri = uri;
}).prototype = _http.HttpException.prototype;
dart.addTypeTests(_http.HttpException);
_http.HttpException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(_http.HttpException, "dart:_http");
dart.setFieldSignature(_http.HttpException, () => ({
  __proto__: dart.getFields(_http.HttpException.__proto__),
  message: dart.finalFieldType(core.String),
  uri: dart.finalFieldType(core.Uri)
}));
dart.defineExtensionMethods(_http.HttpException, ['toString']);
_http.RedirectException = class RedirectException extends core.Object {
  toString() {
    return "RedirectException: " + dart.str(this.message);
  }
  get uri() {
    return this.redirects[$last].location;
  }
};
(_http.RedirectException.new = function(message, redirects) {
  this.message = message;
  this.redirects = redirects;
}).prototype = _http.RedirectException.prototype;
dart.addTypeTests(_http.RedirectException);
_http.RedirectException[dart.implements] = () => [_http.HttpException];
dart.setGetterSignature(_http.RedirectException, () => ({
  __proto__: dart.getGetters(_http.RedirectException.__proto__),
  uri: core.Uri
}));
dart.setLibraryUri(_http.RedirectException, "dart:_http");
dart.setFieldSignature(_http.RedirectException, () => ({
  __proto__: dart.getFields(_http.RedirectException.__proto__),
  message: dart.finalFieldType(core.String),
  redirects: dart.finalFieldType(ListOfRedirectInfo())
}));
dart.defineExtensionMethods(_http.RedirectException, ['toString']);
_http._CryptoUtils = class _CryptoUtils extends core.Object {
  static getRandomBytes(count) {
    let result = typed_data.Uint8List.new(count);
    for (let i = 0; i < dart.notNull(count); i++) {
      result[$_set](i, _http._CryptoUtils._rng.nextInt(255));
    }
    return result;
  }
  static bytesToHex(bytes) {
    let result = new core.StringBuffer.new();
    for (let part of bytes) {
      result.write((dart.notNull(part) < 16 ? "0" : "") + part[$toRadixString](16));
    }
    return result.toString();
  }
  static bytesToBase64(bytes, urlSafe, addLineSeparator) {
    if (urlSafe === void 0) urlSafe = false;
    if (addLineSeparator === void 0) addLineSeparator = false;
    let len = bytes[$length];
    if (len === 0) {
      return "";
    }
    let lookup = dart.test(urlSafe) ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    let remainderLength = dart.asInt(len[$remainder](3));
    let chunkLength = dart.notNull(len) - dart.notNull(remainderLength);
    let outputLen = (dart.notNull(len) / 3)[$truncate]() * 4 + (dart.notNull(remainderLength) > 0 ? 4 : 0);
    if (dart.test(addLineSeparator)) {
      outputLen = outputLen + (((outputLen - 1) / 76)[$truncate]() << 1 >>> 0);
    }
    let out = ListOfint().new(outputLen);
    let j = 0, i = 0, c = 0;
    while (i < chunkLength) {
      let x = (dart.notNull(bytes[$_get](i++)) << 16 & 16777215 | dart.notNull(bytes[$_get](i++)) << 8 & 16777215 | dart.notNull(bytes[$_get](i++))) >>> 0;
      out[$_set](j++, lookup[$codeUnitAt](x[$rightShift](18)));
      out[$_set](j++, lookup[$codeUnitAt](x >> 12 & 63));
      out[$_set](j++, lookup[$codeUnitAt](x >> 6 & 63));
      out[$_set](j++, lookup[$codeUnitAt](x & 63));
      if (dart.test(addLineSeparator) && ++c === 19 && j < outputLen - 2) {
        out[$_set](j++, 13);
        out[$_set](j++, 10);
        c = 0;
      }
    }
    if (remainderLength === 1) {
      let x = bytes[$_get](i);
      out[$_set](j++, lookup[$codeUnitAt](x[$rightShift](2)));
      out[$_set](j++, lookup[$codeUnitAt](dart.notNull(x) << 4 & 63));
      out[$_set](j++, 61);
      out[$_set](j++, 61);
    } else if (remainderLength === 2) {
      let x = bytes[$_get](i);
      let y = bytes[$_get](i + 1);
      out[$_set](j++, lookup[$codeUnitAt](x[$rightShift](2)));
      out[$_set](j++, lookup[$codeUnitAt]((dart.notNull(x) << 4 | dart.notNull(y) >> 4) & 63));
      out[$_set](j++, lookup[$codeUnitAt](dart.notNull(y) << 2 & 63));
      out[$_set](j++, 61);
    }
    return core.String.fromCharCodes(out);
  }
  static base64StringToBytes(input, ignoreInvalidCharacters) {
    if (ignoreInvalidCharacters === void 0) ignoreInvalidCharacters = true;
    let len = input.length;
    if (len === 0) {
      return ListOfint().new(0);
    }
    let extrasLen = 0;
    for (let i = 0; i < len; i++) {
      let c = _http._CryptoUtils._decodeTable[$_get](input[$codeUnitAt](i));
      if (dart.notNull(c) < 0) {
        extrasLen++;
        if (c === -2 && !dart.test(ignoreInvalidCharacters)) {
          dart.throw(new core.FormatException.new("Invalid character: " + dart.str(input[$_get](i))));
        }
      }
    }
    if ((len - extrasLen)[$modulo](4) !== 0) {
      dart.throw(new core.FormatException.new("Size of Base 64 characters in Input\n          must be a multiple of 4. Input: " + dart.str(input)));
    }
    let padLength = 0;
    for (let i = len - 1; i >= 0; i--) {
      let currentCodeUnit = input[$codeUnitAt](i);
      if (dart.notNull(_http._CryptoUtils._decodeTable[$_get](currentCodeUnit)) > 0) break;
      if (currentCodeUnit === 61) padLength++;
    }
    let outputLen = ((len - extrasLen) * 6)[$rightShift](3) - padLength;
    let out = ListOfint().new(outputLen);
    for (let i = 0, o = 0; o < outputLen;) {
      let x = 0;
      for (let j = 4; j > 0;) {
        let c = _http._CryptoUtils._decodeTable[$_get](input[$codeUnitAt](i++));
        if (dart.notNull(c) >= 0) {
          x = (x << 6 & 16777215 | dart.notNull(c)) >>> 0;
          j--;
        }
      }
      out[$_set](o++, x[$rightShift](16));
      if (o < outputLen) {
        out[$_set](o++, x >> 8 & 255);
        if (o < outputLen) out[$_set](o++, x & 255);
      }
    }
    return out;
  }
};
(_http._CryptoUtils.new = function() {
}).prototype = _http._CryptoUtils.prototype;
dart.addTypeTests(_http._CryptoUtils);
dart.setLibraryUri(_http._CryptoUtils, "dart:_http");
dart.defineLazy(_http._CryptoUtils, {
  /*_http._CryptoUtils.PAD*/get PAD() {
    return 61;
  },
  /*_http._CryptoUtils.CR*/get CR() {
    return 13;
  },
  /*_http._CryptoUtils.LF*/get LF() {
    return 10;
  },
  /*_http._CryptoUtils.LINE_LENGTH*/get LINE_LENGTH() {
    return 76;
  },
  /*_http._CryptoUtils._encodeTable*/get _encodeTable() {
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  },
  /*_http._CryptoUtils._encodeTableUrlSafe*/get _encodeTableUrlSafe() {
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  },
  /*_http._CryptoUtils._decodeTable*/get _decodeTable() {
    return dart.constList([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, 0, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2], core.int);
  },
  /*_http._CryptoUtils._rng*/get _rng() {
    return math.Random.secure();
  },
  set _rng(_) {}
});
dart.defineLazy(_http, {
  /*_http._MASK_8*/get _MASK_8() {
    return 255;
  },
  /*_http._MASK_32*/get _MASK_32() {
    return 4294967295;
  },
  /*_http._BITS_PER_BYTE*/get _BITS_PER_BYTE() {
    return 8;
  },
  /*_http._BYTES_PER_WORD*/get _BYTES_PER_WORD() {
    return 4;
  }
});
const _chunkSizeInWords = dart.privateName(_http, "_chunkSizeInWords");
const _digestSizeInWords = dart.privateName(_http, "_digestSizeInWords");
const _bigEndianWords = dart.privateName(_http, "_bigEndianWords");
const _pendingData = dart.privateName(_http, "_pendingData");
const _lengthInBytes = dart.privateName(_http, "_lengthInBytes");
const _currentChunk = dart.privateName(_http, "_currentChunk");
const _h = dart.privateName(_http, "_h");
const _digestCalled = dart.privateName(_http, "_digestCalled");
const _iterate = dart.privateName(_http, "_iterate");
const _resultAsBytes = dart.privateName(_http, "_resultAsBytes");
const _finalizeData = dart.privateName(_http, "_finalizeData");
const _add32 = dart.privateName(_http, "_add32");
const _roundUp = dart.privateName(_http, "_roundUp");
const _rotl32 = dart.privateName(_http, "_rotl32");
const _wordToBytes = dart.privateName(_http, "_wordToBytes");
const _bytesToChunk = dart.privateName(_http, "_bytesToChunk");
const _updateHash = dart.privateName(_http, "_updateHash");
_http._HashBase = class _HashBase extends core.Object {
  add(data) {
    if (dart.test(this[_digestCalled])) {
      dart.throw(new core.StateError.new("Hash update method called after digest was retrieved"));
    }
    this[_lengthInBytes] = dart.notNull(this[_lengthInBytes]) + dart.notNull(data[$length]);
    this[_pendingData][$addAll](data);
    this[_iterate]();
  }
  close() {
    if (dart.test(this[_digestCalled])) {
      return this[_resultAsBytes]();
    }
    this[_digestCalled] = true;
    this[_finalizeData]();
    this[_iterate]();
    if (!(this[_pendingData][$length] === 0)) dart.assertFailed(null, "dart:_http/crypto.dart", 217, 12, "_pendingData.length == 0");
    return this[_resultAsBytes]();
  }
  get blockSize() {
    return dart.notNull(this[_chunkSizeInWords]) * 4;
  }
  [_add32](x, y) {
    return dart.dsend(dart.dsend(x, '+', [y]), '&', [4294967295]);
  }
  [_roundUp](val, n) {
    return dart.dsend(dart.dsend(dart.dsend(val, '+', [n]), '-', [1]), '&', [dart.dsend(n, '_negate', [])]);
  }
  [_rotl32](val, shift) {
    let mod_shift = dart.notNull(shift) & 31;
    return (val[$leftShift](mod_shift) & 4294967295 | ((dart.notNull(val) & 4294967295) >>> 0)[$rightShift](32 - mod_shift)) >>> 0;
  }
  [_resultAsBytes]() {
    let result = JSArrayOfint().of([]);
    for (let i = 0; i < dart.notNull(this[_h][$length]); i++) {
      result[$addAll](this[_wordToBytes](this[_h][$_get](i)));
    }
    return result;
  }
  [_bytesToChunk](data, dataIndex) {
    if (!(dart.notNull(data[$length]) - dart.notNull(dataIndex) >= dart.notNull(this[_chunkSizeInWords]) * 4)) dart.assertFailed(null, "dart:_http/crypto.dart", 254, 12, "(data.length - dataIndex) >= (_chunkSizeInWords * _BYTES_PER_WORD)");
    for (let wordIndex = 0; wordIndex < dart.notNull(this[_chunkSizeInWords]); wordIndex++) {
      let w3 = dart.test(this[_bigEndianWords]) ? data[$_get](dataIndex) : data[$_get](dart.notNull(dataIndex) + 3);
      let w2 = dart.test(this[_bigEndianWords]) ? data[$_get](dart.notNull(dataIndex) + 1) : data[$_get](dart.notNull(dataIndex) + 2);
      let w1 = dart.test(this[_bigEndianWords]) ? data[$_get](dart.notNull(dataIndex) + 2) : data[$_get](dart.notNull(dataIndex) + 1);
      let w0 = dart.test(this[_bigEndianWords]) ? data[$_get](dart.notNull(dataIndex) + 3) : data[$_get](dataIndex);
      dataIndex = dart.notNull(dataIndex) + 4;
      let word = (dart.notNull(w3) & 255) << 24 >>> 0;
      word = (word | (dart.notNull(w2) & 255) << 16) >>> 0;
      word = (word | (dart.notNull(w1) & 255) << 8) >>> 0;
      word = (word | dart.notNull(w0) & 255) >>> 0;
      this[_currentChunk][$_set](wordIndex, word);
    }
  }
  [_wordToBytes](word) {
    let bytes = ListOfint().new(4);
    bytes[$_set](0, word[$rightShift](dart.test(this[_bigEndianWords]) ? 24 : 0) & 255);
    bytes[$_set](1, word[$rightShift](dart.test(this[_bigEndianWords]) ? 16 : 8) & 255);
    bytes[$_set](2, word[$rightShift](dart.test(this[_bigEndianWords]) ? 8 : 16) & 255);
    bytes[$_set](3, word[$rightShift](dart.test(this[_bigEndianWords]) ? 0 : 24) & 255);
    return bytes;
  }
  [_iterate]() {
    let len = this[_pendingData][$length];
    let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * 4;
    if (dart.notNull(len) >= chunkSizeInBytes) {
      let index = 0;
      for (; dart.notNull(len) - index >= chunkSizeInBytes; index = index + chunkSizeInBytes) {
        this[_bytesToChunk](this[_pendingData], index);
        this[_updateHash](this[_currentChunk]);
      }
      this[_pendingData] = this[_pendingData][$sublist](index, len);
    }
  }
  [_finalizeData]() {
    this[_pendingData][$add](128);
    let contentsLength = dart.notNull(this[_lengthInBytes]) + 9;
    let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * 4;
    let finalizedLength = this[_roundUp](contentsLength, chunkSizeInBytes);
    let zeroPadding = dart.dsend(finalizedLength, '-', [contentsLength]);
    for (let i = 0; i < dart.notNull(core.num._check(zeroPadding)); i++) {
      this[_pendingData][$add](0);
    }
    let lengthInBits = dart.notNull(this[_lengthInBytes]) * 8;
    if (!(lengthInBits < math.pow(2, 32))) dart.assertFailed(null, "dart:_http/crypto.dart", 307, 12, "lengthInBits < pow(2, 32)");
    if (dart.test(this[_bigEndianWords])) {
      this[_pendingData][$addAll](this[_wordToBytes](0));
      this[_pendingData][$addAll](this[_wordToBytes]((lengthInBits & 4294967295) >>> 0));
    } else {
      this[_pendingData][$addAll](this[_wordToBytes]((lengthInBits & 4294967295) >>> 0));
      this[_pendingData][$addAll](this[_wordToBytes](0));
    }
  }
};
(_http._HashBase.new = function(chunkSizeInWords, digestSizeInWords, bigEndianWords) {
  this[_lengthInBytes] = 0;
  this[_currentChunk] = null;
  this[_h] = null;
  this[_digestCalled] = false;
  this[_chunkSizeInWords] = chunkSizeInWords;
  this[_digestSizeInWords] = digestSizeInWords;
  this[_bigEndianWords] = bigEndianWords;
  this[_pendingData] = JSArrayOfint().of([]);
  this[_currentChunk] = ListOfint().new(this[_chunkSizeInWords]);
  this[_h] = ListOfint().new(this[_digestSizeInWords]);
}).prototype = _http._HashBase.prototype;
dart.addTypeTests(_http._HashBase);
dart.setMethodSignature(_http._HashBase, () => ({
  __proto__: dart.getMethods(_http._HashBase.__proto__),
  add: dart.fnType(dart.dynamic, [core.List$(core.int)]),
  close: dart.fnType(core.List$(core.int), []),
  [_add32]: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic]),
  [_roundUp]: dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic]),
  [_rotl32]: dart.fnType(core.int, [core.int, core.int]),
  [_resultAsBytes]: dart.fnType(core.List$(core.int), []),
  [_bytesToChunk]: dart.fnType(dart.dynamic, [core.List$(core.int), core.int]),
  [_wordToBytes]: dart.fnType(core.List$(core.int), [core.int]),
  [_iterate]: dart.fnType(dart.dynamic, []),
  [_finalizeData]: dart.fnType(dart.dynamic, [])
}));
dart.setGetterSignature(_http._HashBase, () => ({
  __proto__: dart.getGetters(_http._HashBase.__proto__),
  blockSize: core.int
}));
dart.setLibraryUri(_http._HashBase, "dart:_http");
dart.setFieldSignature(_http._HashBase, () => ({
  __proto__: dart.getFields(_http._HashBase.__proto__),
  [_chunkSizeInWords]: dart.finalFieldType(core.int),
  [_digestSizeInWords]: dart.finalFieldType(core.int),
  [_bigEndianWords]: dart.finalFieldType(core.bool),
  [_lengthInBytes]: dart.fieldType(core.int),
  [_pendingData]: dart.fieldType(ListOfint()),
  [_currentChunk]: dart.fieldType(ListOfint()),
  [_h]: dart.fieldType(ListOfint()),
  [_digestCalled]: dart.fieldType(core.bool)
}));
_http._MD5 = class _MD5 extends _http._HashBase {
  newInstance() {
    return new _http._MD5.new();
  }
  [_updateHash](m) {
    if (!(m[$length] === 16)) dart.assertFailed(null, "dart:_http/crypto.dart", 356, 12, "m.length == 16");
    let a = this[_h][$_get](0);
    let b = this[_h][$_get](1);
    let c = this[_h][$_get](2);
    let d = this[_h][$_get](3);
    let t0 = null;
    let t1 = null;
    for (let i = 0; i < 64; i++) {
      if (i < 16) {
        t0 = (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & 4294967295 & dart.notNull(d)) >>> 0;
        t1 = i;
      } else if (i < 32) {
        t0 = (dart.notNull(d) & dart.notNull(b) | ~dart.notNull(d) & 4294967295 & dart.notNull(c)) >>> 0;
        t1 = (5 * i + 1)[$modulo](16);
      } else if (i < 48) {
        t0 = (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0;
        t1 = (3 * i + 5)[$modulo](16);
      } else {
        t0 = (dart.notNull(c) ^ (dart.notNull(b) | ~dart.notNull(d) & 4294967295)) >>> 0;
        t1 = (7 * i)[$modulo](16);
      }
      let temp = d;
      d = c;
      c = b;
      b = core.int._check(this[_add32](b, this[_rotl32](core.int._check(this[_add32](this[_add32](a, t0), this[_add32](_http._MD5._k[$_get](i), m[$_get](core.int._check(t1))))), _http._MD5._r[$_get](i))));
      a = temp;
    }
    this[_h][$_set](0, core.int._check(this[_add32](a, this[_h][$_get](0))));
    this[_h][$_set](1, core.int._check(this[_add32](b, this[_h][$_get](1))));
    this[_h][$_set](2, core.int._check(this[_add32](c, this[_h][$_get](2))));
    this[_h][$_set](3, core.int._check(this[_add32](d, this[_h][$_get](3))));
  }
};
(_http._MD5.new = function() {
  _http._MD5.__proto__.new.call(this, 16, 4, false);
  this[_h][$_set](0, 1732584193);
  this[_h][$_set](1, 4023233417);
  this[_h][$_set](2, 2562383102);
  this[_h][$_set](3, 271733878);
}).prototype = _http._MD5.prototype;
dart.addTypeTests(_http._MD5);
dart.setMethodSignature(_http._MD5, () => ({
  __proto__: dart.getMethods(_http._MD5.__proto__),
  newInstance: dart.fnType(_http._MD5, []),
  [_updateHash]: dart.fnType(dart.void, [core.List$(core.int)])
}));
dart.setLibraryUri(_http._MD5, "dart:_http");
dart.defineLazy(_http._MD5, {
  /*_http._MD5._k*/get _k() {
    return dart.constList([3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, 4149444226, 3174756917, 718787259, 3951481745], core.int);
  },
  /*_http._MD5._r*/get _r() {
    return dart.constList([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21], core.int);
  }
});
const _w = dart.privateName(_http, "_w");
_http._SHA1 = class _SHA1 extends _http._HashBase {
  newInstance() {
    return new _http._SHA1.new();
  }
  [_updateHash](m) {
    if (!(m[$length] === 16)) dart.assertFailed(null, "dart:_http/crypto.dart", 417, 12, "m.length == 16");
    let a = this[_h][$_get](0);
    let b = this[_h][$_get](1);
    let c = this[_h][$_get](2);
    let d = this[_h][$_get](3);
    let e = this[_h][$_get](4);
    for (let i = 0; i < 80; i++) {
      if (i < 16) {
        this[_w][$_set](i, m[$_get](i));
      } else {
        let n = (dart.notNull(this[_w][$_get](i - 3)) ^ dart.notNull(this[_w][$_get](i - 8)) ^ dart.notNull(this[_w][$_get](i - 14)) ^ dart.notNull(this[_w][$_get](i - 16))) >>> 0;
        this[_w][$_set](i, this[_rotl32](n, 1));
      }
      let t = this[_add32](this[_add32](this[_rotl32](a, 5), e), this[_w][$_get](i));
      if (i < 20) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & dart.notNull(d)) >>> 0), 1518500249);
      } else if (i < 40) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 1859775393);
      } else if (i < 60) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | dart.notNull(b) & dart.notNull(d) | dart.notNull(c) & dart.notNull(d)) >>> 0), 2400959708);
      } else {
        t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 3395469782);
      }
      e = d;
      d = c;
      c = this[_rotl32](b, 30);
      b = a;
      a = core.int._check(dart.dsend(t, '&', [4294967295]));
    }
    this[_h][$_set](0, core.int._check(this[_add32](a, this[_h][$_get](0))));
    this[_h][$_set](1, core.int._check(this[_add32](b, this[_h][$_get](1))));
    this[_h][$_set](2, core.int._check(this[_add32](c, this[_h][$_get](2))));
    this[_h][$_set](3, core.int._check(this[_add32](d, this[_h][$_get](3))));
    this[_h][$_set](4, core.int._check(this[_add32](e, this[_h][$_get](4))));
  }
};
(_http._SHA1.new = function() {
  this[_w] = ListOfint().new(80);
  _http._SHA1.__proto__.new.call(this, 16, 5, true);
  this[_h][$_set](0, 1732584193);
  this[_h][$_set](1, 4023233417);
  this[_h][$_set](2, 2562383102);
  this[_h][$_set](3, 271733878);
  this[_h][$_set](4, 3285377520);
}).prototype = _http._SHA1.prototype;
dart.addTypeTests(_http._SHA1);
dart.setMethodSignature(_http._SHA1, () => ({
  __proto__: dart.getMethods(_http._SHA1.__proto__),
  newInstance: dart.fnType(_http._SHA1, []),
  [_updateHash]: dart.fnType(dart.void, [core.List$(core.int)])
}));
dart.setLibraryUri(_http._SHA1, "dart:_http");
dart.setFieldSignature(_http._SHA1, () => ({
  __proto__: dart.getFields(_http._SHA1.__proto__),
  [_w]: dart.fieldType(ListOfint())
}));
let const$89;
let const$90;
let const$91;
let const$92;
let const$93;
let const$94;
let const$95;
let const$96;
let const$97;
_http.HttpDate = class HttpDate extends core.Object {
  static format(date) {
    let wkday = const$89 || (const$89 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], dart.dynamic));
    let month = const$90 || (const$90 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], dart.dynamic));
    let d = date.toUtc();
    let sb = new core.StringBuffer.new();
    sb.write(wkday[$_get](dart.notNull(d.weekday) - 1));
    sb.write(", ");
    sb.write(dart.notNull(d.day) <= 9 ? "0" : "");
    sb.write(dart.toString(d.day));
    sb.write(" ");
    sb.write(month[$_get](dart.notNull(d.month) - 1));
    sb.write(" ");
    sb.write(dart.toString(d.year));
    sb.write(dart.notNull(d.hour) <= 9 ? " 0" : " ");
    sb.write(dart.toString(d.hour));
    sb.write(dart.notNull(d.minute) <= 9 ? ":0" : ":");
    sb.write(dart.toString(d.minute));
    sb.write(dart.notNull(d.second) <= 9 ? ":0" : ":");
    sb.write(dart.toString(d.second));
    sb.write(" GMT");
    return sb.toString();
  }
  static parse(date) {
    let SP = 32;
    let wkdays = const$91 || (const$91 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], dart.dynamic));
    let weekdays = const$92 || (const$92 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], dart.dynamic));
    let months = const$93 || (const$93 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], dart.dynamic));
    let wkdaysLowerCase = const$94 || (const$94 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], dart.dynamic));
    let weekdaysLowerCase = const$95 || (const$95 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], dart.dynamic));
    let monthsLowerCase = const$96 || (const$96 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], dart.dynamic));
    let formatRfc1123 = 0;
    let formatRfc850 = 1;
    let formatAsctime = 2;
    let index = 0;
    let tmp = null;
    let format = null;
    function expect(s) {
      if (date.length - index < s.length) {
        dart.throw(new _http.HttpException.new("Invalid HTTP date " + dart.str(date)));
      }
      let tmp = date[$substring](index, index + s.length);
      if (tmp !== s) {
        dart.throw(new _http.HttpException.new("Invalid HTTP date " + dart.str(date)));
      }
      index = index + s.length;
    }
    dart.fn(expect, StringTovoid());
    function expectWeekday() {
      let weekday = null;
      let pos = date[$indexOf](",", index);
      if (pos === -1) {
        let pos = date[$indexOf](" ", index);
        if (pos === -1) dart.throw(new _http.HttpException.new("Invalid HTTP date " + dart.str(date)));
        tmp = date[$substring](index, pos);
        index = pos + 1;
        weekday = wkdays[$indexOf](tmp);
        if (weekday !== -1) {
          format = formatAsctime;
          return weekday;
        }
      } else {
        tmp = date[$substring](index, pos);
        index = pos + 1;
        weekday = wkdays[$indexOf](tmp);
        if (weekday !== -1) {
          format = formatRfc1123;
          return weekday;
        }
        weekday = weekdays[$indexOf](tmp);
        if (weekday !== -1) {
          format = formatRfc850;
          return weekday;
        }
      }
      dart.throw(new _http.HttpException.new("Invalid HTTP date " + dart.str(date)));
    }
    dart.fn(expectWeekday, VoidToint());
    function expectMonth(separator) {
      let pos = date[$indexOf](separator, index);
      if (pos - index !== 3) dart.throw(new _http.HttpException.new("Invalid HTTP date " + dart.str(date)));
      tmp = date[$substring](index, pos);
      index = pos + 1;
      let month = months[$indexOf](tmp);
      if (month !== -1) return month;
      dart.throw(new _http.HttpException.new("Invalid HTTP date " + dart.str(date)));
    }
    dart.fn(expectMonth, StringToint());
    function expectNum(separator) {
      let pos = null;
      if (separator.length > 0) {
        pos = date[$indexOf](separator, index);
      } else {
        pos = date.length;
      }
      let tmp = date[$substring](index, pos);
      index = dart.notNull(pos) + separator.length;
      try {
        let value = core.int.parse(tmp);
        return value;
      } catch (e$) {
        let e = dart.getThrown(e$);
        if (core.FormatException.is(e)) {
          dart.throw(new _http.HttpException.new("Invalid HTTP date " + dart.str(date)));
        } else
          throw e$;
      }
    }
    dart.fn(expectNum, StringToint());
    function expectEnd() {
      if (index !== date.length) {
        dart.throw(new _http.HttpException.new("Invalid HTTP date " + dart.str(date)));
      }
    }
    dart.fn(expectEnd, VoidTovoid());
    let weekday = expectWeekday();
    let day = null;
    let month = null;
    let year = null;
    let hours = null;
    let minutes = null;
    let seconds = null;
    if (format === formatAsctime) {
      month = expectMonth(" ");
      if (date[$codeUnitAt](index) === SP) index++;
      day = expectNum(" ");
      hours = expectNum(":");
      minutes = expectNum(":");
      seconds = expectNum(" ");
      year = expectNum("");
    } else {
      expect(" ");
      day = expectNum(format === formatRfc1123 ? " " : "-");
      month = expectMonth(format === formatRfc1123 ? " " : "-");
      year = expectNum(" ");
      hours = expectNum(":");
      minutes = expectNum(":");
      seconds = expectNum(" ");
      expect("GMT");
    }
    expectEnd();
    return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
  }
  static _parseCookieDate(date) {
    let monthsLowerCase = const$97 || (const$97 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], dart.dynamic));
    let position = 0;
    function error() {
      dart.throw(new _http.HttpException.new("Invalid cookie date " + dart.str(date)));
    }
    dart.fn(error, VoidTovoid());
    function isEnd() {
      return position === date.length;
    }
    dart.fn(isEnd, VoidTobool());
    function isDelimiter(s) {
      let char = s[$codeUnitAt](0);
      if (char === 9) return true;
      if (char >= 32 && char <= 47) return true;
      if (char >= 59 && char <= 64) return true;
      if (char >= 91 && char <= 96) return true;
      if (char >= 123 && char <= 126) return true;
      return false;
    }
    dart.fn(isDelimiter, StringTobool());
    function isNonDelimiter(s) {
      let char = s[$codeUnitAt](0);
      if (char >= 0 && char <= 8) return true;
      if (char >= 10 && char <= 31) return true;
      if (char >= 48 && char <= 57) return true;
      if (char === 58) return true;
      if (char >= 65 && char <= 90) return true;
      if (char >= 97 && char <= 122) return true;
      if (char >= 127 && char <= 255) return true;
      return false;
    }
    dart.fn(isNonDelimiter, StringTobool());
    function isDigit(s) {
      let char = s[$codeUnitAt](0);
      if (char > 47 && char < 58) return true;
      return false;
    }
    dart.fn(isDigit, StringTobool());
    function getMonth(month) {
      if (month.length < 3) return -1;
      return monthsLowerCase[$indexOf](month[$substring](0, 3));
    }
    dart.fn(getMonth, StringToint());
    function toInt(s) {
      let index = 0;
      for (; index < s.length && dart.test(isDigit(s[$_get](index))); index++)
        ;
      return core.int.parse(s[$substring](0, index));
    }
    dart.fn(toInt, StringToint());
    let tokens = [];
    while (!dart.test(isEnd())) {
      while (!dart.test(isEnd()) && dart.test(isDelimiter(date[$_get](position))))
        position++;
      let start = position;
      while (!dart.test(isEnd()) && dart.test(isNonDelimiter(date[$_get](position))))
        position++;
      tokens[$add](date[$substring](start, position)[$toLowerCase]());
      while (!dart.test(isEnd()) && dart.test(isDelimiter(date[$_get](position))))
        position++;
    }
    let timeStr = null;
    let dayOfMonthStr = null;
    let monthStr = null;
    let yearStr = null;
    for (let token of tokens) {
      if (dart.dtest(dart.dsend(dart.dload(token, 'length'), '<', [1]))) continue;
      if (timeStr == null && dart.dtest(dart.dsend(dart.dload(token, 'length'), '>=', [5])) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && (dart.equals(dart.dindex(token, 1), ":") || dart.test(isDigit(core.String._check(dart.dindex(token, 1)))) && dart.equals(dart.dindex(token, 2), ":"))) {
        timeStr = core.String._check(token);
      } else if (dayOfMonthStr == null && dart.test(isDigit(core.String._check(dart.dindex(token, 0))))) {
        dayOfMonthStr = core.String._check(token);
      } else if (monthStr == null && dart.notNull(getMonth(core.String._check(token))) >= 0) {
        monthStr = core.String._check(token);
      } else if (yearStr == null && dart.dtest(dart.dsend(dart.dload(token, 'length'), '>=', [2])) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && dart.test(isDigit(core.String._check(dart.dindex(token, 1))))) {
        yearStr = core.String._check(token);
      }
    }
    if (timeStr == null || dayOfMonthStr == null || monthStr == null || yearStr == null) {
      error();
    }
    let year = toInt(yearStr);
    if (dart.notNull(year) >= 70 && dart.notNull(year) <= 99) {
      year = dart.notNull(year) + 1900;
    } else if (dart.notNull(year) >= 0 && dart.notNull(year) <= 69) {
      year = dart.notNull(year) + 2000;
    }
    if (dart.notNull(year) < 1601) error();
    let dayOfMonth = toInt(dayOfMonthStr);
    if (dart.notNull(dayOfMonth) < 1 || dart.notNull(dayOfMonth) > 31) error();
    let month = dart.notNull(getMonth(monthStr)) + 1;
    let timeList = timeStr[$split](":");
    if (timeList[$length] !== 3) error();
    let hour = toInt(timeList[$_get](0));
    let minute = toInt(timeList[$_get](1));
    let second = toInt(timeList[$_get](2));
    if (dart.notNull(hour) > 23) error();
    if (dart.notNull(minute) > 59) error();
    if (dart.notNull(second) > 59) error();
    return new core.DateTime.utc(year, month, dayOfMonth, hour, minute, second, 0);
  }
};
(_http.HttpDate.new = function() {
}).prototype = _http.HttpDate.prototype;
dart.addTypeTests(_http.HttpDate);
dart.setLibraryUri(_http.HttpDate, "dart:_http");
const _headers = dart.privateName(_http, "_headers");
const _defaultPortForScheme = dart.privateName(_http, "_defaultPortForScheme");
const _mutable = dart.privateName(_http, "_mutable");
const _noFoldingHeaders = dart.privateName(_http, "_noFoldingHeaders");
const _contentLength = dart.privateName(_http, "_contentLength");
const _persistentConnection = dart.privateName(_http, "_persistentConnection");
const _chunkedTransferEncoding = dart.privateName(_http, "_chunkedTransferEncoding");
const _host$ = dart.privateName(_http, "_host");
const _port$ = dart.privateName(_http, "_port");
const _checkMutable = dart.privateName(_http, "_checkMutable");
const _addAll = dart.privateName(_http, "_addAll");
const _add$2 = dart.privateName(_http, "_add");
const _set = dart.privateName(_http, "_set");
const _addValue = dart.privateName(_http, "_addValue");
const _updateHostHeader = dart.privateName(_http, "_updateHostHeader");
const _addDate = dart.privateName(_http, "_addDate");
const _addHost = dart.privateName(_http, "_addHost");
const _addExpires = dart.privateName(_http, "_addExpires");
const _addConnection = dart.privateName(_http, "_addConnection");
const _addContentType = dart.privateName(_http, "_addContentType");
const _addContentLength = dart.privateName(_http, "_addContentLength");
const _addTransferEncoding = dart.privateName(_http, "_addTransferEncoding");
const _addIfModifiedSince = dart.privateName(_http, "_addIfModifiedSince");
const _foldHeader = dart.privateName(_http, "_foldHeader");
const _finalize = dart.privateName(_http, "_finalize");
const _build = dart.privateName(_http, "_build");
const _parseCookies = dart.privateName(_http, "_parseCookies");
_http._HttpHeaders = class _HttpHeaders extends core.Object {
  _get(name) {
    return this[_headers][$_get](name[$toLowerCase]());
  }
  value(name) {
    name = name[$toLowerCase]();
    let values = this[_headers][$_get](name);
    if (values == null) return null;
    if (dart.notNull(values[$length]) > 1) {
      dart.throw(new _http.HttpException.new("More than one value for header " + dart.str(name)));
    }
    return values[$_get](0);
  }
  add(name, value) {
    this[_checkMutable]();
    this[_addAll](_http._HttpHeaders._validateField(name), value);
  }
  [_addAll](name, value) {
    if (!(name == _http._HttpHeaders._validateField(name))) dart.assertFailed(null, "dart:_http/http_headers.dart", 59, 12, "name == _validateField(name)");
    if (core.Iterable.is(value)) {
      for (let v of value) {
        this[_add$2](name, _http._HttpHeaders._validateValue(v));
      }
    } else {
      this[_add$2](name, _http._HttpHeaders._validateValue(value));
    }
  }
  set(name, value) {
    this[_checkMutable]();
    name = _http._HttpHeaders._validateField(name);
    this[_headers][$remove](name);
    if (name === _http.HttpHeaders.transferEncodingHeader) {
      this[_chunkedTransferEncoding] = false;
    }
    this[_addAll](name, value);
  }
  remove(name, value) {
    this[_checkMutable]();
    name = _http._HttpHeaders._validateField(name);
    value = _http._HttpHeaders._validateValue(value);
    let values = this[_headers][$_get](name);
    if (values != null) {
      let index = values[$indexOf](core.String._check(value));
      if (index !== -1) {
        values[$removeRange](index, dart.notNull(index) + 1);
      }
      if (values[$length] === 0) this[_headers][$remove](name);
    }
    if (name === _http.HttpHeaders.transferEncodingHeader && dart.equals(value, "chunked")) {
      this[_chunkedTransferEncoding] = false;
    }
  }
  removeAll(name) {
    this[_checkMutable]();
    name = _http._HttpHeaders._validateField(name);
    this[_headers][$remove](name);
  }
  forEach(f) {
    this[_headers][$forEach](f);
  }
  noFolding(name) {
    if (this[_noFoldingHeaders] == null) this[_noFoldingHeaders] = JSArrayOfString().of([]);
    this[_noFoldingHeaders][$add](name);
  }
  get persistentConnection() {
    return this[_persistentConnection];
  }
  set persistentConnection(persistentConnection) {
    this[_checkMutable]();
    if (persistentConnection == this[_persistentConnection]) return;
    if (dart.test(persistentConnection)) {
      if (this.protocolVersion === "1.1") {
        this.remove(_http.HttpHeaders.connectionHeader, "close");
      } else {
        if (this[_contentLength] === -1) {
          dart.throw(new _http.HttpException.new("Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with " + "no ContentLength"));
        }
        this.add(_http.HttpHeaders.connectionHeader, "keep-alive");
      }
    } else {
      if (this.protocolVersion === "1.1") {
        this.add(_http.HttpHeaders.connectionHeader, "close");
      } else {
        this.remove(_http.HttpHeaders.connectionHeader, "keep-alive");
      }
    }
    this[_persistentConnection] = persistentConnection;
  }
  get contentLength() {
    return this[_contentLength];
  }
  set contentLength(contentLength) {
    this[_checkMutable]();
    if (this.protocolVersion === "1.0" && dart.test(this.persistentConnection) && contentLength === -1) {
      dart.throw(new _http.HttpException.new("Trying to clear ContentLength on HTTP 1.0 headers with " + "'Connection: Keep-Alive' set"));
    }
    if (this[_contentLength] == contentLength) return;
    this[_contentLength] = contentLength;
    if (dart.notNull(this[_contentLength]) >= 0) {
      if (dart.test(this.chunkedTransferEncoding)) this.chunkedTransferEncoding = false;
      this[_set](_http.HttpHeaders.contentLengthHeader, dart.toString(contentLength));
    } else {
      this.removeAll(_http.HttpHeaders.contentLengthHeader);
      if (this.protocolVersion === "1.1") {
        this.chunkedTransferEncoding = true;
      }
    }
  }
  get chunkedTransferEncoding() {
    return this[_chunkedTransferEncoding];
  }
  set chunkedTransferEncoding(chunkedTransferEncoding) {
    this[_checkMutable]();
    if (dart.test(chunkedTransferEncoding) && this.protocolVersion === "1.0") {
      dart.throw(new _http.HttpException.new("Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers"));
    }
    if (chunkedTransferEncoding == this[_chunkedTransferEncoding]) return;
    if (dart.test(chunkedTransferEncoding)) {
      let values = this[_headers][$_get](_http.HttpHeaders.transferEncodingHeader);
      if (values == null || values[$last] !== "chunked") {
        this[_addValue](_http.HttpHeaders.transferEncodingHeader, "chunked");
      }
      this.contentLength = -1;
    } else {
      this.remove(_http.HttpHeaders.transferEncodingHeader, "chunked");
    }
    this[_chunkedTransferEncoding] = chunkedTransferEncoding;
  }
  get host() {
    return this[_host$];
  }
  set host(host) {
    this[_checkMutable]();
    this[_host$] = host;
    this[_updateHostHeader]();
  }
  get port() {
    return this[_port$];
  }
  set port(port) {
    this[_checkMutable]();
    this[_port$] = port;
    this[_updateHostHeader]();
  }
  get ifModifiedSince() {
    let values = this[_headers][$_get](_http.HttpHeaders.ifModifiedSinceHeader);
    if (values != null) {
      try {
        return _http.HttpDate.parse(values[$_get](0));
      } catch (e$) {
        let e = dart.getThrown(e$);
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e$;
      }
    }
    return null;
  }
  set ifModifiedSince(ifModifiedSince) {
    this[_checkMutable]();
    let formatted = _http.HttpDate.format(ifModifiedSince.toUtc());
    this[_set](_http.HttpHeaders.ifModifiedSinceHeader, formatted);
  }
  get date() {
    let values = this[_headers][$_get](_http.HttpHeaders.dateHeader);
    if (values != null) {
      try {
        return _http.HttpDate.parse(values[$_get](0));
      } catch (e$) {
        let e = dart.getThrown(e$);
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e$;
      }
    }
    return null;
  }
  set date(date) {
    this[_checkMutable]();
    let formatted = _http.HttpDate.format(date.toUtc());
    this[_set]("date", formatted);
  }
  get expires() {
    let values = this[_headers][$_get](_http.HttpHeaders.expiresHeader);
    if (values != null) {
      try {
        return _http.HttpDate.parse(values[$_get](0));
      } catch (e$) {
        let e = dart.getThrown(e$);
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e$;
      }
    }
    return null;
  }
  set expires(expires) {
    this[_checkMutable]();
    let formatted = _http.HttpDate.format(expires.toUtc());
    this[_set](_http.HttpHeaders.expiresHeader, formatted);
  }
  get contentType() {
    let values = this[_headers][$_get]("content-type");
    if (values != null) {
      return _http.ContentType.parse(values[$_get](0));
    } else {
      return null;
    }
  }
  set contentType(contentType) {
    this[_checkMutable]();
    this[_set](_http.HttpHeaders.contentTypeHeader, dart.toString(contentType));
  }
  clear() {
    this[_checkMutable]();
    this[_headers][$clear]();
    this[_contentLength] = -1;
    this[_persistentConnection] = true;
    this[_chunkedTransferEncoding] = false;
    this[_host$] = null;
    this[_port$] = null;
  }
  [_add$2](name, value) {
    if (!(name == _http._HttpHeaders._validateField(name))) dart.assertFailed(null, "dart:_http/http_headers.dart", 283, 12, "name == _validateField(name)");
    switch (name.length) {
      case 4:
      {
        if (_http.HttpHeaders.dateHeader === name) {
          this[_addDate](name, value);
          return;
        }
        if (_http.HttpHeaders.hostHeader === name) {
          this[_addHost](name, value);
          return;
        }
        break;
      }
      case 7:
      {
        if (_http.HttpHeaders.expiresHeader === name) {
          this[_addExpires](name, value);
          return;
        }
        break;
      }
      case 10:
      {
        if (_http.HttpHeaders.connectionHeader === name) {
          this[_addConnection](name, value);
          return;
        }
        break;
      }
      case 12:
      {
        if (_http.HttpHeaders.contentTypeHeader === name) {
          this[_addContentType](name, value);
          return;
        }
        break;
      }
      case 14:
      {
        if (_http.HttpHeaders.contentLengthHeader === name) {
          this[_addContentLength](name, value);
          return;
        }
        break;
      }
      case 17:
      {
        if (_http.HttpHeaders.transferEncodingHeader === name) {
          this[_addTransferEncoding](name, value);
          return;
        }
        if (_http.HttpHeaders.ifModifiedSinceHeader === name) {
          this[_addIfModifiedSince](name, value);
          return;
        }
      }
    }
    this[_addValue](name, value);
  }
  [_addContentLength](name, value) {
    if (core.int.is(value)) {
      this.contentLength = value;
    } else if (typeof value == 'string') {
      this.contentLength = core.int.parse(value);
    } else {
      dart.throw(new _http.HttpException.new("Unexpected type for header named " + dart.str(name)));
    }
  }
  [_addTransferEncoding](name, value) {
    if (dart.equals(value, "chunked")) {
      this.chunkedTransferEncoding = true;
    } else {
      this[_addValue](_http.HttpHeaders.transferEncodingHeader, value);
    }
  }
  [_addDate](name, value) {
    if (core.DateTime.is(value)) {
      this.date = value;
    } else if (typeof value == 'string') {
      this[_set](_http.HttpHeaders.dateHeader, value);
    } else {
      dart.throw(new _http.HttpException.new("Unexpected type for header named " + dart.str(name)));
    }
  }
  [_addExpires](name, value) {
    if (core.DateTime.is(value)) {
      this.expires = value;
    } else if (typeof value == 'string') {
      this[_set](_http.HttpHeaders.expiresHeader, value);
    } else {
      dart.throw(new _http.HttpException.new("Unexpected type for header named " + dart.str(name)));
    }
  }
  [_addIfModifiedSince](name, value) {
    if (core.DateTime.is(value)) {
      this.ifModifiedSince = value;
    } else if (typeof value == 'string') {
      this[_set](_http.HttpHeaders.ifModifiedSinceHeader, value);
    } else {
      dart.throw(new _http.HttpException.new("Unexpected type for header named " + dart.str(name)));
    }
  }
  [_addHost](name, value) {
    if (typeof value == 'string') {
      let pos = value[$indexOf](":");
      if (pos === -1) {
        this[_host$] = value;
        this[_port$] = _http.HttpClient.defaultHttpPort;
      } else {
        if (pos > 0) {
          this[_host$] = value[$substring](0, pos);
        } else {
          this[_host$] = null;
        }
        if (pos + 1 === value.length) {
          this[_port$] = _http.HttpClient.defaultHttpPort;
        } else {
          try {
            this[_port$] = core.int.parse(value[$substring](pos + 1));
          } catch (e$) {
            let e = dart.getThrown(e$);
            if (core.FormatException.is(e)) {
              this[_port$] = null;
            } else
              throw e$;
          }
        }
      }
      this[_set](_http.HttpHeaders.hostHeader, value);
    } else {
      dart.throw(new _http.HttpException.new("Unexpected type for header named " + dart.str(name)));
    }
  }
  [_addConnection](name, value) {
    let lowerCaseValue = dart.dsend(value, 'toLowerCase', []);
    if (dart.equals(lowerCaseValue, "close")) {
      this[_persistentConnection] = false;
    } else if (dart.equals(lowerCaseValue, "keep-alive")) {
      this[_persistentConnection] = true;
    }
    this[_addValue](name, value);
  }
  [_addContentType](name, value) {
    this[_set](_http.HttpHeaders.contentTypeHeader, core.String._check(value));
  }
  [_addValue](name, value) {
    let values = this[_headers][$_get](name);
    if (values == null) {
      values = JSArrayOfString().of([]);
      this[_headers][$_set](name, values);
    }
    if (core.DateTime.is(value)) {
      values[$add](_http.HttpDate.format(value));
    } else if (typeof value == 'string') {
      values[$add](value);
    } else {
      values[$add](core.String._check(_http._HttpHeaders._validateValue(dart.toString(value))));
    }
  }
  [_set](name, value) {
    if (!(name == _http._HttpHeaders._validateField(name))) dart.assertFailed(null, "dart:_http/http_headers.dart", 440, 12, "name == _validateField(name)");
    let values = JSArrayOfString().of([]);
    this[_headers][$_set](name, values);
    values[$add](value);
  }
  [_checkMutable]() {
    if (!dart.test(this[_mutable])) dart.throw(new _http.HttpException.new("HTTP headers are not mutable"));
  }
  [_updateHostHeader]() {
    let defaultPort = this[_port$] == null || this[_port$] == this[_defaultPortForScheme];
    this[_set]("host", defaultPort ? this.host : dart.str(this.host) + ":" + dart.str(this[_port$]));
  }
  [_foldHeader](name) {
    if (name === _http.HttpHeaders.setCookieHeader || this[_noFoldingHeaders] != null && this[_noFoldingHeaders][$indexOf](name) !== -1) {
      return false;
    }
    return true;
  }
  [_finalize]() {
    this[_mutable] = false;
  }
  [_build](builder) {
    for (let name of this[_headers][$keys]) {
      let values = this[_headers][$_get](name);
      let fold = core.bool._check(this[_foldHeader](name));
      let nameData = name[$codeUnits];
      builder.add(nameData);
      builder.addByte(_http._CharCode.COLON);
      builder.addByte(_http._CharCode.SP);
      for (let i = 0; i < dart.notNull(values[$length]); i++) {
        if (i > 0) {
          if (dart.test(fold)) {
            builder.addByte(_http._CharCode.COMMA);
            builder.addByte(_http._CharCode.SP);
          } else {
            builder.addByte(_http._CharCode.CR);
            builder.addByte(_http._CharCode.LF);
            builder.add(nameData);
            builder.addByte(_http._CharCode.COLON);
            builder.addByte(_http._CharCode.SP);
          }
        }
        builder.add(values[$_get](i)[$codeUnits]);
      }
      builder.addByte(_http._CharCode.CR);
      builder.addByte(_http._CharCode.LF);
    }
  }
  toString() {
    let sb = new core.StringBuffer.new();
    this[_headers][$forEach](dart.fn((name, values) => {
      sb.write(name);
      sb.write(": ");
      let fold = core.bool._check(this[_foldHeader](name));
      for (let i = 0; i < dart.notNull(values[$length]); i++) {
        if (i > 0) {
          if (dart.test(fold)) {
            sb.write(", ");
          } else {
            sb.write("\n");
            sb.write(name);
            sb.write(": ");
          }
        }
        sb.write(values[$_get](i));
      }
      sb.write("\n");
    }, StringAndListOfStringToNull()));
    return sb.toString();
  }
  [_parseCookies]() {
    let cookies = JSArrayOfCookie().of([]);
    function parseCookieString(s) {
      let index = 0;
      function done() {
        return index === -1 || index === s.length;
      }
      dart.fn(done, VoidTobool());
      function skipWS() {
        while (!dart.test(done())) {
          if (s[$_get](index) !== " " && s[$_get](index) !== "\t") return;
          index++;
        }
      }
      dart.fn(skipWS, VoidTovoid());
      function parseName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[$_get](index) === " " || s[$_get](index) === "\t" || s[$_get](index) === "=") break;
          index++;
        }
        return s[$substring](start, index);
      }
      dart.fn(parseName, VoidToString());
      function parseValue() {
        let start = index;
        while (!dart.test(done())) {
          if (s[$_get](index) === " " || s[$_get](index) === "\t" || s[$_get](index) === ";") break;
          index++;
        }
        return s[$substring](start, index);
      }
      dart.fn(parseValue, VoidToString());
      function expect(expected) {
        if (dart.test(done())) return false;
        if (s[$_get](index) != expected) return false;
        index++;
        return true;
      }
      dart.fn(expect, StringTobool());
      while (!dart.test(done())) {
        skipWS();
        if (dart.test(done())) return;
        let name = parseName();
        skipWS();
        if (!dart.test(expect("="))) {
          index = s[$indexOf](";", index);
          continue;
        }
        skipWS();
        let value = parseValue();
        try {
          cookies[$add](new _http._Cookie.new(name, value));
        } catch (e) {
          let _ = dart.getThrown(e);
        }
        skipWS();
        if (dart.test(done())) return;
        if (!dart.test(expect(";"))) {
          index = s[$indexOf](";", index);
          continue;
        }
      }
    }
    dart.fn(parseCookieString, StringTovoid());
    let values = this[_headers][$_get](_http.HttpHeaders.cookieHeader);
    if (values != null) {
      values[$forEach](dart.fn(headerValue => parseCookieString(headerValue), StringTovoid()));
    }
    return cookies;
  }
  static _validateField(field) {
    for (let i = 0; i < field.length; i++) {
      if (!dart.test(_http._HttpParser._isTokenChar(field[$codeUnitAt](i)))) {
        dart.throw(new core.FormatException.new("Invalid HTTP header field name: " + dart.str(convert.json.encode(field))));
      }
    }
    return field[$toLowerCase]();
  }
  static _validateValue(value) {
    if (!(typeof value == 'string')) return value;
    for (let i = 0; i < dart.notNull(core.num._check(dart.dload(value, 'length'))); i++) {
      if (!dart.test(_http._HttpParser._isValueChar(core.int._check(dart.dsend(value, 'codeUnitAt', [i]))))) {
        dart.throw(new core.FormatException.new("Invalid HTTP header field value: " + dart.str(convert.json.encode(value))));
      }
    }
    return value;
  }
};
(_http._HttpHeaders.new = function(protocolVersion, opts) {
  let defaultPortForScheme = opts && 'defaultPortForScheme' in opts ? opts.defaultPortForScheme : _http.HttpClient.defaultHttpPort;
  let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
  this[_mutable] = true;
  this[_noFoldingHeaders] = null;
  this[_contentLength] = -1;
  this[_persistentConnection] = true;
  this[_chunkedTransferEncoding] = false;
  this[_host$] = null;
  this[_port$] = null;
  this.protocolVersion = protocolVersion;
  this[_headers] = new (IdentityMapOfString$ListOfString()).new();
  this[_defaultPortForScheme] = defaultPortForScheme;
  if (initialHeaders != null) {
    initialHeaders[_headers][$forEach](dart.fn((name, value) => this[_headers][$_set](name, value), StringAndListOfStringToListOfString()));
    this[_contentLength] = initialHeaders[_contentLength];
    this[_persistentConnection] = initialHeaders[_persistentConnection];
    this[_chunkedTransferEncoding] = initialHeaders[_chunkedTransferEncoding];
    this[_host$] = initialHeaders[_host$];
    this[_port$] = initialHeaders[_port$];
  }
  if (this.protocolVersion === "1.0") {
    this[_persistentConnection] = false;
    this[_chunkedTransferEncoding] = false;
  }
}).prototype = _http._HttpHeaders.prototype;
dart.addTypeTests(_http._HttpHeaders);
_http._HttpHeaders[dart.implements] = () => [_http.HttpHeaders];
dart.setMethodSignature(_http._HttpHeaders, () => ({
  __proto__: dart.getMethods(_http._HttpHeaders.__proto__),
  _get: dart.fnType(core.List$(core.String), [core.String]),
  value: dart.fnType(core.String, [core.String]),
  add: dart.fnType(dart.void, [core.String, core.Object]),
  [_addAll]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  set: dart.fnType(dart.void, [core.String, core.Object]),
  remove: dart.fnType(dart.void, [core.String, core.Object]),
  removeAll: dart.fnType(dart.void, [core.String]),
  forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [core.String, core.List$(core.String)])]),
  noFolding: dart.fnType(dart.void, [core.String]),
  clear: dart.fnType(dart.void, []),
  [_add$2]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addContentLength]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addTransferEncoding]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addDate]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addExpires]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addIfModifiedSince]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addHost]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addConnection]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addContentType]: dart.fnType(dart.void, [core.String, dart.dynamic]),
  [_addValue]: dart.fnType(dart.void, [core.String, core.Object]),
  [_set]: dart.fnType(dart.void, [core.String, core.String]),
  [_checkMutable]: dart.fnType(dart.dynamic, []),
  [_updateHostHeader]: dart.fnType(dart.dynamic, []),
  [_foldHeader]: dart.fnType(dart.dynamic, [core.String]),
  [_finalize]: dart.fnType(dart.void, []),
  [_build]: dart.fnType(dart.void, [io.BytesBuilder]),
  [_parseCookies]: dart.fnType(core.List$(_http.Cookie), [])
}));
dart.setGetterSignature(_http._HttpHeaders, () => ({
  __proto__: dart.getGetters(_http._HttpHeaders.__proto__),
  persistentConnection: core.bool,
  contentLength: core.int,
  chunkedTransferEncoding: core.bool,
  host: core.String,
  port: core.int,
  ifModifiedSince: core.DateTime,
  date: core.DateTime,
  expires: core.DateTime,
  contentType: _http.ContentType
}));
dart.setSetterSignature(_http._HttpHeaders, () => ({
  __proto__: dart.getSetters(_http._HttpHeaders.__proto__),
  persistentConnection: core.bool,
  contentLength: core.int,
  chunkedTransferEncoding: core.bool,
  host: core.String,
  port: core.int,
  ifModifiedSince: core.DateTime,
  date: core.DateTime,
  expires: core.DateTime,
  contentType: _http.ContentType
}));
dart.setLibraryUri(_http._HttpHeaders, "dart:_http");
dart.setFieldSignature(_http._HttpHeaders, () => ({
  __proto__: dart.getFields(_http._HttpHeaders.__proto__),
  [_headers]: dart.finalFieldType(MapOfString$ListOfString()),
  protocolVersion: dart.finalFieldType(core.String),
  [_mutable]: dart.fieldType(core.bool),
  [_noFoldingHeaders]: dart.fieldType(ListOfString()),
  [_contentLength]: dart.fieldType(core.int),
  [_persistentConnection]: dart.fieldType(core.bool),
  [_chunkedTransferEncoding]: dart.fieldType(core.bool),
  [_host$]: dart.fieldType(core.String),
  [_port$]: dart.fieldType(core.int),
  [_defaultPortForScheme]: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(_http._HttpHeaders, ['toString']);
const _value$4 = dart.privateName(_http, "_value");
const _parameters = dart.privateName(_http, "_parameters");
const _unmodifiableParameters = dart.privateName(_http, "_unmodifiableParameters");
const _parse = dart.privateName(_http, "_parse");
const _ensureParameters = dart.privateName(_http, "_ensureParameters");
_http._HeaderValue = class _HeaderValue extends core.Object {
  static parse(value, opts) {
    let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
    let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
    let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
    let result = new _http._HeaderValue.new();
    result[_parse](value, core.String._check(parameterSeparator), core.String._check(valueSeparator), core.bool._check(preserveBackslash));
    return result;
  }
  get value() {
    return this[_value$4];
  }
  [_ensureParameters]() {
    if (this[_parameters] == null) {
      this[_parameters] = new (IdentityMapOfString$String()).new();
    }
  }
  get parameters() {
    this[_ensureParameters]();
    if (this[_unmodifiableParameters] == null) {
      this[_unmodifiableParameters] = new (UnmodifiableMapViewOfString$String()).new(this[_parameters]);
    }
    return this[_unmodifiableParameters];
  }
  toString() {
    let sb = new core.StringBuffer.new();
    sb.write(this[_value$4]);
    if (this.parameters != null && dart.notNull(this.parameters[$length]) > 0) {
      this[_parameters][$forEach](dart.fn((name, value) => {
        sb.write("; ");
        sb.write(name);
        sb.write("=");
        sb.write(value);
      }, StringAndStringToNull()));
    }
    return sb.toString();
  }
  [_parse](s, parameterSeparator, valueSeparator, preserveBackslash) {
    let index = 0;
    function done() {
      return index === s.length;
    }
    dart.fn(done, VoidTobool());
    function skipWS() {
      while (!dart.test(done())) {
        if (s[$_get](index) !== " " && s[$_get](index) !== "\t") return;
        index++;
      }
    }
    dart.fn(skipWS, VoidTovoid());
    function parseValue() {
      let start = index;
      while (!dart.test(done())) {
        if (s[$_get](index) === " " || s[$_get](index) === "\t" || s[$_get](index) == valueSeparator || s[$_get](index) == parameterSeparator) break;
        index++;
      }
      return s[$substring](start, index);
    }
    dart.fn(parseValue, VoidToString());
    function expect(expected) {
      if (dart.test(done()) || s[$_get](index) != expected) {
        dart.throw(new _http.HttpException.new("Failed to parse header value"));
      }
      index++;
    }
    dart.fn(expect, StringTovoid());
    function maybeExpect(expected) {
      if (s[$_get](index) == expected) index++;
    }
    dart.fn(maybeExpect, StringTovoid());
    const parseParameters = () => {
      let parameters = new (IdentityMapOfString$String()).new();
      this[_parameters] = new (UnmodifiableMapViewOfString$String()).new(parameters);
      function parseParameterName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[$_get](index) === " " || s[$_get](index) === "\t" || s[$_get](index) === "=" || s[$_get](index) == parameterSeparator || s[$_get](index) == valueSeparator) break;
          index++;
        }
        return s[$substring](start, index)[$toLowerCase]();
      }
      dart.fn(parseParameterName, VoidToString());
      function parseParameterValue() {
        if (!dart.test(done()) && s[$_get](index) === "\"") {
          let sb = new core.StringBuffer.new();
          index++;
          while (!dart.test(done())) {
            if (s[$_get](index) === "\\") {
              if (index + 1 === s.length) {
                dart.throw(new _http.HttpException.new("Failed to parse header value"));
              }
              if (dart.test(preserveBackslash) && s[$_get](index + 1) !== "\"") {
                sb.write(s[$_get](index));
              }
              index++;
            } else if (s[$_get](index) === "\"") {
              index++;
              break;
            }
            sb.write(s[$_get](index));
            index++;
          }
          return sb.toString();
        } else {
          let val = parseValue();
          return val === "" ? null : val;
        }
      }
      dart.fn(parseParameterValue, VoidToString());
      while (!dart.test(done())) {
        skipWS();
        if (dart.test(done())) return;
        let name = parseParameterName();
        skipWS();
        if (dart.test(done())) {
          parameters._set(name, null);
          return;
        }
        maybeExpect("=");
        skipWS();
        if (dart.test(done())) {
          parameters._set(name, null);
          return;
        }
        let value = parseParameterValue();
        if (name === "charset" && _http._ContentType.is(this) && value != null) {
          value = value[$toLowerCase]();
        }
        parameters._set(name, value);
        skipWS();
        if (dart.test(done())) return;
        if (s[$_get](index) == valueSeparator) return;
        expect(parameterSeparator);
      }
    };
    dart.fn(parseParameters, VoidTovoid());
    skipWS();
    this[_value$4] = parseValue();
    skipWS();
    if (dart.test(done())) return;
    maybeExpect(parameterSeparator);
    parseParameters();
  }
};
(_http._HeaderValue.new = function(value, parameters) {
  if (value === void 0) value = "";
  if (parameters === void 0) parameters = null;
  this[_parameters] = null;
  this[_unmodifiableParameters] = null;
  this[_value$4] = value;
  if (parameters != null) {
    this[_parameters] = HashMapOfString$String().from(parameters);
  }
}).prototype = _http._HeaderValue.prototype;
dart.addTypeTests(_http._HeaderValue);
_http._HeaderValue[dart.implements] = () => [_http.HeaderValue];
dart.setMethodSignature(_http._HeaderValue, () => ({
  __proto__: dart.getMethods(_http._HeaderValue.__proto__),
  [_ensureParameters]: dart.fnType(dart.void, []),
  [_parse]: dart.fnType(dart.void, [core.String, core.String, core.String, core.bool])
}));
dart.setGetterSignature(_http._HeaderValue, () => ({
  __proto__: dart.getGetters(_http._HeaderValue.__proto__),
  value: core.String,
  parameters: core.Map$(core.String, core.String)
}));
dart.setLibraryUri(_http._HeaderValue, "dart:_http");
dart.setFieldSignature(_http._HeaderValue, () => ({
  __proto__: dart.getFields(_http._HeaderValue.__proto__),
  [_value$4]: dart.fieldType(core.String),
  [_parameters]: dart.fieldType(MapOfString$String()),
  [_unmodifiableParameters]: dart.fieldType(MapOfString$String())
}));
dart.defineExtensionMethods(_http._HeaderValue, ['toString']);
const _primaryType = dart.privateName(_http, "_primaryType");
const _subType = dart.privateName(_http, "_subType");
_http._ContentType = class _ContentType extends _http._HeaderValue {
  static parse(value) {
    let result = new _http._ContentType.__();
    result[_parse](value, ";", null, false);
    let index = result[_value$4][$indexOf]("/");
    if (index === -1 || index === result[_value$4].length - 1) {
      result[_primaryType] = result[_value$4][$trim]()[$toLowerCase]();
      result[_subType] = "";
    } else {
      result[_primaryType] = result[_value$4][$substring](0, index)[$trim]()[$toLowerCase]();
      result[_subType] = result[_value$4][$substring](index + 1)[$trim]()[$toLowerCase]();
    }
    return result;
  }
  get mimeType() {
    return dart.str(this.primaryType) + "/" + dart.str(this.subType);
  }
  get primaryType() {
    return this[_primaryType];
  }
  get subType() {
    return this[_subType];
  }
  get charset() {
    return this.parameters[$_get]("charset");
  }
};
(_http._ContentType.new = function(primaryType, subType, charset, parameters) {
  this[_primaryType] = primaryType;
  this[_subType] = subType;
  _http._ContentType.__proto__.new.call(this, "");
  if (this[_primaryType] == null) this[_primaryType] = "";
  if (this[_subType] == null) this[_subType] = "";
  this[_value$4] = dart.str(this[_primaryType]) + "/" + dart.str(this[_subType]);
  if (parameters != null) {
    this[_ensureParameters]();
    parameters[$forEach](dart.fn((key, value) => {
      let lowerCaseKey = key[$toLowerCase]();
      if (lowerCaseKey === "charset") {
        value = value[$toLowerCase]();
      }
      this[_parameters][$_set](lowerCaseKey, value);
    }, StringAndStringToNull()));
  }
  if (charset != null) {
    this[_ensureParameters]();
    this[_parameters][$_set]("charset", charset[$toLowerCase]());
  }
}).prototype = _http._ContentType.prototype;
(_http._ContentType.__ = function() {
  this[_primaryType] = "";
  this[_subType] = "";
  _http._ContentType.__proto__.new.call(this);
}).prototype = _http._ContentType.prototype;
dart.addTypeTests(_http._ContentType);
_http._ContentType[dart.implements] = () => [_http.ContentType];
dart.setGetterSignature(_http._ContentType, () => ({
  __proto__: dart.getGetters(_http._ContentType.__proto__),
  mimeType: core.String,
  primaryType: core.String,
  subType: core.String,
  charset: core.String
}));
dart.setLibraryUri(_http._ContentType, "dart:_http");
dart.setFieldSignature(_http._ContentType, () => ({
  __proto__: dart.getFields(_http._ContentType.__proto__),
  [_primaryType]: dart.fieldType(core.String),
  [_subType]: dart.fieldType(core.String)
}));
const _validate = dart.privateName(_http, "_validate");
const _parseSetCookieValue = dart.privateName(_http, "_parseSetCookieValue");
let const$98;
_http._Cookie = class _Cookie extends core.Object {
  [_parseSetCookieValue](s) {
    let index = 0;
    function done() {
      return index === s.length;
    }
    dart.fn(done, VoidTobool());
    function parseName() {
      let start = index;
      while (!dart.test(done())) {
        if (s[$_get](index) === "=") break;
        index++;
      }
      return s[$substring](start, index)[$trim]();
    }
    dart.fn(parseName, VoidToString());
    function parseValue() {
      let start = index;
      while (!dart.test(done())) {
        if (s[$_get](index) === ";") break;
        index++;
      }
      return s[$substring](start, index)[$trim]();
    }
    dart.fn(parseValue, VoidToString());
    function expect(expected) {
      if (dart.test(done())) dart.throw(new _http.HttpException.new("Failed to parse header value [" + dart.str(s) + "]"));
      if (s[$_get](index) != expected) {
        dart.throw(new _http.HttpException.new("Failed to parse header value [" + dart.str(s) + "]"));
      }
      index++;
    }
    dart.fn(expect, StringTovoid());
    const parseAttributes = () => {
      function parseAttributeName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[$_get](index) === "=" || s[$_get](index) === ";") break;
          index++;
        }
        return s[$substring](start, index)[$trim]()[$toLowerCase]();
      }
      dart.fn(parseAttributeName, VoidToString());
      function parseAttributeValue() {
        let start = index;
        while (!dart.test(done())) {
          if (s[$_get](index) === ";") break;
          index++;
        }
        return s[$substring](start, index)[$trim]()[$toLowerCase]();
      }
      dart.fn(parseAttributeValue, VoidToString());
      while (!dart.test(done())) {
        let name = parseAttributeName();
        let value = "";
        if (!dart.test(done()) && s[$_get](index) === "=") {
          index++;
          value = parseAttributeValue();
        }
        if (name === "expires") {
          this.expires = _http.HttpDate._parseCookieDate(value);
        } else if (name === "max-age") {
          this.maxAge = core.int.parse(value);
        } else if (name === "domain") {
          this.domain = value;
        } else if (name === "path") {
          this.path = value;
        } else if (name === "httponly") {
          this.httpOnly = true;
        } else if (name === "secure") {
          this.secure = true;
        }
        if (!dart.test(done())) index++;
      }
    };
    dart.fn(parseAttributes, VoidTovoid());
    this.name = parseName();
    if (dart.test(done()) || this.name.length === 0) {
      dart.throw(new _http.HttpException.new("Failed to parse header value [" + dart.str(s) + "]"));
    }
    index++;
    this.value = parseValue();
    this[_validate]();
    if (dart.test(done())) return;
    index++;
    parseAttributes();
  }
  toString() {
    let sb = new core.StringBuffer.new();
    sb.write(this.name);
    sb.write("=");
    sb.write(this.value);
    if (this.expires != null) {
      sb.write("; Expires=");
      sb.write(_http.HttpDate.format(this.expires));
    }
    if (this.maxAge != null) {
      sb.write("; Max-Age=");
      sb.write(this.maxAge);
    }
    if (this.domain != null) {
      sb.write("; Domain=");
      sb.write(this.domain);
    }
    if (this.path != null) {
      sb.write("; Path=");
      sb.write(this.path);
    }
    if (dart.test(this.secure)) sb.write("; Secure");
    if (dart.test(this.httpOnly)) sb.write("; HttpOnly");
    return sb.toString();
  }
  [_validate]() {
    let separators = const$98 || (const$98 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", "\"", "/", "[", "]", "?", "=", "{", "}"], core.String));
    for (let i = 0; i < this.name.length; i++) {
      let codeUnit = this.name[$codeUnits][$_get](i);
      if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(separators[$indexOf](this.name[$_get](i))) >= 0) {
        dart.throw(new core.FormatException.new("Invalid character in cookie name, code unit: '" + dart.str(codeUnit) + "'", this.name, i));
      }
    }
    let start = 0;
    let end = this.value.length;
    if (2 <= this.value.length && this.value[$codeUnits][$_get](start) === 34 && this.value[$codeUnits][$_get](end - 1) === 34) {
      start++;
      end--;
    }
    for (let i = start; i < end; i++) {
      let codeUnit = this.value[$codeUnits][$_get](i);
      if (!(codeUnit === 33 || dart.notNull(codeUnit) >= 35 && dart.notNull(codeUnit) <= 43 || dart.notNull(codeUnit) >= 45 && dart.notNull(codeUnit) <= 58 || dart.notNull(codeUnit) >= 60 && dart.notNull(codeUnit) <= 91 || dart.notNull(codeUnit) >= 93 && dart.notNull(codeUnit) <= 126)) {
        dart.throw(new core.FormatException.new("Invalid character in cookie value, code unit: '" + dart.str(codeUnit) + "'", this.value, i));
      }
    }
  }
};
(_http._Cookie.new = function(name, value) {
  if (name === void 0) name = null;
  if (value === void 0) value = null;
  this.expires = null;
  this.maxAge = null;
  this.domain = null;
  this.path = null;
  this.httpOnly = false;
  this.secure = false;
  this.name = name;
  this.value = value;
  this.httpOnly = true;
  this[_validate]();
}).prototype = _http._Cookie.prototype;
(_http._Cookie.fromSetCookieValue = function(value) {
  this.name = null;
  this.value = null;
  this.expires = null;
  this.maxAge = null;
  this.domain = null;
  this.path = null;
  this.httpOnly = false;
  this.secure = false;
  this[_parseSetCookieValue](value);
}).prototype = _http._Cookie.prototype;
dart.addTypeTests(_http._Cookie);
_http._Cookie[dart.implements] = () => [_http.Cookie];
dart.setMethodSignature(_http._Cookie, () => ({
  __proto__: dart.getMethods(_http._Cookie.__proto__),
  [_parseSetCookieValue]: dart.fnType(dart.void, [core.String]),
  [_validate]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(_http._Cookie, "dart:_http");
dart.setFieldSignature(_http._Cookie, () => ({
  __proto__: dart.getFields(_http._Cookie.__proto__),
  name: dart.fieldType(core.String),
  value: dart.fieldType(core.String),
  expires: dart.fieldType(core.DateTime),
  maxAge: dart.fieldType(core.int),
  domain: dart.fieldType(core.String),
  path: dart.fieldType(core.String),
  httpOnly: dart.fieldType(core.bool),
  secure: dart.fieldType(core.bool)
}));
dart.defineExtensionMethods(_http._Cookie, ['toString']);
dart.defineLazy(_http, {
  /*_http._nextServiceId*/get _nextServiceId() {
    return 1;
  },
  set _nextServiceId(_) {}
});
const __serviceId$ = dart.privateName(_http, "__serviceId");
const _serviceId$ = dart.privateName(_http, "_serviceId");
const _serviceTypePath$ = dart.privateName(_http, "_serviceTypePath");
const _servicePath$ = dart.privateName(_http, "_servicePath");
const _serviceTypeName$ = dart.privateName(_http, "_serviceTypeName");
const _serviceType$ = dart.privateName(_http, "_serviceType");
_http._ServiceObject = class _ServiceObject extends core.Object {
  get [_serviceId$]() {
    if (this[__serviceId$] === 0) {
      let x = _http._nextServiceId;
      _http._nextServiceId = dart.notNull(x) + 1;
      this[__serviceId$] = x;
    }
    return this[__serviceId$];
  }
  get [_servicePath$]() {
    return dart.str(this[_serviceTypePath$]) + "/" + dart.str(this[_serviceId$]);
  }
  [_serviceType$](ref) {
    if (dart.test(ref)) return "@" + dart.str(this[_serviceTypeName$]);
    return this[_serviceTypeName$];
  }
};
(_http._ServiceObject.new = function() {
  this[__serviceId$] = 0;
}).prototype = _http._ServiceObject.prototype;
dart.addTypeTests(_http._ServiceObject);
dart.setMethodSignature(_http._ServiceObject, () => ({
  __proto__: dart.getMethods(_http._ServiceObject.__proto__),
  [_serviceType$]: dart.fnType(core.String, [core.bool])
}));
dart.setGetterSignature(_http._ServiceObject, () => ({
  __proto__: dart.getGetters(_http._ServiceObject.__proto__),
  [_serviceId$]: core.int,
  [_servicePath$]: core.String
}));
dart.setLibraryUri(_http._ServiceObject, "dart:_http");
dart.setFieldSignature(_http._ServiceObject, () => ({
  __proto__: dart.getFields(_http._ServiceObject.__proto__),
  [__serviceId$]: dart.fieldType(core.int)
}));
const _buffer$1 = dart.privateName(_http, "_buffer");
const _length$3 = dart.privateName(_http, "_length");
const _grow$0 = dart.privateName(_http, "_grow");
_http._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
  add(bytes) {
    let bytesLength = bytes[$length];
    if (bytesLength === 0) return;
    let required = dart.notNull(this[_length$3]) + dart.notNull(bytesLength);
    if (dart.notNull(this[_buffer$1][$length]) < required) {
      this[_grow$0](required);
    }
    if (!(dart.notNull(this[_buffer$1][$length]) >= required)) dart.assertFailed(null, "dart:_http/http_impl.dart", 52, 12, "_buffer.length >= required");
    if (typed_data.Uint8List.is(bytes)) {
      this[_buffer$1][$setRange](this[_length$3], required, bytes);
    } else {
      for (let i = 0; i < dart.notNull(bytesLength); i++) {
        this[_buffer$1][$_set](dart.notNull(this[_length$3]) + i, bytes[$_get](i));
      }
    }
    this[_length$3] = required;
  }
  addByte(byte) {
    if (this[_buffer$1][$length] == this[_length$3]) {
      this[_grow$0](this[_length$3]);
    }
    if (!(dart.notNull(this[_buffer$1][$length]) > dart.notNull(this[_length$3]))) dart.assertFailed(null, "dart:_http/http_impl.dart", 69, 12, "_buffer.length > _length");
    this[_buffer$1][$_set](this[_length$3], byte);
    this[_length$3] = dart.notNull(this[_length$3]) + 1;
  }
  [_grow$0](required) {
    let newSize = dart.notNull(required) * 2;
    if (dart.notNull(newSize) < 1024) {
      newSize = 1024;
    } else {
      newSize = _http._CopyingBytesBuilder._pow2roundup(newSize);
    }
    let newBuffer = typed_data.Uint8List.new(newSize);
    newBuffer[$setRange](0, this[_buffer$1][$length], this[_buffer$1]);
    this[_buffer$1] = newBuffer;
  }
  takeBytes() {
    if (this[_length$3] === 0) return _http._CopyingBytesBuilder._emptyList;
    let buffer = typed_data.Uint8List.view(this[_buffer$1][$buffer], 0, this[_length$3]);
    this.clear();
    return buffer;
  }
  toBytes() {
    if (this[_length$3] === 0) return _http._CopyingBytesBuilder._emptyList;
    return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$1][$buffer], 0, this[_length$3]));
  }
  get length() {
    return this[_length$3];
  }
  get isEmpty() {
    return this[_length$3] === 0;
  }
  get isNotEmpty() {
    return this[_length$3] !== 0;
  }
  clear() {
    this[_length$3] = 0;
    this[_buffer$1] = _http._CopyingBytesBuilder._emptyList;
  }
  static _pow2roundup(x) {
    if (!(dart.notNull(x) > 0)) dart.assertFailed(null, "dart:_http/http_impl.dart", 113, 12, "x > 0");
    x = dart.notNull(x) - 1;
    x = (dart.notNull(x) | x[$rightShift](1)) >>> 0;
    x = (dart.notNull(x) | x[$rightShift](2)) >>> 0;
    x = (dart.notNull(x) | x[$rightShift](4)) >>> 0;
    x = (dart.notNull(x) | x[$rightShift](8)) >>> 0;
    x = (dart.notNull(x) | x[$rightShift](16)) >>> 0;
    return dart.notNull(x) + 1;
  }
};
(_http._CopyingBytesBuilder.new = function(initialCapacity) {
  if (initialCapacity === void 0) initialCapacity = 0;
  this[_length$3] = 0;
  this[_buffer$1] = dart.notNull(initialCapacity) <= 0 ? _http._CopyingBytesBuilder._emptyList : typed_data.Uint8List.new(_http._CopyingBytesBuilder._pow2roundup(initialCapacity));
}).prototype = _http._CopyingBytesBuilder.prototype;
dart.addTypeTests(_http._CopyingBytesBuilder);
_http._CopyingBytesBuilder[dart.implements] = () => [io.BytesBuilder];
dart.setMethodSignature(_http._CopyingBytesBuilder, () => ({
  __proto__: dart.getMethods(_http._CopyingBytesBuilder.__proto__),
  add: dart.fnType(dart.void, [core.List$(core.int)]),
  addByte: dart.fnType(dart.void, [core.int]),
  [_grow$0]: dart.fnType(dart.void, [core.int]),
  takeBytes: dart.fnType(core.List$(core.int), []),
  toBytes: dart.fnType(core.List$(core.int), []),
  clear: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(_http._CopyingBytesBuilder, () => ({
  __proto__: dart.getGetters(_http._CopyingBytesBuilder.__proto__),
  length: core.int,
  isEmpty: core.bool,
  isNotEmpty: core.bool
}));
dart.setLibraryUri(_http._CopyingBytesBuilder, "dart:_http");
dart.setFieldSignature(_http._CopyingBytesBuilder, () => ({
  __proto__: dart.getFields(_http._CopyingBytesBuilder.__proto__),
  [_length$3]: dart.fieldType(core.int),
  [_buffer$1]: dart.fieldType(typed_data.Uint8List)
}));
dart.defineLazy(_http._CopyingBytesBuilder, {
  /*_http._CopyingBytesBuilder._INIT_SIZE*/get _INIT_SIZE() {
    return 1024;
  },
  /*_http._CopyingBytesBuilder._emptyList*/get _emptyList() {
    return typed_data.Uint8List.new(0);
  }
});
dart.defineLazy(_http, {
  /*_http._OUTGOING_BUFFER_SIZE*/get _OUTGOING_BUFFER_SIZE() {
    return 8 * 1024;
  }
});
const _transferLength = dart.privateName(_http, "_transferLength");
const _stream$1 = dart.privateName(_http, "_stream");
const _dataCompleter = dart.privateName(_http, "_dataCompleter");
_http._HttpIncoming = class _HttpIncoming extends async.Stream$(core.List$(core.int)) {
  get transferLength() {
    return this[_transferLength];
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    this.hasSubscriber = true;
    return this[_stream$1].handleError(dart.fn(error => {
      dart.throw(new _http.HttpException.new(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
    }, dynamicToNull())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get dataDone() {
    return this[_dataCompleter].future;
  }
  close(closing) {
    this.fullBodyRead = true;
    this.hasSubscriber = true;
    this[_dataCompleter].complete(closing);
  }
};
(_http._HttpIncoming.new = function(headers, transferLength, stream) {
  this[_dataCompleter] = async.Completer.new();
  this.fullBodyRead = false;
  this.upgraded = false;
  this.statusCode = null;
  this.reasonPhrase = null;
  this.method = null;
  this.uri = null;
  this.hasSubscriber = false;
  this.headers = headers;
  this[_transferLength] = transferLength;
  this[_stream$1] = stream;
  _http._HttpIncoming.__proto__.new.call(this);
}).prototype = _http._HttpIncoming.prototype;
dart.addTypeTests(_http._HttpIncoming);
dart.setMethodSignature(_http._HttpIncoming, () => ({
  __proto__: dart.getMethods(_http._HttpIncoming.__proto__),
  listen: dart.fnType(async.StreamSubscription$(core.List$(core.int)), [dart.fnType(dart.void, [core.List$(core.int)])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  close: dart.fnType(dart.void, [core.bool])
}));
dart.setGetterSignature(_http._HttpIncoming, () => ({
  __proto__: dart.getGetters(_http._HttpIncoming.__proto__),
  transferLength: core.int,
  dataDone: async.Future
}));
dart.setLibraryUri(_http._HttpIncoming, "dart:_http");
dart.setFieldSignature(_http._HttpIncoming, () => ({
  __proto__: dart.getFields(_http._HttpIncoming.__proto__),
  [_transferLength]: dart.finalFieldType(core.int),
  [_dataCompleter]: dart.finalFieldType(async.Completer),
  [_stream$1]: dart.fieldType(StreamOfListOfint()),
  fullBodyRead: dart.fieldType(core.bool),
  headers: dart.finalFieldType(_http._HttpHeaders),
  upgraded: dart.fieldType(core.bool),
  statusCode: dart.fieldType(core.int),
  reasonPhrase: dart.fieldType(core.String),
  method: dart.fieldType(core.String),
  uri: dart.fieldType(core.Uri),
  hasSubscriber: dart.fieldType(core.bool)
}));
const _incoming = dart.privateName(_http, "_incoming");
const _cookies = dart.privateName(_http, "_cookies");
_http._HttpInboundMessage = class _HttpInboundMessage extends async.Stream$(core.List$(core.int)) {
  get cookies() {
    if (this[_cookies] != null) return this[_cookies];
    return this[_cookies] = this.headers[_parseCookies]();
  }
  get headers() {
    return this[_incoming].headers;
  }
  get protocolVersion() {
    return this.headers.protocolVersion;
  }
  get contentLength() {
    return this.headers.contentLength;
  }
  get persistentConnection() {
    return this.headers.persistentConnection;
  }
};
(_http._HttpInboundMessage.new = function(incoming) {
  this[_cookies] = null;
  this[_incoming] = incoming;
  _http._HttpInboundMessage.__proto__.new.call(this);
}).prototype = _http._HttpInboundMessage.prototype;
dart.addTypeTests(_http._HttpInboundMessage);
dart.setGetterSignature(_http._HttpInboundMessage, () => ({
  __proto__: dart.getGetters(_http._HttpInboundMessage.__proto__),
  cookies: core.List$(_http.Cookie),
  headers: _http._HttpHeaders,
  protocolVersion: core.String,
  contentLength: core.int,
  persistentConnection: core.bool
}));
dart.setLibraryUri(_http._HttpInboundMessage, "dart:_http");
dart.setFieldSignature(_http._HttpInboundMessage, () => ({
  __proto__: dart.getFields(_http._HttpInboundMessage.__proto__),
  [_incoming]: dart.finalFieldType(_http._HttpIncoming),
  [_cookies]: dart.fieldType(ListOfCookie())
}));
const _httpServer = dart.privateName(_http, "_httpServer");
const _httpConnection = dart.privateName(_http, "_httpConnection");
const _session = dart.privateName(_http, "_session");
const _requestedUri = dart.privateName(_http, "_requestedUri");
const _sessionManagerInstance = dart.privateName(_http, "_sessionManagerInstance");
const _sessionManager = dart.privateName(_http, "_sessionManager");
const _markSeen = dart.privateName(_http, "_markSeen");
const _socket$ = dart.privateName(_http, "_socket");
const _destroyed = dart.privateName(_http, "_destroyed");
_http._HttpRequest = class _HttpRequest extends _http._HttpInboundMessage {
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get uri() {
    return this[_incoming].uri;
  }
  get requestedUri() {
    if (this[_requestedUri] == null) {
      let proto = this.headers._get("x-forwarded-proto");
      let scheme = proto != null ? proto[$first] : io.SecureSocket.is(this[_httpConnection][_socket$]) ? "https" : "http";
      let hostList = this.headers._get("x-forwarded-host");
      let host = null;
      if (hostList != null) {
        host = hostList[$first];
      } else {
        hostList = this.headers._get("host");
        if (hostList != null) {
          host = hostList[$first];
        } else {
          host = dart.str(this[_httpServer].address.host) + ":" + dart.str(this[_httpServer].port);
        }
      }
      this[_requestedUri] = core.Uri.parse(dart.str(scheme) + "://" + dart.str(host) + dart.str(this.uri));
    }
    return this[_requestedUri];
  }
  get method() {
    return this[_incoming].method;
  }
  get session() {
    if (this[_session] != null) {
      if (dart.test(this[_session][_destroyed])) {
        this[_session] = null;
        return this.session;
      }
      return this[_session];
    }
    return this[_session] = this[_httpServer][_sessionManager].createSession();
  }
  get connectionInfo() {
    return this[_httpConnection].connectionInfo;
  }
  get certificate() {
    let socket = this[_httpConnection][_socket$];
    if (io.SecureSocket.is(socket)) return socket.peerCertificate;
    return null;
  }
};
(_http._HttpRequest.new = function(response, _incoming, httpServer, httpConnection) {
  this[_session] = null;
  this[_requestedUri] = null;
  this.response = response;
  this[_httpServer] = httpServer;
  this[_httpConnection] = httpConnection;
  _http._HttpRequest.__proto__.new.call(this, _incoming);
  if (this.headers.protocolVersion === "1.1") {
    let _ = this.response.headers;
    _.chunkedTransferEncoding = true;
    _.persistentConnection = this.headers.persistentConnection;
  }
  if (this[_httpServer][_sessionManagerInstance] != null) {
    let sessionIds = IterableOfString()._check(this.cookies[$where](dart.fn(cookie => cookie.name[$toUpperCase]() === "DARTSESSID", CookieTobool()))[$map](core.String, dart.fn(cookie => cookie.value, CookieToString())));
    for (let sessionId of sessionIds) {
      this[_session] = this[_httpServer][_sessionManager].getSession(sessionId);
      if (this[_session] != null) {
        this[_session][_markSeen]();
        break;
      }
    }
  }
}).prototype = _http._HttpRequest.prototype;
dart.addTypeTests(_http._HttpRequest);
_http._HttpRequest[dart.implements] = () => [_http.HttpRequest];
dart.setMethodSignature(_http._HttpRequest, () => ({
  __proto__: dart.getMethods(_http._HttpRequest.__proto__),
  listen: dart.fnType(async.StreamSubscription$(core.List$(core.int)), [dart.fnType(dart.void, [core.List$(core.int)])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool})
}));
dart.setGetterSignature(_http._HttpRequest, () => ({
  __proto__: dart.getGetters(_http._HttpRequest.__proto__),
  uri: core.Uri,
  requestedUri: core.Uri,
  method: core.String,
  session: _http.HttpSession,
  connectionInfo: _http.HttpConnectionInfo,
  certificate: io.X509Certificate
}));
dart.setLibraryUri(_http._HttpRequest, "dart:_http");
dart.setFieldSignature(_http._HttpRequest, () => ({
  __proto__: dart.getFields(_http._HttpRequest.__proto__),
  response: dart.finalFieldType(_http.HttpResponse),
  [_httpServer]: dart.finalFieldType(_http._HttpServer),
  [_httpConnection]: dart.finalFieldType(_http._HttpConnection),
  [_session]: dart.fieldType(_http._HttpSession),
  [_requestedUri]: dart.fieldType(core.Uri)
}));
const _httpRequest = dart.privateName(_http, "_httpRequest");
const _httpClient = dart.privateName(_http, "_httpClient");
const _responseRedirects = dart.privateName(_http, "_responseRedirects");
const _httpClientConnection = dart.privateName(_http, "_httpClientConnection");
const _openUrlFromRequest = dart.privateName(_http, "_openUrlFromRequest");
const _connectionClosed = dart.privateName(_http, "_connectionClosed");
const _shouldAuthenticateProxy = dart.privateName(_http, "_shouldAuthenticateProxy");
const _shouldAuthenticate = dart.privateName(_http, "_shouldAuthenticate");
const _proxy = dart.privateName(_http, "_proxy");
const _findProxyCredentials = dart.privateName(_http, "_findProxyCredentials");
const _findCredentials = dart.privateName(_http, "_findCredentials");
const _removeProxyCredentials = dart.privateName(_http, "_removeProxyCredentials");
const _removeCredentials = dart.privateName(_http, "_removeCredentials");
const _authenticateProxy = dart.privateName(_http, "_authenticateProxy");
const _authenticate = dart.privateName(_http, "_authenticate");
_http._HttpClientResponse = class _HttpClientResponse extends _http._HttpInboundMessage {
  get redirects() {
    return this[_httpRequest][_responseRedirects];
  }
  static _getCompressionState(httpClient, headers) {
    if (headers.value(_http.HttpHeaders.contentEncodingHeader) === "gzip") {
      return dart.test(httpClient.autoUncompress) ? _http.HttpClientResponseCompressionState.decompressed : _http.HttpClientResponseCompressionState.compressed;
    } else {
      return _http.HttpClientResponseCompressionState.notCompressed;
    }
  }
  get statusCode() {
    return this[_incoming].statusCode;
  }
  get reasonPhrase() {
    return this[_incoming].reasonPhrase;
  }
  get certificate() {
    let socket = this[_httpRequest][_httpClientConnection][_socket$];
    if (io.SecureSocket.is(socket)) return socket.peerCertificate;
    return null;
  }
  get cookies() {
    if (this[_cookies] != null) return this[_cookies];
    this[_cookies] = JSArrayOfCookie().of([]);
    let values = this.headers._get(_http.HttpHeaders.setCookieHeader);
    if (values != null) {
      values[$forEach](dart.fn(value => {
        this[_cookies][$add](_http.Cookie.fromSetCookieValue(value));
      }, StringToNull()));
    }
    return this[_cookies];
  }
  get isRedirect() {
    if (this[_httpRequest].method === "GET" || this[_httpRequest].method === "HEAD") {
      return this.statusCode === _internal.HttpStatus.movedPermanently || this.statusCode === _internal.HttpStatus.found || this.statusCode === _internal.HttpStatus.seeOther || this.statusCode === _internal.HttpStatus.temporaryRedirect;
    } else if (this[_httpRequest].method === "POST") {
      return this.statusCode === _internal.HttpStatus.seeOther;
    }
    return false;
  }
  redirect(method, url, followLoops) {
    if (method === void 0) method = null;
    if (url === void 0) url = null;
    if (followLoops === void 0) followLoops = null;
    if (method == null) {
      if (this.statusCode === _internal.HttpStatus.seeOther && this[_httpRequest].method === "POST") {
        method = "GET";
      } else {
        method = this[_httpRequest].method;
      }
    }
    if (url == null) {
      let location = this.headers.value(_http.HttpHeaders.locationHeader);
      if (location == null) {
        dart.throw(new core.StateError.new("Response has no Location header for redirect"));
      }
      url = core.Uri.parse(location);
    }
    if (followLoops !== true) {
      for (let redirect of this.redirects) {
        if (dart.equals(redirect.location, url)) {
          return FutureOfHttpClientResponse().error(new _http.RedirectException.new("Redirect loop detected", this.redirects));
        }
      }
    }
    return FutureOfHttpClientResponse()._check(this[_httpClient][_openUrlFromRequest](method, url, this[_httpRequest]).then(_http.HttpClientResponse, dart.fn(request => {
      let _ = request[_responseRedirects];
      _[$addAll](this.redirects);
      _[$add](new _http._RedirectInfo.new(this.statusCode, method, url));
      return request.close();
    }, _HttpClientRequestToFutureOfHttpClientResponse())));
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    if (dart.test(this[_incoming].upgraded)) {
      this[_httpRequest][_httpClientConnection].destroy();
      return StreamOfListOfint().empty().listen(null, {onDone: onDone});
    }
    let stream = this[_incoming];
    if (this.compressionState === _http.HttpClientResponseCompressionState.decompressed) {
      stream = StreamOfListOfint()._check(stream.transform(ListOfint(), io.gzip.decoder));
    }
    return stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  detachSocket() {
    this[_httpClient][_connectionClosed](this[_httpRequest][_httpClientConnection]);
    return this[_httpRequest][_httpClientConnection].detachSocket();
  }
  get connectionInfo() {
    return this[_httpRequest].connectionInfo;
  }
  get [_shouldAuthenticateProxy]() {
    let challenge = this.headers._get(_http.HttpHeaders.proxyAuthenticateHeader);
    return this.statusCode === _internal.HttpStatus.proxyAuthenticationRequired && challenge != null && challenge[$length] === 1;
  }
  get [_shouldAuthenticate]() {
    let challenge = this.headers._get(_http.HttpHeaders.wwwAuthenticateHeader);
    return this.statusCode === _internal.HttpStatus.unauthorized && challenge != null && challenge[$length] === 1;
  }
  [_authenticate](proxyAuth) {
    const retry = () => {
      return FutureOfHttpClientResponse()._check(this.drain(dart.dynamic).then(_http.HttpClientResponse, dart.fn(_ => FutureOfHttpClientResponse()._check(this[_httpClient][_openUrlFromRequest](this[_httpRequest].method, this[_httpRequest].uri, this[_httpRequest]).then(_http.HttpClientResponse, dart.fn(request => request.close(), _HttpClientRequestToFutureOfHttpClientResponse()))), dynamicToFutureOfHttpClientResponse())));
    };
    dart.fn(retry, VoidToFutureOfHttpClientResponse());
    const authChallenge = () => {
      return dart.test(proxyAuth) ? this.headers._get(_http.HttpHeaders.proxyAuthenticateHeader) : this.headers._get(_http.HttpHeaders.wwwAuthenticateHeader);
    };
    dart.fn(authChallenge, VoidToListOfString());
    const findCredentials = scheme => {
      return dart.test(proxyAuth) ? this[_httpClient][_findProxyCredentials](this[_httpRequest][_proxy], scheme) : this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
    };
    dart.fn(findCredentials, _AuthenticationSchemeTo_Credentials());
    const removeCredentials = cr => {
      if (dart.test(proxyAuth)) {
        this[_httpClient][_removeProxyCredentials](cr);
      } else {
        this[_httpClient][_removeCredentials](cr);
      }
    };
    dart.fn(removeCredentials, _CredentialsTovoid());
    const requestAuthentication = (scheme, realm) => {
      if (dart.test(proxyAuth)) {
        if (this[_httpClient][_authenticateProxy] == null) {
          return async.Future.value(false);
        }
        let proxy = this[_httpRequest][_proxy];
        return async.Future._check(dart.dsend(this[_httpClient], _authenticateProxy, [proxy.host, proxy.port, dart.toString(scheme), realm]));
      } else {
        if (this[_httpClient][_authenticate] == null) {
          return async.Future.value(false);
        }
        return async.Future._check(dart.dsend(this[_httpClient], _authenticate, [this[_httpRequest].uri, dart.toString(scheme), realm]));
      }
    };
    dart.fn(requestAuthentication, _AuthenticationSchemeAndStringToFuture());
    let challenge = authChallenge();
    if (!(challenge != null || challenge[$length] === 1)) dart.assertFailed(null, "dart:_http/http_impl.dart", 474, 12, "challenge != null || challenge.length == 1");
    let header = _http._HeaderValue.parse(challenge[$_get](0), {parameterSeparator: ","});
    let scheme = _http._AuthenticationScheme.fromString(header.value);
    let realm = header.parameters[$_get]("realm");
    let cr = findCredentials(scheme);
    if (cr != null) {
      if (dart.equals(cr.scheme, _http._AuthenticationScheme.BASIC) && !dart.test(cr.used)) {
        return retry();
      }
      if (dart.equals(cr.scheme, _http._AuthenticationScheme.DIGEST) && (header.parameters[$_get]("algorithm") == null || header.parameters[$_get]("algorithm")[$toLowerCase]() === "md5")) {
        if (cr.nonce == null || cr.nonce == header.parameters[$_get]("nonce")) {
          if (cr.nonce == null) {
            let _ = cr;
            _.nonce = header.parameters[$_get]("nonce");
            _.algorithm = "MD5";
            _.qop = header.parameters[$_get]("qop");
            _.nonceCount = 0;
          }
          return retry();
        } else if (header.parameters[$_get]("stale") != null && header.parameters[$_get]("stale")[$toLowerCase]() === "true") {
          cr.nonce = header.parameters[$_get]("nonce");
          return retry();
        }
      }
    }
    if (cr != null) {
      removeCredentials(cr);
      cr = null;
    }
    return FutureOfHttpClientResponse()._check(requestAuthentication(scheme, realm).then(_http.HttpClientResponse, dart.fn(credsAvailable => {
      if (dart.dtest(credsAvailable)) {
        cr = this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
        return retry();
      } else {
        return this;
      }
    }, dynamicToFutureOrOfHttpClientResponse())));
  }
};
(_http._HttpClientResponse.new = function(_incoming, httpRequest, httpClient) {
  this[_httpRequest] = httpRequest;
  this[_httpClient] = httpClient;
  this.compressionState = _http._HttpClientResponse._getCompressionState(httpClient, _incoming.headers);
  _http._HttpClientResponse.__proto__.new.call(this, _incoming);
  _incoming.uri = this[_httpRequest].uri;
}).prototype = _http._HttpClientResponse.prototype;
dart.addTypeTests(_http._HttpClientResponse);
_http._HttpClientResponse[dart.implements] = () => [_http.HttpClientResponse];
dart.setMethodSignature(_http._HttpClientResponse, () => ({
  __proto__: dart.getMethods(_http._HttpClientResponse.__proto__),
  redirect: dart.fnType(async.Future$(_http.HttpClientResponse), [], [core.String, core.Uri, core.bool]),
  listen: dart.fnType(async.StreamSubscription$(core.List$(core.int)), [dart.fnType(dart.void, [core.List$(core.int)])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  detachSocket: dart.fnType(async.Future$(io.Socket), []),
  [_authenticate]: dart.fnType(async.Future$(_http.HttpClientResponse), [core.bool])
}));
dart.setGetterSignature(_http._HttpClientResponse, () => ({
  __proto__: dart.getGetters(_http._HttpClientResponse.__proto__),
  redirects: core.List$(_http.RedirectInfo),
  statusCode: core.int,
  reasonPhrase: core.String,
  certificate: io.X509Certificate,
  isRedirect: core.bool,
  connectionInfo: _http.HttpConnectionInfo,
  [_shouldAuthenticateProxy]: core.bool,
  [_shouldAuthenticate]: core.bool
}));
dart.setLibraryUri(_http._HttpClientResponse, "dart:_http");
dart.setFieldSignature(_http._HttpClientResponse, () => ({
  __proto__: dart.getFields(_http._HttpClientResponse.__proto__),
  [_httpClient]: dart.finalFieldType(_http._HttpClient),
  [_httpRequest]: dart.finalFieldType(_http._HttpClientRequest),
  compressionState: dart.finalFieldType(_http.HttpClientResponseCompressionState)
}));
const _target$1 = dart.privateName(_http, "_target");
const _doneCompleter$ = dart.privateName(_http, "_doneCompleter");
const _controllerInstance$ = dart.privateName(_http, "_controllerInstance");
const _controllerCompleter$ = dart.privateName(_http, "_controllerCompleter");
const _isClosed$0 = dart.privateName(_http, "_isClosed");
const _isBound$ = dart.privateName(_http, "_isBound");
const _hasError$0 = dart.privateName(_http, "_hasError");
const _controller$1 = dart.privateName(_http, "_controller");
const _closeTarget$ = dart.privateName(_http, "_closeTarget");
const _completeDoneValue$ = dart.privateName(_http, "_completeDoneValue");
const _completeDoneError$ = dart.privateName(_http, "_completeDoneError");
const _is__StreamSinkImpl_default$ = Symbol('_is__StreamSinkImpl_default');
_http._StreamSinkImpl$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
  let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
  class _StreamSinkImpl extends core.Object {
    add(data) {
      T._check(data);
      if (dart.test(this[_isClosed$0])) {
        dart.throw(new core.StateError.new("StreamSink is closed"));
      }
      this[_controller$1].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      if (dart.test(this[_isClosed$0])) {
        dart.throw(new core.StateError.new("StreamSink is closed"));
      }
      this[_controller$1].addError(error, stackTrace);
    }
    addStream(stream) {
      StreamOfT()._check(stream);
      if (dart.test(this[_isBound$])) {
        dart.throw(new core.StateError.new("StreamSink is already bound to a stream"));
      }
      this[_isBound$] = true;
      if (dart.test(this[_hasError$0])) return this.done;
      const targetAddStream = () => {
        return this[_target$1].addStream(stream).whenComplete(dart.fn(() => {
          this[_isBound$] = false;
        }, VoidToNull()));
      };
      dart.fn(targetAddStream, VoidToFuture());
      if (this[_controllerInstance$] == null) return targetAddStream();
      let future = this[_controllerCompleter$].future;
      this[_controllerInstance$].close();
      return future.then(dart.dynamic, dart.fn(_ => targetAddStream(), dynamicToFuture()));
    }
    flush() {
      if (dart.test(this[_isBound$])) {
        dart.throw(new core.StateError.new("StreamSink is bound to a stream"));
      }
      if (this[_controllerInstance$] == null) return async.Future.value(this);
      this[_isBound$] = true;
      let future = this[_controllerCompleter$].future;
      this[_controllerInstance$].close();
      return future.whenComplete(dart.fn(() => {
        this[_isBound$] = false;
      }, VoidToNull()));
    }
    close() {
      if (dart.test(this[_isBound$])) {
        dart.throw(new core.StateError.new("StreamSink is bound to a stream"));
      }
      if (!dart.test(this[_isClosed$0])) {
        this[_isClosed$0] = true;
        if (this[_controllerInstance$] != null) {
          this[_controllerInstance$].close();
        } else {
          this[_closeTarget$]();
        }
      }
      return this.done;
    }
    [_closeTarget$]() {
      this[_target$1].close().then(dart.void, dart.bind(this, _completeDoneValue$), {onError: dart.bind(this, _completeDoneError$)});
    }
    get done() {
      return this[_doneCompleter$].future;
    }
    [_completeDoneValue$](value) {
      if (!dart.test(this[_doneCompleter$].isCompleted)) {
        this[_doneCompleter$].complete(value);
      }
    }
    [_completeDoneError$](error, stackTrace) {
      if (!dart.test(this[_doneCompleter$].isCompleted)) {
        this[_hasError$0] = true;
        this[_doneCompleter$].completeError(error, stackTrace);
      }
    }
    get [_controller$1]() {
      if (dart.test(this[_isBound$])) {
        dart.throw(new core.StateError.new("StreamSink is bound to a stream"));
      }
      if (dart.test(this[_isClosed$0])) {
        dart.throw(new core.StateError.new("StreamSink is closed"));
      }
      if (this[_controllerInstance$] == null) {
        this[_controllerInstance$] = StreamControllerOfT().new({sync: true});
        this[_controllerCompleter$] = async.Completer.new();
        FutureOfNull()._check(this[_target$1].addStream(this[_controller$1].stream).then(core.Null, dart.fn(_ => {
          if (dart.test(this[_isBound$])) {
            this[_controllerCompleter$].complete(this);
            this[_controllerCompleter$] = null;
            this[_controllerInstance$] = null;
          } else {
            this[_closeTarget$]();
          }
        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
            if (dart.test(this[_isBound$])) {
              this[_controllerCompleter$].completeError(error, core.StackTrace._check(stackTrace));
              this[_controllerCompleter$] = null;
              this[_controllerInstance$] = null;
            } else {
              this[_completeDoneError$](error, core.StackTrace._check(stackTrace));
            }
          }, dynamicAnddynamicToNull())}));
      }
      return this[_controllerInstance$];
    }
  }
  (_StreamSinkImpl.new = function(target) {
    this[_doneCompleter$] = async.Completer.new();
    this[_controllerInstance$] = null;
    this[_controllerCompleter$] = null;
    this[_isClosed$0] = false;
    this[_isBound$] = false;
    this[_hasError$0] = false;
    this[_target$1] = target;
  }).prototype = _StreamSinkImpl.prototype;
  dart.addTypeTests(_StreamSinkImpl);
  _StreamSinkImpl.prototype[_is__StreamSinkImpl_default$] = true;
  _StreamSinkImpl[dart.implements] = () => [StreamSinkOfT()];
  dart.setMethodSignature(_StreamSinkImpl, () => ({
    __proto__: dart.getMethods(_StreamSinkImpl.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
    addStream: dart.fnType(async.Future, [core.Object]),
    flush: dart.fnType(async.Future, []),
    close: dart.fnType(async.Future, []),
    [_closeTarget$]: dart.fnType(dart.void, []),
    [_completeDoneValue$]: dart.fnType(dart.void, [dart.dynamic]),
    [_completeDoneError$]: dart.fnType(dart.void, [dart.dynamic, core.StackTrace])
  }));
  dart.setGetterSignature(_StreamSinkImpl, () => ({
    __proto__: dart.getGetters(_StreamSinkImpl.__proto__),
    done: async.Future,
    [_controller$1]: async.StreamController$(T)
  }));
  dart.setLibraryUri(_StreamSinkImpl, "dart:_http");
  dart.setFieldSignature(_StreamSinkImpl, () => ({
    __proto__: dart.getFields(_StreamSinkImpl.__proto__),
    [_target$1]: dart.finalFieldType(StreamConsumerOfT()),
    [_doneCompleter$]: dart.finalFieldType(async.Completer),
    [_controllerInstance$]: dart.fieldType(StreamControllerOfT()),
    [_controllerCompleter$]: dart.fieldType(async.Completer),
    [_isClosed$0]: dart.fieldType(core.bool),
    [_isBound$]: dart.fieldType(core.bool),
    [_hasError$0]: dart.fieldType(core.bool)
  }));
  return _StreamSinkImpl;
});
_http._StreamSinkImpl = _http._StreamSinkImpl$();
dart.addTypeTests(_http._StreamSinkImpl, _is__StreamSinkImpl_default$);
const _encoding$ = dart.privateName(_http, "_encoding");
const _encodingMutable$ = dart.privateName(_http, "_encodingMutable");
_http._IOSinkImpl = class _IOSinkImpl extends _http._StreamSinkImpl$(core.List$(core.int)) {
  get encoding() {
    return this[_encoding$];
  }
  set encoding(value) {
    if (!dart.test(this[_encodingMutable$])) {
      dart.throw(new core.StateError.new("IOSink encoding is not mutable"));
    }
    this[_encoding$] = value;
  }
  write(obj) {
    let string = dart.str(obj);
    if (string[$isEmpty]) return;
    this.add(this[_encoding$].encode(string));
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    let iterator = objects[$iterator];
    if (!dart.test(iterator.moveNext())) return;
    if (separator[$isEmpty]) {
      do {
        this.write(iterator.current);
      } while (dart.test(iterator.moveNext()));
    } else {
      this.write(iterator.current);
      while (dart.test(iterator.moveNext())) {
        this.write(separator);
        this.write(iterator.current);
      }
    }
  }
  writeln(object) {
    if (object === void 0) object = "";
    this.write(object);
    this.write("\n");
  }
  writeCharCode(charCode) {
    this.write(core.String.fromCharCode(charCode));
  }
};
(_http._IOSinkImpl.new = function(target, encoding) {
  this[_encodingMutable$] = true;
  this[_encoding$] = encoding;
  _http._IOSinkImpl.__proto__.new.call(this, target);
}).prototype = _http._IOSinkImpl.prototype;
dart.addTypeTests(_http._IOSinkImpl);
_http._IOSinkImpl[dart.implements] = () => [io.IOSink];
dart.setMethodSignature(_http._IOSinkImpl, () => ({
  __proto__: dart.getMethods(_http._IOSinkImpl.__proto__),
  write: dart.fnType(dart.void, [core.Object]),
  writeAll: dart.fnType(dart.void, [core.Iterable], [core.String]),
  writeln: dart.fnType(dart.void, [], [core.Object]),
  writeCharCode: dart.fnType(dart.void, [core.int])
}));
dart.setGetterSignature(_http._IOSinkImpl, () => ({
  __proto__: dart.getGetters(_http._IOSinkImpl.__proto__),
  encoding: convert.Encoding
}));
dart.setSetterSignature(_http._IOSinkImpl, () => ({
  __proto__: dart.getSetters(_http._IOSinkImpl.__proto__),
  encoding: convert.Encoding
}));
dart.setLibraryUri(_http._IOSinkImpl, "dart:_http");
dart.setFieldSignature(_http._IOSinkImpl, () => ({
  __proto__: dart.getFields(_http._IOSinkImpl.__proto__),
  [_encoding$]: dart.fieldType(convert.Encoding),
  [_encodingMutable$]: dart.fieldType(core.bool)
}));
const _uri$ = dart.privateName(_http, "_uri");
const _outgoing = dart.privateName(_http, "_outgoing");
const _encodingSet = dart.privateName(_http, "_encodingSet");
const _bufferOutput = dart.privateName(_http, "_bufferOutput");
const _isConnectionClosed = dart.privateName(_http, "_isConnectionClosed");
const _is__HttpOutboundMessage_default = Symbol('_is__HttpOutboundMessage_default');
_http._HttpOutboundMessage$ = dart.generic(T => {
  class _HttpOutboundMessage extends _http._IOSinkImpl {
    get contentLength() {
      return this.headers.contentLength;
    }
    set contentLength(contentLength) {
      this.headers.contentLength = contentLength;
    }
    get persistentConnection() {
      return this.headers.persistentConnection;
    }
    set persistentConnection(p) {
      this.headers.persistentConnection = p;
    }
    get bufferOutput() {
      return this[_bufferOutput];
    }
    set bufferOutput(bufferOutput) {
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError.new("Header already sent"));
      this[_bufferOutput] = bufferOutput;
    }
    get encoding() {
      if (dart.test(this[_encodingSet]) && dart.test(this[_outgoing].headersWritten)) {
        return this[_encoding$];
      }
      let charset = null;
      if (this.headers.contentType != null && this.headers.contentType.charset != null) {
        charset = this.headers.contentType.charset;
      } else {
        charset = "iso-8859-1";
      }
      return convert.Encoding.getByName(core.String._check(charset));
    }
    set encoding(value) {
      super.encoding = value;
    }
    add(data) {
      ListOfint()._check(data);
      if (data[$length] === 0) return;
      super.add(data);
    }
    write(obj) {
      if (!dart.test(this[_encodingSet])) {
        this[_encoding$] = this.encoding;
        this[_encodingSet] = true;
      }
      super.write(obj);
    }
    get [_isConnectionClosed]() {
      return false;
    }
  }
  (_HttpOutboundMessage.new = function(uri, protocolVersion, outgoing, opts) {
    let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
    this[_encodingSet] = false;
    this[_bufferOutput] = true;
    this[_uri$] = uri;
    this.headers = new _http._HttpHeaders.new(protocolVersion, {defaultPortForScheme: uri.scheme === "https" ? _http.HttpClient.defaultHttpsPort : _http.HttpClient.defaultHttpPort, initialHeaders: initialHeaders});
    this[_outgoing] = outgoing;
    _HttpOutboundMessage.__proto__.new.call(this, outgoing, null);
    this[_outgoing].outbound = this;
    this[_encodingMutable$] = false;
  }).prototype = _HttpOutboundMessage.prototype;
  dart.addTypeTests(_HttpOutboundMessage);
  _HttpOutboundMessage.prototype[_is__HttpOutboundMessage_default] = true;
  dart.setMethodSignature(_HttpOutboundMessage, () => ({
    __proto__: dart.getMethods(_HttpOutboundMessage.__proto__),
    add: dart.fnType(dart.void, [core.Object]),
    write: dart.fnType(dart.void, [core.Object])
  }));
  dart.setGetterSignature(_HttpOutboundMessage, () => ({
    __proto__: dart.getGetters(_HttpOutboundMessage.__proto__),
    contentLength: core.int,
    persistentConnection: core.bool,
    bufferOutput: core.bool,
    encoding: convert.Encoding,
    [_isConnectionClosed]: core.bool
  }));
  dart.setSetterSignature(_HttpOutboundMessage, () => ({
    __proto__: dart.getSetters(_HttpOutboundMessage.__proto__),
    contentLength: core.int,
    persistentConnection: core.bool,
    bufferOutput: core.bool
  }));
  dart.setLibraryUri(_HttpOutboundMessage, "dart:_http");
  dart.setFieldSignature(_HttpOutboundMessage, () => ({
    __proto__: dart.getFields(_HttpOutboundMessage.__proto__),
    [_encodingSet]: dart.fieldType(core.bool),
    [_bufferOutput]: dart.fieldType(core.bool),
    [_uri$]: dart.finalFieldType(core.Uri),
    [_outgoing]: dart.finalFieldType(_http._HttpOutgoing),
    headers: dart.finalFieldType(_http._HttpHeaders)
  }));
  return _HttpOutboundMessage;
});
_http._HttpOutboundMessage = _http._HttpOutboundMessage$();
dart.addTypeTests(_http._HttpOutboundMessage, _is__HttpOutboundMessage_default);
const _statusCode = dart.privateName(_http, "_statusCode");
const _reasonPhrase = dart.privateName(_http, "_reasonPhrase");
const _deadline = dart.privateName(_http, "_deadline");
const _deadlineTimer = dart.privateName(_http, "_deadlineTimer");
const _isClosing = dart.privateName(_http, "_isClosing");
const _findReasonPhrase = dart.privateName(_http, "_findReasonPhrase");
const _isNew = dart.privateName(_http, "_isNew");
const _writeHeader = dart.privateName(_http, "_writeHeader");
_http._HttpResponse = class _HttpResponse extends _http._HttpOutboundMessage$(_http.HttpResponse) {
  get [_isConnectionClosed]() {
    return this[_httpRequest][_httpConnection][_isClosing];
  }
  get cookies() {
    if (this[_cookies] == null) this[_cookies] = JSArrayOfCookie().of([]);
    return this[_cookies];
  }
  get statusCode() {
    return this[_statusCode];
  }
  set statusCode(statusCode) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError.new("Header already sent"));
    this[_statusCode] = statusCode;
  }
  get reasonPhrase() {
    return this[_findReasonPhrase](this.statusCode);
  }
  set reasonPhrase(reasonPhrase) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError.new("Header already sent"));
    this[_reasonPhrase] = reasonPhrase;
  }
  redirect(location, opts) {
    let status = opts && 'status' in opts ? opts.status : _internal.HttpStatus.movedTemporarily;
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError.new("Header already sent"));
    this.statusCode = status;
    this.headers.set("location", dart.toString(location));
    return this.close();
  }
  detachSocket(opts) {
    let writeHeaders = opts && 'writeHeaders' in opts ? opts.writeHeaders : true;
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError.new("Headers already sent"));
    this.deadline = null;
    let future = this[_httpRequest][_httpConnection].detachSocket();
    if (dart.test(writeHeaders)) {
      let headersFuture = this[_outgoing].writeHeaders({drainRequest: false, setOutgoing: false});
      if (!(headersFuture == null)) dart.assertFailed(null, "dart:_http/http_impl.dart", 835, 14, "headersFuture == null");
    } else {
      this[_outgoing].headersWritten = true;
    }
    this.close();
    this.done.catchError(dart.fn(_ => {
    }, dynamicToNull()));
    return future;
  }
  get connectionInfo() {
    return this[_httpRequest].connectionInfo;
  }
  get deadline() {
    return this[_deadline];
  }
  set deadline(d) {
    if (this[_deadlineTimer] != null) this[_deadlineTimer].cancel();
    this[_deadline] = d;
    if (this[_deadline] == null) return;
    this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
      this[_httpRequest][_httpConnection].destroy();
    }, VoidToNull()));
  }
  [_writeHeader]() {
    let buffer = new _http._CopyingBytesBuilder.new(8192);
    if (this.headers.protocolVersion === "1.1") {
      buffer.add(_http._Const.HTTP11);
    } else {
      buffer.add(_http._Const.HTTP10);
    }
    buffer.addByte(_http._CharCode.SP);
    buffer.add(dart.toString(this.statusCode)[$codeUnits]);
    buffer.addByte(_http._CharCode.SP);
    buffer.add(this.reasonPhrase[$codeUnits]);
    buffer.addByte(_http._CharCode.CR);
    buffer.addByte(_http._CharCode.LF);
    let session = this[_httpRequest][_session];
    if (session != null && !dart.test(session[_destroyed])) {
      session[_isNew] = false;
      let found = false;
      for (let i = 0; i < dart.notNull(this.cookies[$length]); i++) {
        if (this.cookies[$_get](i).name[$toUpperCase]() === "DARTSESSID") {
          let _ = this.cookies[$_get](i);
          _.value = session.id;
          _.httpOnly = true;
          _.path = "/";
          found = true;
        }
      }
      if (!found) {
        let cookie = _http.Cookie.new("DARTSESSID", session.id);
        this.cookies[$add]((() => {
          cookie.httpOnly = true;
          cookie.path = "/";
          return cookie;
        })());
      }
    }
    if (this[_cookies] != null) {
      this[_cookies][$forEach](dart.fn(cookie => {
        this.headers.add(_http.HttpHeaders.setCookieHeader, cookie);
      }, CookieToNull()));
    }
    this.headers[_finalize]();
    this.headers[_build](buffer);
    buffer.addByte(_http._CharCode.CR);
    buffer.addByte(_http._CharCode.LF);
    let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
    this[_outgoing].setHeader(headerBytes, headerBytes[$length]);
  }
  [_findReasonPhrase](statusCode) {
    if (this[_reasonPhrase] != null) {
      return this[_reasonPhrase];
    }
    switch (statusCode) {
      case _internal.HttpStatus.continue__:
      {
        return "Continue";
      }
      case _internal.HttpStatus.switchingProtocols:
      {
        return "Switching Protocols";
      }
      case _internal.HttpStatus.ok:
      {
        return "OK";
      }
      case _internal.HttpStatus.created:
      {
        return "Created";
      }
      case _internal.HttpStatus.accepted:
      {
        return "Accepted";
      }
      case _internal.HttpStatus.nonAuthoritativeInformation:
      {
        return "Non-Authoritative Information";
      }
      case _internal.HttpStatus.noContent:
      {
        return "No Content";
      }
      case _internal.HttpStatus.resetContent:
      {
        return "Reset Content";
      }
      case _internal.HttpStatus.partialContent:
      {
        return "Partial Content";
      }
      case _internal.HttpStatus.multipleChoices:
      {
        return "Multiple Choices";
      }
      case _internal.HttpStatus.movedPermanently:
      {
        return "Moved Permanently";
      }
      case _internal.HttpStatus.found:
      {
        return "Found";
      }
      case _internal.HttpStatus.seeOther:
      {
        return "See Other";
      }
      case _internal.HttpStatus.notModified:
      {
        return "Not Modified";
      }
      case _internal.HttpStatus.useProxy:
      {
        return "Use Proxy";
      }
      case _internal.HttpStatus.temporaryRedirect:
      {
        return "Temporary Redirect";
      }
      case _internal.HttpStatus.badRequest:
      {
        return "Bad Request";
      }
      case _internal.HttpStatus.unauthorized:
      {
        return "Unauthorized";
      }
      case _internal.HttpStatus.paymentRequired:
      {
        return "Payment Required";
      }
      case _internal.HttpStatus.forbidden:
      {
        return "Forbidden";
      }
      case _internal.HttpStatus.notFound:
      {
        return "Not Found";
      }
      case _internal.HttpStatus.methodNotAllowed:
      {
        return "Method Not Allowed";
      }
      case _internal.HttpStatus.notAcceptable:
      {
        return "Not Acceptable";
      }
      case _internal.HttpStatus.proxyAuthenticationRequired:
      {
        return "Proxy Authentication Required";
      }
      case _internal.HttpStatus.requestTimeout:
      {
        return "Request Time-out";
      }
      case _internal.HttpStatus.conflict:
      {
        return "Conflict";
      }
      case _internal.HttpStatus.gone:
      {
        return "Gone";
      }
      case _internal.HttpStatus.lengthRequired:
      {
        return "Length Required";
      }
      case _internal.HttpStatus.preconditionFailed:
      {
        return "Precondition Failed";
      }
      case _internal.HttpStatus.requestEntityTooLarge:
      {
        return "Request Entity Too Large";
      }
      case _internal.HttpStatus.requestUriTooLong:
      {
        return "Request-URI Too Long";
      }
      case _internal.HttpStatus.unsupportedMediaType:
      {
        return "Unsupported Media Type";
      }
      case _internal.HttpStatus.requestedRangeNotSatisfiable:
      {
        return "Requested range not satisfiable";
      }
      case _internal.HttpStatus.expectationFailed:
      {
        return "Expectation Failed";
      }
      case _internal.HttpStatus.internalServerError:
      {
        return "Internal Server Error";
      }
      case _internal.HttpStatus.notImplemented:
      {
        return "Not Implemented";
      }
      case _internal.HttpStatus.badGateway:
      {
        return "Bad Gateway";
      }
      case _internal.HttpStatus.serviceUnavailable:
      {
        return "Service Unavailable";
      }
      case _internal.HttpStatus.gatewayTimeout:
      {
        return "Gateway Time-out";
      }
      case _internal.HttpStatus.httpVersionNotSupported:
      {
        return "Http Version not supported";
      }
      default:
      {
        return "Status " + dart.str(statusCode);
      }
    }
  }
};
(_http._HttpResponse.new = function(uri, protocolVersion, outgoing, defaultHeaders, serverHeader) {
  this[_statusCode] = 200;
  this[_reasonPhrase] = null;
  this[_cookies] = null;
  this[_httpRequest] = null;
  this[_deadline] = null;
  this[_deadlineTimer] = null;
  _http._HttpResponse.__proto__.new.call(this, uri, protocolVersion, outgoing, {initialHeaders: _http._HttpHeaders._check(defaultHeaders)});
  if (serverHeader != null) this.headers.set("server", serverHeader);
}).prototype = _http._HttpResponse.prototype;
dart.addTypeTests(_http._HttpResponse);
_http._HttpResponse[dart.implements] = () => [_http.HttpResponse];
dart.setMethodSignature(_http._HttpResponse, () => ({
  __proto__: dart.getMethods(_http._HttpResponse.__proto__),
  redirect: dart.fnType(async.Future, [core.Uri], {status: core.int}),
  detachSocket: dart.fnType(async.Future$(io.Socket), [], {writeHeaders: core.bool}),
  [_writeHeader]: dart.fnType(dart.void, []),
  [_findReasonPhrase]: dart.fnType(core.String, [core.int])
}));
dart.setGetterSignature(_http._HttpResponse, () => ({
  __proto__: dart.getGetters(_http._HttpResponse.__proto__),
  [_isConnectionClosed]: core.bool,
  cookies: core.List$(_http.Cookie),
  statusCode: core.int,
  reasonPhrase: core.String,
  connectionInfo: _http.HttpConnectionInfo,
  deadline: core.Duration
}));
dart.setSetterSignature(_http._HttpResponse, () => ({
  __proto__: dart.getSetters(_http._HttpResponse.__proto__),
  statusCode: core.int,
  reasonPhrase: core.String,
  deadline: core.Duration
}));
dart.setLibraryUri(_http._HttpResponse, "dart:_http");
dart.setFieldSignature(_http._HttpResponse, () => ({
  __proto__: dart.getFields(_http._HttpResponse.__proto__),
  [_statusCode]: dart.fieldType(core.int),
  [_reasonPhrase]: dart.fieldType(core.String),
  [_cookies]: dart.fieldType(ListOfCookie()),
  [_httpRequest]: dart.fieldType(_http._HttpRequest),
  [_deadline]: dart.fieldType(core.Duration),
  [_deadlineTimer]: dart.fieldType(async.Timer)
}));
const _responseCompleter = dart.privateName(_http, "_responseCompleter");
const _response = dart.privateName(_http, "_response");
const _followRedirects = dart.privateName(_http, "_followRedirects");
const _maxRedirects = dart.privateName(_http, "_maxRedirects");
const _onIncoming = dart.privateName(_http, "_onIncoming");
const _onError$ = dart.privateName(_http, "_onError");
const _proxyTunnel = dart.privateName(_http, "_proxyTunnel");
const _requestUri = dart.privateName(_http, "_requestUri");
_http._HttpClientRequest = class _HttpClientRequest extends _http._HttpOutboundMessage$(_http.HttpClientResponse) {
  get done() {
    if (this[_response] == null) {
      this[_response] = FutureOfHttpClientResponse()._check(async.Future.wait(dart.dynamic, JSArrayOfFuture().of([this[_responseCompleter].future, super.done]), {eagerError: true}).then(_http.HttpClientResponse, dart.fn(list => FutureOrOfHttpClientResponse()._check(list[$_get](0)), ListToFutureOrOfHttpClientResponse())));
    }
    return this[_response];
  }
  close() {
    super.close();
    return this.done;
  }
  get maxRedirects() {
    return this[_maxRedirects];
  }
  set maxRedirects(maxRedirects) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError.new("Request already sent"));
    this[_maxRedirects] = maxRedirects;
  }
  get followRedirects() {
    return this[_followRedirects];
  }
  set followRedirects(followRedirects) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError.new("Request already sent"));
    this[_followRedirects] = followRedirects;
  }
  get connectionInfo() {
    return this[_httpClientConnection].connectionInfo;
  }
  [_onIncoming](incoming) {
    let response = new _http._HttpClientResponse.new(incoming, this, this[_httpClient]);
    let future = null;
    if (dart.test(this.followRedirects) && dart.test(response.isRedirect)) {
      if (dart.notNull(response.redirects[$length]) < dart.notNull(this.maxRedirects)) {
        future = FutureOfHttpClientResponse()._check(response.drain(dart.dynamic).then(_http.HttpClientResponse, dart.fn(_ => response.redirect(), dynamicToFutureOfHttpClientResponse())));
      } else {
        future = FutureOfHttpClientResponse()._check(response.drain(dart.dynamic).then(_http.HttpClientResponse, dart.fn(_ => FutureOfHttpClientResponse().error(new _http.RedirectException.new("Redirect limit exceeded", response.redirects)), dynamicToFutureOfHttpClientResponse())));
      }
    } else if (dart.test(response[_shouldAuthenticateProxy])) {
      future = response[_authenticate](true);
    } else if (dart.test(response[_shouldAuthenticate])) {
      future = response[_authenticate](false);
    } else {
      future = FutureOfHttpClientResponse().value(response);
    }
    future.then(dart.void, dart.fn(v => this[_responseCompleter].complete(v), HttpClientResponseTovoid()), {onError: dart.bind(this[_responseCompleter], 'completeError')});
  }
  [_onError$](error, stackTrace) {
    this[_responseCompleter].completeError(error, stackTrace);
  }
  [_requestUri]() {
    const uriStartingFromPath = () => {
      let result = this.uri.path;
      if (result[$isEmpty]) result = "/";
      if (dart.test(this.uri.hasQuery)) {
        result = dart.str(result) + "?" + dart.str(this.uri.query);
      }
      return result;
    };
    dart.fn(uriStartingFromPath, VoidToString());
    if (dart.test(this[_proxy].isDirect)) {
      return uriStartingFromPath();
    } else {
      if (this.method === "CONNECT") {
        return dart.str(this.uri.host) + ":" + dart.str(this.uri.port);
      } else {
        if (dart.test(this[_httpClientConnection][_proxyTunnel])) {
          return uriStartingFromPath();
        } else {
          return dart.toString(this.uri.removeFragment());
        }
      }
    }
  }
  [_writeHeader]() {
    let buffer = new _http._CopyingBytesBuilder.new(8192);
    buffer.add(this.method[$codeUnits]);
    buffer.addByte(_http._CharCode.SP);
    buffer.add(this[_requestUri]()[$codeUnits]);
    buffer.addByte(_http._CharCode.SP);
    buffer.add(_http._Const.HTTP11);
    buffer.addByte(_http._CharCode.CR);
    buffer.addByte(_http._CharCode.LF);
    if (!dart.test(this.cookies[$isEmpty])) {
      let sb = new core.StringBuffer.new();
      for (let i = 0; i < dart.notNull(this.cookies[$length]); i++) {
        if (i > 0) sb.write("; ");
        sb.write(this.cookies[$_get](i).name);
        sb.write("=");
        sb.write(this.cookies[$_get](i).value);
      }
      this.headers.add(_http.HttpHeaders.cookieHeader, sb.toString());
    }
    this.headers[_finalize]();
    this.headers[_build](buffer);
    buffer.addByte(_http._CharCode.CR);
    buffer.addByte(_http._CharCode.LF);
    let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
    this[_outgoing].setHeader(headerBytes, headerBytes[$length]);
  }
};
(_http._HttpClientRequest.new = function(outgoing, uri, method, proxy, httpClient, httpClientConnection) {
  this.cookies = JSArrayOfCookie().of([]);
  this[_responseCompleter] = CompleterOfHttpClientResponse().new();
  this[_response] = null;
  this[_followRedirects] = true;
  this[_maxRedirects] = 5;
  this[_responseRedirects] = JSArrayOfRedirectInfo().of([]);
  this.method = method;
  this[_proxy] = proxy;
  this[_httpClient] = httpClient;
  this[_httpClientConnection] = httpClientConnection;
  this.uri = uri;
  _http._HttpClientRequest.__proto__.new.call(this, uri, "1.1", outgoing);
  if (this.method === "GET" || this.method === "HEAD") {
    this.contentLength = 0;
  } else {
    this.headers.chunkedTransferEncoding = true;
  }
}).prototype = _http._HttpClientRequest.prototype;
dart.addTypeTests(_http._HttpClientRequest);
_http._HttpClientRequest[dart.implements] = () => [_http.HttpClientRequest];
dart.setMethodSignature(_http._HttpClientRequest, () => ({
  __proto__: dart.getMethods(_http._HttpClientRequest.__proto__),
  close: dart.fnType(async.Future$(_http.HttpClientResponse), []),
  [_onIncoming]: dart.fnType(dart.void, [_http._HttpIncoming]),
  [_onError$]: dart.fnType(dart.void, [dart.dynamic, core.StackTrace]),
  [_requestUri]: dart.fnType(core.String, []),
  [_writeHeader]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(_http._HttpClientRequest, () => ({
  __proto__: dart.getGetters(_http._HttpClientRequest.__proto__),
  done: async.Future$(_http.HttpClientResponse),
  maxRedirects: core.int,
  followRedirects: core.bool,
  connectionInfo: _http.HttpConnectionInfo
}));
dart.setSetterSignature(_http._HttpClientRequest, () => ({
  __proto__: dart.getSetters(_http._HttpClientRequest.__proto__),
  maxRedirects: core.int,
  followRedirects: core.bool
}));
dart.setLibraryUri(_http._HttpClientRequest, "dart:_http");
dart.setFieldSignature(_http._HttpClientRequest, () => ({
  __proto__: dart.getFields(_http._HttpClientRequest.__proto__),
  method: dart.finalFieldType(core.String),
  uri: dart.finalFieldType(core.Uri),
  cookies: dart.finalFieldType(ListOfCookie()),
  [_httpClient]: dart.finalFieldType(_http._HttpClient),
  [_httpClientConnection]: dart.finalFieldType(_http._HttpClientConnection),
  [_responseCompleter]: dart.finalFieldType(CompleterOfHttpClientResponse()),
  [_proxy]: dart.finalFieldType(_http._Proxy),
  [_response]: dart.fieldType(FutureOfHttpClientResponse()),
  [_followRedirects]: dart.fieldType(core.bool),
  [_maxRedirects]: dart.fieldType(core.int),
  [_responseRedirects]: dart.fieldType(ListOfRedirectInfo())
}));
const _consume = dart.privateName(_http, "_consume");
_http._HttpGZipSink = class _HttpGZipSink extends convert.ByteConversionSink {
  add(chunk) {
    ListOfint()._check(chunk);
    this[_consume](chunk);
  }
  addSlice(chunk, start, end, isLast) {
    if (typed_data.Uint8List.is(chunk)) {
      this[_consume](typed_data.Uint8List.view(chunk[$buffer], start, dart.notNull(end) - dart.notNull(start)));
    } else {
      this[_consume](chunk[$sublist](start, dart.notNull(end) - dart.notNull(start)));
    }
  }
  close() {}
};
(_http._HttpGZipSink.new = function(consume) {
  this[_consume] = consume;
  _http._HttpGZipSink.__proto__.new.call(this);
}).prototype = _http._HttpGZipSink.prototype;
dart.addTypeTests(_http._HttpGZipSink);
dart.setMethodSignature(_http._HttpGZipSink, () => ({
  __proto__: dart.getMethods(_http._HttpGZipSink.__proto__),
  add: dart.fnType(dart.void, [core.Object]),
  addSlice: dart.fnType(dart.void, [core.List$(core.int), core.int, core.int, core.bool]),
  close: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(_http._HttpGZipSink, "dart:_http");
dart.setFieldSignature(_http._HttpGZipSink, () => ({
  __proto__: dart.getFields(_http._HttpGZipSink.__proto__),
  [_consume]: dart.finalFieldType(ListOfintTovoid())
}));
const _closeFuture = dart.privateName(_http, "_closeFuture");
const _pendingChunkedFooter = dart.privateName(_http, "_pendingChunkedFooter");
const _bytesWritten = dart.privateName(_http, "_bytesWritten");
const _gzip = dart.privateName(_http, "_gzip");
const _gzipSink = dart.privateName(_http, "_gzipSink");
const _gzipAdd = dart.privateName(_http, "_gzipAdd");
const _gzipBuffer = dart.privateName(_http, "_gzipBuffer");
const _gzipBufferLength = dart.privateName(_http, "_gzipBufferLength");
const _socketError = dart.privateName(_http, "_socketError");
const _addGZipChunk = dart.privateName(_http, "_addGZipChunk");
const _chunkHeader = dart.privateName(_http, "_chunkHeader");
const _addChunk$ = dart.privateName(_http, "_addChunk");
const _ignoreError = dart.privateName(_http, "_ignoreError");
let const$99;
_http._HttpOutgoing = class _HttpOutgoing extends core.Object {
  writeHeaders(opts) {
    let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
    let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
    if (dart.test(this.headersWritten)) return null;
    this.headersWritten = true;
    let drainFuture = null;
    let gzip = false;
    if (_http._HttpResponse.is(this.outbound)) {
      let response = _http._HttpResponse._check(this.outbound);
      if (dart.test(response[_httpRequest][_httpServer].autoCompress) && dart.test(this.outbound.bufferOutput) && dart.test(this.outbound.headers.chunkedTransferEncoding)) {
        let acceptEncodings = response[_httpRequest].headers._get(_http.HttpHeaders.acceptEncodingHeader);
        let contentEncoding = this.outbound.headers._get(_http.HttpHeaders.contentEncodingHeader);
        if (acceptEncodings != null && dart.test(acceptEncodings[$expand](dart.dynamic, dart.fn(list => core.Iterable._check(dart.dsend(list, 'split', [","])), dynamicToIterable()))[$any](dart.fn(encoding => dart.equals(dart.dsend(dart.dsend(encoding, 'trim', []), 'toLowerCase', []), "gzip"), dynamicTobool()))) && contentEncoding == null) {
          this.outbound.headers.set(_http.HttpHeaders.contentEncodingHeader, "gzip");
          gzip = true;
        }
      }
      if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
        drainFuture = response[_httpRequest].drain(dart.dynamic).catchError(dart.fn(_ => {
        }, dynamicToNull()));
      }
    } else {
      drainRequest = false;
    }
    if (!dart.test(this.ignoreBody)) {
      if (dart.test(setOutgoing)) {
        let contentLength = this.outbound.headers.contentLength;
        if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
          this.chunked = true;
          if (gzip) this.gzip = true;
        } else if (dart.notNull(contentLength) >= 0) {
          this.contentLength = contentLength;
        }
      }
      if (drainFuture != null) {
        return drainFuture.then(dart.dynamic, dart.fn(_ => this.outbound[_writeHeader](), dynamicTovoid()));
      }
    }
    this.outbound[_writeHeader]();
    return null;
  }
  addStream(stream) {
    StreamOfListOfint()._check(stream);
    if (dart.test(this[_socketError])) {
      stream.listen(null).cancel();
      return async.Future.value(this.outbound);
    }
    if (dart.test(this.ignoreBody)) {
      stream.drain(dart.dynamic).catchError(dart.fn(_ => {
      }, dynamicToNull()));
      let future = this.writeHeaders();
      if (future != null) {
        return future.then(dart.dynamic, dart.fn(_ => this.close(), dynamicToFuture()));
      }
      return this.close();
    }
    let sub = null;
    let controller = StreamControllerOfListOfint().new({onPause: dart.fn(() => sub.pause(), VoidTovoid()), onResume: dart.fn(() => sub.resume(), VoidTovoid()), sync: true});
    const onData = data => {
      if (dart.test(this[_socketError])) return;
      if (data[$length] === 0) return;
      if (dart.test(this.chunked)) {
        if (dart.test(this[_gzip])) {
          this[_gzipAdd] = dart.bind(controller, 'add');
          this[_addGZipChunk](data, dart.bind(this[_gzipSink], 'add'));
          this[_gzipAdd] = null;
          return;
        }
        this[_addChunk$](this[_chunkHeader](data[$length]), dart.bind(controller, 'add'));
        this[_pendingChunkedFooter] = 2;
      } else {
        if (this.contentLength != null) {
          this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(data[$length]);
          if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
            controller.addError(new _http.HttpException.new("Content size exceeds specified contentLength. " + (dart.str(this[_bytesWritten]) + " bytes written while expected ") + (dart.str(this.contentLength) + ". ") + ("[" + core.String.fromCharCodes(data) + "]")));
            return;
          }
        }
      }
      this[_addChunk$](data, dart.bind(controller, 'add'));
    };
    dart.fn(onData, ListOfintTovoid());
    sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
    if (!dart.test(this.headersWritten)) {
      let future = this.writeHeaders();
      if (future != null) {
        sub.pause(future);
      }
    }
    return this.socket.addStream(controller.stream).then(dart.dynamic, dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
        if (dart.test(this[_gzip])) this[_gzipSink].close();
        this[_socketError] = true;
        this[_doneCompleter$].completeError(error, core.StackTrace._check(stackTrace));
        if (dart.test(this[_ignoreError](error))) {
          return this.outbound;
        } else {
          dart.throw(error);
        }
      }, dynamicAnddynamicTo_HttpOutboundMessage())});
  }
  close() {
    if (this[_closeFuture] != null) return this[_closeFuture];
    if (dart.test(this[_socketError])) return async.Future.value(this.outbound);
    if (dart.test(this.outbound[_isConnectionClosed])) return async.Future.value(this.outbound);
    if (!dart.test(this.headersWritten) && !dart.test(this.ignoreBody)) {
      if (this.outbound.headers.contentLength === -1) {
        this.outbound.headers.chunkedTransferEncoding = false;
        this.outbound.headers.contentLength = 0;
      } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
        let error = new _http.HttpException.new("No content even though contentLength was specified to be " + ("greater than 0: " + dart.str(this.outbound.headers.contentLength) + "."), {uri: this.outbound[_uri$]});
        this[_doneCompleter$].completeError(error);
        return this[_closeFuture] = async.Future.error(error);
      }
    }
    if (this.contentLength != null) {
      if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
        let error = new _http.HttpException.new("Content size below specified contentLength. " + (" " + dart.str(this[_bytesWritten]) + " bytes written but expected ") + (dart.str(this.contentLength) + "."), {uri: this.outbound[_uri$]});
        this[_doneCompleter$].completeError(error);
        return this[_closeFuture] = async.Future.error(error);
      }
    }
    const finalize = () => {
      if (dart.test(this.chunked)) {
        if (dart.test(this[_gzip])) {
          this[_gzipAdd] = dart.bind(this.socket, 'add');
          if (dart.notNull(this[_gzipBufferLength]) > 0) {
            this[_gzipSink].add(typed_data.Uint8List.view(this[_gzipBuffer][$buffer], 0, this[_gzipBufferLength]));
          }
          this[_gzipBuffer] = null;
          this[_gzipSink].close();
          this[_gzipAdd] = null;
        }
        this[_addChunk$](this[_chunkHeader](0), dart.bind(this.socket, 'add'));
      }
      if (dart.notNull(this[_length$3]) > 0) {
        this.socket.add(typed_data.Uint8List.view(this[_buffer$1][$buffer], 0, this[_length$3]));
      }
      this[_buffer$1] = null;
      return this.socket.flush().then(dart.dynamic, dart.fn(_ => {
        this[_doneCompleter$].complete(this.socket);
        return this.outbound;
      }, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
          this[_doneCompleter$].completeError(error, core.StackTrace._check(stackTrace));
          if (dart.test(this[_ignoreError](error))) {
            return this.outbound;
          } else {
            dart.throw(error);
          }
        }, dynamicAnddynamicTo_HttpOutboundMessage())});
    };
    dart.fn(finalize, VoidToFuture());
    let future = this.writeHeaders();
    if (future != null) {
      return this[_closeFuture] = future.whenComplete(finalize);
    }
    return this[_closeFuture] = finalize();
  }
  get done() {
    return this[_doneCompleter$].future;
  }
  setHeader(data, length) {
    if (!(this[_length$3] === 0)) dart.assertFailed(null, "dart:_http/http_impl.dart", 1459, 12, "_length == 0");
    this[_buffer$1] = typed_data.Uint8List._check(data);
    this[_length$3] = length;
  }
  set gzip(value) {
    this[_gzip] = value;
    if (dart.test(this[_gzip])) {
      this[_gzipBuffer] = typed_data.Uint8List.new(8192);
      if (!(this[_gzipSink] == null)) dart.assertFailed(null, "dart:_http/http_impl.dart", 1468, 14, "_gzipSink == null");
      this[_gzipSink] = new io.ZLibEncoder.new({gzip: true}).startChunkedConversion(new _http._HttpGZipSink.new(dart.fn(data => {
        if (this[_gzipAdd] == null) return;
        this[_addChunk$](this[_chunkHeader](data[$length]), this[_gzipAdd]);
        this[_pendingChunkedFooter] = 2;
        this[_addChunk$](data, this[_gzipAdd]);
      }, ListOfintToNull())));
    }
  }
  [_ignoreError](error) {
    return (io.SocketException.is(error) || io.TlsException.is(error)) && _http.HttpResponse.is(this.outbound);
  }
  [_addGZipChunk](chunk, add) {
    if (!dart.test(this.outbound.bufferOutput)) {
      add(chunk);
      return;
    }
    if (dart.notNull(chunk[$length]) > dart.notNull(this[_gzipBuffer][$length]) - dart.notNull(this[_gzipBufferLength])) {
      add(typed_data.Uint8List.view(this[_gzipBuffer][$buffer], 0, this[_gzipBufferLength]));
      this[_gzipBuffer] = typed_data.Uint8List.new(8192);
      this[_gzipBufferLength] = 0;
    }
    if (dart.notNull(chunk[$length]) > 8192) {
      add(chunk);
    } else {
      this[_gzipBuffer][$setRange](this[_gzipBufferLength], dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[$length]), chunk);
      this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[$length]);
    }
  }
  [_addChunk$](chunk, add) {
    if (!dart.test(this.outbound.bufferOutput)) {
      if (this[_buffer$1] != null) {
        add(typed_data.Uint8List.view(this[_buffer$1][$buffer], 0, this[_length$3]));
        this[_buffer$1] = null;
        this[_length$3] = 0;
      }
      add(chunk);
      return;
    }
    if (dart.notNull(chunk[$length]) > dart.notNull(this[_buffer$1][$length]) - dart.notNull(this[_length$3])) {
      add(typed_data.Uint8List.view(this[_buffer$1][$buffer], 0, this[_length$3]));
      this[_buffer$1] = typed_data.Uint8List.new(8192);
      this[_length$3] = 0;
    }
    if (dart.notNull(chunk[$length]) > 8192) {
      add(chunk);
    } else {
      this[_buffer$1][$setRange](this[_length$3], dart.notNull(this[_length$3]) + dart.notNull(chunk[$length]), chunk);
      this[_length$3] = dart.notNull(this[_length$3]) + dart.notNull(chunk[$length]);
    }
  }
  [_chunkHeader](length) {
    let hexDigits = const$99 || (const$99 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
    if (length === 0) {
      if (this[_pendingChunkedFooter] === 2) return _http._HttpOutgoing._footerAndChunk0Length;
      return _http._HttpOutgoing._chunk0Length;
    }
    let size = this[_pendingChunkedFooter];
    let len = length;
    while (dart.notNull(len) > 0) {
      size = dart.notNull(size) + 1;
      len = len[$rightShift](4);
    }
    let footerAndHeader = typed_data.Uint8List.new(dart.notNull(size) + 2);
    if (this[_pendingChunkedFooter] === 2) {
      footerAndHeader[$_set](0, _http._CharCode.CR);
      footerAndHeader[$_set](1, _http._CharCode.LF);
    }
    let index = size;
    while (dart.notNull(index) > dart.notNull(this[_pendingChunkedFooter])) {
      footerAndHeader[$_set](index = dart.notNull(index) - 1, hexDigits[$_get](dart.notNull(length) & 15));
      length = length[$rightShift](4);
    }
    footerAndHeader[$_set](dart.notNull(size) + 0, _http._CharCode.CR);
    footerAndHeader[$_set](dart.notNull(size) + 1, _http._CharCode.LF);
    return footerAndHeader;
  }
};
(_http._HttpOutgoing.new = function(socket) {
  this[_doneCompleter$] = CompleterOfSocket().new();
  this.ignoreBody = false;
  this.headersWritten = false;
  this[_buffer$1] = null;
  this[_length$3] = 0;
  this[_closeFuture] = null;
  this.chunked = false;
  this[_pendingChunkedFooter] = 0;
  this.contentLength = null;
  this[_bytesWritten] = 0;
  this[_gzip] = false;
  this[_gzipSink] = null;
  this[_gzipAdd] = null;
  this[_gzipBuffer] = null;
  this[_gzipBufferLength] = 0;
  this[_socketError] = false;
  this.outbound = null;
  this.socket = socket;
}).prototype = _http._HttpOutgoing.prototype;
dart.addTypeTests(_http._HttpOutgoing);
_http._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
dart.setMethodSignature(_http._HttpOutgoing, () => ({
  __proto__: dart.getMethods(_http._HttpOutgoing.__proto__),
  writeHeaders: dart.fnType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
  addStream: dart.fnType(async.Future, [core.Object]),
  close: dart.fnType(async.Future, []),
  setHeader: dart.fnType(dart.void, [core.List$(core.int), core.int]),
  [_ignoreError]: dart.fnType(core.bool, [dart.dynamic]),
  [_addGZipChunk]: dart.fnType(dart.void, [core.List$(core.int), dart.fnType(dart.void, [core.List$(core.int)])]),
  [_addChunk$]: dart.fnType(dart.void, [core.List$(core.int), dart.fnType(dart.void, [core.List$(core.int)])]),
  [_chunkHeader]: dart.fnType(core.List$(core.int), [core.int])
}));
dart.setGetterSignature(_http._HttpOutgoing, () => ({
  __proto__: dart.getGetters(_http._HttpOutgoing.__proto__),
  done: async.Future$(io.Socket)
}));
dart.setSetterSignature(_http._HttpOutgoing, () => ({
  __proto__: dart.getSetters(_http._HttpOutgoing.__proto__),
  gzip: core.bool
}));
dart.setLibraryUri(_http._HttpOutgoing, "dart:_http");
dart.setFieldSignature(_http._HttpOutgoing, () => ({
  __proto__: dart.getFields(_http._HttpOutgoing.__proto__),
  [_doneCompleter$]: dart.finalFieldType(CompleterOfSocket()),
  socket: dart.finalFieldType(io.Socket),
  ignoreBody: dart.fieldType(core.bool),
  headersWritten: dart.fieldType(core.bool),
  [_buffer$1]: dart.fieldType(typed_data.Uint8List),
  [_length$3]: dart.fieldType(core.int),
  [_closeFuture]: dart.fieldType(async.Future),
  chunked: dart.fieldType(core.bool),
  [_pendingChunkedFooter]: dart.fieldType(core.int),
  contentLength: dart.fieldType(core.int),
  [_bytesWritten]: dart.fieldType(core.int),
  [_gzip]: dart.fieldType(core.bool),
  [_gzipSink]: dart.fieldType(convert.ByteConversionSink),
  [_gzipAdd]: dart.fieldType(ListOfintTovoid()),
  [_gzipBuffer]: dart.fieldType(typed_data.Uint8List),
  [_gzipBufferLength]: dart.fieldType(core.int),
  [_socketError]: dart.fieldType(core.bool),
  outbound: dart.fieldType(_http._HttpOutboundMessage)
}));
dart.defineLazy(_http._HttpOutgoing, {
  /*_http._HttpOutgoing._footerAndChunk0Length*/get _footerAndChunk0Length() {
    return dart.constList([_http._CharCode.CR, _http._CharCode.LF, 48, _http._CharCode.CR, _http._CharCode.LF, _http._CharCode.CR, _http._CharCode.LF], core.int);
  },
  /*_http._HttpOutgoing._chunk0Length*/get _chunk0Length() {
    return dart.constList([48, _http._CharCode.CR, _http._CharCode.LF, _http._CharCode.CR, _http._CharCode.LF], core.int);
  }
});
const _context$ = dart.privateName(_http, "_context");
const _httpParser = dart.privateName(_http, "_httpParser");
const _subscription$0 = dart.privateName(_http, "_subscription");
const _dispose = dart.privateName(_http, "_dispose");
const _idleTimer = dart.privateName(_http, "_idleTimer");
const _currentUri = dart.privateName(_http, "_currentUri");
const _nextResponseCompleter = dart.privateName(_http, "_nextResponseCompleter");
const _streamFuture = dart.privateName(_http, "_streamFuture");
const _proxyCredentials = dart.privateName(_http, "_proxyCredentials");
const _returnConnection = dart.privateName(_http, "_returnConnection");
_http._HttpClientConnection = class _HttpClientConnection extends core.Object {
  send(uri, port, method, proxy) {
    if (dart.test(this.closed)) {
      dart.throw(new _http.HttpException.new("Socket closed before request was sent", {uri: uri}));
    }
    this[_currentUri] = uri;
    this[_subscription$0].pause();
    let proxyCreds = null;
    let creds = null;
    let outgoing = new _http._HttpOutgoing.new(this[_socket$]);
    let request = new _http._HttpClientRequest.new(outgoing, uri, method, proxy, this[_httpClient], this);
    let host = uri.host;
    if (host[$contains](":")) host = "[" + dart.str(host) + "]";
    request.headers.host = host;
    request.headers.port = port;
    request.headers[_add$2](_http.HttpHeaders.acceptEncodingHeader, "gzip");
    if (this[_httpClient].userAgent != null) {
      request.headers[_add$2]("user-agent", this[_httpClient].userAgent);
    }
    if (dart.test(proxy.isAuthenticated)) {
      let auth = _http._CryptoUtils.bytesToBase64(convert.utf8.encode(dart.str(proxy.username) + ":" + dart.str(proxy.password)));
      request.headers.set(_http.HttpHeaders.proxyAuthorizationHeader, "Basic " + dart.str(auth));
    } else if (!dart.test(proxy.isDirect) && dart.notNull(this[_httpClient][_proxyCredentials][$length]) > 0) {
      proxyCreds = this[_httpClient][_findProxyCredentials](proxy);
      if (proxyCreds != null) {
        proxyCreds.authorize(request);
      }
    }
    if (uri.userInfo != null && !uri.userInfo[$isEmpty]) {
      let auth = _http._CryptoUtils.bytesToBase64(convert.utf8.encode(uri.userInfo));
      request.headers.set(_http.HttpHeaders.authorizationHeader, "Basic " + dart.str(auth));
    } else {
      creds = this[_httpClient][_findCredentials](uri);
      if (creds != null) {
        creds.authorize(request);
      }
    }
    this[_httpParser].isHead = method === "HEAD";
    this[_streamFuture] = FutureOfSocket()._check(outgoing.done.then(io.Socket, dart.fn(s => {
      this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
      FutureOfNull()._check(this[_nextResponseCompleter].future.then(core.Null, dart.fn(incoming => {
        this[_currentUri] = null;
        FutureOfNull()._check(incoming.dataDone.then(core.Null, dart.fn(closing => {
          if (dart.test(incoming.upgraded)) {
            this[_httpClient][_connectionClosed](this);
            this.startTimer();
            return;
          }
          if (dart.test(this.closed)) return;
          if (!dart.dtest(closing) && !dart.test(this[_dispose]) && dart.test(incoming.headers.persistentConnection) && dart.test(request.persistentConnection)) {
            this[_httpClient][_returnConnection](this);
            this[_subscription$0].resume();
          } else {
            this.destroy();
          }
        }, dynamicToNull())));
        if (proxyCreds != null && dart.equals(proxyCreds.scheme, _http._AuthenticationScheme.DIGEST)) {
          let authInfo = incoming.headers._get("proxy-authentication-info");
          if (authInfo != null && authInfo[$length] === 1) {
            let header = _http._HeaderValue.parse(authInfo[$_get](0), {parameterSeparator: ","});
            let nextnonce = header.parameters[$_get]("nextnonce");
            if (nextnonce != null) proxyCreds.nonce = nextnonce;
          }
        }
        if (creds != null && dart.equals(creds.scheme, _http._AuthenticationScheme.DIGEST)) {
          let authInfo = incoming.headers._get("authentication-info");
          if (authInfo != null && authInfo[$length] === 1) {
            let header = _http._HeaderValue.parse(authInfo[$_get](0), {parameterSeparator: ","});
            let nextnonce = header.parameters[$_get]("nextnonce");
            if (nextnonce != null) creds.nonce = nextnonce;
          }
        }
        request[_onIncoming](incoming);
      }, _HttpIncomingToNull()))).catchError(dart.fn(error => {
        dart.throw(new _http.HttpException.new("Connection closed before data was received", {uri: uri}));
      }, dynamicToNull()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
        this.destroy();
        request[_onError$](error, core.StackTrace._check(stackTrace));
      }, dynamicAnddynamicToNull()));
      this[_subscription$0].resume();
      return s;
    }, SocketToSocket()), {onError: dart.fn(e => {
        this.destroy();
      }, dynamicToNull())}));
    return request;
  }
  detachSocket() {
    return FutureOfSocket()._check(this[_streamFuture].then(io.Socket, dart.fn(_ => new _http._DetachedSocket.new(this[_socket$], this[_httpParser].detachIncoming()), SocketTo_DetachedSocket())));
  }
  destroy() {
    this.closed = true;
    this[_httpClient][_connectionClosed](this);
    this[_socket$].destroy();
  }
  close() {
    this.closed = true;
    this[_httpClient][_connectionClosed](this);
    this[_streamFuture].timeout(this[_httpClient].idleTimeout).then(dart.void, dart.fn(_ => this[_socket$].destroy(), SocketTovoid()));
  }
  createProxyTunnel(host, port, proxy, callback) {
    let request = this.send(core.Uri.new({host: host, port: port}), port, "CONNECT", proxy);
    if (dart.test(proxy.isAuthenticated)) {
      let auth = _http._CryptoUtils.bytesToBase64(convert.utf8.encode(dart.str(proxy.username) + ":" + dart.str(proxy.password)));
      request.headers.set(_http.HttpHeaders.proxyAuthorizationHeader, "Basic " + dart.str(auth));
    }
    return FutureOf_HttpClientConnection()._check(FutureOfSecureSocket()._check(request.close().then(io.SecureSocket, dart.fn(response => {
      if (response.statusCode !== _internal.HttpStatus.ok) {
        dart.throw("Proxy failed to establish tunnel " + ("(" + dart.str(response.statusCode) + " " + dart.str(response.reasonPhrase) + ")"));
      }
      let socket = _http._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket$];
      return io.SecureSocket.secure(socket, {host: host, context: this[_context$], onBadCertificate: callback});
    }, HttpClientResponseToFutureOfSecureSocket()))).then(_http._HttpClientConnection, dart.fn(secureSocket => {
      let key = core.String._check(_http._HttpClientConnection.makeKey(true, host, port));
      return new _http._HttpClientConnection.new(key, secureSocket, request[_httpClient], true);
    }, SecureSocketTo_HttpClientConnection())));
  }
  get connectionInfo() {
    return _http._HttpConnectionInfo.create(this[_socket$]);
  }
  static makeKey(isSecure, host, port) {
    return dart.test(isSecure) ? "ssh:" + dart.str(host) + ":" + dart.str(port) : dart.str(host) + ":" + dart.str(port);
  }
  stopTimer() {
    if (this[_idleTimer] != null) {
      this[_idleTimer].cancel();
      this[_idleTimer] = null;
    }
  }
  startTimer() {
    if (!(this[_idleTimer] == null)) dart.assertFailed(null, "dart:_http/http_impl.dart", 1825, 12, "_idleTimer == null");
    this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
      this[_idleTimer] = null;
      this.close();
    }, VoidToNull()));
  }
};
(_http._HttpClientConnection.new = function(key, socket, httpClient, proxyTunnel, context) {
  if (proxyTunnel === void 0) proxyTunnel = false;
  if (context === void 0) context = null;
  this[_subscription$0] = null;
  this[_dispose] = false;
  this[_idleTimer] = null;
  this.closed = false;
  this[_currentUri] = null;
  this[_nextResponseCompleter] = null;
  this[_streamFuture] = null;
  this.key = key;
  this[_socket$] = socket;
  this[_httpClient] = httpClient;
  this[_proxyTunnel] = proxyTunnel;
  this[_context$] = context;
  this[_httpParser] = _http._HttpParser.responseParser();
  this[_httpParser].listenToStream(this[_socket$]);
  this[_subscription$0] = this[_httpParser].listen(dart.fn(incoming => {
    this[_subscription$0].pause();
    if (this[_nextResponseCompleter] == null) {
      dart.throw(new _http.HttpException.new("Unexpected response (unsolicited response without request).", {uri: this[_currentUri]}));
    }
    if (incoming.statusCode === 100) {
      FutureOfNull()._check(incoming.drain(dart.dynamic).then(core.Null, dart.fn(_ => {
        this[_subscription$0].resume();
      }, dynamicToNull()))).catchError(dart.fn((error, stackTrace) => {
        if (stackTrace === void 0) stackTrace = null;
        this[_nextResponseCompleter].completeError(new _http.HttpException.new(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
        this[_nextResponseCompleter] = null;
      }, dynamic__ToNull()));
    } else {
      this[_nextResponseCompleter].complete(incoming);
      this[_nextResponseCompleter] = null;
    }
  }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
      if (stackTrace === void 0) stackTrace = null;
      if (this[_nextResponseCompleter] != null) {
        this[_nextResponseCompleter].completeError(new _http.HttpException.new(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
        this[_nextResponseCompleter] = null;
      }
    }, dynamic__ToNull()), onDone: dart.fn(() => {
      if (this[_nextResponseCompleter] != null) {
        this[_nextResponseCompleter].completeError(new _http.HttpException.new("Connection closed before response was received", {uri: this[_currentUri]}));
        this[_nextResponseCompleter] = null;
      }
      this.close();
    }, VoidToNull())});
}).prototype = _http._HttpClientConnection.prototype;
dart.addTypeTests(_http._HttpClientConnection);
dart.setMethodSignature(_http._HttpClientConnection, () => ({
  __proto__: dart.getMethods(_http._HttpClientConnection.__proto__),
  send: dart.fnType(_http._HttpClientRequest, [core.Uri, core.int, core.String, _http._Proxy]),
  detachSocket: dart.fnType(async.Future$(io.Socket), []),
  destroy: dart.fnType(dart.void, []),
  close: dart.fnType(dart.void, []),
  createProxyTunnel: dart.fnType(async.Future$(_http._HttpClientConnection), [core.String, core.int, _http._Proxy, dart.fnType(core.bool, [io.X509Certificate])]),
  stopTimer: dart.fnType(dart.void, []),
  startTimer: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(_http._HttpClientConnection, () => ({
  __proto__: dart.getGetters(_http._HttpClientConnection.__proto__),
  connectionInfo: _http.HttpConnectionInfo
}));
dart.setLibraryUri(_http._HttpClientConnection, "dart:_http");
dart.setFieldSignature(_http._HttpClientConnection, () => ({
  __proto__: dart.getFields(_http._HttpClientConnection.__proto__),
  key: dart.finalFieldType(core.String),
  [_socket$]: dart.finalFieldType(io.Socket),
  [_proxyTunnel]: dart.finalFieldType(core.bool),
  [_context$]: dart.finalFieldType(io.SecurityContext),
  [_httpParser]: dart.finalFieldType(_http._HttpParser),
  [_subscription$0]: dart.fieldType(async.StreamSubscription),
  [_httpClient]: dart.finalFieldType(_http._HttpClient),
  [_dispose]: dart.fieldType(core.bool),
  [_idleTimer]: dart.fieldType(async.Timer),
  closed: dart.fieldType(core.bool),
  [_currentUri]: dart.fieldType(core.Uri),
  [_nextResponseCompleter]: dart.fieldType(CompleterOf_HttpIncoming()),
  [_streamFuture]: dart.fieldType(FutureOfSocket())
}));
_http._ConnectionInfo = class _ConnectionInfo extends core.Object {};
(_http._ConnectionInfo.new = function(connection, proxy) {
  this.connection = connection;
  this.proxy = proxy;
}).prototype = _http._ConnectionInfo.prototype;
dart.addTypeTests(_http._ConnectionInfo);
dart.setLibraryUri(_http._ConnectionInfo, "dart:_http");
dart.setFieldSignature(_http._ConnectionInfo, () => ({
  __proto__: dart.getFields(_http._ConnectionInfo.__proto__),
  connection: dart.finalFieldType(_http._HttpClientConnection),
  proxy: dart.finalFieldType(_http._Proxy)
}));
const _idle = dart.privateName(_http, "_idle");
const _active = dart.privateName(_http, "_active");
const _socketTasks = dart.privateName(_http, "_socketTasks");
const _pending$ = dart.privateName(_http, "_pending");
const _connecting = dart.privateName(_http, "_connecting");
const _checkPending = dart.privateName(_http, "_checkPending");
const _connectionsChanged = dart.privateName(_http, "_connectionsChanged");
const _badCertificateCallback = dart.privateName(_http, "_badCertificateCallback");
const _getConnectionTarget = dart.privateName(_http, "_getConnectionTarget");
_http._ConnectionTarget = class _ConnectionTarget extends core.Object {
  get isEmpty() {
    return dart.test(this[_idle].isEmpty) && dart.test(this[_active].isEmpty) && this[_connecting] === 0;
  }
  get hasIdle() {
    return this[_idle].isNotEmpty;
  }
  get hasActive() {
    return dart.test(this[_active].isNotEmpty) || dart.notNull(this[_connecting]) > 0;
  }
  takeIdle() {
    if (!dart.test(this.hasIdle)) dart.assertFailed(null, "dart:_http/http_impl.dart", 1863, 12, "hasIdle");
    let connection = this[_idle].first;
    this[_idle].remove(connection);
    connection.stopTimer();
    this[_active].add(connection);
    return connection;
  }
  [_checkPending]() {
    if (dart.test(this[_pending$].isNotEmpty)) {
      dart.dcall(this[_pending$].removeFirst(), []);
    }
  }
  addNewActive(connection) {
    this[_active].add(connection);
  }
  returnConnection(connection) {
    if (!dart.test(this[_active].contains(connection))) dart.assertFailed(null, "dart:_http/http_impl.dart", 1882, 12, "_active.contains(connection)");
    this[_active].remove(connection);
    this[_idle].add(connection);
    connection.startTimer();
    this[_checkPending]();
  }
  connectionClosed(connection) {
    if (!(!dart.test(this[_active].contains(connection)) || !dart.test(this[_idle].contains(connection)))) dart.assertFailed(null, "dart:_http/http_impl.dart", 1890, 12, "!_active.contains(connection) || !_idle.contains(connection)");
    this[_active].remove(connection);
    this[_idle].remove(connection);
    this[_checkPending]();
  }
  close(force) {
    for (let t of this[_socketTasks].toList()) {
      FutureOfNull()._check(t.socket.then(core.Null, dart.fn(s => {
        dart.dsend(s, 'destroy', []);
      }, dynamicToNull()), {onError: dart.fn(e => {
        }, dynamicToNull())}));
      t.cancel();
    }
    if (dart.test(force)) {
      for (let c of this[_idle].toList()) {
        c.destroy();
      }
      for (let c of this[_active].toList()) {
        c.destroy();
      }
    } else {
      for (let c of this[_idle].toList()) {
        c.close();
      }
    }
  }
  connect(uriHost, uriPort, proxy, client) {
    if (dart.test(this.hasIdle)) {
      let connection = this.takeIdle();
      client[_connectionsChanged]();
      return FutureOf_ConnectionInfo().value(new _http._ConnectionInfo.new(connection, proxy));
    }
    if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
      let completer = CompleterOf_ConnectionInfo().new();
      this[_pending$].add(dart.fn(() => {
        completer.complete(this.connect(uriHost, uriPort, proxy, client));
      }, VoidToNull()));
      return completer.future;
    }
    let currentBadCertificateCallback = client[_badCertificateCallback];
    function callback(certificate) {
      if (currentBadCertificateCallback == null) return false;
      return currentBadCertificateCallback(certificate, uriHost, uriPort);
    }
    dart.fn(callback, X509CertificateTobool());
    let connectionTask = dart.test(this.isSecure) && dart.test(proxy.isDirect) ? io.SecureSocket.startConnect(this.host, this.port, {context: this.context, onBadCertificate: callback}) : io.Socket.startConnect(this.host, this.port);
    this[_connecting] = dart.notNull(this[_connecting]) + 1;
    return FutureOf_ConnectionInfo()._check(connectionTask.then(_http._ConnectionInfo, dart.fn(task => {
      this[_socketTasks].add(task);
      let socketFuture = task.socket;
      if (client.connectionTimeout != null) {
        socketFuture = socketFuture.timeout(client.connectionTimeout, {onTimeout: dart.fn(() => {
            this[_socketTasks].remove(task);
            task.cancel();
          }, VoidToNull())});
      }
      return FutureOf_ConnectionInfo()._check(socketFuture.then(_http._ConnectionInfo, dart.fn(socket => {
        this[_connecting] = dart.notNull(this[_connecting]) - 1;
        dart.dsend(socket, 'setOption', [io.SocketOption.tcpNoDelay, true]);
        let connection = new _http._HttpClientConnection.new(this.key, io.Socket._check(socket), client, false, this.context);
        if (dart.test(this.isSecure) && !dart.test(proxy.isDirect)) {
          connection[_dispose] = true;
          return FutureOf_ConnectionInfo()._check(connection.createProxyTunnel(uriHost, uriPort, proxy, callback).then(_http._ConnectionInfo, dart.fn(tunnel => {
            client[_getConnectionTarget](uriHost, uriPort, true).addNewActive(tunnel);
            this[_socketTasks].remove(task);
            return new _http._ConnectionInfo.new(tunnel, proxy);
          }, _HttpClientConnectionTo_ConnectionInfo())));
        } else {
          this.addNewActive(connection);
          this[_socketTasks].remove(task);
          return new _http._ConnectionInfo.new(connection, proxy);
        }
      }, dynamicToFutureOrOf_ConnectionInfo()), {onError: dart.fn(error => {
          this[_connecting] = dart.notNull(this[_connecting]) - 1;
          this[_socketTasks].remove(task);
          this[_checkPending]();
          dart.throw(error);
        }, dynamicToNull())}));
    }, ConnectionTaskToFutureOf_ConnectionInfo())));
  }
};
(_http._ConnectionTarget.new = function(key, host, port, isSecure, context) {
  this[_idle] = new (_HashSetOf_HttpClientConnection()).new();
  this[_active] = new (_HashSetOf_HttpClientConnection()).new();
  this[_socketTasks] = new (_HashSetOfConnectionTask()).new();
  this[_pending$] = new collection.ListQueue.new();
  this[_connecting] = 0;
  this.key = key;
  this.host = host;
  this.port = port;
  this.isSecure = isSecure;
  this.context = context;
}).prototype = _http._ConnectionTarget.prototype;
dart.addTypeTests(_http._ConnectionTarget);
dart.setMethodSignature(_http._ConnectionTarget, () => ({
  __proto__: dart.getMethods(_http._ConnectionTarget.__proto__),
  takeIdle: dart.fnType(_http._HttpClientConnection, []),
  [_checkPending]: dart.fnType(dart.dynamic, []),
  addNewActive: dart.fnType(dart.void, [_http._HttpClientConnection]),
  returnConnection: dart.fnType(dart.void, [_http._HttpClientConnection]),
  connectionClosed: dart.fnType(dart.void, [_http._HttpClientConnection]),
  close: dart.fnType(dart.void, [core.bool]),
  connect: dart.fnType(async.Future$(_http._ConnectionInfo), [core.String, core.int, _http._Proxy, _http._HttpClient])
}));
dart.setGetterSignature(_http._ConnectionTarget, () => ({
  __proto__: dart.getGetters(_http._ConnectionTarget.__proto__),
  isEmpty: core.bool,
  hasIdle: core.bool,
  hasActive: core.bool
}));
dart.setLibraryUri(_http._ConnectionTarget, "dart:_http");
dart.setFieldSignature(_http._ConnectionTarget, () => ({
  __proto__: dart.getFields(_http._ConnectionTarget.__proto__),
  key: dart.finalFieldType(core.String),
  host: dart.finalFieldType(core.String),
  port: dart.finalFieldType(core.int),
  isSecure: dart.finalFieldType(core.bool),
  context: dart.finalFieldType(io.SecurityContext),
  [_idle]: dart.finalFieldType(SetOf_HttpClientConnection()),
  [_active]: dart.finalFieldType(SetOf_HttpClientConnection()),
  [_socketTasks]: dart.finalFieldType(SetOfConnectionTask()),
  [_pending$]: dart.finalFieldType(collection.Queue),
  [_connecting]: dart.fieldType(core.int)
}));
const _closing = dart.privateName(_http, "_closing");
const _closingForcefully = dart.privateName(_http, "_closingForcefully");
const _connectionTargets = dart.privateName(_http, "_connectionTargets");
const _credentials = dart.privateName(_http, "_credentials");
const _findProxy = dart.privateName(_http, "_findProxy");
const _idleTimeout = dart.privateName(_http, "_idleTimeout");
let const$100;
const _openUrl = dart.privateName(_http, "_openUrl");
const _closeConnections = dart.privateName(_http, "_closeConnections");
let const$101;
const _getConnection = dart.privateName(_http, "_getConnection");
_http._HttpClient = class _HttpClient extends core.Object {
  get idleTimeout() {
    return this[_idleTimeout];
  }
  set idleTimeout(timeout) {
    this[_idleTimeout] = timeout;
    for (let c of this[_connectionTargets][$values]) {
      for (let idle of c[_idle]) {
        idle.stopTimer();
        idle.startTimer();
      }
    }
  }
  set badCertificateCallback(callback) {
    this[_badCertificateCallback] = callback;
  }
  open(method, host, port, path) {
    let hashMark = 35;
    let questionMark = 63;
    let fragmentStart = path.length;
    let queryStart = path.length;
    for (let i = path.length - 1; i >= 0; i--) {
      let char = path[$codeUnitAt](i);
      if (char === hashMark) {
        fragmentStart = i;
        queryStart = i;
      } else if (char === questionMark) {
        queryStart = i;
      }
    }
    let query = null;
    if (queryStart < fragmentStart) {
      query = path[$substring](queryStart + 1, fragmentStart);
      path = path[$substring](0, queryStart);
    }
    let uri = core.Uri.new({scheme: "http", host: host, port: port, path: path, query: query});
    return this[_openUrl](method, uri);
  }
  openUrl(method, url) {
    return this[_openUrl](method, url);
  }
  get(host, port, path) {
    return this.open("get", host, port, path);
  }
  getUrl(url) {
    return this[_openUrl]("get", url);
  }
  post(host, port, path) {
    return this.open("post", host, port, path);
  }
  postUrl(url) {
    return this[_openUrl]("post", url);
  }
  put(host, port, path) {
    return this.open("put", host, port, path);
  }
  putUrl(url) {
    return this[_openUrl]("put", url);
  }
  delete(host, port, path) {
    return this.open("delete", host, port, path);
  }
  deleteUrl(url) {
    return this[_openUrl]("delete", url);
  }
  head(host, port, path) {
    return this.open("head", host, port, path);
  }
  headUrl(url) {
    return this[_openUrl]("head", url);
  }
  patch(host, port, path) {
    return this.open("patch", host, port, path);
  }
  patchUrl(url) {
    return this[_openUrl]("patch", url);
  }
  close(opts) {
    let force = opts && 'force' in opts ? opts.force : false;
    this[_closing] = true;
    this[_closingForcefully] = force;
    this[_closeConnections](this[_closingForcefully]);
    if (!!dart.test(this[_connectionTargets][$values][$any](dart.fn(s => s.hasIdle, _ConnectionTargetTobool())))) dart.assertFailed(null, "dart:_http/http_impl.dart", 2093, 12, "!_connectionTargets.values.any((s) => s.hasIdle)");
    if (!(!dart.test(force) || !dart.test(this[_connectionTargets][$values][$any](dart.fn(s => s[_active].isNotEmpty, _ConnectionTargetTobool()))))) dart.assertFailed(null, "dart:_http/http_impl.dart", 2095, 9, "!force || !_connectionTargets.values.any((s) => s._active.isNotEmpty)");
  }
  set authenticate(f) {
    this[_authenticate] = f;
  }
  addCredentials(url, realm, cr) {
    this[_credentials][$add](new _http._SiteCredentials.new(url, realm, _http._HttpClientCredentials._check(cr)));
  }
  set authenticateProxy(f) {
    this[_authenticateProxy] = f;
  }
  addProxyCredentials(host, port, realm, cr) {
    this[_proxyCredentials][$add](new _http._ProxyCredentials.new(host, port, realm, _http._HttpClientCredentials._check(cr)));
  }
  set findProxy(f) {
    return this[_findProxy] = f;
  }
  [_openUrl](method, uri) {
    if (dart.test(this[_closing])) {
      dart.throw(new core.StateError.new("Client is closed"));
    }
    uri = uri.removeFragment();
    if (method == null) {
      dart.throw(new core.ArgumentError.new(method));
    }
    if (method !== "CONNECT") {
      if (uri.host[$isEmpty]) {
        dart.throw(new core.ArgumentError.new("No host specified in URI " + dart.str(uri)));
      } else if (uri.scheme !== "http" && uri.scheme !== "https") {
        dart.throw(new core.ArgumentError.new("Unsupported scheme '" + dart.str(uri.scheme) + "' in URI " + dart.str(uri)));
      }
    }
    let isSecure = uri.scheme === "https";
    let port = uri.port;
    if (port === 0) {
      port = isSecure ? _http.HttpClient.defaultHttpsPort : _http.HttpClient.defaultHttpPort;
    }
    let proxyConf = const$101 || (const$101 = dart.const(new _http._ProxyConfiguration.direct()));
    if (this[_findProxy] != null) {
      try {
        proxyConf = new _http._ProxyConfiguration.new(core.String._check(dart.dcall(this[_findProxy], [uri])));
      } catch (e) {
        let error = dart.getThrown(e);
        let stackTrace = dart.stackTrace(e);
        return FutureOf_HttpClientRequest().error(error, stackTrace);
      }
    }
    return FutureOf_HttpClientRequest()._check(this[_getConnection](uri.host, port, proxyConf, isSecure).then(_http._HttpClientRequest, dart.fn(info => {
      function send(info) {
        return info.connection.send(uri, port, method[$toUpperCase](), info.proxy);
      }
      dart.fn(send, _ConnectionInfoTo_HttpClientRequest());
      if (dart.test(info.connection.closed)) {
        return FutureOf_HttpClientRequest()._check(this[_getConnection](uri.host, port, proxyConf, isSecure).then(_http._HttpClientRequest, send));
      }
      return send(info);
    }, _ConnectionInfoToFutureOrOf_HttpClientRequest())));
  }
  [_openUrlFromRequest](method, uri, previous) {
    let resolved = previous.uri.resolveUri(uri);
    return FutureOf_HttpClientRequest()._check(this[_openUrl](method, resolved).then(_http._HttpClientRequest, dart.fn(request => {
      request.followRedirects = previous.followRedirects;
      request.maxRedirects = previous.maxRedirects;
      for (let header of previous.headers[_headers][$keys]) {
        if (request.headers._get(header) == null) {
          request.headers.set(header, previous.headers._get(header));
        }
      }
      request.headers.chunkedTransferEncoding = false;
      request.contentLength = 0;
      return request;
    }, _HttpClientRequestTo_HttpClientRequest())));
  }
  [_returnConnection](connection) {
    this[_connectionTargets][$_get](connection.key).returnConnection(connection);
    this[_connectionsChanged]();
  }
  [_connectionClosed](connection) {
    connection.stopTimer();
    let connectionTarget = this[_connectionTargets][$_get](connection.key);
    if (connectionTarget != null) {
      connectionTarget.connectionClosed(connection);
      if (dart.test(connectionTarget.isEmpty)) {
        this[_connectionTargets][$remove](connection.key);
      }
      this[_connectionsChanged]();
    }
  }
  [_connectionsChanged]() {
    if (dart.test(this[_closing])) {
      this[_closeConnections](this[_closingForcefully]);
    }
  }
  [_closeConnections](force) {
    for (let connectionTarget of this[_connectionTargets][$values][$toList]()) {
      connectionTarget.close(force);
    }
  }
  [_getConnectionTarget](host, port, isSecure) {
    let key = core.String._check(_http._HttpClientConnection.makeKey(isSecure, host, port));
    return this[_connectionTargets][$putIfAbsent](key, dart.fn(() => new _http._ConnectionTarget.new(key, host, port, isSecure, this[_context$]), VoidTo_ConnectionTarget()));
  }
  [_getConnection](uriHost, uriPort, proxyConf, isSecure) {
    let proxies = proxyConf.proxies[$iterator];
    const connect = error => {
      if (!dart.test(proxies.moveNext())) return FutureOf_ConnectionInfo().error(error);
      let proxy = proxies.current;
      let host = dart.test(proxy.isDirect) ? uriHost : proxy.host;
      let port = dart.test(proxy.isDirect) ? uriPort : proxy.port;
      return this[_getConnectionTarget](host, port, isSecure).connect(uriHost, uriPort, proxy, this).catchError(connect);
    };
    dart.fn(connect, dynamicToFutureOf_ConnectionInfo());
    return connect(new _http.HttpException.new("No proxies given"));
  }
  [_findCredentials](url, scheme) {
    if (scheme === void 0) scheme = null;
    let cr = _http._SiteCredentials._check(this[_credentials][$fold](_http._SiteCredentials, null, dart.fn((prev, value) => {
      let siteCredentials = _http._SiteCredentials.as(value);
      if (dart.test(siteCredentials.applies(url, scheme))) {
        if (prev == null) return _http._SiteCredentials._check(value);
        return siteCredentials.uri.path.length > prev.uri.path.length ? siteCredentials : prev;
      } else {
        return prev;
      }
    }, _SiteCredentialsAnd_CredentialsTo_SiteCredentials())));
    return cr;
  }
  [_findProxyCredentials](proxy, scheme) {
    if (scheme === void 0) scheme = null;
    let it = this[_proxyCredentials][$iterator];
    while (dart.test(it.moveNext())) {
      if (dart.test(it.current.applies(proxy, scheme))) {
        return it.current;
      }
    }
    return null;
  }
  [_removeCredentials](cr) {
    let index = this[_credentials][$indexOf](cr);
    if (index !== -1) {
      this[_credentials][$removeAt](index);
    }
  }
  [_removeProxyCredentials](cr) {
    let index = this[_proxyCredentials][$indexOf](_http._ProxyCredentials._check(cr));
    if (index !== -1) {
      this[_proxyCredentials][$removeAt](index);
    }
  }
  static _findProxyFromEnvironment(url, environment) {
    function checkNoProxy(option) {
      if (option == null) return null;
      let names = IterableOfString()._check(option[$split](",")[$map](core.String, dart.fn(s => s[$trim](), StringToString())))[$iterator];
      while (dart.test(names.moveNext())) {
        let name = names.current;
        if (name[$startsWith]("[") && name[$endsWith]("]") && "[" + dart.str(url.host) + "]" === name || name[$isNotEmpty] && url.host[$endsWith](name)) {
          return "DIRECT";
        }
      }
      return null;
    }
    dart.fn(checkNoProxy, StringToString());
    function checkProxy(option) {
      if (option == null) return null;
      option = option[$trim]();
      if (option[$isEmpty]) return null;
      let pos = option[$indexOf]("://");
      if (pos >= 0) {
        option = option[$substring](pos + 3);
      }
      pos = option[$indexOf]("/");
      if (pos >= 0) {
        option = option[$substring](0, pos);
      }
      if (option[$indexOf]("[") === 0) {
        let pos = option[$lastIndexOf](":");
        if (option[$indexOf]("]") > pos) option = dart.str(option) + ":1080";
      } else {
        if (option[$indexOf](":") === -1) option = dart.str(option) + ":1080";
      }
      return "PROXY " + dart.str(option);
    }
    dart.fn(checkProxy, StringToString());
    if (environment == null) environment = _http._HttpClient._platformEnvironmentCache;
    let proxyCfg = null;
    let noProxy = environment[$_get]("no_proxy");
    if (noProxy == null) noProxy = environment[$_get]("NO_PROXY");
    if ((proxyCfg = checkNoProxy(noProxy)) != null) {
      return proxyCfg;
    }
    if (url.scheme === "http") {
      let proxy = environment[$_get]("http_proxy");
      if (proxy == null) proxy = environment[$_get]("HTTP_PROXY");
      if ((proxyCfg = checkProxy(proxy)) != null) {
        return proxyCfg;
      }
    } else if (url.scheme === "https") {
      let proxy = environment[$_get]("https_proxy");
      if (proxy == null) proxy = environment[$_get]("HTTPS_PROXY");
      if ((proxyCfg = checkProxy(proxy)) != null) {
        return proxyCfg;
      }
    }
    return "DIRECT";
  }
};
(_http._HttpClient.new = function(context) {
  this[_closing] = false;
  this[_closingForcefully] = false;
  this[_connectionTargets] = new (IdentityMapOfString$_ConnectionTarget()).new();
  this[_credentials] = JSArrayOf_Credentials().of([]);
  this[_proxyCredentials] = JSArrayOf_ProxyCredentials().of([]);
  this[_authenticate] = null;
  this[_authenticateProxy] = null;
  this[_findProxy] = dart.fn(_http.HttpClient.findProxyFromEnvironment, Uri__ToString());
  this[_idleTimeout] = const$100 || (const$100 = dart.const(new core.Duration.new({seconds: 15})));
  this[_badCertificateCallback] = null;
  this.connectionTimeout = null;
  this.maxConnectionsPerHost = null;
  this.autoUncompress = true;
  this.userAgent = _http._getHttpVersion();
  this[_context$] = context;
}).prototype = _http._HttpClient.prototype;
dart.addTypeTests(_http._HttpClient);
_http._HttpClient[dart.implements] = () => [_http.HttpClient];
dart.setMethodSignature(_http._HttpClient, () => ({
  __proto__: dart.getMethods(_http._HttpClient.__proto__),
  open: dart.fnType(async.Future$(_http.HttpClientRequest), [core.String, core.String, core.int, core.String]),
  openUrl: dart.fnType(async.Future$(_http.HttpClientRequest), [core.String, core.Uri]),
  get: dart.fnType(async.Future$(_http.HttpClientRequest), [core.String, core.int, core.String]),
  getUrl: dart.fnType(async.Future$(_http.HttpClientRequest), [core.Uri]),
  post: dart.fnType(async.Future$(_http.HttpClientRequest), [core.String, core.int, core.String]),
  postUrl: dart.fnType(async.Future$(_http.HttpClientRequest), [core.Uri]),
  put: dart.fnType(async.Future$(_http.HttpClientRequest), [core.String, core.int, core.String]),
  putUrl: dart.fnType(async.Future$(_http.HttpClientRequest), [core.Uri]),
  delete: dart.fnType(async.Future$(_http.HttpClientRequest), [core.String, core.int, core.String]),
  deleteUrl: dart.fnType(async.Future$(_http.HttpClientRequest), [core.Uri]),
  head: dart.fnType(async.Future$(_http.HttpClientRequest), [core.String, core.int, core.String]),
  headUrl: dart.fnType(async.Future$(_http.HttpClientRequest), [core.Uri]),
  patch: dart.fnType(async.Future$(_http.HttpClientRequest), [core.String, core.int, core.String]),
  patchUrl: dart.fnType(async.Future$(_http.HttpClientRequest), [core.Uri]),
  close: dart.fnType(dart.void, [], {force: core.bool}),
  addCredentials: dart.fnType(dart.void, [core.Uri, core.String, _http.HttpClientCredentials]),
  addProxyCredentials: dart.fnType(dart.void, [core.String, core.int, core.String, _http.HttpClientCredentials]),
  [_openUrl]: dart.fnType(async.Future$(_http._HttpClientRequest), [core.String, core.Uri]),
  [_openUrlFromRequest]: dart.fnType(async.Future$(_http._HttpClientRequest), [core.String, core.Uri, _http._HttpClientRequest]),
  [_returnConnection]: dart.fnType(dart.void, [_http._HttpClientConnection]),
  [_connectionClosed]: dart.fnType(dart.void, [_http._HttpClientConnection]),
  [_connectionsChanged]: dart.fnType(dart.void, []),
  [_closeConnections]: dart.fnType(dart.void, [core.bool]),
  [_getConnectionTarget]: dart.fnType(_http._ConnectionTarget, [core.String, core.int, core.bool]),
  [_getConnection]: dart.fnType(async.Future$(_http._ConnectionInfo), [core.String, core.int, _http._ProxyConfiguration, core.bool]),
  [_findCredentials]: dart.fnType(_http._SiteCredentials, [core.Uri], [_http._AuthenticationScheme]),
  [_findProxyCredentials]: dart.fnType(_http._ProxyCredentials, [_http._Proxy], [_http._AuthenticationScheme]),
  [_removeCredentials]: dart.fnType(dart.void, [_http._Credentials]),
  [_removeProxyCredentials]: dart.fnType(dart.void, [_http._Credentials])
}));
dart.setGetterSignature(_http._HttpClient, () => ({
  __proto__: dart.getGetters(_http._HttpClient.__proto__),
  idleTimeout: core.Duration
}));
dart.setSetterSignature(_http._HttpClient, () => ({
  __proto__: dart.getSetters(_http._HttpClient.__proto__),
  idleTimeout: core.Duration,
  badCertificateCallback: dart.fnType(core.bool, [io.X509Certificate, core.String, core.int]),
  authenticate: dart.fnType(async.Future$(core.bool), [core.Uri, core.String, core.String]),
  authenticateProxy: dart.fnType(async.Future$(core.bool), [core.String, core.int, core.String, core.String]),
  findProxy: dart.fnType(core.String, [core.Uri])
}));
dart.setLibraryUri(_http._HttpClient, "dart:_http");
dart.setFieldSignature(_http._HttpClient, () => ({
  __proto__: dart.getFields(_http._HttpClient.__proto__),
  [_closing]: dart.fieldType(core.bool),
  [_closingForcefully]: dart.fieldType(core.bool),
  [_connectionTargets]: dart.finalFieldType(MapOfString$_ConnectionTarget()),
  [_credentials]: dart.finalFieldType(ListOf_Credentials()),
  [_proxyCredentials]: dart.finalFieldType(ListOf_ProxyCredentials()),
  [_context$]: dart.finalFieldType(io.SecurityContext),
  [_authenticate]: dart.fieldType(core.Function),
  [_authenticateProxy]: dart.fieldType(core.Function),
  [_findProxy]: dart.fieldType(core.Function),
  [_idleTimeout]: dart.fieldType(core.Duration),
  [_badCertificateCallback]: dart.fieldType(X509CertificateAndStringAndintTobool()),
  connectionTimeout: dart.fieldType(core.Duration),
  maxConnectionsPerHost: dart.fieldType(core.int),
  autoUncompress: dart.fieldType(core.bool),
  userAgent: dart.fieldType(core.String)
}));
dart.defineLazy(_http._HttpClient, {
  /*_http._HttpClient._platformEnvironmentCache*/get _platformEnvironmentCache() {
    return io.Platform.environment;
  },
  set _platformEnvironmentCache(_) {}
});
const _state$1 = dart.privateName(_http, "_state");
const _idleMark = dart.privateName(_http, "_idleMark");
const _markActive = dart.privateName(_http, "_markActive");
const _markIdle = dart.privateName(_http, "_markIdle");
const _handleRequest = dart.privateName(_http, "_handleRequest");
const _isActive = dart.privateName(_http, "_isActive");
const _isIdle = dart.privateName(_http, "_isIdle");
const _isDetached = dart.privateName(_http, "_isDetached");
const _toJSON$ = dart.privateName(_http, "_toJSON");
const LinkedListEntry__ServiceObject$ = class LinkedListEntry__ServiceObject extends collection.LinkedListEntry {};
(LinkedListEntry__ServiceObject$.new = function() {
  _http._ServiceObject.new.call(this);
  LinkedListEntry__ServiceObject$.__proto__.new.call(this);
}).prototype = LinkedListEntry__ServiceObject$.prototype;
dart.applyMixin(LinkedListEntry__ServiceObject$, _http._ServiceObject);
_http._HttpConnection = class _HttpConnection extends LinkedListEntry__ServiceObject$ {
  markIdle() {
    this[_idleMark] = true;
  }
  get isMarkedIdle() {
    return this[_idleMark];
  }
  destroy() {
    if (this[_state$1] === 2 || this[_state$1] === 3) return;
    this[_state$1] = 2;
    dart.dsend(this[_socket$], 'destroy', []);
    this[_httpServer][_connectionClosed](this);
    _http._HttpConnection._connections[$remove](this[_serviceId$]);
  }
  detachSocket() {
    this[_state$1] = 3;
    this[_httpServer][_connectionClosed](this);
    let detachedIncoming = this[_httpParser].detachIncoming();
    return FutureOfSocket()._check(this[_streamFuture].then(io.Socket, dart.fn(_ => {
      _http._HttpConnection._connections[$remove](this[_serviceId$]);
      return new _http._DetachedSocket.new(io.Socket._check(this[_socket$]), detachedIncoming);
    }, dynamicTo_DetachedSocket())));
  }
  get connectionInfo() {
    return _http._HttpConnectionInfo.create(io.Socket._check(this[_socket$]));
  }
  get [_isActive]() {
    return this[_state$1] === 0;
  }
  get [_isIdle]() {
    return this[_state$1] === 1;
  }
  get [_isClosing]() {
    return this[_state$1] === 2;
  }
  get [_isDetached]() {
    return this[_state$1] === 3;
  }
  get [_serviceTypePath$]() {
    return "io/http/serverconnections";
  }
  get [_serviceTypeName$]() {
    return "HttpServerConnection";
  }
  [_toJSON$](ref) {
    let name = dart.str(dart.dload(dart.dload(this[_socket$], 'address'), 'host')) + ":" + dart.str(dart.dload(this[_socket$], 'port')) + " <-> " + (dart.str(dart.dload(dart.dload(this[_socket$], 'remoteAddress'), 'host')) + ":" + dart.str(dart.dload(this[_socket$], 'remotePort')));
    let r = new (IdentityMapOfString$dynamic()).from(["id", this[_servicePath$], "type", this[_serviceType$](ref), "name", name, "user_name", name]);
    if (dart.test(ref)) {
      return r;
    }
    r[$_set]("server", this[_httpServer][_toJSON$](true));
    try {
      r[$_set]("socket", dart.dsend(this[_socket$], _toJSON$, [true]));
    } catch (e) {
      let _ = dart.getThrown(e);
      r[$_set]("socket", new (IdentityMapOfString$String()).from(["id", this[_servicePath$], "type", "@Socket", "name", "UserSocket", "user_name", "UserSocket"]));
    }
    switch (this[_state$1]) {
      case 0:
      {
        r[$_set]("state", "Active");
        break;
      }
      case 1:
      {
        r[$_set]("state", "Idle");
        break;
      }
      case 2:
      {
        r[$_set]("state", "Closing");
        break;
      }
      case 3:
      {
        r[$_set]("state", "Detached");
        break;
      }
      default:
      {
        r[$_set]("state", "Unknown");
        break;
      }
    }
    return r;
  }
};
(_http._HttpConnection.new = function(socket, httpServer) {
  this[_state$1] = 1;
  this[_subscription$0] = null;
  this[_idleMark] = false;
  this[_streamFuture] = null;
  this[_socket$] = socket;
  this[_httpServer] = httpServer;
  this[_httpParser] = _http._HttpParser.requestParser();
  _http._HttpConnection.__proto__.new.call(this);
  _http._HttpConnection._connections[$_set](this[_serviceId$], this);
  this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket$]));
  this[_subscription$0] = this[_httpParser].listen(dart.fn(incoming => {
    this[_httpServer][_markActive](this);
    FutureOfNull()._check(incoming.dataDone.then(core.Null, dart.fn(closing => {
      if (dart.dtest(closing)) this.destroy();
    }, dynamicToNull())));
    this[_subscription$0].pause();
    this[_state$1] = 0;
    let outgoing = new _http._HttpOutgoing.new(io.Socket._check(this[_socket$]));
    let response = new _http._HttpResponse.new(incoming.uri, incoming.headers.protocolVersion, outgoing, this[_httpServer].defaultResponseHeaders, this[_httpServer].serverHeader);
    let request = new _http._HttpRequest.new(response, incoming, this[_httpServer], this);
    this[_streamFuture] = outgoing.done.then(dart.dynamic, dart.fn(_ => {
      response.deadline = null;
      if (this[_state$1] === 3) return;
      if (dart.test(response.persistentConnection) && dart.test(request.persistentConnection) && dart.test(incoming.fullBodyRead) && !dart.test(this[_httpParser].upgrade) && !dart.test(this[_httpServer].closed)) {
        this[_state$1] = 1;
        this[_idleMark] = false;
        this[_httpServer][_markIdle](this);
        this[_subscription$0].resume();
      } else {
        this.destroy();
      }
    }, SocketToNull()), {onError: dart.fn(_ => {
        this.destroy();
      }, dynamicToNull())});
    outgoing.ignoreBody = request.method === "HEAD";
    response[_httpRequest] = request;
    this[_httpServer][_handleRequest](request);
  }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
      this.destroy();
    }, VoidToNull()), onError: dart.fn(error => {
      this.destroy();
    }, dynamicToNull())});
}).prototype = _http._HttpConnection.prototype;
dart.addTypeTests(_http._HttpConnection);
dart.setMethodSignature(_http._HttpConnection, () => ({
  __proto__: dart.getMethods(_http._HttpConnection.__proto__),
  markIdle: dart.fnType(dart.void, []),
  destroy: dart.fnType(dart.void, []),
  detachSocket: dart.fnType(async.Future$(io.Socket), []),
  [_toJSON$]: dart.fnType(core.Map, [core.bool])
}));
dart.setGetterSignature(_http._HttpConnection, () => ({
  __proto__: dart.getGetters(_http._HttpConnection.__proto__),
  isMarkedIdle: core.bool,
  connectionInfo: _http.HttpConnectionInfo,
  [_isActive]: core.bool,
  [_isIdle]: core.bool,
  [_isClosing]: core.bool,
  [_isDetached]: core.bool,
  [_serviceTypePath$]: core.String,
  [_serviceTypeName$]: core.String
}));
dart.setLibraryUri(_http._HttpConnection, "dart:_http");
dart.setFieldSignature(_http._HttpConnection, () => ({
  __proto__: dart.getFields(_http._HttpConnection.__proto__),
  [_socket$]: dart.finalFieldType(dart.dynamic),
  [_httpServer]: dart.finalFieldType(_http._HttpServer),
  [_httpParser]: dart.finalFieldType(_http._HttpParser),
  [_state$1]: dart.fieldType(core.int),
  [_subscription$0]: dart.fieldType(async.StreamSubscription),
  [_idleMark]: dart.fieldType(core.bool),
  [_streamFuture]: dart.fieldType(async.Future)
}));
dart.defineLazy(_http._HttpConnection, {
  /*_http._HttpConnection._ACTIVE*/get _ACTIVE() {
    return 0;
  },
  /*_http._HttpConnection._IDLE*/get _IDLE() {
    return 1;
  },
  /*_http._HttpConnection._CLOSING*/get _CLOSING() {
    return 2;
  },
  /*_http._HttpConnection._DETACHED*/get _DETACHED() {
    return 3;
  },
  /*_http._HttpConnection._connections*/get _connections() {
    return new (IdentityMapOfint$_HttpConnection()).new();
  },
  set _connections(_) {}
});
const _serverSocket = dart.privateName(_http, "_serverSocket");
const _closeServer = dart.privateName(_http, "_closeServer");
const _activeConnections = dart.privateName(_http, "_activeConnections");
const _idleConnections = dart.privateName(_http, "_idleConnections");
let const$102;
let const$103;
const _maybePerformCleanup$ = dart.privateName(_http, "_maybePerformCleanup");
const Stream__ServiceObject$ = class Stream__ServiceObject extends async.Stream$(_http.HttpRequest) {};
(Stream__ServiceObject$.new = function() {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$.__proto__.new.call(this);
}).prototype = Stream__ServiceObject$.prototype;
(Stream__ServiceObject$._internal = function() {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$.__proto__._internal.call(this);
}).prototype = Stream__ServiceObject$.prototype;
(Stream__ServiceObject$.empty = function() {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$.__proto__.empty.call(this);
}).prototype = Stream__ServiceObject$.prototype;
(Stream__ServiceObject$.fromFuture = function(future) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$.__proto__.fromFuture.call(this, future);
}).prototype = Stream__ServiceObject$.prototype;
(Stream__ServiceObject$.fromFutures = function(futures) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$.__proto__.fromFutures.call(this, futures);
}).prototype = Stream__ServiceObject$.prototype;
(Stream__ServiceObject$.fromIterable = function(elements) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$.__proto__.fromIterable.call(this, elements);
}).prototype = Stream__ServiceObject$.prototype;
(Stream__ServiceObject$.periodic = function(period, computation) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$.__proto__.periodic.call(this, period, computation);
}).prototype = Stream__ServiceObject$.prototype;
(Stream__ServiceObject$.eventTransformed = function(source, mapSink) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$.__proto__.eventTransformed.call(this, source, mapSink);
}).prototype = Stream__ServiceObject$.prototype;
dart.applyMixin(Stream__ServiceObject$, _http._ServiceObject);
_http._HttpServer = class _HttpServer extends Stream__ServiceObject$ {
  static bind(address, port, backlog, v6Only, shared) {
    return FutureOfHttpServer()._check(io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(_http.HttpServer, dart.fn(socket => new _http._HttpServer.__(socket, true), ServerSocketTo_HttpServer())));
  }
  static bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared) {
    return FutureOfHttpServer()._check(io.SecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, shared: shared}).then(_http.HttpServer, dart.fn(socket => new _http._HttpServer.__(socket, true), SecureServerSocketTo_HttpServer())));
  }
  static _initDefaultResponseHeaders() {
    let defaultResponseHeaders = new _http._HttpHeaders.new("1.1");
    defaultResponseHeaders.contentType = _http.ContentType.text;
    defaultResponseHeaders.set("X-Frame-Options", "SAMEORIGIN");
    defaultResponseHeaders.set("X-Content-Type-Options", "nosniff");
    defaultResponseHeaders.set("X-XSS-Protection", "1; mode=block");
    return defaultResponseHeaders;
  }
  get idleTimeout() {
    return this[_idleTimeout];
  }
  set idleTimeout(duration) {
    if (this[_idleTimer] != null) {
      this[_idleTimer].cancel();
      this[_idleTimer] = null;
    }
    this[_idleTimeout] = duration;
    if (this[_idleTimeout] != null) {
      this[_idleTimer] = async.Timer.periodic(this[_idleTimeout], dart.fn(_ => {
        for (let idle of this[_idleConnections].toList()) {
          if (dart.test(idle.isMarkedIdle)) {
            idle.destroy();
          } else {
            idle.markIdle();
          }
        }
      }, TimerToNull()));
    }
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    dart.dsend(this[_serverSocket], 'listen', [dart.fn(socket => {
        socket.setOption(io.SocketOption.tcpNoDelay, true);
        let connection = new _http._HttpConnection.new(socket, this);
        this[_idleConnections].add(connection);
      }, SocketToNull())], {onError: dart.fn((error, stackTrace) => {
        if (!io.HandshakeException.is(error)) {
          this[_controller$1].addError(error, core.StackTrace._check(stackTrace));
        }
      }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller$1], 'close')});
    return this[_controller$1].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  close(opts) {
    let force = opts && 'force' in opts ? opts.force : false;
    this.closed = true;
    let result = null;
    if (this[_serverSocket] != null && dart.test(this[_closeServer])) {
      result = async.Future._check(dart.dsend(this[_serverSocket], 'close', []));
    } else {
      result = async.Future.value();
    }
    this.idleTimeout = null;
    if (dart.test(force)) {
      for (let c of this[_activeConnections].toList()) {
        c.destroy();
      }
      if (!dart.test(this[_activeConnections].isEmpty)) dart.assertFailed(null, "dart:_http/http_impl.dart", 2634, 14, "_activeConnections.isEmpty");
    }
    for (let c of this[_idleConnections].toList()) {
      c.destroy();
    }
    this[_maybePerformCleanup$]();
    return result;
  }
  [_maybePerformCleanup$]() {
    if (dart.test(this.closed) && dart.test(this[_idleConnections].isEmpty) && dart.test(this[_activeConnections].isEmpty) && this[_sessionManagerInstance] != null) {
      this[_sessionManagerInstance].close();
      this[_sessionManagerInstance] = null;
      _http._HttpServer._servers[$remove](this[_serviceId$]);
    }
  }
  get port() {
    if (dart.test(this.closed)) dart.throw(new _http.HttpException.new("HttpServer is not bound to a socket"));
    return core.int._check(dart.dload(this[_serverSocket], 'port'));
  }
  get address() {
    if (dart.test(this.closed)) dart.throw(new _http.HttpException.new("HttpServer is not bound to a socket"));
    return io.InternetAddress._check(dart.dload(this[_serverSocket], 'address'));
  }
  set sessionTimeout(timeout) {
    this[_sessionManager].sessionTimeout = timeout;
  }
  [_handleRequest](request) {
    if (!dart.test(this.closed)) {
      this[_controller$1].add(request);
    } else {
      request[_httpConnection].destroy();
    }
  }
  [_connectionClosed](connection) {
    connection.unlink();
    this[_maybePerformCleanup$]();
  }
  [_markIdle](connection) {
    this[_activeConnections].remove(connection);
    this[_idleConnections].add(connection);
  }
  [_markActive](connection) {
    this[_idleConnections].remove(connection);
    this[_activeConnections].add(connection);
  }
  get [_sessionManager]() {
    if (this[_sessionManagerInstance] == null) {
      this[_sessionManagerInstance] = new _http._HttpSessionManager.new();
    }
    return this[_sessionManagerInstance];
  }
  connectionsInfo() {
    let result = new _http.HttpConnectionsInfo.new();
    result.total = dart.notNull(this[_activeConnections].length) + dart.notNull(this[_idleConnections].length);
    this[_activeConnections].forEach(dart.fn(conn => {
      if (dart.test(conn[_isActive])) {
        result.active = dart.notNull(result.active) + 1;
      } else {
        if (!dart.test(conn[_isClosing])) dart.assertFailed(null, "dart:_http/http_impl.dart", 2707, 16, "conn._isClosing");
        result.closing = dart.notNull(result.closing) + 1;
      }
    }, _HttpConnectionToNull()));
    this[_idleConnections].forEach(dart.fn(conn => {
      result.idle = dart.notNull(result.idle) + 1;
      if (!dart.test(conn[_isIdle])) dart.assertFailed(null, "dart:_http/http_impl.dart", 2713, 14, "conn._isIdle");
    }, _HttpConnectionToNull()));
    return result;
  }
  get [_serviceTypePath$]() {
    return "io/http/servers";
  }
  get [_serviceTypeName$]() {
    return "HttpServer";
  }
  [_toJSON$](ref) {
    let r = new (IdentityMapOfString$dynamic()).from(["id", this[_servicePath$], "type", this[_serviceType$](ref), "name", dart.str(this.address.host) + ":" + dart.str(this.port), "user_name", dart.str(this.address.host) + ":" + dart.str(this.port)]);
    if (dart.test(ref)) {
      return r;
    }
    try {
      r[$_set]("socket", dart.dsend(this[_serverSocket], _toJSON$, [true]));
    } catch (e) {
      let _ = dart.getThrown(e);
      r[$_set]("socket", new (IdentityMapOfString$String()).from(["id", this[_servicePath$], "type", "@Socket", "name", "UserSocket", "user_name", "UserSocket"]));
    }
    r[$_set]("port", this.port);
    r[$_set]("address", this.address.host);
    r[$_set]("active", IterableOfMap()._check(this[_activeConnections].map(core.Map, dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap())))[$toList]());
    r[$_set]("idle", IterableOfMap()._check(this[_idleConnections].map(core.Map, dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap())))[$toList]());
    r[$_set]("closed", this.closed);
    return r;
  }
};
(_http._HttpServer.__ = function(serverSocket, closeServer) {
  this.serverHeader = null;
  this.defaultResponseHeaders = _http._HttpServer._initDefaultResponseHeaders();
  this.autoCompress = false;
  this[_idleTimeout] = null;
  this[_idleTimer] = null;
  this[_sessionManagerInstance] = null;
  this.closed = false;
  this[_activeConnections] = new (LinkedListOf_HttpConnection()).new();
  this[_idleConnections] = new (LinkedListOf_HttpConnection()).new();
  this[_controller$1] = null;
  this[_serverSocket] = serverSocket;
  this[_closeServer] = closeServer;
  _http._HttpServer.__proto__.new.call(this);
  this[_controller$1] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
  this.idleTimeout = const$102 || (const$102 = dart.const(new core.Duration.new({seconds: 120})));
  _http._HttpServer._servers[$_set](this[_serviceId$], this);
}).prototype = _http._HttpServer.prototype;
(_http._HttpServer.listenOn = function(serverSocket) {
  this.serverHeader = null;
  this.defaultResponseHeaders = _http._HttpServer._initDefaultResponseHeaders();
  this.autoCompress = false;
  this[_idleTimeout] = null;
  this[_idleTimer] = null;
  this[_sessionManagerInstance] = null;
  this.closed = false;
  this[_activeConnections] = new (LinkedListOf_HttpConnection()).new();
  this[_idleConnections] = new (LinkedListOf_HttpConnection()).new();
  this[_controller$1] = null;
  this[_serverSocket] = serverSocket;
  this[_closeServer] = false;
  _http._HttpServer.__proto__.new.call(this);
  this[_controller$1] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
  this.idleTimeout = const$103 || (const$103 = dart.const(new core.Duration.new({seconds: 120})));
  _http._HttpServer._servers[$_set](this[_serviceId$], this);
}).prototype = _http._HttpServer.prototype;
dart.addTypeTests(_http._HttpServer);
_http._HttpServer[dart.implements] = () => [_http.HttpServer];
dart.setMethodSignature(_http._HttpServer, () => ({
  __proto__: dart.getMethods(_http._HttpServer.__proto__),
  listen: dart.fnType(async.StreamSubscription$(_http.HttpRequest), [dart.fnType(dart.void, [_http.HttpRequest])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  close: dart.fnType(async.Future, [], {force: core.bool}),
  [_maybePerformCleanup$]: dart.fnType(dart.void, []),
  [_handleRequest]: dart.fnType(dart.void, [_http._HttpRequest]),
  [_connectionClosed]: dart.fnType(dart.void, [_http._HttpConnection]),
  [_markIdle]: dart.fnType(dart.void, [_http._HttpConnection]),
  [_markActive]: dart.fnType(dart.void, [_http._HttpConnection]),
  connectionsInfo: dart.fnType(_http.HttpConnectionsInfo, []),
  [_toJSON$]: dart.fnType(core.Map$(core.String, dart.dynamic), [core.bool])
}));
dart.setGetterSignature(_http._HttpServer, () => ({
  __proto__: dart.getGetters(_http._HttpServer.__proto__),
  idleTimeout: core.Duration,
  port: core.int,
  address: io.InternetAddress,
  [_sessionManager]: _http._HttpSessionManager,
  [_serviceTypePath$]: core.String,
  [_serviceTypeName$]: core.String
}));
dart.setSetterSignature(_http._HttpServer, () => ({
  __proto__: dart.getSetters(_http._HttpServer.__proto__),
  idleTimeout: core.Duration,
  sessionTimeout: core.int
}));
dart.setLibraryUri(_http._HttpServer, "dart:_http");
dart.setFieldSignature(_http._HttpServer, () => ({
  __proto__: dart.getFields(_http._HttpServer.__proto__),
  serverHeader: dart.fieldType(core.String),
  defaultResponseHeaders: dart.finalFieldType(_http.HttpHeaders),
  autoCompress: dart.fieldType(core.bool),
  [_idleTimeout]: dart.fieldType(core.Duration),
  [_idleTimer]: dart.fieldType(async.Timer),
  [_sessionManagerInstance]: dart.fieldType(_http._HttpSessionManager),
  closed: dart.fieldType(core.bool),
  [_serverSocket]: dart.finalFieldType(dart.dynamic),
  [_closeServer]: dart.finalFieldType(core.bool),
  [_activeConnections]: dart.finalFieldType(LinkedListOf_HttpConnection()),
  [_idleConnections]: dart.finalFieldType(LinkedListOf_HttpConnection()),
  [_controller$1]: dart.fieldType(StreamControllerOfHttpRequest())
}));
dart.defineLazy(_http._HttpServer, {
  /*_http._HttpServer._servers*/get _servers() {
    return new (IdentityMapOfint$_HttpServer()).new();
  },
  set _servers(_) {}
});
let const$104;
let const$105;
_http._ProxyConfiguration = class _ProxyConfiguration extends core.Object {};
(_http._ProxyConfiguration.new = function(configuration) {
  this.proxies = JSArrayOf_Proxy().of([]);
  if (configuration == null) {
    dart.throw(new _http.HttpException.new("Invalid proxy configuration " + dart.str(configuration)));
  }
  let list = configuration[$split](";");
  list[$forEach](dart.fn(proxy => {
    proxy = proxy[$trim]();
    if (!proxy[$isEmpty]) {
      if (proxy[$startsWith]("PROXY ")) {
        let username = null;
        let password = null;
        proxy = proxy[$substring]("PROXY ".length)[$trim]();
        let at = proxy[$indexOf]("@");
        if (at !== -1) {
          let userinfo = proxy[$substring](0, at)[$trim]();
          proxy = proxy[$substring](at + 1)[$trim]();
          let colon = userinfo[$indexOf](":");
          if (colon === -1 || colon === 0 || colon === proxy.length - 1) {
            dart.throw(new _http.HttpException.new("Invalid proxy configuration " + dart.str(configuration)));
          }
          username = userinfo[$substring](0, colon)[$trim]();
          password = userinfo[$substring](colon + 1)[$trim]();
        }
        let colon = proxy[$lastIndexOf](":");
        if (colon === -1 || colon === 0 || colon === proxy.length - 1) {
          dart.throw(new _http.HttpException.new("Invalid proxy configuration " + dart.str(configuration)));
        }
        let host = proxy[$substring](0, colon)[$trim]();
        if (host[$startsWith]("[") && host[$endsWith]("]")) {
          host = host[$substring](1, host.length - 1);
        }
        let portString = proxy[$substring](colon + 1)[$trim]();
        let port = null;
        try {
          port = core.int.parse(portString);
        } catch (e$) {
          let e = dart.getThrown(e$);
          if (core.FormatException.is(e)) {
            dart.throw(new _http.HttpException.new("Invalid proxy configuration " + dart.str(configuration) + ", " + ("invalid port '" + portString + "'")));
          } else
            throw e$;
        }
        this.proxies[$add](new _http._Proxy.new(host, port, username, password));
      } else if (proxy[$trim]() === "DIRECT") {
        this.proxies[$add](new _http._Proxy.direct());
      } else {
        dart.throw(new _http.HttpException.new("Invalid proxy configuration " + dart.str(configuration)));
      }
    }
  }, StringToNull()));
}).prototype = _http._ProxyConfiguration.prototype;
(_http._ProxyConfiguration.direct = function() {
  this.proxies = const$105 || (const$105 = dart.constList([const$104 || (const$104 = dart.const(new _http._Proxy.direct()))], _http._Proxy));
}).prototype = _http._ProxyConfiguration.prototype;
dart.addTypeTests(_http._ProxyConfiguration);
dart.setLibraryUri(_http._ProxyConfiguration, "dart:_http");
dart.setFieldSignature(_http._ProxyConfiguration, () => ({
  __proto__: dart.getFields(_http._ProxyConfiguration.__proto__),
  proxies: dart.finalFieldType(ListOf_Proxy())
}));
dart.defineLazy(_http._ProxyConfiguration, {
  /*_http._ProxyConfiguration.PROXY_PREFIX*/get PROXY_PREFIX() {
    return "PROXY ";
  },
  /*_http._ProxyConfiguration.DIRECT_PREFIX*/get DIRECT_PREFIX() {
    return "DIRECT";
  }
});
_http._Proxy = class _Proxy extends core.Object {
  get isAuthenticated() {
    return this.username != null;
  }
};
(_http._Proxy.new = function(host, port, username, password) {
  this.host = host;
  this.port = port;
  this.username = username;
  this.password = password;
  this.isDirect = false;
}).prototype = _http._Proxy.prototype;
(_http._Proxy.direct = function() {
  this.host = null;
  this.port = null;
  this.username = null;
  this.password = null;
  this.isDirect = true;
}).prototype = _http._Proxy.prototype;
dart.addTypeTests(_http._Proxy);
dart.setGetterSignature(_http._Proxy, () => ({
  __proto__: dart.getGetters(_http._Proxy.__proto__),
  isAuthenticated: core.bool
}));
dart.setLibraryUri(_http._Proxy, "dart:_http");
dart.setFieldSignature(_http._Proxy, () => ({
  __proto__: dart.getFields(_http._Proxy.__proto__),
  host: dart.finalFieldType(core.String),
  port: dart.finalFieldType(core.int),
  username: dart.finalFieldType(core.String),
  password: dart.finalFieldType(core.String),
  isDirect: dart.finalFieldType(core.bool)
}));
_http._HttpConnectionInfo = class _HttpConnectionInfo extends core.Object {
  static create(socket) {
    if (socket == null) return null;
    try {
      let info = new _http._HttpConnectionInfo.new();
      info.remoteAddress = socket.remoteAddress;
      info.remotePort = socket.remotePort;
      info.localPort = socket.port;
      return info;
    } catch (e$) {
      let e = dart.getThrown(e$);
    }
    return null;
  }
};
(_http._HttpConnectionInfo.new = function() {
  this.remoteAddress = null;
  this.remotePort = null;
  this.localPort = null;
}).prototype = _http._HttpConnectionInfo.prototype;
dart.addTypeTests(_http._HttpConnectionInfo);
_http._HttpConnectionInfo[dart.implements] = () => [_http.HttpConnectionInfo];
dart.setLibraryUri(_http._HttpConnectionInfo, "dart:_http");
dart.setFieldSignature(_http._HttpConnectionInfo, () => ({
  __proto__: dart.getFields(_http._HttpConnectionInfo.__proto__),
  remoteAddress: dart.fieldType(io.InternetAddress),
  remotePort: dart.fieldType(core.int),
  localPort: dart.fieldType(core.int)
}));
_http._DetachedSocket = class _DetachedSocket extends async.Stream$(core.List$(core.int)) {
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get encoding() {
    return this[_socket$].encoding;
  }
  set encoding(value) {
    this[_socket$].encoding = value;
  }
  write(obj) {
    this[_socket$].write(obj);
  }
  writeln(obj) {
    if (obj === void 0) obj = "";
    this[_socket$].writeln(obj);
  }
  writeCharCode(charCode) {
    this[_socket$].writeCharCode(charCode);
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    this[_socket$].writeAll(objects, separator);
  }
  add(bytes) {
    ListOfint()._check(bytes);
    this[_socket$].add(bytes);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    return this[_socket$].addError(error, stackTrace);
  }
  addStream(stream) {
    StreamOfListOfint()._check(stream);
    return this[_socket$].addStream(stream);
  }
  destroy() {
    this[_socket$].destroy();
  }
  flush() {
    return this[_socket$].flush();
  }
  close() {
    return this[_socket$].close();
  }
  get done() {
    return this[_socket$].done;
  }
  get port() {
    return this[_socket$].port;
  }
  get address() {
    return this[_socket$].address;
  }
  get remoteAddress() {
    return this[_socket$].remoteAddress;
  }
  get remotePort() {
    return this[_socket$].remotePort;
  }
  setOption(option, enabled) {
    return this[_socket$].setOption(option, enabled);
  }
  getRawOption(option) {
    return this[_socket$].getRawOption(option);
  }
  setRawOption(option) {
    this[_socket$].setRawOption(option);
  }
  [_toJSON$](ref) {
    return core.Map._check(dart.dsend(this[_socket$], _toJSON$, [ref]));
  }
};
(_http._DetachedSocket.new = function(socket, incoming) {
  this[_socket$] = socket;
  this[_incoming] = incoming;
  _http._DetachedSocket.__proto__.new.call(this);
}).prototype = _http._DetachedSocket.prototype;
dart.addTypeTests(_http._DetachedSocket);
_http._DetachedSocket[dart.implements] = () => [io.Socket];
dart.setMethodSignature(_http._DetachedSocket, () => ({
  __proto__: dart.getMethods(_http._DetachedSocket.__proto__),
  listen: dart.fnType(async.StreamSubscription$(core.List$(core.int)), [dart.fnType(dart.void, [core.List$(core.int)])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  write: dart.fnType(dart.void, [core.Object]),
  writeln: dart.fnType(dart.void, [], [core.Object]),
  writeCharCode: dart.fnType(dart.void, [core.int]),
  writeAll: dart.fnType(dart.void, [core.Iterable], [core.String]),
  add: dart.fnType(dart.void, [core.Object]),
  addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
  addStream: dart.fnType(async.Future, [core.Object]),
  destroy: dart.fnType(dart.void, []),
  flush: dart.fnType(async.Future, []),
  close: dart.fnType(async.Future, []),
  setOption: dart.fnType(core.bool, [io.SocketOption, core.bool]),
  getRawOption: dart.fnType(typed_data.Uint8List, [io.RawSocketOption]),
  setRawOption: dart.fnType(dart.void, [io.RawSocketOption]),
  [_toJSON$]: dart.fnType(core.Map, [core.bool])
}));
dart.setGetterSignature(_http._DetachedSocket, () => ({
  __proto__: dart.getGetters(_http._DetachedSocket.__proto__),
  encoding: convert.Encoding,
  done: async.Future,
  port: core.int,
  address: io.InternetAddress,
  remoteAddress: io.InternetAddress,
  remotePort: core.int
}));
dart.setSetterSignature(_http._DetachedSocket, () => ({
  __proto__: dart.getSetters(_http._DetachedSocket.__proto__),
  encoding: convert.Encoding
}));
dart.setLibraryUri(_http._DetachedSocket, "dart:_http");
dart.setFieldSignature(_http._DetachedSocket, () => ({
  __proto__: dart.getFields(_http._DetachedSocket.__proto__),
  [_incoming]: dart.finalFieldType(StreamOfListOfint()),
  [_socket$]: dart.finalFieldType(io.Socket)
}));
const _scheme = dart.privateName(_http, "_scheme");
_http._AuthenticationScheme = class _AuthenticationScheme extends core.Object {
  static fromString(scheme) {
    if (scheme[$toLowerCase]() === "basic") return _http._AuthenticationScheme.BASIC;
    if (scheme[$toLowerCase]() === "digest") return _http._AuthenticationScheme.DIGEST;
    return _http._AuthenticationScheme.UNKNOWN;
  }
  toString() {
    if (this._equals(_http._AuthenticationScheme.BASIC)) return "Basic";
    if (this._equals(_http._AuthenticationScheme.DIGEST)) return "Digest";
    return "Unknown";
  }
};
(_http._AuthenticationScheme.new = function(scheme) {
  this[_scheme] = scheme;
}).prototype = _http._AuthenticationScheme.prototype;
dart.addTypeTests(_http._AuthenticationScheme);
dart.setLibraryUri(_http._AuthenticationScheme, "dart:_http");
dart.setFieldSignature(_http._AuthenticationScheme, () => ({
  __proto__: dart.getFields(_http._AuthenticationScheme.__proto__),
  [_scheme]: dart.finalFieldType(core.int)
}));
dart.defineExtensionMethods(_http._AuthenticationScheme, ['toString']);
dart.defineLazy(_http._AuthenticationScheme, {
  /*_http._AuthenticationScheme.UNKNOWN*/get UNKNOWN() {
    return dart.const(new _http._AuthenticationScheme.new(-1));
  },
  /*_http._AuthenticationScheme.BASIC*/get BASIC() {
    return dart.const(new _http._AuthenticationScheme.new(0));
  },
  /*_http._AuthenticationScheme.DIGEST*/get DIGEST() {
    return dart.const(new _http._AuthenticationScheme.new(1));
  }
});
_http._Credentials = class _Credentials extends core.Object {
  get scheme() {
    return this.credentials.scheme;
  }
};
(_http._Credentials.new = function(credentials, realm) {
  this.used = false;
  this.ha1 = null;
  this.nonce = null;
  this.algorithm = null;
  this.qop = null;
  this.nonceCount = null;
  this.credentials = credentials;
  this.realm = realm;
  if (dart.equals(this.credentials.scheme, _http._AuthenticationScheme.DIGEST)) {
    let creds = _http._HttpClientDigestCredentials._check(this.credentials);
    let hasher = new _http._MD5.new();
    hasher.add(convert.utf8.encode(creds.username));
    hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
    hasher.add(this.realm[$codeUnits]);
    hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
    hasher.add(convert.utf8.encode(creds.password));
    this.ha1 = _http._CryptoUtils.bytesToHex(hasher.close());
  }
}).prototype = _http._Credentials.prototype;
dart.addTypeTests(_http._Credentials);
dart.setGetterSignature(_http._Credentials, () => ({
  __proto__: dart.getGetters(_http._Credentials.__proto__),
  scheme: _http._AuthenticationScheme
}));
dart.setLibraryUri(_http._Credentials, "dart:_http");
dart.setFieldSignature(_http._Credentials, () => ({
  __proto__: dart.getFields(_http._Credentials.__proto__),
  credentials: dart.fieldType(_http._HttpClientCredentials),
  realm: dart.fieldType(core.String),
  used: dart.fieldType(core.bool),
  ha1: dart.fieldType(core.String),
  nonce: dart.fieldType(core.String),
  algorithm: dart.fieldType(core.String),
  qop: dart.fieldType(core.String),
  nonceCount: dart.fieldType(core.int)
}));
_http._SiteCredentials = class _SiteCredentials extends _http._Credentials {
  applies(uri, scheme) {
    if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
    if (uri.host != this.uri.host) return false;
    let thisPort = this.uri.port === 0 ? _http.HttpClient.defaultHttpPort : this.uri.port;
    let otherPort = uri.port === 0 ? _http.HttpClient.defaultHttpPort : uri.port;
    if (otherPort != thisPort) return false;
    return uri.path[$startsWith](this.uri.path);
  }
  authorize(request) {
    if (dart.equals(this.credentials.scheme, _http._AuthenticationScheme.DIGEST) && this.nonce == null) {
      return;
    }
    this.credentials.authorize(this, request);
    this.used = true;
  }
};
(_http._SiteCredentials.new = function(uri, realm, creds) {
  this.uri = uri;
  _http._SiteCredentials.__proto__.new.call(this, creds, core.String._check(realm));
}).prototype = _http._SiteCredentials.prototype;
dart.addTypeTests(_http._SiteCredentials);
dart.setMethodSignature(_http._SiteCredentials, () => ({
  __proto__: dart.getMethods(_http._SiteCredentials.__proto__),
  applies: dart.fnType(core.bool, [core.Uri, _http._AuthenticationScheme]),
  authorize: dart.fnType(dart.void, [_http.HttpClientRequest])
}));
dart.setLibraryUri(_http._SiteCredentials, "dart:_http");
dart.setFieldSignature(_http._SiteCredentials, () => ({
  __proto__: dart.getFields(_http._SiteCredentials.__proto__),
  uri: dart.fieldType(core.Uri)
}));
_http._ProxyCredentials = class _ProxyCredentials extends _http._Credentials {
  applies(proxy, scheme) {
    if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
    return proxy.host == this.host && proxy.port == this.port;
  }
  authorize(request) {
    if (dart.equals(this.credentials.scheme, _http._AuthenticationScheme.DIGEST) && this.nonce == null) {
      return;
    }
    this.credentials.authorizeProxy(this, request);
  }
};
(_http._ProxyCredentials.new = function(host, port, realm, creds) {
  this.host = host;
  this.port = port;
  _http._ProxyCredentials.__proto__.new.call(this, creds, core.String._check(realm));
}).prototype = _http._ProxyCredentials.prototype;
dart.addTypeTests(_http._ProxyCredentials);
dart.setMethodSignature(_http._ProxyCredentials, () => ({
  __proto__: dart.getMethods(_http._ProxyCredentials.__proto__),
  applies: dart.fnType(core.bool, [_http._Proxy, _http._AuthenticationScheme]),
  authorize: dart.fnType(dart.void, [_http.HttpClientRequest])
}));
dart.setLibraryUri(_http._ProxyCredentials, "dart:_http");
dart.setFieldSignature(_http._ProxyCredentials, () => ({
  __proto__: dart.getFields(_http._ProxyCredentials.__proto__),
  host: dart.fieldType(core.String),
  port: dart.fieldType(core.int)
}));
_http._HttpClientCredentials = class _HttpClientCredentials extends core.Object {};
(_http._HttpClientCredentials.new = function() {
}).prototype = _http._HttpClientCredentials.prototype;
dart.addTypeTests(_http._HttpClientCredentials);
_http._HttpClientCredentials[dart.implements] = () => [_http.HttpClientCredentials];
dart.setLibraryUri(_http._HttpClientCredentials, "dart:_http");
_http._HttpClientBasicCredentials = class _HttpClientBasicCredentials extends _http._HttpClientCredentials {
  get scheme() {
    return _http._AuthenticationScheme.BASIC;
  }
  authorization() {
    let auth = _http._CryptoUtils.bytesToBase64(convert.utf8.encode(dart.str(this.username) + ":" + dart.str(this.password)));
    return "Basic " + dart.str(auth);
  }
  authorize(_, request) {
    request.headers.set(_http.HttpHeaders.authorizationHeader, this.authorization());
  }
  authorizeProxy(_, request) {
    request.headers.set(_http.HttpHeaders.proxyAuthorizationHeader, this.authorization());
  }
};
(_http._HttpClientBasicCredentials.new = function(username, password) {
  this.username = username;
  this.password = password;
}).prototype = _http._HttpClientBasicCredentials.prototype;
dart.addTypeTests(_http._HttpClientBasicCredentials);
_http._HttpClientBasicCredentials[dart.implements] = () => [_http.HttpClientBasicCredentials];
dart.setMethodSignature(_http._HttpClientBasicCredentials, () => ({
  __proto__: dart.getMethods(_http._HttpClientBasicCredentials.__proto__),
  authorization: dart.fnType(core.String, []),
  authorize: dart.fnType(dart.void, [_http._Credentials, _http.HttpClientRequest]),
  authorizeProxy: dart.fnType(dart.void, [_http._ProxyCredentials, _http.HttpClientRequest])
}));
dart.setGetterSignature(_http._HttpClientBasicCredentials, () => ({
  __proto__: dart.getGetters(_http._HttpClientBasicCredentials.__proto__),
  scheme: _http._AuthenticationScheme
}));
dart.setLibraryUri(_http._HttpClientBasicCredentials, "dart:_http");
dart.setFieldSignature(_http._HttpClientBasicCredentials, () => ({
  __proto__: dart.getFields(_http._HttpClientBasicCredentials.__proto__),
  username: dart.fieldType(core.String),
  password: dart.fieldType(core.String)
}));
_http._HttpClientDigestCredentials = class _HttpClientDigestCredentials extends _http._HttpClientCredentials {
  get scheme() {
    return _http._AuthenticationScheme.DIGEST;
  }
  authorization(credentials, request) {
    let requestUri = request[_requestUri]();
    let hasher = new _http._MD5.new();
    hasher.add(request.method[$codeUnits]);
    hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
    hasher.add(requestUri[$codeUnits]);
    let ha2 = _http._CryptoUtils.bytesToHex(hasher.close());
    let qop = null;
    let cnonce = null;
    let nc = null;
    let x = null;
    hasher = new _http._MD5.new();
    hasher.add(credentials.ha1[$codeUnits]);
    hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
    if (credentials.qop === "auth") {
      qop = credentials.qop;
      cnonce = _http._CryptoUtils.bytesToHex(_http._CryptoUtils.getRandomBytes(4));
      credentials.nonceCount = dart.notNull(credentials.nonceCount) + 1;
      nc = credentials.nonceCount[$toRadixString](16);
      nc = "00000000"[$substring](0, 8 - nc.length + 1) + dart.notNull(nc);
      hasher.add(credentials.nonce[$codeUnits]);
      hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
      hasher.add(nc[$codeUnits]);
      hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
      hasher.add(cnonce[$codeUnits]);
      hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
      hasher.add(credentials.qop[$codeUnits]);
      hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
      hasher.add(ha2[$codeUnits]);
    } else {
      hasher.add(credentials.nonce[$codeUnits]);
      hasher.add(JSArrayOfint().of([_http._CharCode.COLON]));
      hasher.add(ha2[$codeUnits]);
    }
    let response = _http._CryptoUtils.bytesToHex(hasher.close());
    let buffer = new core.StringBuffer.new();
    buffer.write("Digest ");
    buffer.write("username=\"" + dart.str(this.username) + "\"");
    buffer.write(", realm=\"" + dart.str(credentials.realm) + "\"");
    buffer.write(", nonce=\"" + dart.str(credentials.nonce) + "\"");
    buffer.write(", uri=\"" + dart.str(requestUri) + "\"");
    buffer.write(", algorithm=\"" + dart.str(credentials.algorithm) + "\"");
    if (qop === "auth") {
      buffer.write(", qop=\"" + dart.str(qop) + "\"");
      buffer.write(", cnonce=\"" + dart.str(cnonce) + "\"");
      buffer.write(", nc=\"" + dart.str(nc) + "\"");
    }
    buffer.write(", response=\"" + dart.str(response) + "\"");
    return buffer.toString();
  }
  authorize(credentials, request) {
    request.headers.set(_http.HttpHeaders.authorizationHeader, this.authorization(credentials, _http._HttpClientRequest._check(request)));
  }
  authorizeProxy(credentials, request) {
    request.headers.set(_http.HttpHeaders.proxyAuthorizationHeader, this.authorization(credentials, _http._HttpClientRequest._check(request)));
  }
};
(_http._HttpClientDigestCredentials.new = function(username, password) {
  this.username = username;
  this.password = password;
}).prototype = _http._HttpClientDigestCredentials.prototype;
dart.addTypeTests(_http._HttpClientDigestCredentials);
_http._HttpClientDigestCredentials[dart.implements] = () => [_http.HttpClientDigestCredentials];
dart.setMethodSignature(_http._HttpClientDigestCredentials, () => ({
  __proto__: dart.getMethods(_http._HttpClientDigestCredentials.__proto__),
  authorization: dart.fnType(core.String, [_http._Credentials, _http._HttpClientRequest]),
  authorize: dart.fnType(dart.void, [_http._Credentials, _http.HttpClientRequest]),
  authorizeProxy: dart.fnType(dart.void, [_http._ProxyCredentials, _http.HttpClientRequest])
}));
dart.setGetterSignature(_http._HttpClientDigestCredentials, () => ({
  __proto__: dart.getGetters(_http._HttpClientDigestCredentials.__proto__),
  scheme: _http._AuthenticationScheme
}));
dart.setLibraryUri(_http._HttpClientDigestCredentials, "dart:_http");
dart.setFieldSignature(_http._HttpClientDigestCredentials, () => ({
  __proto__: dart.getFields(_http._HttpClientDigestCredentials.__proto__),
  username: dart.fieldType(core.String),
  password: dart.fieldType(core.String)
}));
_http._RedirectInfo = class _RedirectInfo extends core.Object {};
(_http._RedirectInfo.new = function(statusCode, method, location) {
  this.statusCode = statusCode;
  this.method = method;
  this.location = location;
}).prototype = _http._RedirectInfo.prototype;
dart.addTypeTests(_http._RedirectInfo);
_http._RedirectInfo[dart.implements] = () => [_http.RedirectInfo];
dart.setLibraryUri(_http._RedirectInfo, "dart:_http");
dart.setFieldSignature(_http._RedirectInfo, () => ({
  __proto__: dart.getFields(_http._RedirectInfo.__proto__),
  statusCode: dart.finalFieldType(core.int),
  method: dart.finalFieldType(core.String),
  location: dart.finalFieldType(core.Uri)
}));
_http._getHttpVersion = function() {
  let version = io.Platform.version;
  let index = version[$indexOf](".", version[$indexOf](".") + 1);
  version = version[$substring](0, index);
  return "Dart/" + dart.str(version) + " (dart:io)";
};
_http._Const = class _Const extends core.Object {};
(_http._Const.new = function() {
}).prototype = _http._Const.prototype;
dart.addTypeTests(_http._Const);
dart.setLibraryUri(_http._Const, "dart:_http");
dart.defineLazy(_http._Const, {
  /*_http._Const.HTTP*/get HTTP() {
    return dart.constList([72, 84, 84, 80], core.int);
  },
  /*_http._Const.HTTP1DOT*/get HTTP1DOT() {
    return dart.constList([72, 84, 84, 80, 47, 49, 46], core.int);
  },
  /*_http._Const.HTTP10*/get HTTP10() {
    return dart.constList([72, 84, 84, 80, 47, 49, 46, 48], core.int);
  },
  /*_http._Const.HTTP11*/get HTTP11() {
    return dart.constList([72, 84, 84, 80, 47, 49, 46, 49], core.int);
  },
  /*_http._Const.T*/get T() {
    return true;
  },
  /*_http._Const.F*/get F() {
    return false;
  },
  /*_http._Const.SEPARATOR_MAP*/get SEPARATOR_MAP() {
    return dart.constList([false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, true, true, false, false, true, false, false, true, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false], core.bool);
  }
});
_http._CharCode = class _CharCode extends core.Object {};
(_http._CharCode.new = function() {
}).prototype = _http._CharCode.prototype;
dart.addTypeTests(_http._CharCode);
dart.setLibraryUri(_http._CharCode, "dart:_http");
dart.defineLazy(_http._CharCode, {
  /*_http._CharCode.HT*/get HT() {
    return 9;
  },
  /*_http._CharCode.LF*/get LF() {
    return 10;
  },
  /*_http._CharCode.CR*/get CR() {
    return 13;
  },
  /*_http._CharCode.SP*/get SP() {
    return 32;
  },
  /*_http._CharCode.AMPERSAND*/get AMPERSAND() {
    return 38;
  },
  /*_http._CharCode.COMMA*/get COMMA() {
    return 44;
  },
  /*_http._CharCode.DASH*/get DASH() {
    return 45;
  },
  /*_http._CharCode.SLASH*/get SLASH() {
    return 47;
  },
  /*_http._CharCode.ZERO*/get ZERO() {
    return 48;
  },
  /*_http._CharCode.ONE*/get ONE() {
    return 49;
  },
  /*_http._CharCode.COLON*/get COLON() {
    return 58;
  },
  /*_http._CharCode.SEMI_COLON*/get SEMI_COLON() {
    return 59;
  },
  /*_http._CharCode.EQUAL*/get EQUAL() {
    return 61;
  }
});
_http._State = class _State extends core.Object {};
(_http._State.new = function() {
}).prototype = _http._State.prototype;
dart.addTypeTests(_http._State);
dart.setLibraryUri(_http._State, "dart:_http");
dart.defineLazy(_http._State, {
  /*_http._State.START*/get START() {
    return 0;
  },
  /*_http._State.METHOD_OR_RESPONSE_HTTP_VERSION*/get METHOD_OR_RESPONSE_HTTP_VERSION() {
    return 1;
  },
  /*_http._State.RESPONSE_HTTP_VERSION*/get RESPONSE_HTTP_VERSION() {
    return 2;
  },
  /*_http._State.REQUEST_LINE_METHOD*/get REQUEST_LINE_METHOD() {
    return 3;
  },
  /*_http._State.REQUEST_LINE_URI*/get REQUEST_LINE_URI() {
    return 4;
  },
  /*_http._State.REQUEST_LINE_HTTP_VERSION*/get REQUEST_LINE_HTTP_VERSION() {
    return 5;
  },
  /*_http._State.REQUEST_LINE_ENDING*/get REQUEST_LINE_ENDING() {
    return 6;
  },
  /*_http._State.RESPONSE_LINE_STATUS_CODE*/get RESPONSE_LINE_STATUS_CODE() {
    return 7;
  },
  /*_http._State.RESPONSE_LINE_REASON_PHRASE*/get RESPONSE_LINE_REASON_PHRASE() {
    return 8;
  },
  /*_http._State.RESPONSE_LINE_ENDING*/get RESPONSE_LINE_ENDING() {
    return 9;
  },
  /*_http._State.HEADER_START*/get HEADER_START() {
    return 10;
  },
  /*_http._State.HEADER_FIELD*/get HEADER_FIELD() {
    return 11;
  },
  /*_http._State.HEADER_VALUE_START*/get HEADER_VALUE_START() {
    return 12;
  },
  /*_http._State.HEADER_VALUE*/get HEADER_VALUE() {
    return 13;
  },
  /*_http._State.HEADER_VALUE_FOLDING_OR_ENDING*/get HEADER_VALUE_FOLDING_OR_ENDING() {
    return 14;
  },
  /*_http._State.HEADER_VALUE_FOLD_OR_END*/get HEADER_VALUE_FOLD_OR_END() {
    return 15;
  },
  /*_http._State.HEADER_ENDING*/get HEADER_ENDING() {
    return 16;
  },
  /*_http._State.CHUNK_SIZE_STARTING_CR*/get CHUNK_SIZE_STARTING_CR() {
    return 17;
  },
  /*_http._State.CHUNK_SIZE_STARTING_LF*/get CHUNK_SIZE_STARTING_LF() {
    return 18;
  },
  /*_http._State.CHUNK_SIZE*/get CHUNK_SIZE() {
    return 19;
  },
  /*_http._State.CHUNK_SIZE_EXTENSION*/get CHUNK_SIZE_EXTENSION() {
    return 20;
  },
  /*_http._State.CHUNK_SIZE_ENDING*/get CHUNK_SIZE_ENDING() {
    return 21;
  },
  /*_http._State.CHUNKED_BODY_DONE_CR*/get CHUNKED_BODY_DONE_CR() {
    return 22;
  },
  /*_http._State.CHUNKED_BODY_DONE_LF*/get CHUNKED_BODY_DONE_LF() {
    return 23;
  },
  /*_http._State.BODY*/get BODY() {
    return 24;
  },
  /*_http._State.CLOSED*/get CLOSED() {
    return 25;
  },
  /*_http._State.UPGRADED*/get UPGRADED() {
    return 26;
  },
  /*_http._State.FAILURE*/get FAILURE() {
    return 27;
  },
  /*_http._State.FIRST_BODY_STATE*/get FIRST_BODY_STATE() {
    return 17;
  }
});
_http._HttpVersion = class _HttpVersion extends core.Object {};
(_http._HttpVersion.new = function() {
}).prototype = _http._HttpVersion.prototype;
dart.addTypeTests(_http._HttpVersion);
dart.setLibraryUri(_http._HttpVersion, "dart:_http");
dart.defineLazy(_http._HttpVersion, {
  /*_http._HttpVersion.UNDETERMINED*/get UNDETERMINED() {
    return 0;
  },
  /*_http._HttpVersion.HTTP10*/get HTTP10() {
    return 1;
  },
  /*_http._HttpVersion.HTTP11*/get HTTP11() {
    return 2;
  }
});
_http._MessageType = class _MessageType extends core.Object {};
(_http._MessageType.new = function() {
}).prototype = _http._MessageType.prototype;
dart.addTypeTests(_http._MessageType);
dart.setLibraryUri(_http._MessageType, "dart:_http");
dart.defineLazy(_http._MessageType, {
  /*_http._MessageType.UNDETERMINED*/get UNDETERMINED() {
    return 0;
  },
  /*_http._MessageType.REQUEST*/get REQUEST() {
    return 1;
  },
  /*_http._MessageType.RESPONSE*/get RESPONSE() {
    return 0;
  }
});
const _injectData = dart.privateName(_http, "_injectData");
const _userOnData = dart.privateName(_http, "_userOnData");
const _isCanceled$ = dart.privateName(_http, "_isCanceled");
const _pauseCount$0 = dart.privateName(_http, "_pauseCount");
const _scheduled = dart.privateName(_http, "_scheduled");
const _maybeScheduleData = dart.privateName(_http, "_maybeScheduleData");
_http._HttpDetachedStreamSubscription = class _HttpDetachedStreamSubscription extends core.Object {
  get isPaused() {
    return this[_subscription$0].isPaused;
  }
  asFuture(T, futureValue) {
    if (futureValue === void 0) futureValue = null;
    return async.Future$(T)._check(this[_subscription$0].asFuture(T, futureValue));
  }
  cancel() {
    this[_isCanceled$] = true;
    this[_injectData] = null;
    return this[_subscription$0].cancel();
  }
  onData(handleData) {
    this[_userOnData] = handleData;
    this[_subscription$0].onData(handleData);
  }
  onDone(handleDone) {
    this[_subscription$0].onDone(handleDone);
  }
  onError(handleError) {
    this[_subscription$0].onError(handleError);
  }
  pause(resumeSignal) {
    if (resumeSignal === void 0) resumeSignal = null;
    if (this[_injectData] == null) {
      this[_subscription$0].pause(resumeSignal);
    } else {
      this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) + 1;
      if (resumeSignal != null) {
        resumeSignal.whenComplete(dart.bind(this, 'resume'));
      }
    }
  }
  resume() {
    if (this[_injectData] == null) {
      this[_subscription$0].resume();
    } else {
      this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) - 1;
      this[_maybeScheduleData]();
    }
  }
  [_maybeScheduleData]() {
    if (dart.test(this[_scheduled])) return;
    if (this[_pauseCount$0] !== 0) return;
    this[_scheduled] = true;
    async.scheduleMicrotask(dart.fn(() => {
      this[_scheduled] = false;
      if (dart.notNull(this[_pauseCount$0]) > 0 || dart.test(this[_isCanceled$])) return;
      let data = this[_injectData];
      this[_injectData] = null;
      this[_subscription$0].resume();
      if (this[_userOnData] != null) {
        dart.dcall(this[_userOnData], [data]);
      }
    }, VoidToNull()));
  }
};
(_http._HttpDetachedStreamSubscription.new = function(subscription, injectData, userOnData) {
  this[_isCanceled$] = false;
  this[_pauseCount$0] = 1;
  this[_scheduled] = false;
  this[_subscription$0] = subscription;
  this[_injectData] = injectData;
  this[_userOnData] = userOnData;
}).prototype = _http._HttpDetachedStreamSubscription.prototype;
_http._HttpDetachedStreamSubscription.prototype[dart.isStreamSubscription] = true;
dart.addTypeTests(_http._HttpDetachedStreamSubscription);
_http._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
dart.setMethodSignature(_http._HttpDetachedStreamSubscription, () => ({
  __proto__: dart.getMethods(_http._HttpDetachedStreamSubscription.__proto__),
  asFuture: dart.gFnType(T => [async.Future$(T), [], [T]]),
  cancel: dart.fnType(async.Future, []),
  onData: dart.fnType(dart.void, [dart.fnType(dart.void, [core.List$(core.int)])]),
  onDone: dart.fnType(dart.void, [dart.fnType(dart.void, [])]),
  onError: dart.fnType(dart.void, [core.Function]),
  pause: dart.fnType(dart.void, [], [async.Future]),
  resume: dart.fnType(dart.void, []),
  [_maybeScheduleData]: dart.fnType(dart.void, [])
}));
dart.setGetterSignature(_http._HttpDetachedStreamSubscription, () => ({
  __proto__: dart.getGetters(_http._HttpDetachedStreamSubscription.__proto__),
  isPaused: core.bool
}));
dart.setLibraryUri(_http._HttpDetachedStreamSubscription, "dart:_http");
dart.setFieldSignature(_http._HttpDetachedStreamSubscription, () => ({
  __proto__: dart.getFields(_http._HttpDetachedStreamSubscription.__proto__),
  [_subscription$0]: dart.fieldType(StreamSubscriptionOfListOfint()),
  [_injectData]: dart.fieldType(ListOfint()),
  [_isCanceled$]: dart.fieldType(core.bool),
  [_pauseCount$0]: dart.fieldType(core.int),
  [_userOnData]: dart.fieldType(core.Function),
  [_scheduled]: dart.fieldType(core.bool)
}));
_http._HttpDetachedIncoming = class _HttpDetachedIncoming extends async.Stream$(core.List$(core.int)) {
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    if (this.subscription != null) {
      this.subscription.onData(onData);
      this.subscription.onError(onError);
      this.subscription.onDone(onDone);
      if (this.bufferedData == null) {
        this.subscription.resume();
        return this.subscription;
      }
      let _ = new _http._HttpDetachedStreamSubscription.new(this.subscription, this.bufferedData, onData);
      _.resume();
      return _;
    } else {
      return StreamOfListOfint().fromIterable(JSArrayOfListOfint().of([this.bufferedData])).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
  }
};
(_http._HttpDetachedIncoming.new = function(subscription, bufferedData) {
  this.subscription = subscription;
  this.bufferedData = bufferedData;
  _http._HttpDetachedIncoming.__proto__.new.call(this);
}).prototype = _http._HttpDetachedIncoming.prototype;
dart.addTypeTests(_http._HttpDetachedIncoming);
dart.setMethodSignature(_http._HttpDetachedIncoming, () => ({
  __proto__: dart.getMethods(_http._HttpDetachedIncoming.__proto__),
  listen: dart.fnType(async.StreamSubscription$(core.List$(core.int)), [dart.fnType(dart.void, [core.List$(core.int)])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool})
}));
dart.setLibraryUri(_http._HttpDetachedIncoming, "dart:_http");
dart.setFieldSignature(_http._HttpDetachedIncoming, () => ({
  __proto__: dart.getFields(_http._HttpDetachedIncoming.__proto__),
  subscription: dart.finalFieldType(StreamSubscriptionOfListOfint()),
  bufferedData: dart.finalFieldType(ListOfint())
}));
const _requestParser = dart.privateName(_http, "_requestParser");
const _parserCalled = dart.privateName(_http, "_parserCalled");
const _index$1 = dart.privateName(_http, "_index");
const _httpVersionIndex = dart.privateName(_http, "_httpVersionIndex");
const _messageType = dart.privateName(_http, "_messageType");
const _statusCodeLength = dart.privateName(_http, "_statusCodeLength");
const _method$ = dart.privateName(_http, "_method");
const _uri_or_reason_phrase = dart.privateName(_http, "_uri_or_reason_phrase");
const _headerField = dart.privateName(_http, "_headerField");
const _headerValue = dart.privateName(_http, "_headerValue");
const _httpVersion = dart.privateName(_http, "_httpVersion");
const _connectionUpgrade = dart.privateName(_http, "_connectionUpgrade");
const _chunked = dart.privateName(_http, "_chunked");
const _noMessageBody = dart.privateName(_http, "_noMessageBody");
const _remainingContent = dart.privateName(_http, "_remainingContent");
const _socketSubscription$ = dart.privateName(_http, "_socketSubscription");
const _paused = dart.privateName(_http, "_paused");
const _bodyPaused = dart.privateName(_http, "_bodyPaused");
const _bodyController = dart.privateName(_http, "_bodyController");
const _pauseStateChanged = dart.privateName(_http, "_pauseStateChanged");
const _reset = dart.privateName(_http, "_reset");
const _onData$2 = dart.privateName(_http, "_onData");
const _onDone$ = dart.privateName(_http, "_onDone");
const _doParse = dart.privateName(_http, "_doParse");
const _reportError$ = dart.privateName(_http, "_reportError");
const _createIncoming = dart.privateName(_http, "_createIncoming");
const _closeIncoming = dart.privateName(_http, "_closeIncoming");
const _headersEnd = dart.privateName(_http, "_headersEnd");
const _expect = dart.privateName(_http, "_expect");
const _caseInsensitiveCompare = dart.privateName(_http, "_caseInsensitiveCompare");
const _expectHexDigit = dart.privateName(_http, "_expectHexDigit");
const _releaseBuffer = dart.privateName(_http, "_releaseBuffer");
_http._HttpParser = class _HttpParser extends async.Stream$(_http._HttpIncoming) {
  static requestParser() {
    return new _http._HttpParser.__(true);
  }
  static responseParser() {
    return new _http._HttpParser.__(false);
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_controller$1].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  listenToStream(stream) {
    this[_socketSubscription$] = stream.listen(dart.bind(this, _onData$2), {onError: dart.bind(this[_controller$1], 'addError'), onDone: dart.bind(this, _onDone$)});
  }
  [_parse]() {
    try {
      this[_doParse]();
    } catch (e$) {
      let e = dart.getThrown(e$);
      let s = dart.stackTrace(e$);
      this[_state$1] = _http._State.FAILURE;
      this[_reportError$](e, s);
    }
  }
  [_headersEnd]() {
    this[_headers][_mutable] = false;
    this[_transferLength] = this[_headers].contentLength;
    if (dart.test(this[_chunked])) this[_transferLength] = -1;
    if (this[_messageType] === _http._MessageType.REQUEST && dart.notNull(this[_transferLength]) < 0 && this[_chunked] === false) {
      this[_transferLength] = 0;
    }
    if (dart.test(this[_connectionUpgrade])) {
      this[_state$1] = _http._State.UPGRADED;
      this[_transferLength] = 0;
    }
    this[_createIncoming](this[_transferLength]);
    if (dart.test(this[_requestParser])) {
      this[_incoming].method = core.String.fromCharCodes(this[_method$]);
      this[_incoming].uri = core.Uri.parse(core.String.fromCharCodes(this[_uri_or_reason_phrase]));
    } else {
      this[_incoming].statusCode = this[_statusCode];
      this[_incoming].reasonPhrase = core.String.fromCharCodes(this[_uri_or_reason_phrase]);
    }
    this[_method$][$clear]();
    this[_uri_or_reason_phrase][$clear]();
    if (dart.test(this[_connectionUpgrade])) {
      this[_incoming].upgraded = true;
      this[_parserCalled] = false;
      let tmp = this[_incoming];
      this[_closeIncoming]();
      this[_controller$1].add(tmp);
      return true;
    }
    if (this[_transferLength] === 0 || this[_messageType] === _http._MessageType.RESPONSE && dart.test(this[_noMessageBody])) {
      this[_reset]();
      let tmp = this[_incoming];
      this[_closeIncoming]();
      this[_controller$1].add(tmp);
      return false;
    } else if (dart.test(this[_chunked])) {
      this[_state$1] = _http._State.CHUNK_SIZE;
      this[_remainingContent] = 0;
    } else if (dart.notNull(this[_transferLength]) > 0) {
      this[_remainingContent] = this[_transferLength];
      this[_state$1] = _http._State.BODY;
    } else {
      this[_state$1] = _http._State.BODY;
    }
    this[_parserCalled] = false;
    this[_controller$1].add(this[_incoming]);
    return true;
  }
  [_doParse]() {
    if (!!dart.test(this[_parserCalled])) dart.assertFailed(null, "dart:_http/http_parser.dart", 400, 12, "!_parserCalled");
    this[_parserCalled] = true;
    if (this[_state$1] === _http._State.CLOSED) {
      dart.throw(new _http.HttpException.new("Data on closed connection"));
    }
    if (this[_state$1] === _http._State.FAILURE) {
      dart.throw(new _http.HttpException.new("Data on failed connection"));
    }
    while (this[_buffer$1] != null && dart.notNull(this[_index$1]) < dart.notNull(this[_buffer$1][$length]) && this[_state$1] !== _http._State.FAILURE && this[_state$1] !== _http._State.UPGRADED) {
      if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
        this[_parserCalled] = false;
        return;
      }
      let byte = this[_buffer$1][$_get]((() => {
        let x = this[_index$1];
        this[_index$1] = dart.notNull(x) + 1;
        return x;
      })());
      switch (this[_state$1]) {
        case _http._State.START:
        {
          if (byte == _http._Const.HTTP[$_get](0)) {
            this[_httpVersionIndex] = 1;
            this[_state$1] = _http._State.METHOD_OR_RESPONSE_HTTP_VERSION;
          } else {
            if (!dart.test(_http._HttpParser._isTokenChar(byte))) {
              dart.throw(new _http.HttpException.new("Invalid request method"));
            }
            this[_method$][$add](byte);
            if (!dart.test(this[_requestParser])) {
              dart.throw(new _http.HttpException.new("Invalid response line"));
            }
            this[_state$1] = _http._State.REQUEST_LINE_METHOD;
          }
          break;
        }
        case _http._State.METHOD_OR_RESPONSE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(_http._Const.HTTP[$length]) && byte == _http._Const.HTTP[$_get](this[_httpVersionIndex])) {
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == _http._Const.HTTP[$length] && byte === _http._CharCode.SLASH) {
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            if (dart.test(this[_requestParser])) {
              dart.throw(new _http.HttpException.new("Invalid request line"));
            }
            this[_state$1] = _http._State.RESPONSE_HTTP_VERSION;
          } else {
            for (let i = 0; i < dart.notNull(this[_httpVersionIndex]); i++) {
              this[_method$][$add](_http._Const.HTTP[$_get](i));
            }
            if (byte === _http._CharCode.SP) {
              this[_state$1] = _http._State.REQUEST_LINE_URI;
            } else {
              this[_method$][$add](byte);
              this[_httpVersion] = _http._HttpVersion.UNDETERMINED;
              if (!dart.test(this[_requestParser])) {
                dart.throw(new _http.HttpException.new("Invalid response line"));
              }
              this[_state$1] = _http._State.REQUEST_LINE_METHOD;
            }
          }
          break;
        }
        case _http._State.RESPONSE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(_http._Const.HTTP1DOT[$length])) {
            this[_expect](byte, _http._Const.HTTP1DOT[$_get](this[_httpVersionIndex]));
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == _http._Const.HTTP1DOT[$length] && byte === _http._CharCode.ONE) {
            this[_httpVersion] = _http._HttpVersion.HTTP11;
            this[_persistentConnection] = true;
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == _http._Const.HTTP1DOT[$length] && byte === _http._CharCode.ZERO) {
            this[_httpVersion] = _http._HttpVersion.HTTP10;
            this[_persistentConnection] = false;
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] === dart.notNull(_http._Const.HTTP1DOT[$length]) + 1) {
            this[_expect](byte, _http._CharCode.SP);
            this[_state$1] = _http._State.RESPONSE_LINE_STATUS_CODE;
          } else {
            dart.throw(new _http.HttpException.new("Invalid response line"));
          }
          break;
        }
        case _http._State.REQUEST_LINE_METHOD:
        {
          if (byte === _http._CharCode.SP) {
            this[_state$1] = _http._State.REQUEST_LINE_URI;
          } else {
            if (dart.test(_http._Const.SEPARATOR_MAP[$_get](byte)) || byte === _http._CharCode.CR || byte === _http._CharCode.LF) {
              dart.throw(new _http.HttpException.new("Invalid request method"));
            }
            this[_method$][$add](byte);
          }
          break;
        }
        case _http._State.REQUEST_LINE_URI:
        {
          if (byte === _http._CharCode.SP) {
            if (this[_uri_or_reason_phrase][$length] === 0) {
              dart.throw(new _http.HttpException.new("Invalid request URI"));
            }
            this[_state$1] = _http._State.REQUEST_LINE_HTTP_VERSION;
            this[_httpVersionIndex] = 0;
          } else {
            if (byte === _http._CharCode.CR || byte === _http._CharCode.LF) {
              dart.throw(new _http.HttpException.new("Invalid request URI"));
            }
            this[_uri_or_reason_phrase][$add](byte);
          }
          break;
        }
        case _http._State.REQUEST_LINE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(_http._Const.HTTP1DOT[$length])) {
            this[_expect](byte, _http._Const.HTTP11[$_get](this[_httpVersionIndex]));
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == _http._Const.HTTP1DOT[$length]) {
            if (byte === _http._CharCode.ONE) {
              this[_httpVersion] = _http._HttpVersion.HTTP11;
              this[_persistentConnection] = true;
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else if (byte === _http._CharCode.ZERO) {
              this[_httpVersion] = _http._HttpVersion.HTTP10;
              this[_persistentConnection] = false;
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else {
              dart.throw(new _http.HttpException.new("Invalid response line"));
            }
          } else {
            if (byte === _http._CharCode.CR) {
              this[_state$1] = _http._State.REQUEST_LINE_ENDING;
            } else {
              this[_expect](byte, _http._CharCode.LF);
              this[_messageType] = _http._MessageType.REQUEST;
              this[_state$1] = _http._State.HEADER_START;
            }
          }
          break;
        }
        case _http._State.REQUEST_LINE_ENDING:
        {
          this[_expect](byte, _http._CharCode.LF);
          this[_messageType] = _http._MessageType.REQUEST;
          this[_state$1] = _http._State.HEADER_START;
          break;
        }
        case _http._State.RESPONSE_LINE_STATUS_CODE:
        {
          if (byte === _http._CharCode.SP) {
            this[_state$1] = _http._State.RESPONSE_LINE_REASON_PHRASE;
          } else if (byte === _http._CharCode.CR) {
            this[_state$1] = _http._State.RESPONSE_LINE_ENDING;
          } else {
            this[_statusCodeLength] = dart.notNull(this[_statusCodeLength]) + 1;
            if (dart.notNull(byte) < 48 && 57 < dart.notNull(byte) || dart.notNull(this[_statusCodeLength]) > 3) {
              dart.throw(new _http.HttpException.new("Invalid response status code"));
            } else {
              this[_statusCode] = dart.notNull(this[_statusCode]) * 10 + dart.notNull(byte) - 48;
            }
          }
          break;
        }
        case _http._State.RESPONSE_LINE_REASON_PHRASE:
        {
          if (byte === _http._CharCode.CR) {
            this[_state$1] = _http._State.RESPONSE_LINE_ENDING;
          } else {
            if (byte === _http._CharCode.CR || byte === _http._CharCode.LF) {
              dart.throw(new _http.HttpException.new("Invalid response reason phrase"));
            }
            this[_uri_or_reason_phrase][$add](byte);
          }
          break;
        }
        case _http._State.RESPONSE_LINE_ENDING:
        {
          this[_expect](byte, _http._CharCode.LF);
          this[_messageType] === _http._MessageType.RESPONSE;
          if (dart.notNull(this[_statusCode]) < 100 || dart.notNull(this[_statusCode]) > 599) {
            dart.throw(new _http.HttpException.new("Invalid response status code"));
          } else {
            if (dart.notNull(this[_statusCode]) <= 199 || this[_statusCode] === 204 || this[_statusCode] === 304) {
              this[_noMessageBody] = true;
            }
          }
          this[_state$1] = _http._State.HEADER_START;
          break;
        }
        case _http._State.HEADER_START:
        {
          this[_headers] = new _http._HttpHeaders.new(this.version);
          if (byte === _http._CharCode.CR) {
            this[_state$1] = _http._State.HEADER_ENDING;
          } else if (byte === _http._CharCode.LF) {
            this[_state$1] = _http._State.HEADER_ENDING;
            this[_index$1] = dart.notNull(this[_index$1]) - 1;
          } else {
            this[_headerField][$add](_http._HttpParser._toLowerCaseByte(byte));
            this[_state$1] = _http._State.HEADER_FIELD;
          }
          break;
        }
        case _http._State.HEADER_FIELD:
        {
          if (byte === _http._CharCode.COLON) {
            this[_state$1] = _http._State.HEADER_VALUE_START;
          } else {
            if (!dart.test(_http._HttpParser._isTokenChar(byte))) {
              dart.throw(new _http.HttpException.new("Invalid header field name"));
            }
            this[_headerField][$add](_http._HttpParser._toLowerCaseByte(byte));
          }
          break;
        }
        case _http._State.HEADER_VALUE_START:
        {
          if (byte === _http._CharCode.CR) {
            this[_state$1] = _http._State.HEADER_VALUE_FOLDING_OR_ENDING;
          } else if (byte === _http._CharCode.LF) {
            this[_state$1] = _http._State.HEADER_VALUE_FOLD_OR_END;
          } else if (byte !== _http._CharCode.SP && byte !== _http._CharCode.HT) {
            this[_headerValue][$add](byte);
            this[_state$1] = _http._State.HEADER_VALUE;
          }
          break;
        }
        case _http._State.HEADER_VALUE:
        {
          if (byte === _http._CharCode.CR) {
            this[_state$1] = _http._State.HEADER_VALUE_FOLDING_OR_ENDING;
          } else if (byte === _http._CharCode.LF) {
            this[_state$1] = _http._State.HEADER_VALUE_FOLD_OR_END;
          } else {
            this[_headerValue][$add](byte);
          }
          break;
        }
        case _http._State.HEADER_VALUE_FOLDING_OR_ENDING:
        {
          this[_expect](byte, _http._CharCode.LF);
          this[_state$1] = _http._State.HEADER_VALUE_FOLD_OR_END;
          break;
        }
        case _http._State.HEADER_VALUE_FOLD_OR_END:
        {
          if (byte === _http._CharCode.SP || byte === _http._CharCode.HT) {
            this[_state$1] = _http._State.HEADER_VALUE_START;
          } else {
            let headerField = core.String.fromCharCodes(this[_headerField]);
            let headerValue = core.String.fromCharCodes(this[_headerValue]);
            if (headerField === "transfer-encoding" && dart.test(this[_caseInsensitiveCompare]("chunked"[$codeUnits], this[_headerValue]))) {
              this[_chunked] = true;
            }
            if (headerField === "connection") {
              let tokens = _http._HttpParser._tokenizeFieldValue(headerValue);
              let isResponse = this[_messageType] === _http._MessageType.RESPONSE;
              let isUpgradeCode = this[_statusCode] === _internal.HttpStatus.upgradeRequired || this[_statusCode] === _internal.HttpStatus.switchingProtocols;
              for (let i = 0; i < dart.notNull(tokens[$length]); i++) {
                let isUpgrade = this[_caseInsensitiveCompare]("upgrade"[$codeUnits], tokens[$_get](i)[$codeUnits]);
                if (dart.test(isUpgrade) && !isResponse || dart.test(isUpgrade) && isResponse && isUpgradeCode) {
                  this[_connectionUpgrade] = true;
                }
                this[_headers][_add$2](headerField, tokens[$_get](i));
              }
            } else {
              this[_headers][_add$2](headerField, headerValue);
            }
            this[_headerField][$clear]();
            this[_headerValue][$clear]();
            if (byte === _http._CharCode.CR) {
              this[_state$1] = _http._State.HEADER_ENDING;
            } else if (byte === _http._CharCode.LF) {
              this[_state$1] = _http._State.HEADER_ENDING;
              this[_index$1] = dart.notNull(this[_index$1]) - 1;
            } else {
              this[_headerField][$add](_http._HttpParser._toLowerCaseByte(byte));
              this[_state$1] = _http._State.HEADER_FIELD;
            }
          }
          break;
        }
        case _http._State.HEADER_ENDING:
        {
          this[_expect](byte, _http._CharCode.LF);
          if (dart.test(this[_headersEnd]())) {
            return;
          } else {
            break;
          }
          return;
        }
        case _http._State.CHUNK_SIZE_STARTING_CR:
        {
          this[_expect](byte, _http._CharCode.CR);
          this[_state$1] = _http._State.CHUNK_SIZE_STARTING_LF;
          break;
        }
        case _http._State.CHUNK_SIZE_STARTING_LF:
        {
          this[_expect](byte, _http._CharCode.LF);
          this[_state$1] = _http._State.CHUNK_SIZE;
          break;
        }
        case _http._State.CHUNK_SIZE:
        {
          if (byte === _http._CharCode.CR) {
            this[_state$1] = _http._State.CHUNK_SIZE_ENDING;
          } else if (byte === _http._CharCode.SEMI_COLON) {
            this[_state$1] = _http._State.CHUNK_SIZE_EXTENSION;
          } else {
            let value = this[_expectHexDigit](byte);
            this[_remainingContent] = dart.notNull(this[_remainingContent]) * 16 + dart.notNull(value);
          }
          break;
        }
        case _http._State.CHUNK_SIZE_EXTENSION:
        {
          if (byte === _http._CharCode.CR) {
            this[_state$1] = _http._State.CHUNK_SIZE_ENDING;
          }
          break;
        }
        case _http._State.CHUNK_SIZE_ENDING:
        {
          this[_expect](byte, _http._CharCode.LF);
          if (dart.notNull(this[_remainingContent]) > 0) {
            this[_state$1] = _http._State.BODY;
          } else {
            this[_state$1] = _http._State.CHUNKED_BODY_DONE_CR;
          }
          break;
        }
        case _http._State.CHUNKED_BODY_DONE_CR:
        {
          this[_expect](byte, _http._CharCode.CR);
          this[_state$1] = _http._State.CHUNKED_BODY_DONE_LF;
          break;
        }
        case _http._State.CHUNKED_BODY_DONE_LF:
        {
          this[_expect](byte, _http._CharCode.LF);
          this[_reset]();
          this[_closeIncoming]();
          break;
        }
        case _http._State.BODY:
        {
          this[_index$1] = dart.notNull(this[_index$1]) - 1;
          let dataAvailable = dart.notNull(this[_buffer$1][$length]) - dart.notNull(this[_index$1]);
          if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
            dataAvailable = this[_remainingContent];
          }
          let data = typed_data.Uint8List.view(this[_buffer$1][$buffer], dart.notNull(this[_buffer$1][$offsetInBytes]) + dart.notNull(this[_index$1]), dataAvailable);
          this[_bodyController].add(data);
          if (this[_remainingContent] !== -1) {
            this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[$length]);
          }
          this[_index$1] = dart.notNull(this[_index$1]) + dart.notNull(data[$length]);
          if (this[_remainingContent] === 0) {
            if (!dart.test(this[_chunked])) {
              this[_reset]();
              this[_closeIncoming]();
            } else {
              this[_state$1] = _http._State.CHUNK_SIZE_STARTING_CR;
            }
          }
          break;
        }
        case _http._State.FAILURE:
        {
          if (!false) dart.assertFailed(null, "dart:_http/http_parser.dart", 784, 18, "false");
          break;
        }
        default:
        {
          if (!false) dart.assertFailed(null, "dart:_http/http_parser.dart", 789, 18, "false");
          break;
        }
      }
    }
    this[_parserCalled] = false;
    if (this[_buffer$1] != null && this[_index$1] == this[_buffer$1][$length]) {
      this[_releaseBuffer]();
      if (this[_state$1] !== _http._State.UPGRADED && this[_state$1] !== _http._State.FAILURE) {
        this[_socketSubscription$].resume();
      }
    }
  }
  [_onData$2](buffer) {
    this[_socketSubscription$].pause();
    if (!(this[_buffer$1] == null)) dart.assertFailed(null, "dart:_http/http_parser.dart", 807, 12, "_buffer == null");
    this[_buffer$1] = typed_data.Uint8List._check(buffer);
    this[_index$1] = 0;
    this[_parse]();
  }
  [_onDone$]() {
    this[_socketSubscription$] = null;
    if (this[_state$1] === _http._State.CLOSED || this[_state$1] === _http._State.FAILURE) return;
    if (this[_incoming] != null) {
      if (this[_state$1] !== _http._State.UPGRADED && !(this[_state$1] === _http._State.START && !dart.test(this[_requestParser])) && !(this[_state$1] === _http._State.BODY && !dart.test(this[_chunked]) && this[_transferLength] === -1)) {
        this[_bodyController].addError(new _http.HttpException.new("Connection closed while receiving data"));
      }
      this[_closeIncoming](true);
      this[_controller$1].close();
      return;
    }
    if (this[_state$1] === _http._State.START) {
      if (!dart.test(this[_requestParser])) {
        this[_reportError$](new _http.HttpException.new("Connection closed before full header was received"));
      }
      this[_controller$1].close();
      return;
    }
    if (this[_state$1] === _http._State.UPGRADED) {
      this[_controller$1].close();
      return;
    }
    if (dart.notNull(this[_state$1]) < _http._State.FIRST_BODY_STATE) {
      this[_state$1] = _http._State.FAILURE;
      this[_reportError$](new _http.HttpException.new("Connection closed before full header was received"));
      this[_controller$1].close();
      return;
    }
    if (!dart.test(this[_chunked]) && this[_transferLength] === -1) {
      this[_state$1] = _http._State.CLOSED;
    } else {
      this[_state$1] = _http._State.FAILURE;
      this[_reportError$](new _http.HttpException.new("Connection closed before full body was received"));
    }
    this[_controller$1].close();
  }
  get version() {
    switch (this[_httpVersion]) {
      case _http._HttpVersion.HTTP10:
      {
        return "1.0";
      }
      case _http._HttpVersion.HTTP11:
      {
        return "1.1";
      }
    }
    return null;
  }
  get messageType() {
    return this[_messageType];
  }
  get transferLength() {
    return this[_transferLength];
  }
  get upgrade() {
    return dart.test(this[_connectionUpgrade]) && this[_state$1] === _http._State.UPGRADED;
  }
  get persistentConnection() {
    return this[_persistentConnection];
  }
  set isHead(value) {
    if (dart.test(value)) this[_noMessageBody] = true;
  }
  detachIncoming() {
    this[_state$1] = _http._State.UPGRADED;
    return new _http._HttpDetachedIncoming.new(this[_socketSubscription$], this.readUnparsedData());
  }
  readUnparsedData() {
    if (this[_buffer$1] == null) return null;
    if (this[_index$1] == this[_buffer$1][$length]) return null;
    let result = this[_buffer$1][$sublist](this[_index$1]);
    this[_releaseBuffer]();
    return result;
  }
  [_reset]() {
    if (this[_state$1] === _http._State.UPGRADED) return;
    this[_state$1] = _http._State.START;
    this[_messageType] = _http._MessageType.UNDETERMINED;
    this[_headerField][$clear]();
    this[_headerValue][$clear]();
    this[_method$][$clear]();
    this[_uri_or_reason_phrase][$clear]();
    this[_statusCode] = 0;
    this[_statusCodeLength] = 0;
    this[_httpVersion] = _http._HttpVersion.UNDETERMINED;
    this[_transferLength] = -1;
    this[_persistentConnection] = false;
    this[_connectionUpgrade] = false;
    this[_chunked] = false;
    this[_noMessageBody] = false;
    this[_remainingContent] = -1;
    this[_headers] = null;
  }
  [_releaseBuffer]() {
    this[_buffer$1] = null;
    this[_index$1] = null;
  }
  static _isTokenChar(byte) {
    return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(_http._Const.SEPARATOR_MAP[$_get](byte));
  }
  static _isValueChar(byte) {
    return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 || byte === _http._CharCode.SP || byte === _http._CharCode.HT;
  }
  static _tokenizeFieldValue(headerValue) {
    let tokens = JSArrayOfString().of([]);
    let start = 0;
    let index = 0;
    while (index < headerValue.length) {
      if (headerValue[$_get](index) === ",") {
        tokens[$add](headerValue[$substring](start, index));
        start = index + 1;
      } else if (headerValue[$_get](index) === " " || headerValue[$_get](index) === "\t") {
        start++;
      }
      index++;
    }
    tokens[$add](headerValue[$substring](start, index));
    return tokens;
  }
  static _toLowerCaseByte(x) {
    return (dart.notNull(x) - 65 & 127) < 26 ? (dart.notNull(x) | 32) >>> 0 : x;
  }
  [_caseInsensitiveCompare](expected, value) {
    if (expected[$length] != value[$length]) return false;
    for (let i = 0; i < dart.notNull(expected[$length]); i++) {
      if (expected[$_get](i) != _http._HttpParser._toLowerCaseByte(value[$_get](i))) return false;
    }
    return true;
  }
  [_expect](val1, val2) {
    if (val1 != val2) {
      dart.throw(new _http.HttpException.new("Failed to parse HTTP"));
    }
  }
  [_expectHexDigit](byte) {
    if (48 <= dart.notNull(byte) && dart.notNull(byte) <= 57) {
      return dart.notNull(byte) - 48;
    } else if (65 <= dart.notNull(byte) && dart.notNull(byte) <= 70) {
      return dart.notNull(byte) - 65 + 10;
    } else if (97 <= dart.notNull(byte) && dart.notNull(byte) <= 102) {
      return dart.notNull(byte) - 97 + 10;
    } else {
      dart.throw(new _http.HttpException.new("Failed to parse HTTP"));
    }
  }
  [_createIncoming](transferLength) {
    if (!(this[_incoming] == null)) dart.assertFailed(null, "dart:_http/http_parser.dart", 992, 12, "_incoming == null");
    if (!(this[_bodyController] == null)) dart.assertFailed(null, "dart:_http/http_parser.dart", 993, 12, "_bodyController == null");
    if (!!dart.test(this[_bodyPaused])) dart.assertFailed(null, "dart:_http/http_parser.dart", 994, 12, "!_bodyPaused");
    let incoming = null;
    this[_bodyController] = StreamControllerOfListOfint().new({sync: true, onListen: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        if (!dart.test(this[_bodyPaused])) dart.assertFailed(null, "dart:_http/http_parser.dart", 1000, 18, "_bodyPaused");
        this[_bodyPaused] = false;
        this[_pauseStateChanged]();
      }, VoidToNull()), onPause: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        if (!!dart.test(this[_bodyPaused])) dart.assertFailed(null, "dart:_http/http_parser.dart", 1006, 18, "!_bodyPaused");
        this[_bodyPaused] = true;
        this[_pauseStateChanged]();
      }, VoidToNull()), onResume: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        if (!dart.test(this[_bodyPaused])) dart.assertFailed(null, "dart:_http/http_parser.dart", 1012, 18, "_bodyPaused");
        this[_bodyPaused] = false;
        this[_pauseStateChanged]();
      }, VoidToNull()), onCancel: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        if (this[_socketSubscription$] != null) {
          this[_socketSubscription$].cancel();
        }
        this[_closeIncoming](true);
        this[_controller$1].close();
      }, VoidToNull())});
    incoming = this[_incoming] = new _http._HttpIncoming.new(this[_headers], transferLength, this[_bodyController].stream);
    this[_bodyPaused] = true;
    this[_pauseStateChanged]();
  }
  [_closeIncoming](closing) {
    if (closing === void 0) closing = false;
    if (this[_incoming] == null) return;
    let tmp = this[_incoming];
    tmp.close(closing);
    this[_incoming] = null;
    if (this[_bodyController] != null) {
      this[_bodyController].close();
      this[_bodyController] = null;
    }
    this[_bodyPaused] = false;
    this[_pauseStateChanged]();
  }
  [_pauseStateChanged]() {
    if (this[_incoming] != null) {
      if (!dart.test(this[_bodyPaused]) && !dart.test(this[_parserCalled])) {
        this[_parse]();
      }
    } else {
      if (!dart.test(this[_paused]) && !dart.test(this[_parserCalled])) {
        this[_parse]();
      }
    }
  }
  [_reportError$](error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    if (this[_socketSubscription$] != null) this[_socketSubscription$].cancel();
    this[_state$1] = _http._State.FAILURE;
    this[_controller$1].addError(error, core.StackTrace._check(stackTrace));
    this[_controller$1].close();
  }
};
(_http._HttpParser.__ = function(requestParser) {
  this[_parserCalled] = false;
  this[_buffer$1] = null;
  this[_index$1] = null;
  this[_state$1] = null;
  this[_httpVersionIndex] = null;
  this[_messageType] = null;
  this[_statusCode] = 0;
  this[_statusCodeLength] = 0;
  this[_method$] = JSArrayOfint().of([]);
  this[_uri_or_reason_phrase] = JSArrayOfint().of([]);
  this[_headerField] = JSArrayOfint().of([]);
  this[_headerValue] = JSArrayOfint().of([]);
  this[_httpVersion] = null;
  this[_transferLength] = -1;
  this[_persistentConnection] = null;
  this[_connectionUpgrade] = null;
  this[_chunked] = null;
  this[_noMessageBody] = false;
  this[_remainingContent] = -1;
  this[_headers] = null;
  this[_incoming] = null;
  this[_socketSubscription$] = null;
  this[_paused] = true;
  this[_bodyPaused] = false;
  this[_controller$1] = null;
  this[_bodyController] = null;
  this[_requestParser] = requestParser;
  _http._HttpParser.__proto__.new.call(this);
  this[_controller$1] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
      this[_paused] = false;
    }, VoidToNull()), onPause: dart.fn(() => {
      this[_paused] = true;
      this[_pauseStateChanged]();
    }, VoidToNull()), onResume: dart.fn(() => {
      this[_paused] = false;
      this[_pauseStateChanged]();
    }, VoidToNull()), onCancel: dart.fn(() => {
      if (this[_socketSubscription$] != null) {
        this[_socketSubscription$].cancel();
      }
    }, VoidToNull())});
  this[_reset]();
}).prototype = _http._HttpParser.prototype;
dart.addTypeTests(_http._HttpParser);
dart.setMethodSignature(_http._HttpParser, () => ({
  __proto__: dart.getMethods(_http._HttpParser.__proto__),
  listen: dart.fnType(async.StreamSubscription$(_http._HttpIncoming), [dart.fnType(dart.void, [_http._HttpIncoming])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  listenToStream: dart.fnType(dart.void, [async.Stream$(core.List$(core.int))]),
  [_parse]: dart.fnType(dart.void, []),
  [_headersEnd]: dart.fnType(core.bool, []),
  [_doParse]: dart.fnType(dart.void, []),
  [_onData$2]: dart.fnType(dart.void, [core.List$(core.int)]),
  [_onDone$]: dart.fnType(dart.void, []),
  detachIncoming: dart.fnType(_http._HttpDetachedIncoming, []),
  readUnparsedData: dart.fnType(core.List$(core.int), []),
  [_reset]: dart.fnType(dart.void, []),
  [_releaseBuffer]: dart.fnType(dart.void, []),
  [_caseInsensitiveCompare]: dart.fnType(core.bool, [core.List$(core.int), core.List$(core.int)]),
  [_expect]: dart.fnType(core.int, [core.int, core.int]),
  [_expectHexDigit]: dart.fnType(core.int, [core.int]),
  [_createIncoming]: dart.fnType(dart.void, [core.int]),
  [_closeIncoming]: dart.fnType(dart.void, [], [core.bool]),
  [_pauseStateChanged]: dart.fnType(dart.void, []),
  [_reportError$]: dart.fnType(dart.void, [dart.dynamic], [dart.dynamic])
}));
dart.setGetterSignature(_http._HttpParser, () => ({
  __proto__: dart.getGetters(_http._HttpParser.__proto__),
  version: core.String,
  messageType: core.int,
  transferLength: core.int,
  upgrade: core.bool,
  persistentConnection: core.bool
}));
dart.setSetterSignature(_http._HttpParser, () => ({
  __proto__: dart.getSetters(_http._HttpParser.__proto__),
  isHead: core.bool
}));
dart.setLibraryUri(_http._HttpParser, "dart:_http");
dart.setFieldSignature(_http._HttpParser, () => ({
  __proto__: dart.getFields(_http._HttpParser.__proto__),
  [_parserCalled]: dart.fieldType(core.bool),
  [_buffer$1]: dart.fieldType(typed_data.Uint8List),
  [_index$1]: dart.fieldType(core.int),
  [_requestParser]: dart.finalFieldType(core.bool),
  [_state$1]: dart.fieldType(core.int),
  [_httpVersionIndex]: dart.fieldType(core.int),
  [_messageType]: dart.fieldType(core.int),
  [_statusCode]: dart.fieldType(core.int),
  [_statusCodeLength]: dart.fieldType(core.int),
  [_method$]: dart.finalFieldType(ListOfint()),
  [_uri_or_reason_phrase]: dart.finalFieldType(ListOfint()),
  [_headerField]: dart.finalFieldType(ListOfint()),
  [_headerValue]: dart.finalFieldType(ListOfint()),
  [_httpVersion]: dart.fieldType(core.int),
  [_transferLength]: dart.fieldType(core.int),
  [_persistentConnection]: dart.fieldType(core.bool),
  [_connectionUpgrade]: dart.fieldType(core.bool),
  [_chunked]: dart.fieldType(core.bool),
  [_noMessageBody]: dart.fieldType(core.bool),
  [_remainingContent]: dart.fieldType(core.int),
  [_headers]: dart.fieldType(_http._HttpHeaders),
  [_incoming]: dart.fieldType(_http._HttpIncoming),
  [_socketSubscription$]: dart.fieldType(StreamSubscriptionOfListOfint()),
  [_paused]: dart.fieldType(core.bool),
  [_bodyPaused]: dart.fieldType(core.bool),
  [_controller$1]: dart.fieldType(StreamControllerOf_HttpIncoming()),
  [_bodyController]: dart.fieldType(StreamControllerOfListOfint())
}));
dart.defineLazy(_http, {
  /*_http._DART_SESSION_ID*/get _DART_SESSION_ID() {
    return "DARTSESSID";
  }
});
const _lastSeen = dart.privateName(_http, "_lastSeen");
const _timeoutCallback = dart.privateName(_http, "_timeoutCallback");
const _prev = dart.privateName(_http, "_prev");
const _next$1 = dart.privateName(_http, "_next");
const _data$1 = dart.privateName(_http, "_data");
const _removeFromTimeoutQueue = dart.privateName(_http, "_removeFromTimeoutQueue");
const _sessions = dart.privateName(_http, "_sessions");
const _bumpToEnd = dart.privateName(_http, "_bumpToEnd");
_http._HttpSession = class _HttpSession extends core.Object {
  destroy() {
    this[_destroyed] = true;
    this[_sessionManager][_removeFromTimeoutQueue](this);
    this[_sessionManager][_sessions][$remove](this.id);
  }
  [_markSeen]() {
    this[_lastSeen] = new core.DateTime.now();
    this[_sessionManager][_bumpToEnd](this);
  }
  get lastSeen() {
    return this[_lastSeen];
  }
  get isNew() {
    return this[_isNew];
  }
  set onTimeout(callback) {
    this[_timeoutCallback] = callback;
  }
  containsValue(value) {
    return this[_data$1][$containsValue](value);
  }
  containsKey(key) {
    return this[_data$1][$containsKey](key);
  }
  _get(key) {
    return this[_data$1][$_get](key);
  }
  _set(key, value) {
    this[_data$1][$_set](key, value);
    return value;
  }
  putIfAbsent(key, ifAbsent) {
    return this[_data$1][$putIfAbsent](key, ifAbsent);
  }
  addAll(other) {
    return this[_data$1][$addAll](other);
  }
  remove(key) {
    return this[_data$1][$remove](key);
  }
  clear() {
    this[_data$1][$clear]();
  }
  forEach(f) {
    this[_data$1][$forEach](f);
  }
  get entries() {
    return this[_data$1][$entries];
  }
  addEntries(entries) {
    this[_data$1][$addEntries](entries);
  }
  map(K, V, transform) {
    return core.Map$(K, V)._check(this[_data$1][$map](K, V, transform));
  }
  removeWhere(test) {
    this[_data$1][$removeWhere](test);
  }
  cast(K, V) {
    return core.Map$(K, V)._check(this[_data$1][$cast](K, V));
  }
  update(key, update, opts) {
    let ifAbsent = opts && 'ifAbsent' in opts ? opts.ifAbsent : null;
    return this[_data$1][$update](key, update, {ifAbsent: ifAbsent});
  }
  updateAll(update) {
    this[_data$1][$updateAll](update);
  }
  get keys() {
    return this[_data$1][$keys];
  }
  get values() {
    return this[_data$1][$values];
  }
  get length() {
    return this[_data$1][$length];
  }
  get isEmpty() {
    return this[_data$1][$isEmpty];
  }
  get isNotEmpty() {
    return this[_data$1][$isNotEmpty];
  }
  toString() {
    return "HttpSession id:" + dart.str(this.id) + " " + dart.str(this[_data$1]);
  }
};
(_http._HttpSession.new = function(sessionManager, id) {
  this[_destroyed] = false;
  this[_isNew] = true;
  this[_timeoutCallback] = null;
  this[_prev] = null;
  this[_next$1] = null;
  this[_data$1] = new _js_helper.LinkedMap.new();
  this[_sessionManager] = sessionManager;
  this.id = id;
  this[_lastSeen] = new core.DateTime.now();
}).prototype = _http._HttpSession.prototype;
dart.addTypeTests(_http._HttpSession);
_http._HttpSession[dart.implements] = () => [_http.HttpSession];
dart.setMethodSignature(_http._HttpSession, () => ({
  __proto__: dart.getMethods(_http._HttpSession.__proto__),
  destroy: dart.fnType(dart.void, []),
  [_markSeen]: dart.fnType(dart.void, []),
  containsValue: dart.fnType(core.bool, [core.Object]),
  [$containsValue]: dart.fnType(core.bool, [core.Object]),
  containsKey: dart.fnType(core.bool, [core.Object]),
  [$containsKey]: dart.fnType(core.bool, [core.Object]),
  _get: dart.fnType(dart.dynamic, [core.Object]),
  [$_get]: dart.fnType(dart.dynamic, [core.Object]),
  _set: dart.fnType(dart.void, [dart.dynamic, dart.dynamic]),
  [$_set]: dart.fnType(dart.void, [dart.dynamic, dart.dynamic]),
  putIfAbsent: dart.fnType(dart.dynamic, [dart.dynamic, dart.fnType(dart.dynamic, [])]),
  [$putIfAbsent]: dart.fnType(dart.dynamic, [dart.dynamic, dart.fnType(dart.dynamic, [])]),
  addAll: dart.fnType(dart.void, [core.Map]),
  [$addAll]: dart.fnType(dart.void, [core.Map]),
  remove: dart.fnType(dart.dynamic, [core.Object]),
  [$remove]: dart.fnType(dart.dynamic, [core.Object]),
  clear: dart.fnType(dart.void, []),
  [$clear]: dart.fnType(dart.void, []),
  forEach: dart.fnType(dart.void, [dart.fnType(dart.void, [dart.dynamic, dart.dynamic])]),
  [$forEach]: dart.fnType(dart.void, [dart.fnType(dart.void, [dart.dynamic, dart.dynamic])]),
  addEntries: dart.fnType(dart.void, [core.Iterable$(core.MapEntry)]),
  [$addEntries]: dart.fnType(dart.void, [core.Iterable$(core.MapEntry)]),
  map: dart.gFnType((K, V) => [core.Map$(K, V), [dart.fnType(core.MapEntry$(K, V), [dart.dynamic, dart.dynamic])]]),
  [$map]: dart.gFnType((K, V) => [core.Map$(K, V), [dart.fnType(core.MapEntry$(K, V), [dart.dynamic, dart.dynamic])]]),
  removeWhere: dart.fnType(dart.void, [dart.fnType(core.bool, [dart.dynamic, dart.dynamic])]),
  [$removeWhere]: dart.fnType(dart.void, [dart.fnType(core.bool, [dart.dynamic, dart.dynamic])]),
  cast: dart.gFnType((K, V) => [core.Map$(K, V), []]),
  [$cast]: dart.gFnType((K, V) => [core.Map$(K, V), []]),
  update: dart.fnType(dart.dynamic, [dart.dynamic, dart.fnType(dart.dynamic, [dart.dynamic])], {ifAbsent: dart.fnType(dart.dynamic, [])}),
  [$update]: dart.fnType(dart.dynamic, [dart.dynamic, dart.fnType(dart.dynamic, [dart.dynamic])], {ifAbsent: dart.fnType(dart.dynamic, [])}),
  updateAll: dart.fnType(dart.void, [dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic])]),
  [$updateAll]: dart.fnType(dart.void, [dart.fnType(dart.dynamic, [dart.dynamic, dart.dynamic])])
}));
dart.setGetterSignature(_http._HttpSession, () => ({
  __proto__: dart.getGetters(_http._HttpSession.__proto__),
  lastSeen: core.DateTime,
  isNew: core.bool,
  entries: core.Iterable$(core.MapEntry),
  [$entries]: core.Iterable$(core.MapEntry),
  keys: core.Iterable,
  [$keys]: core.Iterable,
  values: core.Iterable,
  [$values]: core.Iterable,
  length: core.int,
  [$length]: core.int,
  isEmpty: core.bool,
  [$isEmpty]: core.bool,
  isNotEmpty: core.bool,
  [$isNotEmpty]: core.bool
}));
dart.setSetterSignature(_http._HttpSession, () => ({
  __proto__: dart.getSetters(_http._HttpSession.__proto__),
  onTimeout: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(_http._HttpSession, "dart:_http");
dart.setFieldSignature(_http._HttpSession, () => ({
  __proto__: dart.getFields(_http._HttpSession.__proto__),
  [_destroyed]: dart.fieldType(core.bool),
  [_isNew]: dart.fieldType(core.bool),
  [_lastSeen]: dart.fieldType(core.DateTime),
  [_timeoutCallback]: dart.fieldType(core.Function),
  [_sessionManager]: dart.fieldType(_http._HttpSessionManager),
  [_prev]: dart.fieldType(_http._HttpSession),
  [_next$1]: dart.fieldType(_http._HttpSession),
  id: dart.finalFieldType(core.String),
  [_data$1]: dart.finalFieldType(core.Map)
}));
dart.defineExtensionMethods(_http._HttpSession, [
  'containsValue',
  'containsKey',
  '_get',
  '_set',
  'putIfAbsent',
  'addAll',
  'remove',
  'clear',
  'forEach',
  'addEntries',
  'map',
  'removeWhere',
  'cast',
  'update',
  'updateAll',
  'toString'
]);
dart.defineExtensionAccessors(_http._HttpSession, [
  'entries',
  'keys',
  'values',
  'length',
  'isEmpty',
  'isNotEmpty'
]);
const _sessionTimeout = dart.privateName(_http, "_sessionTimeout");
const _head$0 = dart.privateName(_http, "_head");
const _tail$ = dart.privateName(_http, "_tail");
const _timer = dart.privateName(_http, "_timer");
const _addToTimeoutQueue = dart.privateName(_http, "_addToTimeoutQueue");
const _stopTimer = dart.privateName(_http, "_stopTimer");
const _startTimer = dart.privateName(_http, "_startTimer");
const _timerTimeout = dart.privateName(_http, "_timerTimeout");
_http._HttpSessionManager = class _HttpSessionManager extends core.Object {
  createSessionId() {
    let _KEY_LENGTH = 16;
    let data = _http._CryptoUtils.getRandomBytes(_KEY_LENGTH);
    return _http._CryptoUtils.bytesToHex(data);
  }
  getSession(id) {
    return this[_sessions][$_get](id);
  }
  createSession() {
    let id = this.createSessionId();
    while (dart.test(this[_sessions][$containsKey](id))) {
      id = this.createSessionId();
    }
    let session = this[_sessions][$_set](id, new _http._HttpSession.new(this, id));
    this[_addToTimeoutQueue](session);
    return session;
  }
  set sessionTimeout(timeout) {
    this[_sessionTimeout] = timeout;
    this[_stopTimer]();
    this[_startTimer]();
  }
  close() {
    this[_stopTimer]();
  }
  [_bumpToEnd](session) {
    this[_removeFromTimeoutQueue](session);
    this[_addToTimeoutQueue](session);
  }
  [_addToTimeoutQueue](session) {
    if (this[_head$0] == null) {
      if (!(this[_tail$] == null)) dart.assertFailed(null, "dart:_http/http_session.dart", 148, 14, "_tail == null");
      this[_tail$] = this[_head$0] = session;
      this[_startTimer]();
    } else {
      if (!(this[_timer] != null)) dart.assertFailed(null, "dart:_http/http_session.dart", 152, 14, "_timer != null");
      if (!(this[_tail$] != null)) dart.assertFailed(null, "dart:_http/http_session.dart", 153, 14, "_tail != null");
      this[_tail$][_next$1] = session;
      session[_prev] = this[_tail$];
      this[_tail$] = session;
    }
  }
  [_removeFromTimeoutQueue](session) {
    if (session[_next$1] != null) {
      session[_next$1][_prev] = session[_prev];
    }
    if (session[_prev] != null) {
      session[_prev][_next$1] = session[_next$1];
    }
    if (dart.equals(this[_head$0], session)) {
      this[_head$0] = session[_next$1];
      this[_stopTimer]();
      this[_startTimer]();
    }
    if (dart.equals(this[_tail$], session)) {
      this[_tail$] = session[_prev];
    }
    session[_next$1] = session[_prev] = null;
  }
  [_timerTimeout]() {
    this[_stopTimer]();
    if (!(this[_head$0] != null)) dart.assertFailed(null, "dart:_http/http_session.dart", 182, 12, "_head != null");
    let session = this[_head$0];
    session.destroy();
    if (session[_timeoutCallback] != null) {
      dart.dsend(session, _timeoutCallback, []);
    }
  }
  [_startTimer]() {
    if (!(this[_timer] == null)) dart.assertFailed(null, "dart:_http/http_session.dart", 191, 12, "_timer == null");
    if (this[_head$0] != null) {
      let seconds = new core.DateTime.now().difference(this[_head$0].lastSeen).inSeconds;
      this[_timer] = async.Timer.new(new core.Duration.new({seconds: dart.notNull(this[_sessionTimeout]) - dart.notNull(seconds)}), dart.bind(this, _timerTimeout));
    }
  }
  [_stopTimer]() {
    if (this[_timer] != null) {
      this[_timer].cancel();
      this[_timer] = null;
    }
  }
};
(_http._HttpSessionManager.new = function() {
  this[_sessionTimeout] = 20 * 60;
  this[_head$0] = null;
  this[_tail$] = null;
  this[_timer] = null;
  this[_sessions] = new (IdentityMapOfString$_HttpSession()).new();
}).prototype = _http._HttpSessionManager.prototype;
dart.addTypeTests(_http._HttpSessionManager);
dart.setMethodSignature(_http._HttpSessionManager, () => ({
  __proto__: dart.getMethods(_http._HttpSessionManager.__proto__),
  createSessionId: dart.fnType(core.String, []),
  getSession: dart.fnType(_http._HttpSession, [core.String]),
  createSession: dart.fnType(_http._HttpSession, []),
  close: dart.fnType(dart.void, []),
  [_bumpToEnd]: dart.fnType(dart.void, [_http._HttpSession]),
  [_addToTimeoutQueue]: dart.fnType(dart.void, [_http._HttpSession]),
  [_removeFromTimeoutQueue]: dart.fnType(dart.void, [_http._HttpSession]),
  [_timerTimeout]: dart.fnType(dart.void, []),
  [_startTimer]: dart.fnType(dart.void, []),
  [_stopTimer]: dart.fnType(dart.void, [])
}));
dart.setSetterSignature(_http._HttpSessionManager, () => ({
  __proto__: dart.getSetters(_http._HttpSessionManager.__proto__),
  sessionTimeout: core.int
}));
dart.setLibraryUri(_http._HttpSessionManager, "dart:_http");
dart.setFieldSignature(_http._HttpSessionManager, () => ({
  __proto__: dart.getFields(_http._HttpSessionManager.__proto__),
  [_sessions]: dart.fieldType(MapOfString$_HttpSession()),
  [_sessionTimeout]: dart.fieldType(core.int),
  [_head$0]: dart.fieldType(_http._HttpSession),
  [_tail$]: dart.fieldType(_http._HttpSession),
  [_timer]: dart.fieldType(async.Timer)
}));
dart.defineLazy(_http, {
  /*_http._httpOverridesToken*/get _httpOverridesToken() {
    return new core.Object.new();
  },
  /*_http._asyncRunZoned*/get _asyncRunZoned() {
    return dart.fn(async.runZoned, Fn__ToR());
  }
});
_http.HttpOverrides = class HttpOverrides extends core.Object {
  static get current() {
    return _http.HttpOverrides._check((() => {
      let l = async.Zone.current._get(_http._httpOverridesToken);
      return l != null ? l : _http.HttpOverrides._global;
    })());
  }
  static set global(overrides) {
    _http.HttpOverrides._global = overrides;
  }
  static runZoned(R, body, opts) {
    let createHttpClient = opts && 'createHttpClient' in opts ? opts.createHttpClient : null;
    let findProxyFromEnvironment = opts && 'findProxyFromEnvironment' in opts ? opts.findProxyFromEnvironment : null;
    let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let overrides = new _http._HttpOverridesScope.new(createHttpClient, findProxyFromEnvironment);
    return _http._asyncRunZoned(R, body, {zoneValues: new _js_helper.LinkedMap.from([_http._httpOverridesToken, overrides]), zoneSpecification: zoneSpecification, onError: onError});
  }
  static runWithHttpOverrides(R, body, overrides, opts) {
    let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
    let onError = opts && 'onError' in opts ? opts.onError : null;
    return _http._asyncRunZoned(R, body, {zoneValues: new _js_helper.LinkedMap.from([_http._httpOverridesToken, overrides]), zoneSpecification: zoneSpecification, onError: onError});
  }
  createHttpClient(context) {
    return new _http._HttpClient.new(context);
  }
  findProxyFromEnvironment(url, environment) {
    return _http._HttpClient._findProxyFromEnvironment(url, environment);
  }
};
(_http.HttpOverrides.new = function() {
}).prototype = _http.HttpOverrides.prototype;
dart.addTypeTests(_http.HttpOverrides);
dart.setMethodSignature(_http.HttpOverrides, () => ({
  __proto__: dart.getMethods(_http.HttpOverrides.__proto__),
  createHttpClient: dart.fnType(_http.HttpClient, [io.SecurityContext]),
  findProxyFromEnvironment: dart.fnType(core.String, [core.Uri, core.Map$(core.String, core.String)])
}));
dart.setLibraryUri(_http.HttpOverrides, "dart:_http");
dart.defineLazy(_http.HttpOverrides, {
  /*_http.HttpOverrides._global*/get _global() {
    return null;
  },
  set _global(_) {}
});
const _createHttpClient = dart.privateName(_http, "_createHttpClient");
const _findProxyFromEnvironment = dart.privateName(_http, "_findProxyFromEnvironment");
const _previous$2 = dart.privateName(_http, "_previous");
_http._HttpOverridesScope = class _HttpOverridesScope extends _http.HttpOverrides {
  createHttpClient(context) {
    if (this[_createHttpClient] != null) return this[_createHttpClient](context);
    if (this[_previous$2] != null) return this[_previous$2].createHttpClient(context);
    return super.createHttpClient(context);
  }
  findProxyFromEnvironment(url, environment) {
    if (this[_findProxyFromEnvironment] != null) {
      return this[_findProxyFromEnvironment](url, environment);
    }
    if (this[_previous$2] != null) {
      return this[_previous$2].findProxyFromEnvironment(url, environment);
    }
    return super.findProxyFromEnvironment(url, environment);
  }
};
(_http._HttpOverridesScope.new = function(createHttpClient, findProxyFromEnvironment) {
  this[_previous$2] = _http.HttpOverrides.current;
  this[_createHttpClient] = createHttpClient;
  this[_findProxyFromEnvironment] = findProxyFromEnvironment;
}).prototype = _http._HttpOverridesScope.prototype;
dart.addTypeTests(_http._HttpOverridesScope);
dart.setLibraryUri(_http._HttpOverridesScope, "dart:_http");
dart.setFieldSignature(_http._HttpOverridesScope, () => ({
  __proto__: dart.getFields(_http._HttpOverridesScope.__proto__),
  [_previous$2]: dart.finalFieldType(_http.HttpOverrides),
  [_createHttpClient]: dart.finalFieldType(SecurityContextToHttpClient()),
  [_findProxyFromEnvironment]: dart.finalFieldType(UriAndMapOfString$StringToString())
}));
_http.WebSocketStatus = class WebSocketStatus extends core.Object {};
(_http.WebSocketStatus.new = function() {
}).prototype = _http.WebSocketStatus.prototype;
dart.addTypeTests(_http.WebSocketStatus);
dart.setLibraryUri(_http.WebSocketStatus, "dart:_http");
dart.defineLazy(_http.WebSocketStatus, {
  /*_http.WebSocketStatus.normalClosure*/get normalClosure() {
    return 1000;
  },
  /*_http.WebSocketStatus.goingAway*/get goingAway() {
    return 1001;
  },
  /*_http.WebSocketStatus.protocolError*/get protocolError() {
    return 1002;
  },
  /*_http.WebSocketStatus.unsupportedData*/get unsupportedData() {
    return 1003;
  },
  /*_http.WebSocketStatus.reserved1004*/get reserved1004() {
    return 1004;
  },
  /*_http.WebSocketStatus.noStatusReceived*/get noStatusReceived() {
    return 1005;
  },
  /*_http.WebSocketStatus.abnormalClosure*/get abnormalClosure() {
    return 1006;
  },
  /*_http.WebSocketStatus.invalidFramePayloadData*/get invalidFramePayloadData() {
    return 1007;
  },
  /*_http.WebSocketStatus.policyViolation*/get policyViolation() {
    return 1008;
  },
  /*_http.WebSocketStatus.messageTooBig*/get messageTooBig() {
    return 1009;
  },
  /*_http.WebSocketStatus.missingMandatoryExtension*/get missingMandatoryExtension() {
    return 1010;
  },
  /*_http.WebSocketStatus.internalServerError*/get internalServerError() {
    return 1011;
  },
  /*_http.WebSocketStatus.reserved1015*/get reserved1015() {
    return 1015;
  },
  /*_http.WebSocketStatus.NORMAL_CLOSURE*/get NORMAL_CLOSURE() {
    return 1000;
  },
  /*_http.WebSocketStatus.GOING_AWAY*/get GOING_AWAY() {
    return 1001;
  },
  /*_http.WebSocketStatus.PROTOCOL_ERROR*/get PROTOCOL_ERROR() {
    return 1002;
  },
  /*_http.WebSocketStatus.UNSUPPORTED_DATA*/get UNSUPPORTED_DATA() {
    return 1003;
  },
  /*_http.WebSocketStatus.RESERVED_1004*/get RESERVED_1004() {
    return 1004;
  },
  /*_http.WebSocketStatus.NO_STATUS_RECEIVED*/get NO_STATUS_RECEIVED() {
    return 1005;
  },
  /*_http.WebSocketStatus.ABNORMAL_CLOSURE*/get ABNORMAL_CLOSURE() {
    return 1006;
  },
  /*_http.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA*/get INVALID_FRAME_PAYLOAD_DATA() {
    return 1007;
  },
  /*_http.WebSocketStatus.POLICY_VIOLATION*/get POLICY_VIOLATION() {
    return 1008;
  },
  /*_http.WebSocketStatus.MESSAGE_TOO_BIG*/get MESSAGE_TOO_BIG() {
    return 1009;
  },
  /*_http.WebSocketStatus.MISSING_MANDATORY_EXTENSION*/get MISSING_MANDATORY_EXTENSION() {
    return 1010;
  },
  /*_http.WebSocketStatus.INTERNAL_SERVER_ERROR*/get INTERNAL_SERVER_ERROR() {
    return 1011;
  },
  /*_http.WebSocketStatus.RESERVED_1015*/get RESERVED_1015() {
    return 1015;
  }
});
const _createServerResponseHeader = dart.privateName(_http, "_createServerResponseHeader");
const _createClientRequestHeader = dart.privateName(_http, "_createClientRequestHeader");
const _createHeader = dart.privateName(_http, "_createHeader");
_http.CompressionOptions = class CompressionOptions extends core.Object {
  [_createServerResponseHeader](requested) {
    let info = new _http._CompressionMaxWindowBits.new();
    let mwb = null;
    let part = null;
    if ((requested == null ? null : requested.parameters) != null) {
      part = requested.parameters[$_get]("server_max_window_bits");
    }
    if (part != null) {
      if (part.length >= 2 && part[$startsWith]("0")) {
        dart.throw(new core.ArgumentError.new("Illegal 0 padding on value."));
      } else {
        mwb = this.serverMaxWindowBits == null ? core.int.parse(part, {onError: dart.fn(source => _http._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint())}) : this.serverMaxWindowBits;
        info.headerValue = "; server_max_window_bits=" + dart.str(mwb);
        info.maxWindowBits = mwb;
      }
    } else {
      info.headerValue = "";
      info.maxWindowBits = _http._WebSocketImpl.DEFAULT_WINDOW_BITS;
    }
    return info;
  }
  [_createClientRequestHeader](requested, size) {
    let info = "";
    if (requested != null) {
      info = "; client_max_window_bits=" + dart.str(size);
    } else {
      if (this.clientMaxWindowBits == null) {
        info = "; client_max_window_bits";
      } else {
        info = "; client_max_window_bits=" + dart.str(this.clientMaxWindowBits);
      }
      if (this.serverMaxWindowBits != null) {
        info = info + ("; server_max_window_bits=" + dart.str(this.serverMaxWindowBits));
      }
    }
    return info;
  }
  [_createHeader](requested) {
    if (requested === void 0) requested = null;
    let info = new _http._CompressionMaxWindowBits.new("", 0);
    if (!dart.test(this.enabled)) {
      return info;
    }
    info.headerValue = _http._WebSocketImpl.PER_MESSAGE_DEFLATE;
    if (dart.test(this.clientNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[$containsKey]("client_no_context_takeover")))) {
      info.headerValue = dart.notNull(info.headerValue) + "; client_no_context_takeover";
    }
    if (dart.test(this.serverNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[$containsKey]("server_no_context_takeover")))) {
      info.headerValue = dart.notNull(info.headerValue) + "; server_no_context_takeover";
    }
    let headerList = this[_createServerResponseHeader](requested);
    info.headerValue = dart.notNull(info.headerValue) + dart.notNull(headerList.headerValue);
    info.maxWindowBits = headerList.maxWindowBits;
    info.headerValue = dart.notNull(info.headerValue) + dart.notNull(this[_createClientRequestHeader](requested, info.maxWindowBits));
    return info;
  }
};
(_http.CompressionOptions.new = function(opts) {
  let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
  let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
  let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : null;
  let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : null;
  let enabled = opts && 'enabled' in opts ? opts.enabled : true;
  this.clientNoContextTakeover = clientNoContextTakeover;
  this.serverNoContextTakeover = serverNoContextTakeover;
  this.clientMaxWindowBits = clientMaxWindowBits;
  this.serverMaxWindowBits = serverMaxWindowBits;
  this.enabled = enabled;
}).prototype = _http.CompressionOptions.prototype;
dart.addTypeTests(_http.CompressionOptions);
dart.setMethodSignature(_http.CompressionOptions, () => ({
  __proto__: dart.getMethods(_http.CompressionOptions.__proto__),
  [_createServerResponseHeader]: dart.fnType(_http._CompressionMaxWindowBits, [_http.HeaderValue]),
  [_createClientRequestHeader]: dart.fnType(core.String, [_http.HeaderValue, core.int]),
  [_createHeader]: dart.fnType(_http._CompressionMaxWindowBits, [], [_http.HeaderValue])
}));
dart.setLibraryUri(_http.CompressionOptions, "dart:_http");
dart.setFieldSignature(_http.CompressionOptions, () => ({
  __proto__: dart.getFields(_http.CompressionOptions.__proto__),
  clientNoContextTakeover: dart.finalFieldType(core.bool),
  serverNoContextTakeover: dart.finalFieldType(core.bool),
  clientMaxWindowBits: dart.finalFieldType(core.int),
  serverMaxWindowBits: dart.finalFieldType(core.int),
  enabled: dart.finalFieldType(core.bool)
}));
dart.defineLazy(_http.CompressionOptions, {
  /*_http.CompressionOptions.compressionDefault*/get compressionDefault() {
    return dart.const(new _http.CompressionOptions.new());
  },
  /*_http.CompressionOptions.DEFAULT*/get DEFAULT() {
    return _http.CompressionOptions.compressionDefault;
  },
  /*_http.CompressionOptions.compressionOff*/get compressionOff() {
    return dart.const(new _http.CompressionOptions.new({enabled: false}));
  },
  /*_http.CompressionOptions.OFF*/get OFF() {
    return _http.CompressionOptions.compressionOff;
  }
});
_http.WebSocketTransformer = class WebSocketTransformer extends core.Object {
  static new(opts) {
    let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
    let compression = opts && 'compression' in opts ? opts.compression : _http.CompressionOptions.compressionDefault;
    return new _http._WebSocketTransformerImpl.new(protocolSelector, compression);
  }
  static upgrade(request, opts) {
    let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
    let compression = opts && 'compression' in opts ? opts.compression : _http.CompressionOptions.compressionDefault;
    return _http._WebSocketTransformerImpl._upgrade(request, protocolSelector, compression);
  }
  static isUpgradeRequest(request) {
    return _http._WebSocketTransformerImpl._isUpgradeRequest(request);
  }
};
(_http.WebSocketTransformer[dart.mixinNew] = function() {
}).prototype = _http.WebSocketTransformer.prototype;
dart.addTypeTests(_http.WebSocketTransformer);
_http.WebSocketTransformer[dart.implements] = () => [StreamTransformerOfHttpRequest$WebSocket()];
dart.setLibraryUri(_http.WebSocketTransformer, "dart:_http");
_http.WebSocket = class WebSocket extends core.Object {
  static connect(url, opts) {
    let protocols = opts && 'protocols' in opts ? opts.protocols : null;
    let headers = opts && 'headers' in opts ? opts.headers : null;
    let compression = opts && 'compression' in opts ? opts.compression : _http.CompressionOptions.compressionDefault;
    return _http._WebSocketImpl.connect(url, protocols, headers, {compression: compression});
  }
  static fromUpgradedSocket(socket, opts) {
    let protocol = opts && 'protocol' in opts ? opts.protocol : null;
    let serverSide = opts && 'serverSide' in opts ? opts.serverSide : null;
    let compression = opts && 'compression' in opts ? opts.compression : _http.CompressionOptions.compressionDefault;
    if (serverSide == null) {
      dart.throw(new core.ArgumentError.new("The serverSide argument must be passed " + "explicitly to WebSocket.fromUpgradedSocket."));
    }
    return new _http._WebSocketImpl._fromSocket(socket, protocol, compression, serverSide);
  }
  static get userAgent() {
    return _http._WebSocketImpl.userAgent;
  }
  static set userAgent(userAgent) {
    _http._WebSocketImpl.userAgent = userAgent;
  }
};
(_http.WebSocket.new = function() {
  this.pingInterval = null;
}).prototype = _http.WebSocket.prototype;
_http.WebSocket.prototype[dart.isStream] = true;
dart.addTypeTests(_http.WebSocket);
_http.WebSocket[dart.implements] = () => [async.Stream, async.StreamSink];
dart.setLibraryUri(_http.WebSocket, "dart:_http");
dart.setFieldSignature(_http.WebSocket, () => ({
  __proto__: dart.getFields(_http.WebSocket.__proto__),
  pingInterval: dart.fieldType(core.Duration)
}));
dart.defineLazy(_http.WebSocket, {
  /*_http.WebSocket.connecting*/get connecting() {
    return 0;
  },
  /*_http.WebSocket.open*/get open() {
    return 1;
  },
  /*_http.WebSocket.closing*/get closing() {
    return 2;
  },
  /*_http.WebSocket.closed*/get closed() {
    return 3;
  },
  /*_http.WebSocket.CONNECTING*/get CONNECTING() {
    return 0;
  },
  /*_http.WebSocket.OPEN*/get OPEN() {
    return 1;
  },
  /*_http.WebSocket.CLOSING*/get CLOSING() {
    return 2;
  },
  /*_http.WebSocket.CLOSED*/get CLOSED() {
    return 3;
  }
});
_http.WebSocketException = class WebSocketException extends core.Object {
  toString() {
    return "WebSocketException: " + dart.str(this.message);
  }
};
(_http.WebSocketException.new = function(message) {
  if (message === void 0) message = "";
  this.message = message;
}).prototype = _http.WebSocketException.prototype;
dart.addTypeTests(_http.WebSocketException);
_http.WebSocketException[dart.implements] = () => [io.IOException];
dart.setLibraryUri(_http.WebSocketException, "dart:_http");
dart.setFieldSignature(_http.WebSocketException, () => ({
  __proto__: dart.getFields(_http.WebSocketException.__proto__),
  message: dart.finalFieldType(core.String)
}));
dart.defineExtensionMethods(_http.WebSocketException, ['toString']);
dart.defineLazy(_http, {
  /*_http._webSocketGUID*/get _webSocketGUID() {
    return "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
  },
  /*_http._clientNoContextTakeover*/get _clientNoContextTakeover() {
    return "client_no_context_takeover";
  },
  /*_http._serverNoContextTakeover*/get _serverNoContextTakeover() {
    return "server_no_context_takeover";
  },
  /*_http._clientMaxWindowBits*/get _clientMaxWindowBits() {
    return "client_max_window_bits";
  },
  /*_http._serverMaxWindowBits*/get _serverMaxWindowBits() {
    return "server_max_window_bits";
  }
});
_http._WebSocketMessageType = class _WebSocketMessageType extends core.Object {};
(_http._WebSocketMessageType.new = function() {
}).prototype = _http._WebSocketMessageType.prototype;
dart.addTypeTests(_http._WebSocketMessageType);
dart.setLibraryUri(_http._WebSocketMessageType, "dart:_http");
dart.defineLazy(_http._WebSocketMessageType, {
  /*_http._WebSocketMessageType.NONE*/get NONE() {
    return 0;
  },
  /*_http._WebSocketMessageType.TEXT*/get TEXT() {
    return 1;
  },
  /*_http._WebSocketMessageType.BINARY*/get BINARY() {
    return 2;
  }
});
_http._WebSocketOpcode = class _WebSocketOpcode extends core.Object {};
(_http._WebSocketOpcode.new = function() {
}).prototype = _http._WebSocketOpcode.prototype;
dart.addTypeTests(_http._WebSocketOpcode);
dart.setLibraryUri(_http._WebSocketOpcode, "dart:_http");
dart.defineLazy(_http._WebSocketOpcode, {
  /*_http._WebSocketOpcode.CONTINUATION*/get CONTINUATION() {
    return 0;
  },
  /*_http._WebSocketOpcode.TEXT*/get TEXT() {
    return 1;
  },
  /*_http._WebSocketOpcode.BINARY*/get BINARY() {
    return 2;
  },
  /*_http._WebSocketOpcode.RESERVED_3*/get RESERVED_3() {
    return 3;
  },
  /*_http._WebSocketOpcode.RESERVED_4*/get RESERVED_4() {
    return 4;
  },
  /*_http._WebSocketOpcode.RESERVED_5*/get RESERVED_5() {
    return 5;
  },
  /*_http._WebSocketOpcode.RESERVED_6*/get RESERVED_6() {
    return 6;
  },
  /*_http._WebSocketOpcode.RESERVED_7*/get RESERVED_7() {
    return 7;
  },
  /*_http._WebSocketOpcode.CLOSE*/get CLOSE() {
    return 8;
  },
  /*_http._WebSocketOpcode.PING*/get PING() {
    return 9;
  },
  /*_http._WebSocketOpcode.PONG*/get PONG() {
    return 10;
  },
  /*_http._WebSocketOpcode.RESERVED_B*/get RESERVED_B() {
    return 11;
  },
  /*_http._WebSocketOpcode.RESERVED_C*/get RESERVED_C() {
    return 12;
  },
  /*_http._WebSocketOpcode.RESERVED_D*/get RESERVED_D() {
    return 13;
  },
  /*_http._WebSocketOpcode.RESERVED_E*/get RESERVED_E() {
    return 14;
  },
  /*_http._WebSocketOpcode.RESERVED_F*/get RESERVED_F() {
    return 15;
  }
});
_http._EncodedString = class _EncodedString extends core.Object {};
(_http._EncodedString.new = function(bytes) {
  this.bytes = bytes;
}).prototype = _http._EncodedString.prototype;
dart.addTypeTests(_http._EncodedString);
dart.setLibraryUri(_http._EncodedString, "dart:_http");
dart.setFieldSignature(_http._EncodedString, () => ({
  __proto__: dart.getFields(_http._EncodedString.__proto__),
  bytes: dart.finalFieldType(ListOfint())
}));
_http._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
  toString() {
    return this.headerValue;
  }
};
(_http._CompressionMaxWindowBits.new = function(headerValue, maxWindowBits) {
  if (headerValue === void 0) headerValue = null;
  if (maxWindowBits === void 0) maxWindowBits = null;
  this.headerValue = headerValue;
  this.maxWindowBits = maxWindowBits;
}).prototype = _http._CompressionMaxWindowBits.prototype;
dart.addTypeTests(_http._CompressionMaxWindowBits);
dart.setLibraryUri(_http._CompressionMaxWindowBits, "dart:_http");
dart.setFieldSignature(_http._CompressionMaxWindowBits, () => ({
  __proto__: dart.getFields(_http._CompressionMaxWindowBits.__proto__),
  headerValue: dart.fieldType(core.String),
  maxWindowBits: dart.fieldType(core.int)
}));
dart.defineExtensionMethods(_http._CompressionMaxWindowBits, ['toString']);
const _serverSide = dart.privateName(_http, "_serverSide");
const _deflate = dart.privateName(_http, "_deflate");
const _fin = dart.privateName(_http, "_fin");
const _compressed = dart.privateName(_http, "_compressed");
const _opcode = dart.privateName(_http, "_opcode");
const _len = dart.privateName(_http, "_len");
const _masked = dart.privateName(_http, "_masked");
const _remainingLenBytes = dart.privateName(_http, "_remainingLenBytes");
const _remainingMaskingKeyBytes = dart.privateName(_http, "_remainingMaskingKeyBytes");
const _remainingPayloadBytes = dart.privateName(_http, "_remainingPayloadBytes");
const _unmaskingIndex = dart.privateName(_http, "_unmaskingIndex");
const _currentMessageType = dart.privateName(_http, "_currentMessageType");
const _eventSink$ = dart.privateName(_http, "_eventSink");
const _maskingBytes = dart.privateName(_http, "_maskingBytes");
const _payload = dart.privateName(_http, "_payload");
const _isControlFrame = dart.privateName(_http, "_isControlFrame");
const _lengthDone = dart.privateName(_http, "_lengthDone");
const _maskDone = dart.privateName(_http, "_maskDone");
const _unmask = dart.privateName(_http, "_unmask");
const _controlFrameEnd = dart.privateName(_http, "_controlFrameEnd");
const _messageFrameEnd = dart.privateName(_http, "_messageFrameEnd");
const _startPayload = dart.privateName(_http, "_startPayload");
const _prepareForNextFrame = dart.privateName(_http, "_prepareForNextFrame");
_http._WebSocketProtocolTransformer = class _WebSocketProtocolTransformer extends async.StreamTransformerBase$(core.List$(core.int), dart.dynamic) {
  bind(stream) {
    StreamOfListOfint()._check(stream);
    return async.Stream.eventTransformed(stream, dart.fn(eventSink => {
      if (this[_eventSink$] != null) {
        dart.throw(new core.StateError.new("WebSocket transformer already used."));
      }
      this[_eventSink$] = eventSink;
      return this;
    }, EventSinkTo_WebSocketProtocolTransformer()));
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_eventSink$].addError(error, stackTrace);
  }
  close() {
    this[_eventSink$].close();
  }
  add(bytes) {
    ListOfint()._check(bytes);
    let buffer = typed_data.Uint8List.is(bytes) ? bytes : typed_data.Uint8List.fromList(bytes);
    let index = 0;
    let lastIndex = buffer[$length];
    if (this[_state$1] === 5) {
      dart.throw(new _http.WebSocketException.new("Data on closed connection"));
    }
    if (this[_state$1] === 6) {
      dart.throw(new _http.WebSocketException.new("Data on failed connection"));
    }
    while (index < dart.notNull(lastIndex) && this[_state$1] !== 5 && this[_state$1] !== 6) {
      let byte = buffer[$_get](index);
      if (dart.notNull(this[_state$1]) <= 2) {
        if (this[_state$1] === 0) {
          this[_fin] = (dart.notNull(byte) & 128) !== 0;
          if ((dart.notNull(byte) & (32 | 16)) !== 0) {
            dart.throw(new _http.WebSocketException.new("Protocol error"));
          }
          this[_opcode] = dart.notNull(byte) & 15;
          if (this[_opcode] !== _http._WebSocketOpcode.CONTINUATION) {
            if ((dart.notNull(byte) & 64) !== 0) {
              this[_compressed] = true;
            } else {
              this[_compressed] = false;
            }
          }
          if (dart.notNull(this[_opcode]) <= _http._WebSocketOpcode.BINARY) {
            if (this[_opcode] === _http._WebSocketOpcode.CONTINUATION) {
              if (this[_currentMessageType] === _http._WebSocketMessageType.NONE) {
                dart.throw(new _http.WebSocketException.new("Protocol error"));
              }
            } else {
              if (!(this[_opcode] === _http._WebSocketOpcode.TEXT || this[_opcode] === _http._WebSocketOpcode.BINARY)) dart.assertFailed(null, "dart:_http/websocket_impl.dart", 163, 22, "_opcode == _WebSocketOpcode.TEXT || _opcode == _WebSocketOpcode.BINARY");
              if (this[_currentMessageType] !== _http._WebSocketMessageType.NONE) {
                dart.throw(new _http.WebSocketException.new("Protocol error"));
              }
              this[_currentMessageType] = this[_opcode];
            }
          } else if (dart.notNull(this[_opcode]) >= _http._WebSocketOpcode.CLOSE && dart.notNull(this[_opcode]) <= _http._WebSocketOpcode.PONG) {
            if (!dart.test(this[_fin])) dart.throw(new _http.WebSocketException.new("Protocol error"));
          } else {
            dart.throw(new _http.WebSocketException.new("Protocol error"));
          }
          this[_state$1] = 1;
        } else if (this[_state$1] === 1) {
          this[_masked] = (dart.notNull(byte) & 128) !== 0;
          this[_len] = dart.notNull(byte) & 127;
          if (dart.test(this[_isControlFrame]()) && dart.notNull(this[_len]) > 125) {
            dart.throw(new _http.WebSocketException.new("Protocol error"));
          }
          if (this[_len] === 126) {
            this[_len] = 0;
            this[_remainingLenBytes] = 2;
            this[_state$1] = 2;
          } else if (this[_len] === 127) {
            this[_len] = 0;
            this[_remainingLenBytes] = 8;
            this[_state$1] = 2;
          } else {
            if (!(dart.notNull(this[_len]) < 126)) dart.assertFailed(null, "dart:_http/websocket_impl.dart", 193, 20, "_len < 126");
            this[_lengthDone]();
          }
        } else {
          if (!(this[_state$1] === 2)) dart.assertFailed(null, "dart:_http/websocket_impl.dart", 197, 18, "_state == LEN_REST");
          this[_len] = (dart.notNull(this[_len]) << 8 | dart.notNull(byte)) >>> 0;
          this[_remainingLenBytes] = dart.notNull(this[_remainingLenBytes]) - 1;
          if (this[_remainingLenBytes] === 0) {
            this[_lengthDone]();
          }
        }
      } else {
        if (this[_state$1] === 3) {
          this[_maskingBytes][$_set](4 - (() => {
            let x = this[_remainingMaskingKeyBytes];
            this[_remainingMaskingKeyBytes] = dart.notNull(x) - 1;
            return x;
          })(), byte);
          if (this[_remainingMaskingKeyBytes] === 0) {
            this[_maskDone]();
          }
        } else {
          if (!(this[_state$1] === 4)) dart.assertFailed(null, "dart:_http/websocket_impl.dart", 211, 18, "_state == PAYLOAD");
          let payloadLength = math.min(core.int, dart.notNull(lastIndex) - index, this[_remainingPayloadBytes]);
          this[_remainingPayloadBytes] = dart.notNull(this[_remainingPayloadBytes]) - payloadLength;
          if (dart.test(this[_masked])) {
            this[_unmask](index, payloadLength, buffer);
          }
          this[_payload].add(typed_data.Uint8List.view(buffer[$buffer], index, payloadLength));
          index = index + payloadLength;
          if (dart.test(this[_isControlFrame]())) {
            if (this[_remainingPayloadBytes] === 0) this[_controlFrameEnd]();
          } else {
            if (this[_currentMessageType] !== _http._WebSocketMessageType.TEXT && this[_currentMessageType] !== _http._WebSocketMessageType.BINARY) {
              dart.throw(new _http.WebSocketException.new("Protocol error"));
            }
            if (this[_remainingPayloadBytes] === 0) this[_messageFrameEnd]();
          }
          index--;
        }
      }
      index++;
    }
  }
  [_unmask](index, length, buffer) {
    let BLOCK_SIZE = 16;
    if (dart.notNull(length) >= BLOCK_SIZE) {
      let startOffset = BLOCK_SIZE - (dart.notNull(index) & 15);
      let end = dart.notNull(index) + startOffset;
      for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
        buffer[$_set](i, (dart.notNull(buffer[$_get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][$_get]((() => {
          let x = this[_unmaskingIndex];
          this[_unmaskingIndex] = dart.notNull(x) + 1;
          return x;
        })() & 3)))) >>> 0);
      }
      index = dart.notNull(index) + startOffset;
      length = dart.notNull(length) - startOffset;
      let blockCount = (dart.notNull(length) / BLOCK_SIZE)[$truncate]();
      if (blockCount > 0) {
        let mask = 0;
        for (let i = 3; i >= 0; i--) {
          mask = (mask << 8 | dart.notNull(core.int._check(this[_maskingBytes][$_get](dart.notNull(this[_unmaskingIndex]) + i & 3)))) >>> 0;
        }
        let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
        let blockBuffer = typed_data.Int32x4List.view(buffer[$buffer], index, blockCount);
        for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
          blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
        }
        let bytes = blockCount * BLOCK_SIZE;
        index = dart.notNull(index) + bytes;
        length = dart.notNull(length) - bytes;
      }
    }
    let end = dart.notNull(index) + dart.notNull(length);
    for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
      buffer[$_set](i, (dart.notNull(buffer[$_get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][$_get]((() => {
        let x = this[_unmaskingIndex];
        this[_unmaskingIndex] = dart.notNull(x) + 1;
        return x;
      })() & 3)))) >>> 0);
    }
  }
  [_lengthDone]() {
    if (dart.test(this[_masked])) {
      if (!dart.test(this[_serverSide])) {
        dart.throw(new _http.WebSocketException.new("Received masked frame from server"));
      }
      this[_state$1] = 3;
    } else {
      if (dart.test(this[_serverSide])) {
        dart.throw(new _http.WebSocketException.new("Received unmasked frame from client"));
      }
      this[_remainingPayloadBytes] = this[_len];
      this[_startPayload]();
    }
  }
  [_maskDone]() {
    this[_remainingPayloadBytes] = this[_len];
    this[_startPayload]();
  }
  [_startPayload]() {
    if (this[_remainingPayloadBytes] === 0) {
      if (dart.test(this[_isControlFrame]())) {
        switch (this[_opcode]) {
          case _http._WebSocketOpcode.CLOSE:
          {
            this[_state$1] = 5;
            this[_eventSink$].close();
            break;
          }
          case _http._WebSocketOpcode.PING:
          {
            this[_eventSink$].add(new _http._WebSocketPing.new());
            break;
          }
          case _http._WebSocketOpcode.PONG:
          {
            this[_eventSink$].add(new _http._WebSocketPong.new());
            break;
          }
        }
        this[_prepareForNextFrame]();
      } else {
        this[_messageFrameEnd]();
      }
    } else {
      this[_state$1] = 4;
    }
  }
  [_messageFrameEnd]() {
    if (dart.test(this[_fin])) {
      let bytes = this[_payload].takeBytes();
      if (this[_deflate] != null && dart.test(this[_compressed])) {
        bytes = this[_deflate].processIncomingMessage(bytes);
      }
      switch (this[_currentMessageType]) {
        case _http._WebSocketMessageType.TEXT:
        {
          this[_eventSink$].add(convert.utf8.decode(bytes));
          break;
        }
        case _http._WebSocketMessageType.BINARY:
        {
          this[_eventSink$].add(bytes);
          break;
        }
      }
      this[_currentMessageType] = _http._WebSocketMessageType.NONE;
    }
    this[_prepareForNextFrame]();
  }
  [_controlFrameEnd]() {
    switch (this[_opcode]) {
      case _http._WebSocketOpcode.CLOSE:
      {
        this.closeCode = _http.WebSocketStatus.NO_STATUS_RECEIVED;
        let payload = this[_payload].takeBytes();
        if (dart.notNull(payload[$length]) > 0) {
          if (payload[$length] === 1) {
            dart.throw(new _http.WebSocketException.new("Protocol error"));
          }
          this.closeCode = (dart.notNull(payload[$_get](0)) << 8 | dart.notNull(payload[$_get](1))) >>> 0;
          if (this.closeCode === _http.WebSocketStatus.NO_STATUS_RECEIVED) {
            dart.throw(new _http.WebSocketException.new("Protocol error"));
          }
          if (dart.notNull(payload[$length]) > 2) {
            this.closeReason = convert.utf8.decode(payload[$sublist](2));
          }
        }
        this[_state$1] = 5;
        this[_eventSink$].close();
        break;
      }
      case _http._WebSocketOpcode.PING:
      {
        this[_eventSink$].add(new _http._WebSocketPing.new(this[_payload].takeBytes()));
        break;
      }
      case _http._WebSocketOpcode.PONG:
      {
        this[_eventSink$].add(new _http._WebSocketPong.new(this[_payload].takeBytes()));
        break;
      }
    }
    this[_prepareForNextFrame]();
  }
  [_isControlFrame]() {
    return this[_opcode] === _http._WebSocketOpcode.CLOSE || this[_opcode] === _http._WebSocketOpcode.PING || this[_opcode] === _http._WebSocketOpcode.PONG;
  }
  [_prepareForNextFrame]() {
    if (this[_state$1] !== 5 && this[_state$1] !== 6) this[_state$1] = 0;
    this[_fin] = false;
    this[_opcode] = -1;
    this[_len] = -1;
    this[_remainingLenBytes] = -1;
    this[_remainingMaskingKeyBytes] = 4;
    this[_remainingPayloadBytes] = -1;
    this[_unmaskingIndex] = 0;
  }
};
(_http._WebSocketProtocolTransformer.new = function(serverSide, deflate) {
  if (serverSide === void 0) serverSide = false;
  if (deflate === void 0) deflate = null;
  this[_state$1] = 0;
  this[_fin] = false;
  this[_compressed] = false;
  this[_opcode] = -1;
  this[_len] = -1;
  this[_masked] = false;
  this[_remainingLenBytes] = -1;
  this[_remainingMaskingKeyBytes] = 4;
  this[_remainingPayloadBytes] = -1;
  this[_unmaskingIndex] = 0;
  this[_currentMessageType] = _http._WebSocketMessageType.NONE;
  this.closeCode = _http.WebSocketStatus.NO_STATUS_RECEIVED;
  this.closeReason = "";
  this[_eventSink$] = null;
  this[_maskingBytes] = core.List.new(4);
  this[_payload] = io.BytesBuilder.new({copy: false});
  this[_serverSide] = serverSide;
  this[_deflate] = deflate;
  _http._WebSocketProtocolTransformer.__proto__.new.call(this);
}).prototype = _http._WebSocketProtocolTransformer.prototype;
dart.addTypeTests(_http._WebSocketProtocolTransformer);
_http._WebSocketProtocolTransformer[dart.implements] = () => [EventSinkOfListOfint()];
dart.setMethodSignature(_http._WebSocketProtocolTransformer, () => ({
  __proto__: dart.getMethods(_http._WebSocketProtocolTransformer.__proto__),
  bind: dart.fnType(async.Stream, [core.Object]),
  addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
  close: dart.fnType(dart.void, []),
  add: dart.fnType(dart.void, [core.Object]),
  [_unmask]: dart.fnType(dart.void, [core.int, core.int, typed_data.Uint8List]),
  [_lengthDone]: dart.fnType(dart.void, []),
  [_maskDone]: dart.fnType(dart.void, []),
  [_startPayload]: dart.fnType(dart.void, []),
  [_messageFrameEnd]: dart.fnType(dart.void, []),
  [_controlFrameEnd]: dart.fnType(dart.void, []),
  [_isControlFrame]: dart.fnType(core.bool, []),
  [_prepareForNextFrame]: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(_http._WebSocketProtocolTransformer, "dart:_http");
dart.setFieldSignature(_http._WebSocketProtocolTransformer, () => ({
  __proto__: dart.getFields(_http._WebSocketProtocolTransformer.__proto__),
  [_state$1]: dart.fieldType(core.int),
  [_fin]: dart.fieldType(core.bool),
  [_compressed]: dart.fieldType(core.bool),
  [_opcode]: dart.fieldType(core.int),
  [_len]: dart.fieldType(core.int),
  [_masked]: dart.fieldType(core.bool),
  [_remainingLenBytes]: dart.fieldType(core.int),
  [_remainingMaskingKeyBytes]: dart.fieldType(core.int),
  [_remainingPayloadBytes]: dart.fieldType(core.int),
  [_unmaskingIndex]: dart.fieldType(core.int),
  [_currentMessageType]: dart.fieldType(core.int),
  closeCode: dart.fieldType(core.int),
  closeReason: dart.fieldType(core.String),
  [_eventSink$]: dart.fieldType(async.EventSink),
  [_serverSide]: dart.finalFieldType(core.bool),
  [_maskingBytes]: dart.finalFieldType(core.List),
  [_payload]: dart.finalFieldType(io.BytesBuilder),
  [_deflate]: dart.fieldType(_http._WebSocketPerMessageDeflate)
}));
dart.defineLazy(_http._WebSocketProtocolTransformer, {
  /*_http._WebSocketProtocolTransformer.START*/get START() {
    return 0;
  },
  /*_http._WebSocketProtocolTransformer.LEN_FIRST*/get LEN_FIRST() {
    return 1;
  },
  /*_http._WebSocketProtocolTransformer.LEN_REST*/get LEN_REST() {
    return 2;
  },
  /*_http._WebSocketProtocolTransformer.MASK*/get MASK() {
    return 3;
  },
  /*_http._WebSocketProtocolTransformer.PAYLOAD*/get PAYLOAD() {
    return 4;
  },
  /*_http._WebSocketProtocolTransformer.CLOSED*/get CLOSED() {
    return 5;
  },
  /*_http._WebSocketProtocolTransformer.FAILURE*/get FAILURE() {
    return 6;
  },
  /*_http._WebSocketProtocolTransformer.FIN*/get FIN() {
    return 128;
  },
  /*_http._WebSocketProtocolTransformer.RSV1*/get RSV1() {
    return 64;
  },
  /*_http._WebSocketProtocolTransformer.RSV2*/get RSV2() {
    return 32;
  },
  /*_http._WebSocketProtocolTransformer.RSV3*/get RSV3() {
    return 16;
  },
  /*_http._WebSocketProtocolTransformer.OPCODE*/get OPCODE() {
    return 15;
  }
});
_http._WebSocketPing = class _WebSocketPing extends core.Object {};
(_http._WebSocketPing.new = function(payload) {
  if (payload === void 0) payload = null;
  this.payload = payload;
}).prototype = _http._WebSocketPing.prototype;
dart.addTypeTests(_http._WebSocketPing);
dart.setLibraryUri(_http._WebSocketPing, "dart:_http");
dart.setFieldSignature(_http._WebSocketPing, () => ({
  __proto__: dart.getFields(_http._WebSocketPing.__proto__),
  payload: dart.finalFieldType(ListOfint())
}));
_http._WebSocketPong = class _WebSocketPong extends core.Object {};
(_http._WebSocketPong.new = function(payload) {
  if (payload === void 0) payload = null;
  this.payload = payload;
}).prototype = _http._WebSocketPong.prototype;
dart.addTypeTests(_http._WebSocketPong);
dart.setLibraryUri(_http._WebSocketPong, "dart:_http");
dart.setFieldSignature(_http._WebSocketPong, () => ({
  __proto__: dart.getFields(_http._WebSocketPong.__proto__),
  payload: dart.finalFieldType(ListOfint())
}));
const _protocolSelector = dart.privateName(_http, "_protocolSelector");
const _compression = dart.privateName(_http, "_compression");
_http._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends async.StreamTransformerBase$(_http.HttpRequest, _http.WebSocket) {
  bind(stream) {
    StreamOfHttpRequest()._check(stream);
    stream.listen(dart.fn(request => {
      _http._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void, dart.fn(webSocket => this[_controller$1].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$1], 'addError'));
    }, HttpRequestToNull()), {onDone: dart.fn(() => {
        this[_controller$1].close();
      }, VoidToNull())});
    return this[_controller$1].stream;
  }
  static _tokenizeFieldValue(headerValue) {
    let tokens = JSArrayOfString().of([]);
    let start = 0;
    let index = 0;
    while (index < headerValue.length) {
      if (headerValue[$_get](index) === ",") {
        tokens[$add](headerValue[$substring](start, index));
        start = index + 1;
      } else if (headerValue[$_get](index) === " " || headerValue[$_get](index) === "\t") {
        start++;
      }
      index++;
    }
    tokens[$add](headerValue[$substring](start, index));
    return tokens;
  }
  static _upgrade(request, _protocolSelector, compression) {
    let response = request.response;
    if (!dart.test(_http._WebSocketTransformerImpl._isUpgradeRequest(request))) {
      response.statusCode = _internal.HttpStatus.badRequest;
      response.close();
      return FutureOfWebSocket().error(new _http.WebSocketException.new("Invalid WebSocket upgrade request"));
    }
    function upgrade(protocol) {
      response.statusCode = _internal.HttpStatus.switchingProtocols;
      response.headers.add(_http.HttpHeaders.connectionHeader, "Upgrade");
      response.headers.add(_http.HttpHeaders.upgradeHeader, "websocket");
      let key = request.headers.value("Sec-WebSocket-Key");
      let sha1 = new _http._SHA1.new();
      sha1.add((dart.str(key) + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")[$codeUnits]);
      let accept = _http._CryptoUtils.bytesToBase64(sha1.close());
      response.headers.add("Sec-WebSocket-Accept", accept);
      if (protocol != null) {
        response.headers.add("Sec-WebSocket-Protocol", protocol);
      }
      let deflate = _http._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
      response.headers.contentLength = 0;
      return FutureOfWebSocket()._check(response.detachSocket().then(_http.WebSocket, dart.fn(socket => new _http._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl())));
    }
    dart.fn(upgrade, StringToFutureOfWebSocket());
    let protocols = request.headers._get("Sec-WebSocket-Protocol");
    if (protocols != null && _protocolSelector != null) {
      protocols = _http._WebSocketTransformerImpl._tokenizeFieldValue(protocols[$join](", "));
      return FutureOfWebSocket()._check(FutureOfString()._check(FutureOfString().new(dart.fn(() => FutureOrOfString()._check(_protocolSelector(protocols)), VoidToFutureOrOfString())).then(core.String, dart.fn(protocol => {
        if (dart.notNull(protocols[$indexOf](protocol)) < 0) {
          dart.throw(new _http.WebSocketException.new("Selected protocol is not in the list of available protocols"));
        }
        return protocol;
      }, StringToString()))).catchError(dart.fn(error => {
        response.statusCode = _internal.HttpStatus.internalServerError;
        response.close();
        dart.throw(error);
      }, dynamicToNull())).then(_http.WebSocket, upgrade));
    } else {
      return upgrade(null);
    }
  }
  static _negotiateCompression(request, response, compression) {
    let extensionHeader = request.headers.value("Sec-WebSocket-Extensions");
    let t = extensionHeader;
    t == null ? extensionHeader = "" : t;
    let hv = _http.HeaderValue.parse(extensionHeader, {valueSeparator: ","});
    if (dart.test(compression.enabled) && hv.value === _http._WebSocketImpl.PER_MESSAGE_DEFLATE) {
      let info = compression[_createHeader](hv);
      response.headers.add("Sec-WebSocket-Extensions", info.headerValue);
      let serverNoContextTakeover = dart.test(hv.parameters[$containsKey]("server_no_context_takeover")) && dart.test(compression.serverNoContextTakeover);
      let clientNoContextTakeover = dart.test(hv.parameters[$containsKey]("client_no_context_takeover")) && dart.test(compression.clientNoContextTakeover);
      let deflate = new _http._WebSocketPerMessageDeflate.new({serverNoContextTakeover: serverNoContextTakeover, clientNoContextTakeover: clientNoContextTakeover, serverMaxWindowBits: info.maxWindowBits, clientMaxWindowBits: info.maxWindowBits, serverSide: true});
      return deflate;
    }
    return null;
  }
  static _isUpgradeRequest(request) {
    if (request.method !== "GET") {
      return false;
    }
    if (request.headers._get(_http.HttpHeaders.connectionHeader) == null) {
      return false;
    }
    let isUpgrade = false;
    request.headers._get(_http.HttpHeaders.connectionHeader)[$forEach](dart.fn(value => {
      if (value[$toLowerCase]() === "upgrade") isUpgrade = true;
    }, StringToNull()));
    if (!isUpgrade) return false;
    let upgrade = request.headers.value(_http.HttpHeaders.upgradeHeader);
    if (upgrade == null || upgrade[$toLowerCase]() !== "websocket") {
      return false;
    }
    let version = request.headers.value("Sec-WebSocket-Version");
    if (version == null || version !== "13") {
      return false;
    }
    let key = request.headers.value("Sec-WebSocket-Key");
    if (key == null) {
      return false;
    }
    return true;
  }
};
(_http._WebSocketTransformerImpl.new = function(protocolSelector, compression) {
  this[_controller$1] = StreamControllerOfWebSocket().new({sync: true});
  this[_protocolSelector] = protocolSelector;
  this[_compression] = compression;
  _http._WebSocketTransformerImpl.__proto__.new.call(this);
}).prototype = _http._WebSocketTransformerImpl.prototype;
dart.addTypeTests(_http._WebSocketTransformerImpl);
_http._WebSocketTransformerImpl[dart.implements] = () => [_http.WebSocketTransformer];
dart.setMethodSignature(_http._WebSocketTransformerImpl, () => ({
  __proto__: dart.getMethods(_http._WebSocketTransformerImpl.__proto__),
  bind: dart.fnType(async.Stream$(_http.WebSocket), [core.Object])
}));
dart.setLibraryUri(_http._WebSocketTransformerImpl, "dart:_http");
dart.setFieldSignature(_http._WebSocketTransformerImpl, () => ({
  __proto__: dart.getFields(_http._WebSocketTransformerImpl.__proto__),
  [_controller$1]: dart.finalFieldType(StreamControllerOfWebSocket()),
  [_protocolSelector]: dart.finalFieldType(ListOfStringTodynamic()),
  [_compression]: dart.finalFieldType(_http.CompressionOptions)
}));
const _ensureDecoder = dart.privateName(_http, "_ensureDecoder");
const _ensureEncoder = dart.privateName(_http, "_ensureEncoder");
let const$106;
_http._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
  [_ensureDecoder]() {
    if (this.decoder == null) {
      this.decoder = io.RawZLibFilter.inflateFilter({windowBits: dart.test(this.serverSide) ? this.clientMaxWindowBits : this.serverMaxWindowBits, raw: true});
    }
  }
  [_ensureEncoder]() {
    if (this.encoder == null) {
      this.encoder = io.RawZLibFilter.deflateFilter({windowBits: dart.test(this.serverSide) ? this.serverMaxWindowBits : this.clientMaxWindowBits, raw: true});
    }
  }
  processIncomingMessage(msg) {
    this[_ensureDecoder]();
    let data = JSArrayOfint().of([]);
    data[$addAll](msg);
    data[$addAll](const$106 || (const$106 = dart.constList([0, 0, 255, 255], core.int)));
    this.decoder.process(data, 0, data[$length]);
    let result = JSArrayOfint().of([]);
    let out = null;
    while ((out = this.decoder.processed()) != null) {
      result[$addAll](out);
    }
    if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
      this.decoder = null;
    }
    return typed_data.Uint8List.fromList(result);
  }
  processOutgoingMessage(msg) {
    this[_ensureEncoder]();
    let result = JSArrayOfint().of([]);
    let buffer = null;
    if (!typed_data.Uint8List.is(msg)) {
      for (let i = 0; i < dart.notNull(msg[$length]); i++) {
        if (dart.notNull(msg[$_get](i)) < 0 || 255 < dart.notNull(msg[$_get](i))) {
          dart.throw(new core.ArgumentError.new("List element is not a byte value " + ("(value " + dart.str(msg[$_get](i)) + " at index " + dart.str(i) + ")")));
        }
      }
      buffer = typed_data.Uint8List.fromList(msg);
    } else {
      buffer = typed_data.Uint8List._check(msg);
    }
    this.encoder.process(buffer, 0, buffer[$length]);
    let out = null;
    while ((out = this.encoder.processed()) != null) {
      result[$addAll](out);
    }
    if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
      this.encoder = null;
    }
    if (dart.notNull(result[$length]) > 4) {
      result = result[$sublist](0, dart.notNull(result[$length]) - 4);
    }
    if (result[$length] === 0) {
      return JSArrayOfint().of([0]);
    }
    return result;
  }
};
(_http._WebSocketPerMessageDeflate.new = function(opts) {
  let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : _http._WebSocketImpl.DEFAULT_WINDOW_BITS;
  let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : _http._WebSocketImpl.DEFAULT_WINDOW_BITS;
  let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
  let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
  let serverSide = opts && 'serverSide' in opts ? opts.serverSide : false;
  this.decoder = null;
  this.encoder = null;
  this.clientMaxWindowBits = clientMaxWindowBits;
  this.serverMaxWindowBits = serverMaxWindowBits;
  this.serverNoContextTakeover = serverNoContextTakeover;
  this.clientNoContextTakeover = clientNoContextTakeover;
  this.serverSide = serverSide;
}).prototype = _http._WebSocketPerMessageDeflate.prototype;
dart.addTypeTests(_http._WebSocketPerMessageDeflate);
dart.setMethodSignature(_http._WebSocketPerMessageDeflate, () => ({
  __proto__: dart.getMethods(_http._WebSocketPerMessageDeflate.__proto__),
  [_ensureDecoder]: dart.fnType(dart.void, []),
  [_ensureEncoder]: dart.fnType(dart.void, []),
  processIncomingMessage: dart.fnType(typed_data.Uint8List, [core.List$(core.int)]),
  processOutgoingMessage: dart.fnType(core.List$(core.int), [core.List$(core.int)])
}));
dart.setLibraryUri(_http._WebSocketPerMessageDeflate, "dart:_http");
dart.setFieldSignature(_http._WebSocketPerMessageDeflate, () => ({
  __proto__: dart.getFields(_http._WebSocketPerMessageDeflate.__proto__),
  serverNoContextTakeover: dart.fieldType(core.bool),
  clientNoContextTakeover: dart.fieldType(core.bool),
  clientMaxWindowBits: dart.fieldType(core.int),
  serverMaxWindowBits: dart.fieldType(core.int),
  serverSide: dart.fieldType(core.bool),
  decoder: dart.fieldType(io.RawZLibFilter),
  encoder: dart.fieldType(io.RawZLibFilter)
}));
const _deflateHelper = dart.privateName(_http, "_deflateHelper");
const _outCloseCode = dart.privateName(_http, "_outCloseCode");
const _outCloseReason = dart.privateName(_http, "_outCloseReason");
_http._WebSocketOutgoingTransformer = class _WebSocketOutgoingTransformer extends async.StreamTransformerBase$(dart.dynamic, core.List$(core.int)) {
  bind(stream) {
    return StreamOfListOfint().eventTransformed(stream, dart.fn(eventSink => {
      if (this[_eventSink$] != null) {
        dart.throw(new core.StateError.new("WebSocket transformer already used"));
      }
      this[_eventSink$] = eventSink;
      return this;
    }, EventSinkOfListOfintTo_WebSocketOutgoingTransformer()));
  }
  add(message) {
    if (_http._WebSocketPong.is(message)) {
      this.addFrame(_http._WebSocketOpcode.PONG, message.payload);
      return;
    }
    if (_http._WebSocketPing.is(message)) {
      this.addFrame(_http._WebSocketOpcode.PING, message.payload);
      return;
    }
    let data = null;
    let opcode = null;
    if (message != null) {
      if (typeof message == 'string') {
        opcode = _http._WebSocketOpcode.TEXT;
        data = convert.utf8.encode(message);
      } else if (ListOfint().is(message)) {
        opcode = _http._WebSocketOpcode.BINARY;
        data = message;
      } else if (_http._EncodedString.is(message)) {
        opcode = _http._WebSocketOpcode.TEXT;
        data = message.bytes;
      } else {
        dart.throw(new core.ArgumentError.new(message));
      }
      if (this[_deflateHelper] != null) {
        data = this[_deflateHelper].processOutgoingMessage(data);
      }
    } else {
      opcode = _http._WebSocketOpcode.TEXT;
    }
    this.addFrame(opcode, data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_eventSink$].addError(error, stackTrace);
  }
  close() {
    let code = this.webSocket[_outCloseCode];
    let reason = this.webSocket[_outCloseReason];
    let data = null;
    if (code != null) {
      data = JSArrayOfint().of([]);
      data[$add](dart.notNull(code) >> 8 & 255);
      data[$add](dart.notNull(code) & 255);
      if (reason != null) {
        data[$addAll](convert.utf8.encode(reason));
      }
    }
    this.addFrame(_http._WebSocketOpcode.CLOSE, data);
    this[_eventSink$].close();
  }
  addFrame(opcode, data) {
    _http._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode === _http._WebSocketOpcode.TEXT || opcode === _http._WebSocketOpcode.BINARY))[$forEach](dart.fn(e => {
      this[_eventSink$].add(e);
    }, ListOfintToNull()));
  }
  static createFrame(opcode, data, serverSide, compressed) {
    let mask = !dart.test(serverSide);
    let dataLength = data == null ? 0 : data[$length];
    let headerSize = mask ? 6 : 2;
    if (dart.notNull(dataLength) > 65535) {
      headerSize = headerSize + 8;
    } else if (dart.notNull(dataLength) > 125) {
      headerSize = headerSize + 2;
    }
    let header = typed_data.Uint8List.new(headerSize);
    let index = 0;
    let hoc = (_http._WebSocketProtocolTransformer.FIN | (dart.test(compressed) ? _http._WebSocketProtocolTransformer.RSV1 : 0) | dart.notNull(opcode) & _http._WebSocketProtocolTransformer.OPCODE) >>> 0;
    header[$_set](index++, hoc);
    let lengthBytes = 1;
    if (dart.notNull(dataLength) > 65535) {
      header[$_set](index++, 127);
      lengthBytes = 8;
    } else if (dart.notNull(dataLength) > 125) {
      header[$_set](index++, 126);
      lengthBytes = 2;
    }
    for (let i = 0; i < lengthBytes; i++) {
      header[$_set](index++, dataLength[$rightShift]((lengthBytes - 1 - i) * 8) & 255);
    }
    if (mask) {
      let i$ = 1;
      header[$_set](i$, (dart.notNull(header[$_get](i$)) | 1 << 7) >>> 0);
      let maskBytes = _http._CryptoUtils.getRandomBytes(4);
      header[$setRange](index, index + 4, maskBytes);
      index = index + 4;
      if (data != null) {
        let list = null;
        if (opcode === _http._WebSocketOpcode.TEXT && typed_data.Uint8List.is(data)) {
          list = data;
        } else {
          if (typed_data.Uint8List.is(data)) {
            list = typed_data.Uint8List.fromList(data);
          } else {
            list = typed_data.Uint8List.new(data[$length]);
            for (let i = 0; i < dart.notNull(data[$length]); i++) {
              if (dart.notNull(data[$_get](i)) < 0 || 255 < dart.notNull(data[$_get](i))) {
                dart.throw(new core.ArgumentError.new("List element is not a byte value " + ("(value " + dart.str(data[$_get](i)) + " at index " + dart.str(i) + ")")));
              }
              list[$_set](i, data[$_get](i));
            }
          }
        }
        let BLOCK_SIZE = 16;
        let blockCount = (dart.notNull(list[$length]) / BLOCK_SIZE)[$truncate]();
        if (blockCount > 0) {
          let mask = 0;
          for (let i = 3; i >= 0; i--) {
            mask = (mask << 8 | dart.notNull(maskBytes[$_get](i))) >>> 0;
          }
          let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
          let blockBuffer = typed_data.Int32x4List.view(list[$buffer], 0, blockCount);
          for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
            blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
          }
        }
        for (let i = blockCount * BLOCK_SIZE; i < dart.notNull(list[$length]); i++) {
          list[$_set](i, (dart.notNull(list[$_get](i)) ^ dart.notNull(maskBytes[$_get](i & 3))) >>> 0);
        }
        data = list;
      }
    }
    if (!(index === headerSize)) dart.assertFailed(null, "dart:_http/websocket_impl.dart", 835, 12, "index == headerSize");
    if (data == null) {
      return JSArrayOfListOfint().of([header]);
    } else {
      return JSArrayOfListOfint().of([header, data]);
    }
  }
};
(_http._WebSocketOutgoingTransformer.new = function(webSocket) {
  this[_eventSink$] = null;
  this[_deflateHelper] = null;
  this.webSocket = webSocket;
  _http._WebSocketOutgoingTransformer.__proto__.new.call(this);
  this[_deflateHelper] = this.webSocket[_deflate];
}).prototype = _http._WebSocketOutgoingTransformer.prototype;
dart.addTypeTests(_http._WebSocketOutgoingTransformer);
_http._WebSocketOutgoingTransformer[dart.implements] = () => [async.EventSink];
dart.setMethodSignature(_http._WebSocketOutgoingTransformer, () => ({
  __proto__: dart.getMethods(_http._WebSocketOutgoingTransformer.__proto__),
  bind: dart.fnType(async.Stream$(core.List$(core.int)), [async.Stream]),
  add: dart.fnType(dart.void, [dart.dynamic]),
  addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
  close: dart.fnType(dart.void, []),
  addFrame: dart.fnType(dart.void, [core.int, core.List$(core.int)])
}));
dart.setLibraryUri(_http._WebSocketOutgoingTransformer, "dart:_http");
dart.setFieldSignature(_http._WebSocketOutgoingTransformer, () => ({
  __proto__: dart.getFields(_http._WebSocketOutgoingTransformer.__proto__),
  webSocket: dart.finalFieldType(_http._WebSocketImpl),
  [_eventSink$]: dart.fieldType(EventSinkOfListOfint()),
  [_deflateHelper]: dart.fieldType(_http._WebSocketPerMessageDeflate)
}));
const _issuedPause = dart.privateName(_http, "_issuedPause");
const _closed$ = dart.privateName(_http, "_closed");
const _closeCompleter$ = dart.privateName(_http, "_closeCompleter");
const _completer = dart.privateName(_http, "_completer");
const _onListen$ = dart.privateName(_http, "_onListen");
const _onPause$ = dart.privateName(_http, "_onPause");
const _onResume$ = dart.privateName(_http, "_onResume");
const _cancel$ = dart.privateName(_http, "_cancel");
const _done = dart.privateName(_http, "_done");
const _ensureController = dart.privateName(_http, "_ensureController");
_http._WebSocketConsumer = class _WebSocketConsumer extends core.Object {
  [_onListen$]() {
    if (this[_subscription$0] != null) {
      this[_subscription$0].cancel();
    }
  }
  [_onPause$]() {
    if (this[_subscription$0] != null) {
      this[_subscription$0].pause();
    } else {
      this[_issuedPause] = true;
    }
  }
  [_onResume$]() {
    if (this[_subscription$0] != null) {
      this[_subscription$0].resume();
    } else {
      this[_issuedPause] = false;
    }
  }
  [_cancel$]() {
    if (this[_subscription$0] != null) {
      let subscription = this[_subscription$0];
      this[_subscription$0] = null;
      subscription.cancel();
    }
  }
  [_ensureController]() {
    if (this[_controller$1] != null) return;
    this[_controller$1] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause$), onResume: dart.bind(this, _onResume$), onCancel: dart.bind(this, _onListen$)});
    let stream = StreamOfListOfint()._check(this[_controller$1].stream.transform(ListOfint(), new _http._WebSocketOutgoingTransformer.new(this.webSocket)));
    FutureOfNull()._check(this.socket.addStream(stream).then(core.Null, dart.fn(_ => {
      this[_done]();
      this[_closeCompleter$].complete(this.webSocket);
    }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
        this[_closed$] = true;
        this[_cancel$]();
        if (core.ArgumentError.is(error)) {
          if (!dart.test(this[_done](error, stackTrace))) {
            this[_closeCompleter$].completeError(error, stackTrace);
          }
        } else {
          this[_done]();
          this[_closeCompleter$].complete(this.webSocket);
        }
      }, dynamicAndStackTraceToNull())}));
  }
  [_done](error, stackTrace) {
    if (error === void 0) error = null;
    if (stackTrace === void 0) stackTrace = null;
    if (this[_completer] == null) return false;
    if (error != null) {
      this[_completer].completeError(error, stackTrace);
    } else {
      this[_completer].complete(this.webSocket);
    }
    this[_completer] = null;
    return true;
  }
  addStream(stream) {
    if (dart.test(this[_closed$])) {
      stream.listen(null).cancel();
      return async.Future.value(this.webSocket);
    }
    this[_ensureController]();
    this[_completer] = async.Completer.new();
    this[_subscription$0] = stream.listen(dart.fn(data => {
      this[_controller$1].add(data);
    }, dynamicToNull()), {onDone: dart.bind(this, _done), onError: dart.bind(this, _done), cancelOnError: true});
    if (dart.test(this[_issuedPause])) {
      this[_subscription$0].pause();
      this[_issuedPause] = false;
    }
    return this[_completer].future;
  }
  close() {
    this[_ensureController]();
    const closeSocket = () => {
      return this.socket.close().catchError(dart.fn(_ => {
      }, dynamicToNull())).then(dart.dynamic, dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
    };
    dart.fn(closeSocket, VoidToFuture());
    this[_controller$1].close();
    return this[_closeCompleter$].future.then(dart.dynamic, dart.fn(_ => closeSocket(), dynamicToFuture()));
  }
  add(data) {
    if (dart.test(this[_closed$])) return;
    this[_ensureController]();
    this[_controller$1].add(data);
  }
  closeSocket() {
    this[_closed$] = true;
    this[_cancel$]();
    this.close();
  }
};
(_http._WebSocketConsumer.new = function(webSocket, socket) {
  this[_controller$1] = null;
  this[_subscription$0] = null;
  this[_issuedPause] = false;
  this[_closed$] = false;
  this[_closeCompleter$] = CompleterOfWebSocket().new();
  this[_completer] = null;
  this.webSocket = webSocket;
  this.socket = socket;
}).prototype = _http._WebSocketConsumer.prototype;
dart.addTypeTests(_http._WebSocketConsumer);
_http._WebSocketConsumer[dart.implements] = () => [async.StreamConsumer];
dart.setMethodSignature(_http._WebSocketConsumer, () => ({
  __proto__: dart.getMethods(_http._WebSocketConsumer.__proto__),
  [_onListen$]: dart.fnType(dart.void, []),
  [_onPause$]: dart.fnType(dart.void, []),
  [_onResume$]: dart.fnType(dart.void, []),
  [_cancel$]: dart.fnType(dart.void, []),
  [_ensureController]: dart.fnType(dart.dynamic, []),
  [_done]: dart.fnType(core.bool, [], [dart.dynamic, core.StackTrace]),
  addStream: dart.fnType(async.Future, [async.Stream]),
  close: dart.fnType(async.Future, []),
  add: dart.fnType(dart.void, [dart.dynamic]),
  closeSocket: dart.fnType(dart.void, [])
}));
dart.setLibraryUri(_http._WebSocketConsumer, "dart:_http");
dart.setFieldSignature(_http._WebSocketConsumer, () => ({
  __proto__: dart.getFields(_http._WebSocketConsumer.__proto__),
  webSocket: dart.finalFieldType(_http._WebSocketImpl),
  socket: dart.finalFieldType(io.Socket),
  [_controller$1]: dart.fieldType(async.StreamController),
  [_subscription$0]: dart.fieldType(async.StreamSubscription),
  [_issuedPause]: dart.fieldType(core.bool),
  [_closed$]: dart.fieldType(core.bool),
  [_closeCompleter$]: dart.fieldType(async.Completer),
  [_completer]: dart.fieldType(async.Completer)
}));
const _sink$1 = dart.privateName(_http, "_sink");
const _readyState = dart.privateName(_http, "_readyState");
const _writeClosed = dart.privateName(_http, "_writeClosed");
const _closeCode = dart.privateName(_http, "_closeCode");
const _closeReason = dart.privateName(_http, "_closeReason");
const _pingInterval = dart.privateName(_http, "_pingInterval");
const _pingTimer = dart.privateName(_http, "_pingTimer");
const _consumer = dart.privateName(_http, "_consumer");
const _closeTimer = dart.privateName(_http, "_closeTimer");
const _close$0 = dart.privateName(_http, "_close");
let const$107;
const Stream__ServiceObject$$ = class Stream__ServiceObject extends async.Stream {};
(Stream__ServiceObject$$.new = function() {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$$.__proto__.new.call(this);
}).prototype = Stream__ServiceObject$$.prototype;
(Stream__ServiceObject$$._internal = function() {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$$.__proto__._internal.call(this);
}).prototype = Stream__ServiceObject$$.prototype;
(Stream__ServiceObject$$.empty = function() {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$$.__proto__.empty.call(this);
}).prototype = Stream__ServiceObject$$.prototype;
(Stream__ServiceObject$$.fromFuture = function(future) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$$.__proto__.fromFuture.call(this, future);
}).prototype = Stream__ServiceObject$$.prototype;
(Stream__ServiceObject$$.fromFutures = function(futures) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$$.__proto__.fromFutures.call(this, futures);
}).prototype = Stream__ServiceObject$$.prototype;
(Stream__ServiceObject$$.fromIterable = function(elements) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$$.__proto__.fromIterable.call(this, elements);
}).prototype = Stream__ServiceObject$$.prototype;
(Stream__ServiceObject$$.periodic = function(period, computation) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$$.__proto__.periodic.call(this, period, computation);
}).prototype = Stream__ServiceObject$$.prototype;
(Stream__ServiceObject$$.eventTransformed = function(source, mapSink) {
  _http._ServiceObject.new.call(this);
  Stream__ServiceObject$$.__proto__.eventTransformed.call(this, source, mapSink);
}).prototype = Stream__ServiceObject$$.prototype;
dart.applyMixin(Stream__ServiceObject$$, _http._ServiceObject);
_http._WebSocketImpl = class _WebSocketImpl extends Stream__ServiceObject$$ {
  static connect(url, protocols, headers, opts) {
    let compression = opts && 'compression' in opts ? opts.compression : _http.CompressionOptions.compressionDefault;
    let uri = core.Uri.parse(url);
    if (uri.scheme !== "ws" && uri.scheme !== "wss") {
      dart.throw(new _http.WebSocketException.new("Unsupported URL scheme '" + dart.str(uri.scheme) + "'"));
    }
    let random = math.Random.new();
    let nonceData = typed_data.Uint8List.new(16);
    for (let i = 0; i < 16; i++) {
      nonceData[$_set](i, random.nextInt(256));
    }
    let nonce = _http._CryptoUtils.bytesToBase64(nonceData);
    uri = core.Uri.new({scheme: uri.scheme === "wss" ? "https" : "http", userInfo: uri.userInfo, host: uri.host, port: uri.port, path: uri.path, query: uri.query, fragment: uri.fragment});
    return FutureOfWebSocket()._check(FutureOfHttpClientResponse()._check(_http._WebSocketImpl._httpClient.openUrl("GET", uri).then(_http.HttpClientResponse, dart.fn(request => {
      if (uri.userInfo != null && !uri.userInfo[$isEmpty]) {
        let auth = _http._CryptoUtils.bytesToBase64(convert.utf8.encode(uri.userInfo));
        request.headers.set(_http.HttpHeaders.authorizationHeader, "Basic " + dart.str(auth));
      }
      if (headers != null) {
        headers[$forEach](dart.fn((field, value) => request.headers.add(field, value), StringAnddynamicTovoid()));
      }
      let _ = request.headers;
      _.set(_http.HttpHeaders.connectionHeader, "Upgrade");
      _.set(_http.HttpHeaders.upgradeHeader, "websocket");
      _.set("Sec-WebSocket-Key", nonce);
      _.set("Cache-Control", "no-cache");
      _.set("Sec-WebSocket-Version", "13");
      if (protocols != null) {
        request.headers.add("Sec-WebSocket-Protocol", protocols[$toList]());
      }
      if (dart.test(compression.enabled)) {
        request.headers.add("Sec-WebSocket-Extensions", compression[_createHeader]());
      }
      return request.close();
    }, HttpClientRequestToFutureOfHttpClientResponse()))).then(_http.WebSocket, dart.fn(response => {
      function error(message) {
        FutureOfNull()._check(response.detachSocket().then(core.Null, dart.fn(socket => {
          socket.destroy();
        }, SocketToNull())));
        dart.throw(new _http.WebSocketException.new(message));
      }
      dart.fn(error, StringTovoid());
      if (response.statusCode !== _internal.HttpStatus.switchingProtocols || response.headers._get(_http.HttpHeaders.connectionHeader) == null || !dart.test(response.headers._get(_http.HttpHeaders.connectionHeader)[$any](dart.fn(value => value[$toLowerCase]() === "upgrade", StringTobool()))) || response.headers.value(_http.HttpHeaders.upgradeHeader)[$toLowerCase]() !== "websocket") {
        error("Connection to '" + dart.str(uri) + "' was not upgraded to websocket");
      }
      let accept = response.headers.value("Sec-WebSocket-Accept");
      if (accept == null) {
        error("Response did not contain a 'Sec-WebSocket-Accept' header");
      }
      let sha1 = new _http._SHA1.new();
      sha1.add((dart.str(nonce) + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")[$codeUnits]);
      let expectedAccept = sha1.close();
      let receivedAccept = _http._CryptoUtils.base64StringToBytes(accept);
      if (expectedAccept[$length] != receivedAccept[$length]) {
        error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
      }
      for (let i = 0; i < dart.notNull(expectedAccept[$length]); i++) {
        if (expectedAccept[$_get](i) != receivedAccept[$_get](i)) {
          error("Bad response 'Sec-WebSocket-Accept' header");
        }
      }
      let protocol = response.headers.value("Sec-WebSocket-Protocol");
      let deflate = _http._WebSocketImpl.negotiateClientCompression(response, compression);
      return FutureOfWebSocket()._check(response.detachSocket().then(_http.WebSocket, dart.fn(socket => new _http._WebSocketImpl._fromSocket(socket, protocol, compression, false, deflate), SocketTo_WebSocketImpl())));
    }, HttpClientResponseToFutureOfWebSocket())));
  }
  static negotiateClientCompression(response, compression) {
    let extensionHeader = response.headers.value("Sec-WebSocket-Extensions");
    if (extensionHeader == null) {
      extensionHeader = "";
    }
    let hv = _http.HeaderValue.parse(extensionHeader, {valueSeparator: ","});
    if (dart.test(compression.enabled) && hv.value === "permessage-deflate") {
      let serverNoContextTakeover = hv.parameters[$containsKey]("server_no_context_takeover");
      let clientNoContextTakeover = hv.parameters[$containsKey]("client_no_context_takeover");
      function getWindowBits(type) {
        let o = hv.parameters[$_get](type);
        if (o == null) {
          return 15;
        }
        return core.int.parse(o, {onError: dart.fn(s => 15, StringToint())});
      }
      dart.fn(getWindowBits, StringToint());
      return new _http._WebSocketPerMessageDeflate.new({clientMaxWindowBits: getWindowBits("client_max_window_bits"), serverMaxWindowBits: getWindowBits("server_max_window_bits"), clientNoContextTakeover: clientNoContextTakeover, serverNoContextTakeover: serverNoContextTakeover});
    }
    return null;
  }
  listen(onData, opts) {
    let onError = opts && 'onError' in opts ? opts.onError : null;
    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
    return this[_controller$1].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get pingInterval() {
    return this[_pingInterval];
  }
  set pingInterval(interval) {
    if (dart.test(this[_writeClosed])) return;
    if (this[_pingTimer] != null) this[_pingTimer].cancel();
    this[_pingInterval] = interval;
    if (this[_pingInterval] == null) return;
    this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
      if (dart.test(this[_writeClosed])) return;
      this[_consumer].add(new _http._WebSocketPing.new());
      this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
        this[_close$0](_http.WebSocketStatus.GOING_AWAY);
      }, VoidToNull()));
    }, VoidToNull()));
  }
  get readyState() {
    return this[_readyState];
  }
  get extensions() {
    return null;
  }
  get closeCode() {
    return this[_closeCode];
  }
  get closeReason() {
    return this[_closeReason];
  }
  add(data) {
    this[_sink$1].add(data);
  }
  addUtf8Text(bytes) {
    core.ArgumentError.checkNotNull(bytes, "bytes");
    this[_sink$1].add(new _http._EncodedString.new(bytes));
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_sink$1].addError(error, stackTrace);
  }
  addStream(stream) {
    return this[_sink$1].addStream(stream);
  }
  get done() {
    return this[_sink$1].done;
  }
  close(code, reason) {
    if (code === void 0) code = null;
    if (reason === void 0) reason = null;
    if (dart.test(_http._WebSocketImpl._isReservedStatusCode(code))) {
      dart.throw(new _http.WebSocketException.new("Reserved status code " + dart.str(code)));
    }
    if (this[_outCloseCode] == null) {
      this[_outCloseCode] = code;
      this[_outCloseReason] = reason;
    }
    if (!dart.test(this[_controller$1].isClosed)) {
      if (!dart.test(this[_controller$1].hasListener) && this[_subscription$0] != null) {
        this[_controller$1].stream.drain(dart.dynamic).catchError(dart.fn(_ => new _js_helper.LinkedMap.new(), dynamicToMap()));
      }
      if (this[_closeTimer] == null) {
        this[_closeTimer] = async.Timer.new(const$107 || (const$107 = dart.const(new core.Duration.new({seconds: 5}))), dart.fn(() => {
          this[_closeCode] = this[_outCloseCode];
          this[_closeReason] = this[_outCloseReason];
          if (this[_subscription$0] != null) this[_subscription$0].cancel();
          this[_controller$1].close();
          _http._WebSocketImpl._webSockets[$remove](this[_serviceId$]);
        }, VoidToNull()));
      }
    }
    return this[_sink$1].close();
  }
  static get userAgent() {
    return _http._WebSocketImpl._httpClient.userAgent;
  }
  static set userAgent(userAgent) {
    _http._WebSocketImpl._httpClient.userAgent = userAgent;
  }
  [_close$0](code, reason) {
    if (code === void 0) code = null;
    if (reason === void 0) reason = null;
    if (dart.test(this[_writeClosed])) return;
    if (this[_outCloseCode] == null) {
      this[_outCloseCode] = code;
      this[_outCloseReason] = reason;
    }
    this[_writeClosed] = true;
    this[_consumer].closeSocket();
    _http._WebSocketImpl._webSockets[$remove](this[_serviceId$]);
  }
  get [_serviceTypePath$]() {
    return "io/websockets";
  }
  get [_serviceTypeName$]() {
    return "WebSocket";
  }
  [_toJSON$](ref) {
    let name = dart.str(dart.dload(dart.dload(this[_socket$], 'address'), 'host')) + ":" + dart.str(dart.dload(this[_socket$], 'port'));
    let r = new (IdentityMapOfString$dynamic()).from(["id", this[_servicePath$], "type", this[_serviceType$](ref), "name", name, "user_name", name]);
    if (dart.test(ref)) {
      return r;
    }
    try {
      r[$_set]("socket", dart.dsend(this[_socket$], _toJSON$, [true]));
    } catch (e) {
      let _ = dart.getThrown(e);
      r[$_set]("socket", new (IdentityMapOfString$String()).from(["id", this[_servicePath$], "type", "@Socket", "name", "UserSocket", "user_name", "UserSocket"]));
    }
    return r;
  }
  static _isReservedStatusCode(code) {
    return code != null && (dart.notNull(code) < _http.WebSocketStatus.NORMAL_CLOSURE || code === _http.WebSocketStatus.RESERVED_1004 || code === _http.WebSocketStatus.NO_STATUS_RECEIVED || code === _http.WebSocketStatus.ABNORMAL_CLOSURE || dart.notNull(code) > _http.WebSocketStatus.INTERNAL_SERVER_ERROR && dart.notNull(code) < _http.WebSocketStatus.RESERVED_1015 || dart.notNull(code) >= _http.WebSocketStatus.RESERVED_1015 && dart.notNull(code) < 3000);
  }
};
(_http._WebSocketImpl._fromSocket = function(socket, protocol, compression, serverSide, deflate) {
  if (serverSide === void 0) serverSide = false;
  if (deflate === void 0) deflate = null;
  this[_controller$1] = null;
  this[_subscription$0] = null;
  this[_sink$1] = null;
  this[_readyState] = _http.WebSocket.connecting;
  this[_writeClosed] = false;
  this[_closeCode] = null;
  this[_closeReason] = null;
  this[_pingInterval] = null;
  this[_pingTimer] = null;
  this[_consumer] = null;
  this[_outCloseCode] = null;
  this[_outCloseReason] = null;
  this[_closeTimer] = null;
  this[_deflate] = null;
  this[_socket$] = socket;
  this.protocol = protocol;
  this[_serverSide] = serverSide;
  _http._WebSocketImpl.__proto__.new.call(this);
  this[_consumer] = new _http._WebSocketConsumer.new(this, io.Socket._check(this[_socket$]));
  this[_sink$1] = new _http._StreamSinkImpl.new(this[_consumer]);
  this[_readyState] = _http.WebSocket.open;
  this[_deflate] = deflate;
  let transformer = new _http._WebSocketProtocolTransformer.new(this[_serverSide], this[_deflate]);
  this[_subscription$0] = async.StreamSubscription._check(dart.dsend(dart.dsend(this[_socket$], 'transform', [transformer]), 'listen', [dart.fn(data => {
      if (_http._WebSocketPing.is(data)) {
        if (!dart.test(this[_writeClosed])) this[_consumer].add(new _http._WebSocketPong.new(data.payload));
      } else if (_http._WebSocketPong.is(data)) {
        this.pingInterval = this[_pingInterval];
      } else {
        this[_controller$1].add(data);
      }
    }, dynamicToNull())], {onError: dart.fn((error, stackTrace) => {
      if (this[_closeTimer] != null) this[_closeTimer].cancel();
      if (core.FormatException.is(error)) {
        this[_close$0](_http.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
      } else {
        this[_close$0](_http.WebSocketStatus.PROTOCOL_ERROR);
      }
      this[_closeCode] = this[_outCloseCode];
      this[_closeReason] = this[_outCloseReason];
      this[_controller$1].close();
    }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
      if (this[_closeTimer] != null) this[_closeTimer].cancel();
      if (this[_readyState] === _http.WebSocket.open) {
        this[_readyState] = _http.WebSocket.closing;
        if (!dart.test(_http._WebSocketImpl._isReservedStatusCode(transformer.closeCode))) {
          this[_close$0](transformer.closeCode, transformer.closeReason);
        } else {
          this[_close$0]();
        }
        this[_readyState] = _http.WebSocket.closed;
      }
      this[_closeCode] = transformer.closeCode;
      this[_closeReason] = transformer.closeReason;
      this[_controller$1].close();
    }, VoidToNull()), cancelOnError: true}));
  this[_subscription$0].pause();
  this[_controller$1] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$0], 'resume'), onCancel: dart.fn(() => {
      this[_subscription$0].cancel();
      this[_subscription$0] = null;
    }, VoidToNull()), onPause: dart.bind(this[_subscription$0], 'pause'), onResume: dart.bind(this[_subscription$0], 'resume')});
  _http._WebSocketImpl._webSockets[$_set](this[_serviceId$], this);
}).prototype = _http._WebSocketImpl.prototype;
dart.addTypeTests(_http._WebSocketImpl);
_http._WebSocketImpl[dart.implements] = () => [_http.WebSocket];
dart.setMethodSignature(_http._WebSocketImpl, () => ({
  __proto__: dart.getMethods(_http._WebSocketImpl.__proto__),
  listen: dart.fnType(async.StreamSubscription, [dart.fnType(dart.void, [dart.dynamic])], {onError: core.Function, onDone: dart.fnType(dart.void, []), cancelOnError: core.bool}),
  add: dart.fnType(dart.void, [dart.dynamic]),
  addUtf8Text: dart.fnType(dart.void, [core.List$(core.int)]),
  addError: dart.fnType(dart.void, [core.Object], [core.StackTrace]),
  addStream: dart.fnType(async.Future, [async.Stream]),
  close: dart.fnType(async.Future, [], [core.int, core.String]),
  [_close$0]: dart.fnType(dart.void, [], [core.int, core.String]),
  [_toJSON$]: dart.fnType(core.Map$(core.String, dart.dynamic), [core.bool])
}));
dart.setGetterSignature(_http._WebSocketImpl, () => ({
  __proto__: dart.getGetters(_http._WebSocketImpl.__proto__),
  pingInterval: core.Duration,
  readyState: core.int,
  extensions: core.String,
  closeCode: core.int,
  closeReason: core.String,
  done: async.Future,
  [_serviceTypePath$]: core.String,
  [_serviceTypeName$]: core.String
}));
dart.setSetterSignature(_http._WebSocketImpl, () => ({
  __proto__: dart.getSetters(_http._WebSocketImpl.__proto__),
  pingInterval: core.Duration
}));
dart.setLibraryUri(_http._WebSocketImpl, "dart:_http");
dart.setFieldSignature(_http._WebSocketImpl, () => ({
  __proto__: dart.getFields(_http._WebSocketImpl.__proto__),
  protocol: dart.finalFieldType(core.String),
  [_controller$1]: dart.fieldType(async.StreamController),
  [_subscription$0]: dart.fieldType(async.StreamSubscription),
  [_sink$1]: dart.fieldType(async.StreamSink),
  [_socket$]: dart.finalFieldType(dart.dynamic),
  [_serverSide]: dart.finalFieldType(core.bool),
  [_readyState]: dart.fieldType(core.int),
  [_writeClosed]: dart.fieldType(core.bool),
  [_closeCode]: dart.fieldType(core.int),
  [_closeReason]: dart.fieldType(core.String),
  [_pingInterval]: dart.fieldType(core.Duration),
  [_pingTimer]: dart.fieldType(async.Timer),
  [_consumer]: dart.fieldType(_http._WebSocketConsumer),
  [_outCloseCode]: dart.fieldType(core.int),
  [_outCloseReason]: dart.fieldType(core.String),
  [_closeTimer]: dart.fieldType(async.Timer),
  [_deflate]: dart.fieldType(_http._WebSocketPerMessageDeflate)
}));
dart.defineLazy(_http._WebSocketImpl, {
  /*_http._WebSocketImpl._webSockets*/get _webSockets() {
    return new (IdentityMapOfint$_WebSocketImpl()).new();
  },
  set _webSockets(_) {},
  /*_http._WebSocketImpl.DEFAULT_WINDOW_BITS*/get DEFAULT_WINDOW_BITS() {
    return 15;
  },
  /*_http._WebSocketImpl.PER_MESSAGE_DEFLATE*/get PER_MESSAGE_DEFLATE() {
    return "permessage-deflate";
  },
  /*_http._WebSocketImpl._httpClient*/get _httpClient() {
    return _http.HttpClient.new();
  }
});
dart.setBaseClass(_http._HttpConnection.__proto__, collection.LinkedListEntry$(_http._HttpConnection));
dart.trackLibraries("dart_sdk", {
  "dart:_runtime": dart,
  "dart:_debugger": _debugger,
  "dart:_foreign_helper": _foreign_helper,
  "dart:_interceptors": _interceptors,
  "dart:_internal": _internal,
  "dart:_isolate_helper": _isolate_helper,
  "dart:_js_helper": _js_helper,
  "dart:_js_mirrors": _js_mirrors,
  "dart:_js_primitives": _js_primitives,
  "dart:_metadata": _metadata,
  "dart:_native_typed_data": _native_typed_data,
  "dart:async": async,
  "dart:collection": collection,
  "dart:convert": convert,
  "dart:core": core,
  "dart:developer": developer,
  "dart:io": io,
  "dart:isolate": isolate,
  "dart:js": js,
  "dart:js_util": js_util,
  "dart:math": math,
  "dart:mirrors": mirrors,
  "dart:typed_data": typed_data,
  "dart:indexed_db": indexed_db,
  "dart:html": html$,
  "dart:html_common": html_common,
  "dart:svg": svg$,
  "dart:web_audio": web_audio,
  "dart:web_gl": web_gl,
  "dart:web_sql": web_sql,
  "dart:_http": _http
}, {
  "dart:_runtime": ["utils.dart", "classes.dart", "rtti.dart", "types.dart", "errors.dart", "operations.dart"],
  "dart:_debugger": ["profile.dart"],
  "dart:_interceptors": ["js_array.dart", "js_number.dart", "js_string.dart"],
  "dart:_internal": ["async_cast.dart", "cast.dart", "iterable.dart", "list.dart", "print.dart", "sort.dart", "symbol.dart", "linked_list.dart"],
  "dart:_js_helper": ["annotations.dart", "linked_hash_map.dart", "identity_hash_map.dart", "custom_hash_map.dart", "native_helper.dart", "regexp_helper.dart", "string_helper.dart", "js_rti.dart"],
  "dart:async": ["async_error.dart", "broadcast_stream_controller.dart", "deferred_load.dart", "future.dart", "future_impl.dart", "schedule_microtask.dart", "stream.dart", "stream_controller.dart", "stream_impl.dart", "stream_pipe.dart", "stream_transformers.dart", "timer.dart", "zone.dart"],
  "dart:collection": ["collections.dart", "hash_map.dart", "hash_set.dart", "iterable.dart", "iterator.dart", "linked_hash_map.dart", "linked_hash_set.dart", "linked_list.dart", "list.dart", "maps.dart", "queue.dart", "set.dart", "splay_tree.dart"],
  "dart:convert": ["ascii.dart", "base64.dart", "byte_conversion.dart", "chunked_conversion.dart", "codec.dart", "converter.dart", "encoding.dart", "html_escape.dart", "json.dart", "latin1.dart", "line_splitter.dart", "string_conversion.dart", "utf.dart"],
  "dart:core": ["annotations.dart", "bigint.dart", "bool.dart", "comparable.dart", "date_time.dart", "double.dart", "duration.dart", "errors.dart", "exceptions.dart", "expando.dart", "function.dart", "identical.dart", "int.dart", "invocation.dart", "iterable.dart", "iterator.dart", "list.dart", "map.dart", "null.dart", "num.dart", "object.dart", "pattern.dart", "print.dart", "regexp.dart", "set.dart", "sink.dart", "stacktrace.dart", "stopwatch.dart", "string.dart", "string_buffer.dart", "string_sink.dart", "symbol.dart", "type.dart", "uri.dart"],
  "dart:developer": ["extension.dart", "profiler.dart", "service.dart", "timeline.dart"],
  "dart:io": ["bytes_builder.dart", "common.dart", "data_transformer.dart", "directory.dart", "directory_impl.dart", "embedder_config.dart", "eventhandler.dart", "file.dart", "file_impl.dart", "file_system_entity.dart", "io_resource_info.dart", "io_sink.dart", "io_service.dart", "link.dart", "namespace_impl.dart", "overrides.dart", "platform.dart", "platform_impl.dart", "process.dart", "secure_server_socket.dart", "secure_socket.dart", "security_context.dart", "service_object.dart", "socket.dart", "stdio.dart", "string_transformer.dart", "sync_socket.dart"],
  "dart:isolate": ["capability.dart"],
  "dart:math": ["jenkins_smi_hash.dart", "point.dart", "random.dart", "rectangle.dart"],
  "dart:typed_data": ["unmodifiable_typed_data.dart"],
  "dart:html_common": ["css_class_set.dart", "conversions.dart", "conversions_dart2js.dart", "device.dart", "filtered_element_list.dart", "lists.dart"],
  "dart:_http": ["crypto.dart", "http_date.dart", "http_headers.dart", "http_impl.dart", "http_parser.dart", "http_session.dart", "overrides.dart", "websocket.dart", "websocket_impl.dart"]
}, null);

console.log('done!');
}

let start = Date.now();
try {
foo();
} catch { }
// print(Date.now() - start);
